on complexity and design
Philosophy of Software Design by John Ousterhout isn’t just a fantastic book about software design; it’s a book about how to approach complexity in general. In the 185-page book, Ousterhout mentions the word complexity 269 times. He argues that “software engineers should always be thinking about complexity,” defining complexity as “anything related to the structure of a software system that makes it hard to understand and modify the system.“
It takes deliberate effort to design a system that isn’t complex for the user. One of my favorite talks by Rob Pike is called Simplicity is Complicated. In this talk, he elaborates on the fact that building systems that feel simple is quite complicated for the system designer. In good software design, it isn’t that complexity doesn’t exist but that a good designer hides the complexity from the user.
This line of thinking is particularly appealing as it places the responsibility of managing complexity squarely on the shoulders of the designer. It brings complexity to the forefront and compels the designer to determine how a system should function.
A good design is not just a solution to a problem; it is a gift to others. It embodies a clarity of thought and a perspective that eases burdens on others rather than adding to their complexities. It is a prosocial act to invest extra time in your design, as it allows you to give this valuable gift to others. Even if you are the sole audience for your design, it is a thoughtful gift to your future self.
My favorite technique in the book is “Design it twice.” Here, Ousterhout argues that when designing a system, take a step back and create it again a second time, making an effort to take a fresh approach. Then, compare your two designs. Weigh the pros and cons of each so that your final design emerges from the output of the original two designs. Even if you select one of the designs unaltered, it immediately impacts your confidence in your design. However, it will most likely help you identify flaws in your original design, leading to immediate improvements. Recently, I’ve started using this approach in my design work, and the small investment upfront has transformed the effectiveness of my designs. I’ve applied this to everything from software proposals at work to personal weekend warrior projects in my backyard. In each case, I’ve been glad I did it. Give it a try. It’s easy to do, and I’m confident you’ll also see the benefits.
P.S. If you want to learn more about the book, we recently reviewed it in our new podcast, Book Overflow.