| I don't disagree with the article, and I don't disagree with you - I'm more of expanding the ideas you discussed. I think the key here is indeed that technical debt should not be used as an excuse to write poor code. But I think it may be hard to systematically tell apart code that was written intentionally fast and poorly, and code that just was written to explore the market. It "is accepted" that the most of the cost a software comes from the maintenance period - adding bugfixes, new features, and just reading the code. If the software can be moved from point A where these costs are high (including risk of things getting broken due to complex architecture) to a point B where they are lower, then I could say "technical debt is paid back". Was the software in point A due to intentional shortcuts, or just because that's how we write software in an unfamiliar territory, is maybe besides the point in gauging the practicality of the term. The "technical debt" gets anyway accumulated due to the empirical quality of most of software engineering process. I think this is the most critical thing people should realize - don't take short cuts unless the house is burning down - but do try to explore the problem space fearlessly. The exploration is due to incomplete understanding of the end user needs. And sometimes you can't really explore that space without delivering something to the user. But! I think the exploration phase does not necessarily need to incur technical debt if it's done using prototypes that won't end up in production (yeah yeah like that's ever happened but in theory...). In this case the deliverable will be just used as a template for the actual product development, with the result that the product may be in a more mature state from the get go, and hence, have less debt from the start. Should the exploration be done with prototypes or actual vertical slices of production software? I suppose this depends on the situation. Sometimes the problem is actually so hard that you need to deliver a build based on an actual production codebase no matter what. |