Greetings fellas,
Quite a long time ago (nearly 2 decades), Martin Fowler came up with a cool name for a concept in software engineering that I very much tend to agree with - the Design Stamina Hypothesis. It's annotated as a 'hypothesis' precisely because it can't reliably and objectively be proven true, nor can it be proven false.
In general most developers, myself included, judge this kind of concept based on intuition and feel, on the basis of a certain amount of experience working on projects falling on both sides of this hypothesis. Fowler describes it as the comparison between velocity of progress in a software project with good design versus one with no design at all. This graph, taken directly from his website, depicts the concept quite well:

It plots two projects - one with good design (red line), and one with no design (blue line) - and showcases the relationship between cumulative functionality and time in development. A project where no time or effort is spent initially on design naturally moves faster in the beginning. More features are being developed in that period of time compared to a project that has spent its first weeks (sometimes months if it's a bigger concept) in the design stage and no code has been written yet.
However, at a certain point (the design payoff line), the velocity with which new (quality) features are being added diverges greatly. A project that has been set off with good design in mind can follow that structure in an organized and time-efficient manner, resulting in a much larger amount of stable features being developed. On the contrary, a project with no design at all hits a major obstacle quite early in development - tech debt. It's a concept that deserves its own thread, which I will honor it with in the future.
As a result, designless projects quickly start deteriorating and become harder to modify and maintain, drastically slowing down the addition of new features. Without a designated portion of effort being put into clearing tech debt, the problem evolves and becomes worse and worse with time, to the point where it halts development entirely and the whole team's effort needs to be put into refactoring and rewriting (both of whom also deserve their own threads in the future).
To put the idea in the form of a metaphor, imagine you set out to sea in two ships - one with a rudder being constructed and added in the port, and one without which can head out immediately. The rudderless ship might get carried on the wind for a while and make progress while the other ship is under construction, but sooner rather than later the need of a rudder becomes apparent otherwise you crash or go in a direction you have no purpose in going. Then the crew scrambles to add a rudder on the go, but it turns out the current structure of the ship doesn't allow adding a rudder without first modifying the hull of the ship (i.e. breaking existing features to fix issues in your code).
Meanwhile, the ship that set out to sea with a rudder already in place is steadily, methodically, and effectively making progress and soon overtakes the drifting ship that's undergoing major fixes out in the middle of nowhere. Its crew is not bothered by the lack of a rudder and can work on perfecting their control of the ship and adding more nice features like a brand new navigation system.
That's just a simple example of why (in my opinion) it's definitely worth delaying the actual coding and focusing on design first. Sure, the design might need to change and evolve as time goes on, but it's certainly better than having no design at all and having to deal with all of the disjointed pieces of your software not working well together because they followed no unified 30,000ft perspective of the whole purpose of the project.
Naturally, this needs to be a judgement call and depends from project to project. As Martin Fowler says on his website:
The way I see it, in general for smaller projects where you work with exceptionally tight deadlines and have no time to develop features (i.e. customer-facing POCs, university projects, etc), perhaps it's worth considering going without an initial design phase. That, however, should be done only if you're confident you have enough quality talent on your team, and they know how to work together. There's danger even in that scenario, but sometimes, as we know, the industry pushes us and we have no choice.
What are your thoughts on this? When do you prioritize design and when do you tend to skip it? What are your ways of dealing with accumulating tech debt in projects that have no overarching design? Do you have any interesting stories that fit well into this conceptual framework?
Code on, fellas.
With love,
Nydex
Quite a long time ago (nearly 2 decades), Martin Fowler came up with a cool name for a concept in software engineering that I very much tend to agree with - the Design Stamina Hypothesis. It's annotated as a 'hypothesis' precisely because it can't reliably and objectively be proven true, nor can it be proven false.
In general most developers, myself included, judge this kind of concept based on intuition and feel, on the basis of a certain amount of experience working on projects falling on both sides of this hypothesis. Fowler describes it as the comparison between velocity of progress in a software project with good design versus one with no design at all. This graph, taken directly from his website, depicts the concept quite well:

It plots two projects - one with good design (red line), and one with no design (blue line) - and showcases the relationship between cumulative functionality and time in development. A project where no time or effort is spent initially on design naturally moves faster in the beginning. More features are being developed in that period of time compared to a project that has spent its first weeks (sometimes months if it's a bigger concept) in the design stage and no code has been written yet.
However, at a certain point (the design payoff line), the velocity with which new (quality) features are being added diverges greatly. A project that has been set off with good design in mind can follow that structure in an organized and time-efficient manner, resulting in a much larger amount of stable features being developed. On the contrary, a project with no design at all hits a major obstacle quite early in development - tech debt. It's a concept that deserves its own thread, which I will honor it with in the future.
As a result, designless projects quickly start deteriorating and become harder to modify and maintain, drastically slowing down the addition of new features. Without a designated portion of effort being put into clearing tech debt, the problem evolves and becomes worse and worse with time, to the point where it halts development entirely and the whole team's effort needs to be put into refactoring and rewriting (both of whom also deserve their own threads in the future).
To put the idea in the form of a metaphor, imagine you set out to sea in two ships - one with a rudder being constructed and added in the port, and one without which can head out immediately. The rudderless ship might get carried on the wind for a while and make progress while the other ship is under construction, but sooner rather than later the need of a rudder becomes apparent otherwise you crash or go in a direction you have no purpose in going. Then the crew scrambles to add a rudder on the go, but it turns out the current structure of the ship doesn't allow adding a rudder without first modifying the hull of the ship (i.e. breaking existing features to fix issues in your code).
Meanwhile, the ship that set out to sea with a rudder already in place is steadily, methodically, and effectively making progress and soon overtakes the drifting ship that's undergoing major fixes out in the middle of nowhere. Its crew is not bothered by the lack of a rudder and can work on perfecting their control of the ship and adding more nice features like a brand new navigation system.
That's just a simple example of why (in my opinion) it's definitely worth delaying the actual coding and focusing on design first. Sure, the design might need to change and evolve as time goes on, but it's certainly better than having no design at all and having to deal with all of the disjointed pieces of your software not working well together because they followed no unified 30,000ft perspective of the whole purpose of the project.
Naturally, this needs to be a judgement call and depends from project to project. As Martin Fowler says on his website:
The hypothesis has a corollary, which comes from the design payoff line. If the functionality for your initial release is below the design payoff line, then it may be worth trading off design quality for speed; but if it's above the line then the trade-off is illusory. When your delivery is above the design payoff line neglecting design always makes you ship later. In technical debt terms it's like taking out a loan but not using the principal for so long that by the time you use it you've paid out more in interest payments.
The way I see it, in general for smaller projects where you work with exceptionally tight deadlines and have no time to develop features (i.e. customer-facing POCs, university projects, etc), perhaps it's worth considering going without an initial design phase. That, however, should be done only if you're confident you have enough quality talent on your team, and they know how to work together. There's danger even in that scenario, but sometimes, as we know, the industry pushes us and we have no choice.
What are your thoughts on this? When do you prioritize design and when do you tend to skip it? What are your ways of dealing with accumulating tech debt in projects that have no overarching design? Do you have any interesting stories that fit well into this conceptual framework?
Code on, fellas.
With love,
Nydex