The Kollected Kode Vicious

Kode Vicious - @kode_vicious

  Download PDF version of this article PDF

Structuring Success

The problem with software structure is people don't really learn it until they really need it.

Dear KV,

In teaching an algorithms course this semester, I discovered my students had received very little instruction about how to divide their code into functions. So, I spent a weekend trolling various programming handbooks and discovered most of them are silent on this topic. I ended up writing a quick handbook to help my students, but was struck more by the advice gap. We just don't give people guidance!

Guiding Light

 

Dear Guiding,

Well, luckily, you're in the guidance business! I read over the handbook, and not only do I agree with it, but I think I've given similar advice—although not so nicely—in these columns in the past. I also note that you cite one of my favorite books on the topic of good software engineering, The Practice of Programming by Kernighan and Pike, a classic I read when it came out more than 20 years ago.

I want to look at this problem from another angle, since you've so nicely and concisely gone after the prescriptive advice. I have not taken your class, nor even sought out the syllabus, but as you say that it's an algorithms class, I wonder if that's a part of the challenge. I find that people develop a taste for good program structure—which is what you're arguing for—only after they've either been exposed to it in a well-written system or had the need thrust upon them by the problem they are trying to solve. If the programming guides you consulted are like the ones I've seen, they definitely have that 1980s PROGRAMMING IN BASIC mode of thought, in which the goal wasn't to understand the program so much as it was to type it into your personal computer correctly so you could play the game they were showing you.

In the modern world, this type of programming has been carried over to the Maker-like tutorials, those that blink a light or make an art project out of an Arduino and some string. It is not that these projects are bad (although the ones with sound are ultimately annoying when you're sharing a makerspace), it's that they are not meant to teach good software engineering. And the problem is not limited to the hobbyist world. While many algorithms can be broken down into constituent parts, textbooks do not often treat them that way, preferring, instead, to get the whole concept across in a large block of pseudocode. Good software structure is hard to show in a linear form like a book chapter; it is best when directly experienced.

To that end, I strongly suggest that your first project be one that requires some level of software structure, and this can be done in a few ways. The cruelest, surely, is to give the students such a horrendously complex assignment that the only way to solve it is through proper structure, rather than through the cleverness of the algorithmic design of a single function. The algorithm itself can be trivial, but the requirements for acquiring, processing, and storing the data, along with some nasty reporting requirements, would definitely make your students more aware of why they might want to structure their code. Interacting with the underlying system to get input, store output, and make reports is a straightforward way of ensuring the students want to have structure.

Another possibility, and one that might be a bit less cruel, is to cite the algorithm within some other system that already has structure. Rather than write a sorting algorithm that just takes an input string and produces the sorted string (as we did when I was an undergrad), have the students replace an algorithm in an existing system—for example, one that deals with encryption—where there can be choices of algorithms but the framework is not under their control. The modern world of open-source software should help you here. You can use many different pieces of software, admittedly of highly variable quality, as the frameworks for such homework.

The problem with software structure is people don't really learn it until they really need it, and your homework assignments will have to force them to look closely at how they are solving problems, not only through algorithms but through structure.

KV

 

George V. Neville-Neil works on networking and operating-system code for fun and profit. He also teaches courses on various subjects related to programming. His areas of interest are computer security, operating systems, networking, time protocols, and the care and feeding of large code bases. He is the author of The Kollected Kode Vicious and coauthor with Marshall Kirk McKusick and Robert N. M. Watson of The Design and Implementation of the FreeBSD Operating System. For nearly 20 years he has been the columnist better known as Kode Vicious. Since 2014, he has been an industrial visitor at the University of Cambridge, where he is involved in several projects relating to computer security. He earned his bachelor's degree in computer science at Northeastern University in Boston, Massachusetts, and is a member of ACM, the Usenix Association, and IEEE. His software not only runs on Earth, but also has been deployed as part of VxWorks in NASA's missions to Mars. He is an avid bicyclist and traveler who currently lives in New York City.

Copyright © 2024 held by owner/author. Publication rights licensed to ACM.

 

acmqueue

Originally published in Queue vol. 22, no. 2
Comment on this article in the ACM Digital Library





More related articles:

Catherine Hayes, David Malone - Questioning the Criteria for Evaluating Non-cryptographic Hash Functions
Although cryptographic and non-cryptographic hash functions are everywhere, there seems to be a gap in how they are designed. Lots of criteria exist for cryptographic hashes motivated by various security requirements, but on the non-cryptographic side there is a certain amount of folklore that, despite the long history of hash functions, has not been fully explored. While targeting a uniform distribution makes a lot of sense for real-world datasets, it can be a challenge when confronted by a dataset with particular patterns.


Nicole Forsgren, Eirini Kalliamvakou, Abi Noda, Michaela Greiler, Brian Houck, Margaret-Anne Storey - DevEx in Action
DevEx (developer experience) is garnering increased attention at many software organizations as leaders seek to optimize software delivery amid the backdrop of fiscal tightening and transformational technologies such as AI. Intuitively, there is acceptance among technical leaders that good developer experience enables more effective software delivery and developer happiness. Yet, at many organizations, proposed initiatives and investments to improve DevEx struggle to get buy-in as business stakeholders question the value proposition of improvements.


João Varajão, António Trigo, Miguel Almeida - Low-code Development Productivity
This article aims to provide new insights on the subject by presenting the results of laboratory experiments carried out with code-based, low-code, and extreme low-code technologies to study differences in productivity. Low-code technologies have clearly shown higher levels of productivity, providing strong arguments for low-code to dominate the software development mainstream in the short/medium term. The article reports the procedure and protocols, results, limitations, and opportunities for future research.


Ivar Jacobson, Alistair Cockburn - Use Cases are Essential
While the software industry is a fast-paced and exciting world in which new tools, technologies, and techniques are constantly being developed to serve business and society, it is also forgetful. In its haste for fast-forward motion, it is subject to the whims of fashion and can forget or ignore proven solutions to some of the eternal problems that it faces. Use cases, first introduced in 1986 and popularized later, are one of those proven solutions.





© ACM, Inc. All Rights Reserved.