Some changes to software are simple, but even simple changes can at times have unintended consequences, triggering the need for substantial refactoring or abstraction or performance tuning. It is all case by case, and it's not fully possible to fully predict what's needed ahead of time.
And carpenter never experiences surprises after he opens the walls and sees wiring from Civil War era, lead pipes, etc...? Surely that never happens