it's all about the least worst combination of trade-offs
Tags: books, softwareengineering, architecture
Published: 2024-06-05 01:02:03

i remember that early in my computer science career in the industry hearing a lot of silver bullet frameworks/packages that fit all the cases you want and (apparently) didn't have any disadvantages or drawbacks. "using this MVP framework X will solve your PHP development problems", "the best API interface for Java is Y", and similar pitches were quite common. At the time, the community was infested with solution evangelists and it was so common that providing critical analysis of the usage or its limitation was like desacrating. 

these frameworks were often marketed with grand promises and I saw minimal discussion about the context or implications of its usages involved. at first, these claims seemed incredibly attractive, especially for someone new to the field, as they promised a panacea to all the prevalent issues. however, it didn’t take long to realize that every framework or package had its own set of limitations, and the context in which they were used mattered significantly. this background made me more appreciative of any resource that addressed the complexity of architectural decisions honestly.

last week, I read the book "Software Architecture: The Hard Parts" that I really liked. by the way, the hard parts the author refers to are related to the difficult choices, and the foundation parts - should change less compared to the "soft" ones - of a software design. the book then focuses mainly on these architectural decisions involved in modern software development and several guides on how to better evaluate the implications of different types of solutions to solve these problems: trade-off analysis. the rigorous attention to decision-making frameworks ensures that readers are not just passively absorbing information but are actively engaging with the flow of thinking to understand the nuanced consequences of each choice. the author discusses how these decisions can have long-lasting impacts on maintainability, scalability, and performance, emphasizing that what works well in one context might become a bottleneck in another - which for me makes this book special. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9xgfetole6fqw3u3lk4w.jpg)

the author demystified the concept of the one-fit-all solution for software architecture by focusing on identifying the possible trade-offs inherited in all design decisions. one of the first quotes of the book is "don't try to find the best design in software architecture, instead, strive for the least worst combination of trade-offs". that really caught my eye and gave me the curiosity to finish the book. the examples and case studies provided are rich with scenarios that demonstrate how even small decisions can have cascading effects on a software system's future evolution. by enforcing this critical mindset, the book arms readers with the tools to make more informed decisions, rather than chasing an elusive "perfect" architecture or being "evangelizers".

the good parts of the book are 
- real-world examples to follow the theoretical assumptions the author presents
- systematic guidance on how to decompose complex systems
- large and useful amount of common decisions trade-offs on modern software architecture
- personal tips from the author alongside the chapter discussions 
- amazing and intuitive diagrams
- comprehensive language and storytelling 

the weak parts of the book are
- not so recommended for beginner software developers (but I don't think that's the book's target)
- despite the chapters having a good interconnection, sometimes the author refers to a chapter discussion without making it easier for the reader to remember the context of what was discussed and its implications
- personal tips from the author alongside the chapter discussions (also a weak part here because in some cases I thought it biased the discussion)

overall I think it's definitely an amazing reading and I really recommend it for every programmer who creates modern distributed software that, consequently, involves a lot of design decisions that should be carefully evaluated in order to develop robust systems. The concepts presented in this book are not just applicable to large companies but can also be adapted for use in startups or smaller teams, making it versatile and essential reading for anyone involved in software design and development.