One of the characteristics of an evolutionary architecture is that changes are made to the software system incrementally. Making incremental changes includes how we introduce changes to the system, how we build the system, and how the system is deployed.
In order to design an evolutionary architecture, we must make it easy to understand what is going on in the software system. The ease with which we can make a change is related to how much we understand the system. Making changes that are smaller in scope allows us to more easily understand what is being changed and reduces the risk of introducing a defect. It also makes it easier to code-review and test the changes that are being made to the system.
You may recall from the Lehman's laws of software evolution section earlier in this chapter that Law VIII stresses the importance of having a feedback system that allows important stakeholders to provide feedback on the system. Changes can then be made to the system based on the feedback. The iterative nature of agile software development methodologies and DevOps practices, such as continuous integration (CI) and continuous delivery (CD), facilitates giving of and allows that feedback to be received faster, which enables beneficial improvements to be delivered to customers faster.
In Chapter 13, DevOps and Software Architecture, we discussed CI and CD. An aspect of making incremental changes is having developers continuously integrate their changes into the system. By committing changes to a source control repository frequently, there is a reduced chance of merge conflicts, making it easier to resolve any that do occur. Automated builds that include automated testing give us feedback on our changes quickly. If there is a problem with a set of changes, they will be easier to fix because there will only have been so many changes committed since the last build.
CD is the practice of being able to release changes into production in a safe, repeatable, and sustainable way. A system that is highly adaptable has the ability to quickly react to change and release new versions quickly. Releasing incremental changes to users quickly makes your system highly evolvable. CD is about being able to produce low-risk, high-quality releases with a faster time-to-market.