Each time I read A Philosophy of Software Design, I gain new insights of software design. The acclaimed author, John Ousterhout, shares his thoughts and recommendations, based on his experience, on how to pinpoint and reduce system complexity.
I have mixed feelings about working on projects with complex legacy systems. These projects often give me headaches, as they require a deep understanding of how various systems interact with each other. I always need to be extremely careful to avoid production issues when implementing new changes.
Yet, at the same time, these projects involve valuable discussions with engineers from different teams. We dive into trade-offs to make the best available design choices.
This post reflects my thoughts and takeaways on Chapter 2 of the book The Nature of Complexity. My reflections are based on my personal experience. As Oscar Wilde once said, “Experience is the name everyone gives to their mistakes.” Please take my thoughts in this post with a grain of salt.
Code cannot be read intuitively. Complex state management, side effect, APIs, design patterns, and programming techniques like recursion make the code obscure.