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.