Daniel Jackson SM ’88, PhD ’92 accepted his first job as a software engineer in 1984, but after decades in the field, he has come to a rather striking conclusion: software design needs a reboot. Too many products, he claims, are “cluttered with needless complexity, behaving in unexpected and inconsistent ways.”
When things go wrong, as they often do, blame is commonly attributed to a bug in the code or a problem in the user interface, but the main culprit in many cases is poor design, says Jackson, a professor of computer science and associate director of MIT’s Computer Science and Artificial Intelligence Laboratory. He believes software should be empowering, dependable, and easy to use, and he has laid out a prescription for doing better in his book The Essence of Software (Princeton University Press, 2021).
Jackson’s blunt assessment of the state of software is not the result of a sudden epiphany but instead dates back to his earliest experiences in the field. “I’ve always believed, since the beginning of my career, that there was a better way of doing things,” he says. “In my first job as a programmer, I was struck by how ad hoc and unsystematic programming was.”
That realization spurred Jackson’s interest in “formal methods,” an engineering field that uses mathematically rigorous techniques to evaluate software systems and to make them more precise. “I worked in that field a long time and eventually recognized that the mathematical analysis didn’t really get to the heart of the problem, which mainly originated in the design phase. What was really needed is a simpler way of organizing and characterizing the design of software.”
Meeting human needs
Even the notion of design requires reexamination, Jackson says. Several definitions have been put forth, and he favors one advanced by the architect Christopher Alexander, who regarded design as the shaping of an artifact to meet a human need within a particular environment or context. In programming, Jackson explains, that means prioritizing the user experience.
Unfortunately, this approach is far from the norm, Jackson laments. When it comes to creating software—as opposed to, say, bridges or skyscrapers—design is commonly a step in name only. “Programmers are often just given a list of requirements and rush from there to writing code,” he says. “They know that design is important, but they don’t know how to structure it.” As a result, they may employ inefficient processes, relying heavily on trial and error.
“There is, however, a way of spelling things out in advance that can make efforts less random and less wasteful,” Jackson asserts. “For software, the design process should be based on identifying concepts—using old concepts that work well and inventing new ones when necessary.” This approach, he says, “can give us a new way to think about design.”
As Jackson defines the term in the realm of software, concepts are “a way of organizing functionality, the useful stuff that computers provide, into independent and reusable units.” To put it more simply, he says, “the concepts of a software system are the ideas you need to understand in order to use it.”
To use Twitter, for example, you need to understand the concept of a tweet and a hashtag. Key concepts associated with Facebook include posts, tags, and friends. There’s also the concept of the upvote, or thumbs up, which can be used in settings ranging from book and movie reviews to comments in the New York Times, or in appraising answers posted on Stack Overflow. The reuse of well-established concepts can be a big plus in software design, Jackson says; it keeps designers and engineers from wasting time reinventing the wheel and can also reduce confusion among users.
“People come to understand complex apps by recognizing concepts that are familiar to them,” Jackson says. The Zoom software platform provides a good example. First, there is the concept of a multi-person video call. “But that alone is not enough to understand Zoom,” Jackson says. “You also need to understand the concept of a session identifier, a key feature that distinguishes it from Skype and FaceTime.”
The Zoom app includes many other concepts, including the text chat box, breakout rooms, and polls. In well-designed apps, such concepts provide independent functions that work together like a well-oiled machine. Without good design, usability suffers.
Jackson spent nearly a decade studying 100 failed apps to devise his new strategy for software design, which he is now introducing to the next generation of programmers through his writing, classroom teaching at MIT, and online courses. In this process, “concepts are central,” Jackson says. On this score, he adds, programmers might want to get with the program.
— Steve Nadis
Steve Nadis is a 1997–98 MIT Knight Science Journalism Fellow.