1. Evolutionary development beats “big‑up‑front” design
Many commenters argue that trying to nail every requirement before coding is impossible and that software must grow in small, incremental steps.
“A complex system that works is invariably found to have evolved from a simple system that worked.” – bestham (Gall’s Law)
“The first is too ambitious and ends in an unmaintainable pile around a good core idea.” – jeffreygoesto
2. Complexity is inherent and hard to predict; design must be flexible
The discussion repeatedly points out that complex systems are non‑linear, feedback‑rich, and often cannot be fully understood by breaking them into parts.
“Complex systems are inherently hazardous, operate near the edge of failure and cannot be understood by analyzing individual components.” – bestham
“The nature’s answer to it is, consolidate and compact. Everything that falls onto earth gets compacted into a solid rock over time.” – zkmon
3. Specifications vs prototypes – a practical middle ground
While large, detailed specs rarely succeed, pure prototyping without any planning also fails. Most participants advocate a balanced approach: start with a minimal prototype, learn, then refine a lightweight spec.
“You need smaller documents – this is the core technology we are using.” – bluGill
“The point is that you can look at a prototype, learn, then use that learning to inform a better plan.” – wtetzner
These three themes capture the core of the conversation: evolution over upfront design, the unavoidable nature of complexity, and the need for a pragmatic, iterative approach to specifications.