Discussion about this post

User's avatar
James Tryand's avatar

While this describes tech debt well, it doesn't provide common underlying reasons, and for that there are a couple more concepts that have to be taken into consideration.

1. management measurement and estimation tends to only cover the initial development phase of a piece of work, and tends not to explicitly factor the ongoing and end-of-life costs. As such those costs then tend to get baked into the costs for future work that is coupled to it.

an expedient piece of work with respect to initial delivery, if it were to have an impact on all subsequent work, it reduces the ability to deliver since it's ongoing costs need to be added to all future work.

which leads into the second aspect

2. Coupling - often the expedient (technical debt) decisions allow for the coupling of work. By reducing the coupling, the costs associated with new work tend to be self-contained and not factor in prior maintenance. As such the ability to deliver over time improves even if the initial development might be higher for the decoupled work.

eventmodeling.org goes into more detail in a similar vein, but does include a good diagram to help visualise this : https://eventmodeling.org/cost-comparison.jpg

Expand full comment
Martin Piccolin's avatar

The idea of writing code *clean to refactor* really caught my attention. It is only a small shift of perspective compare to writing *clean* code, but it means looking ahead and anticipating instead of being obsessed with the current state of your problem.

I can relate to that in data science especially, where your understanding of a problem changes as you write code and thus have new results to analyze.

But I would be curious to ask what you recommend in practice to write code *clean to refactor*? I feel that building abstractions before it is really needed is a first trap to avoid.

Also, I think that Ward's quote "If we fail to make the program aligned with what we understand to be the proper way to think about our [...] objects" can be interpreted in two different ways:

1 - not having a proper understanding of the situation

2 - having a proper understand of the situation, but failing to actually implement this understanding.

The result is the same: a code which is not a good fit giving the requirements, but the solution to solve this issue could be different in both cases.

Thanks a lot for this great content Luca, I'll keep reading it with pleasure ;)

Expand full comment
17 more comments...

No posts