Prototype, Expand, Consolidate
A Method for Building Maintainable Systems
Today we look at an efficient, sustainable engineering loop — prototype, expand, consolidate.
#blog #tech #workTODO: remove for regular zettel?
The Loop
An efficient, sustainable engineering loop can be describe through the motto prototype, expand, consolidate.1 This loop consists of three eponymous phases. This has also been referred to as the Fractal Model of software development lifecycles.
Phases
Prototype
Our primary objectives during the prototyping phase are learning about the problem space and fitting a solution to that. We pick specific portions of the problem space to stake our understanding to and just start building something.
We deliberately don't spend time trying to build perfect understanding and systems during this phase. Doing so is a waste of time because we're inevitably blind to the realities at the end location without walking the path first.
Expand
Our next objective is to expand. Similar to prototyping, we expand our understanding of the problem space and the robustness of our solution. This is the phase where nuance comes in. People find themselves saying "I didn't know that worked like that" or "I didn't know it needed to be able to do that" which causes us to expand our knowledge and systems to incorporate new ideas and functions.
There's another optional objective in this phase though.
During this phase we can choose to expand the problem space itself. Instead of just expanding our understanding of what we currently do, we can start choosing to do new things. Each of these new areas should have their own smaller prototype, expand, consolidate loop, but the overall system is still expanding at this point.
Consolidate
Our last objective — and the most critical for the long term sustainability of the system — is to consolidate.
When we start working on a new project, we may have a great solution for the problem as we understand it; however, after the expansion phase we end up with a solution that's far from perfect. We might have a completely different problem space or just more understanding of the space we started with. No matter what the reason, we're very unlikely to retain the correctness of our solution all the way through the process to this point.2
This is when we need to consolidate. We take all our knowledge and systems and reform them into a solution for the current problem space. We make it efficient and well factored for where we are today. Being at the end and having an expanded perspective enables us to consolidate effectively. Without this perspective, consolidation would be premature optimization.
Only after this consolidation, do we have the time and leverage to start the loop over, build new systems, and take on new problem spaces.
-
Foote, B., & Opdyke, W. F. (1994, August). Lifecycle and Refactoring Patterns that Support Evolution and Reuse. Laputan.Org. http://www.laputan.org/lifecycle/lifecycle.html ↩
-
Foote, B., & Yoder, J. (1999, June 26). Big Ball of Mud. Laputan.Org. http://www.laputan.org/mud/ ↩