Postcards from the Peak of Complexity by Brian Goetz

Brian Goetz explores how complex software projects evolve, why we often ship at peak complexity, and how to navigate toward simpler solutions while avoiding pitfalls.

Key takeaways
  • Complex projects often follow a “peak of complexity” lifecycle where initial optimism leads to increasingly complex solutions before reaching a simpler form

  • The most dangerous moment is when you reach a working but complex solution - there’s strong temptation to ship it prematurely before simplifying

  • Shipping at peak complexity (like Java serialization) leaves you maintaining and building upon complexity forever, making future innovations harder

  • The “virtuous collapse” phase is critical - recognizing you’ve solved too many problems at once and need to remove requirements to reach simplicity

  • Major Java features (Lambdas, Generics, Modules, Loom) typically take 5-10 years because:

    • Need to maintain backwards compatibility
    • Must consider future compatibility
    • Developers need gradual adoption paths
    • Last 10% takes significant time
    • Finding core primitives takes exploration
  • Complexity is like entropy - it naturally increases unless you actively work to reduce it

  • Success should be measured not just by delivered features but by how little complexity was added to achieve them

  • Avoiding “opportunistic side quests” during development is crucial - solving tangential problems often adds unnecessary complexity

  • Solutions need to build on what developers already know and provide simple mental models

  • For platform evolution, balance between conservation (stability) and innovation is essential - breaking either makes Java irrelevant