Naarmate software steeds belangrijker wordt voor moderne bedrijven, moet software in staat zijn om snel te reageren op veranderingen, zodat nieuwe functies snel kunnen worden bedacht, ontwikkeld en in productie genomen. De technieken van agile softwareontwikkeling begonnen in de jaren 90 en werden de laatste tien jaar steeds populairder. Ze richten zich op een flexibele benadering van planning, waardoor softwareproducten van richting kunnen veranderen naarmate de behoeften van gebruikers veranderen en productmanagers meer leren over hoe ze hun gebruikers effectiever kunnen maken. Hoewel tegenwoordig wijd geaccepteerd, zijn agile benaderingen niet eenvoudig en vereisen ze aanzienlijke vaardigheden van een team. Maar nog belangrijker is een cultuur van open samenwerking, zowel binnen het team als met partners van het team.
Deze behoefte om vlot te reageren op veranderingen heeft een belangrijke impact op de architectuur van een softwaresysteem. De software moet zo worden gebouwd dat deze zich kan aanpassen aan onverwachte veranderingen in functionaliteit. Een van de belangrijkste manieren om dit te bereiken, is door duidelijke code te schrijven, zodat het gemakkelijk te begrijpen is wat het programma zou moeten doen. Deze code moet worden opgedeeld in modules waarmee ontwikkelaars in staat worden gesteld alleen de delen van het systeem te begrijpen die ze moeten aanpassen. Deze productiecode moet worden ondersteund door geautomatiseerde tests die eventuele fouten kunnen detecteren die zijn gemaakt bij het aanbrengen van een wijziging, terwijl voorbeelden worden gegeven van hoe interne structuren worden gebruikt. Grote en complexe softwareprojecten kunnen profiteren van de microservices-architectuurstijl, omdat het teams helpt software uit te rollen met minder verstrengelde afhankelijkheden.
Het creëren van software met een goede architectuur is geen taak die in één keer kan worden volbracht. Net als goed proza heeft het regelmatig herzieningen nodig naarmate programmeurs meer leren over wat het product moet doen en hoe het product het beste kan worden ontworpen om zijn doelen te bereiken. Refactoring is een essentiële techniek om een programma veilig te kunnen wijzigen. Het bestaat uit het aanbrengen van kleine wijzigingen die het waarneembare gedrag van de software niet veranderen. Door een groot aantal kleine wijzigingen te combineren, kunnen ontwikkelaars de structuur van de software herzien en belangrijke wijzigingen ondersteunen die niet waren gepland toen het systeem voor het eerst werd bedacht.
Software die alleen op de machine van een ontwikkelaar draait, biedt geen waarde voor de klanten van de software. Het vrijgeven van software is van oudsher een lang en ingewikkeld proces geweest, een proces dat de noodzaak om software snel te ontwikkelen belemmerde. Continuous delivery maakt gebruik van automatisering en samenwerkingsworkflows om dit knelpunt weg te nemen, waardoor teams software zo vaak kunnen uitbrengen als klanten dat vereisen. Om continue levering mogelijk te maken, moeten we een solide basis van testen inbouwen, met een reeks geautomatiseerde tests die ons het vertrouwen kunnen geven dat onze wijzigingen geen bugs hebben geïntroduceerd. Dit leidt ertoe dat we testen integreren in het programmeren, wat kan leiden tot verbetering van onze architectuur.