Ask HN: How do you approach designing and implementing software?
Very curious to get some new perspectives on approaching software design.
Very curious to get some new perspectives on approaching software design.
Unknowingly, I self-aligned with what in India is known as the Jugaad work culture [1]. Jugaad favours extension by addition over modification. I combine Jugaad with a growth (software grows almost uncontrollably) & pruning (refactoring) complementary-phase.
In the growth phase, I build processes and software architectures that can be changed by adding something on top of the exiting system rather than modifying or removing. Test-driven-design helps me with the right decisions. I don't obsess over clean code, the test pyramid or documentation in the growth phase. Tests written in this phase serve either as a work bench (I need to run a piece of code often and don't want to wait for a deployment or server to start) or as a guard against regression. I want to move forward as quickly as I can before the bad design decisions I just made catch up with me.
In the pruning phase I refactor the code I wrote, add tests, write documentation, replace hard-coded values with configuration etc.
The reason for the two phases over a single continuous phase is that I observed a distinct summer-winter duality in projects where some times projects seem to teem with life and in others they are stuck waiting for decisions. Or put in other words: the immense pace at which Jugaad allows you to forward a project forces backpressure against business which then needs to "collect its thoughts" and gives you time for the pruning phase.
And if time/money is tight: common environment, smoke tests, then containers, then end-to-end tests, then everything else.
[1] https://blog.georgovassilis.com/2020/09/13/draft-jugaad-take...