Skip to main content

Most of the time is design 🙇

Let’s say you’ve just finished a major software project that took a year to complete. How long would it take you to write the exact same system again?

Probably no more than a third.

Why? Because you’ve already figured out what to build—now it’s just a matter of how.1 You have done the time-consuming design work, and only have the implementation work left.2

We often underestimate how much design is involved in our everyday work—partly because we’re so used to it, and partly because it’s spread out and intertwined with implementation.

Every day we make design decisions—naming types and variables, shaping data structures, choosing between composition or inheritance, deciding the boundaries between components, or deciding what should be public or private. Over time, these choices may shape the system just as much as large architectural decisions.

Implementing a new feature also means thinking about how it fits into the larger system. Maybe even change other parts of the system to make sense given the new addition.3 If we don’t, the system design slowly deteriorates. You need to keep your thinking hat on every day.

And if a task takes much longer than expected, don’t feel bad—it probably involved more design work than anticipated.


  1. The fact that figuring out what to build is often the hard part explains the power of starting over↩︎

  2. Don’t get me wrong, the implementation work is very important. But it is more obvious and not as easily ignored as the more invisible design work. ↩︎

  3. Making changes to the system for the new feature to make sense reminds me of Kent Beck’s maxim:

    For each desired change, make the change easy (warning: this may be hard), then make the easy change.

     ↩︎