Ward Cunningham (inventor of the Wiki) coined the excellent term Technical Debt. I won’t summarize here, you should read Ward’s description.
Technical Debt can be incurred for many reasons but the most prevalent is time-line pressure. Developers are in a funny position because we’re involved in building systems that can make or loss billions of pounds and yet we’re not considered ‘professional’. Would you ask your barrister to hurry your defence, your doctor to hurry you heart operation or your architect to hurry you’re house. As a matter of fact you wouldn’t even hurry your builder.
Unfortunately; unlike builders, computer programmers have CVs, which means we can’t get away with ‘cowboy’ work. This leaves us with a problem; if we are to finish software we need to incur Technical Debt. The result is everything from unfinished features to outright bugs.
So how can you combat Technical Debt? I’m going to coin it Technical Capital. As you work your way through a problem and race to finish it remember that the end result is not solely the code but the knowledge of the problem domain built up in your head. By the time you finish the first iteration you should understand you problem domain pretty well. And with each iteration, it will improve. And the greater your Technical Capital the more it offsets any Technical Debt you may need to incur.
This is why the Agile mantra of “Iterate Iterate Iterate” is so important. With each iteration your Technical Debt is wiped clean, but your Technical Capital builds.
Many employers recognize the need for Technical Capital but are unwilling to foster it in their own staff and hence hire people with specific domain knowledge as a proxy. And sadly, for some developers the domain their weak in is in-fact development itself but that’s another issue….