"onmogelijk" bestaat niet echt in software, de meest harde limieten van software zijn eindige processorsnelheid en enidige hoeveelheid geheugenruimte, en dat zijn niet eens onderdelen die in software zitten, maar van het fysieke computer systeem.
Software is vooral structuur, net als bijv een flatgebouw of een huis. Je kunt overal een muur neerzetten of weghalen, of een trap of raam veranderen, maar soms moet er dan meer overhoop op de lagere niveaus. Als je graag snel het gebouw uit wilt, en een vertikale brand-stang wilt installeren, maar op de plaats waar je hem hebben wilt staat een muur op de verdieping eronder, dan moet je daar iets mee. Als je die muur wilt verplaatsen, dan moet hij ergens anders heen, wat op zijn beurt weer voor nieuwe problemen kan zorgen elders in het gebouw.
Op deze manier kunnen gewenste wijzigingen een cascade aan gevolgen hebben wat ook allemaal anders moet. Bij gebouwen komen die extra dingen op een kostenplaatje, waarbij je op een gegeven moment denkt "dit is te gortig". Bij software krijg je extra kosten in ontwikkel-tijd wat heel snel in weken gaat lopen.
Technisch gezien is de verandering in zowel het gebouw als de software wel mogelijk, maar iemand moet de rekening gaan betalen. Als er niet zo iemand is, dan wordt het dus "onmogelijk".
Op die manier blijven gewenste veranderingen liggen. Na enige tijd is de bult gewenste wijzigingen zo groot, dat je de ruige aanpak kunt kiezen. Je renoveert (een deel van) het gebouw, of een hoek in de software, waarbij je alle veranderingen tegelijk probeert aan te pakken. Bij gebouw renovatie krijg je dan alle gewenste wijzigingen bij oplevering, in software is het eerste doel vaak zo veel mogelijk de bestaande functionaliteit herbouwen, maar op een manier zodat de wijzigingen er later wel eenvoudig in te passen zijn. (De reden hiervan is dat nieuwe functies vaak een project op zich zijn, dus als je dat allemaal mee zou nemen, dan wordt het zo groot en complex, dat het niet meer te begrijpen is.)
In latere releases kun je dan 1 voor 1 de veranderingen introduceren, in de vorm van nieuwe functionaliteit.