The Essence of Software: Why Concepts Matter for Great Design| The Essence of Software
Learning about concept design by comparing similar concepts| Home on The Essence of Software
Learning about concept design by reading a concept spec| Home on The Essence of Software
Criteria for reviewing concept definitions| Home on The Essence of Software
Learning about concept design by writing a concept spec| Home on The Essence of Software
Learning about system design by reading concept specs and syncs| Home on The Essence of Software
Learning about system design by writing concept specs and syncs| The Essence of Software
Oslo: August 25-26, 2025| The Essence of Software
Online: June 10, 12, 16, 24, 2025| The Essence of Software
Boston, March 17-18, 2024| Home on The Essence of Software
Workshop held in Woodinville, WA, in December 2024| The Essence of Software
The first step to great software: scenarios of success| essenceofsoftware.com
An example of what a concept catalog entry might look like| essenceofsoftware.com
Why modularity matters To see why modularity is so critical in software design, consider what goes wrong when it’s missing. For the programmer, life becomes miserable. Whenever you need to understand or modify some piece of functionality, there’s no single place in the code to go to, and you may have to visit many widely separated locations (and just finding them can be a major challenge). Even removing (let alone adding) functionality is hard, because the parts of the codebase are all in...| essenceofsoftware.com
Any software app, service or system can be viewed as a collection of interacting concepts. Concepts are the building blocks of software Imagine explaining Twitter to someone who’s never used it. You might tell them about the Tweet and Follower concepts, then maybe Hashtag and Like (aka Upvote), and if they’re keen to know even more, you could explain VerifiedAccount or Bookmark. Each concept can be explained with a purpose (what it’s for) and an operational principle (how you use it):| essenceofsoftware.com
The role of purposes From what to why. The beginning of wisdom for a designer is to stop asking “what?” and start asking “why?”. This applies at every level. You can ask “what application shall I design?”. But a better question is “why would I design that?”. And at a finer grain, the question “what features should my app have?” gives way to “why should my app have these particular features?| essenceofsoftware.com
A compelling way to explain how something works is to tell a story. Not any story, but a kind of defining story that shows, through a typical scenario, why the thing is useful and fulfills its purpose. The Minuteman Library Network, for example, offers a wonderful service. If I request a book, then when it becomes available at my local library, I get an email notifying me that it’s ready to be picked up.| essenceofsoftware.com
If user experience runs deeper than the user interface, we need a way to talk about an app that isn’t just visual, and that captures behavior in a more fundamental way. Programmers think in terms of complicated things like objects, callbacks, streams, functionals, and so on. They’re essential for structuring code, but for behavior a much simpler model is effective. State machines That model is the state machine. You’ve probably come across state machines, either in a class about the the...| essenceofsoftware.com
As I explained in another tutorial, the easiest and most effective way to define the behavior of an app precisely is to model it as a state machine. The app has a set of possible states, and actions that update and query the states. An execution of the app is just a sequence of actions (or more correctly, action instances that include particular action arguments), and the behavior as a whole is the set of all possible executions.| essenceofsoftware.com
In another tutorial, I showed a concept definition for Yellkey, a popular URL shortening service: concept Yellkey purpose shorten URLs to common words principle if you register a URL u for t seconds and obtaining a shortening s, looking up s will yield u until the shortening expires t seconds from now state used: set String shortFor: used -> one URL expiry: used -> one Date const shorthands: set String actions // register URL u for t seconds // resulting in shortening s register (u: URL, t: i...| essenceofsoftware.com
Two sides of a coin The key to concept design is, perhaps not surprisingly, the idea of concepts. A concept is two things at once. On the one hand, a “concept” means you’d expect it to mean: a mental construct that you need to understand to be able to use an app effectively. So you might that to use Photoshop you need to understand the “concept of a layer”; to use Facebook you need to understand the “concept of friending”; and so on.| essenceofsoftware.com
An idea you need to know One of the most important and useful ideas in software also happens to be one of the least well known. It was introduced in a paper that David Parnas wrote in 1979, entitled Designing Software for Ease of Extension and Contraction. Program families. Following on from an earlier paper that introduced the idea of “program families”—that when you design software you should realize that you’re designing a whole family of programs, not just one—this paper address...| essenceofsoftware.com
Two modes of design thinking Design, whatever the domain, includes two different modes of thinking. In one, the designer generates ideas freely, often responding only loosely to any given need or problem. In the other, the designer takes some previously articulated design ideas, and attempts to improve them. The first mode is expansive, and most successful when critical judgment is suspended; the second is reductive, and calls for focus and analysis.| essenceofsoftware.com
Let’s consider some tactics that you might find useful as a software designer to make divergent design more effective. To make these concrete, I’ll suppose that we’re developing an app to support architectural walking tours. Interviewing stakeholders Talking to potential users and other stakeholders is good not only for identifying needs but also for getting design ideas. You can ask what tools and techniques a user currently finds helpful, and what changes might make them more effective.| essenceofsoftware.com
Motivation: Defining Behavior The operational principle of a concept explains its archetypal behavior: how it’s typically used, and how it fulfills its purpose. But for a concept to be flexible and powerful, it should work in many different scenarios, so we need a way to pin down the behavior in detail. Using the notion of a state machine, we can define how a concept will behave in every possible situation. Then we can analyze the design to make sure that the behavior is always acceptable.| essenceofsoftware.com
Integrity violations aren’t as common as I once expected. But when they happen, they’re bad.| essenceofsoftware.com
Applying concept design to the camera rotation API| essenceofsoftware.com
Notes on designing a GPT-powered tutor using concepts| essenceofsoftware.com
When critical concepts are missing| essenceofsoftware.com
A How-To Guide for Removing Irregularities in Your App| essenceofsoftware.com
Finding Clarity in Design| essenceofsoftware.com
How overloading in DNS brings trouble| essenceofsoftware.com
A Concept Example in Everyday Life| essenceofsoftware.com
In the 1980s, there was a revolution in software. The Apple Macintosh came out (building on the invention of the WIMP interface at PARC), Don Norman wrote The Design of Everyday Things, and the first CHI conference was held. Now everyone knows how important user interface design is, and there’s no excuse for messing it up. You can find several collections of UI design heuristics (such as Nielsen’s) online, and many companies publish standards for how to use UI widgets consistently (here...| essenceofsoftware.com
What's the difference between design and engineering?| essenceofsoftware.com
What is a design problem? What exactly is a design problem? And why are design problems often hard to solve? The most compelling answer to this question, in my view, comes from Christopher Alexander in his influential book Notes on the Synthesis of Form (1964). Most of the book is about a way to structure goals into a tree, by noting alignments and conflicts between them, and grouping them to minimize conflicts across groups.| essenceofsoftware.com
Seven criteria What makes a design fit for purpose depends—surprise!—on the purpose. But generic criteria are helpful for two reasons. First, they give you some basis for evaluation, however crude. Second, they can be used as a checklist to suggest more specific ones. A software product should be: Efficient: letting users accomplish their goals with no more steps or effort than needed; Flexible: supporting not just one fixed and narrow goal, but a range of goals that users are likely to h...| essenceofsoftware.com
Think about your favorite product, whether it’s a photo-editing app or a toaster, and ask yourself: how did it get to be so good? With all the hype in the design world about creativity and brainstorming, it’s easy to imagine that great designs simply appear, out of the blue. Someone conjures up a new idea, and it just needs to be translated from sketch to product. Maybe many details need to be added, but the quality of the design was there at the start—like a tiny seed that grows sponta...| essenceofsoftware.com
When you’re diagnosing a usability snag, or coming up with a new design idea, it’s helpful to know what level you’re working at. Over the years, designers and researchers have defined various levels, reflecting their view of design and what they emphasize. I find the following scheme most helpful: Physical. If you want to think of levels as low and high, this one is at the bottom. It’s the level of design in which you’re concerned about the physical (and physiological) qualities of ...| essenceofsoftware.com
Most of us* believe that simplicity is the key to design. I’m a sucker for the best quotes about it. Here are some of my favorites. First, Tony Hoare in his Turing Award lecture lamenting the complexity of Algol-68: I conclude that there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.| essenceofsoftware.com