rel:: [[change management]] [[antifragile]] rel:: [[Software Design for Flexibility - How to Avoid Programming Yourself into a Corner|Software Design for Flexibility]] # Resilient Systems Should Be Evolvable Can adapt to new requirements with only small changes. Inspiration from Biology. Contemporary practice in [[Software Engineering]] discourages evolvable systems. ## Techniques - minimize assumptions, make just-in-time decisions - [[Postel's Law]] ### Additive Programming Add or adapt functionality without changing existing code or damaging existing functionality. ## Costs Flexibility is costly to create - time, effort, opportunity. Flexible designs make theoretical proofs difficult. ### Cost Mitigation Separate parts of system that need flexibility from parts that must be developed quickly or executed performantly. See hardware/software dichotomy, separating functional code from effects.