Scaling Up: From Pilot Plants to Software Systems #
- Throwaway Prototypes Are Necessary: Realizing a functional system often requires a preliminary "pilot plant" phase where you build a prototype to understand the complexities and limitations of your approach. This prototype is ultimately discarded, but the knowledge gained is invaluable for building the final product.
"Hence plan to throw one away; you will, anyhow." - Fred Brooks
- Second-System Effect: When building upon an initial system, there's a tendency to over-engineer and create a bloated, overly complex "second system." This phenomenon is often attributed to the newfound confidence and expanded feature set that comes with subsequent development efforts.
"The management question, therefore, is not whether to build a pilot system and throw it away. You will do that. The only question is whether to plan in advance to build a throwaway, or to promise to deliver the throwaway to customers." - Fred Brooks
- Vertical Slices in Game Development: The concept of "vertical slices" in game development parallels the pilot plant principle. By creating a small, playable slice of the game, developers gain insights into the content creation process and can refine their time estimates before committing to full-scale production.
Why Software Estimation is So Difficult #
- Learning is Not Normally Distributed: In software development, learning is often a logarithmic process. New information is absorbed at an exponential rate initially, but the rate of learning slows down as the system becomes more complex. Traditional project management methods, relying on normal distributions, fail to capture this dynamic effectively.
- Real Projects vs. "Construction Sites": While construction projects often involve replicating tried-and-true methods, software development is dominated by "real projects" - unique, complex endeavors with significant learning curves. This distinction contributes to the challenges in accurately estimating software project timelines.
- The Explore-Exploit Tradeoff: Software development often involves both exploring unchartered territory and exploiting existing knowledge. The success of a project depends heavily on the appropriate balance between these two activities. Mismatches, such as using a team skilled in exploration for exploitation tasks, can lead to project difficulties.
Key Takeaways #
- Accept that building a "throwaway" prototype is essential for successful software development.
- Be wary of the second-system effect, and resist the urge to over-engineer your product.
- Recognize that software estimation is inherently complex due to the nature of learning and the prevalence of unique projects.
- Understand the interplay between exploration and exploitation in software development and adapt your team and approach accordingly.