Responding to this post Why software design matters • Buttondown
Professor Jackson asks why software designers focus more on cool new features rather than fixing serious design issues with their existing software that would be more beneficial to the company in the long run.
I think there are many aspects: technical, organizational, and psychological.
From a technical perspective, our tools are often easier to use to build new systems rather than maintain existing systems. And because of the current state of programming, our systems tend to grow large quickly, making their maintenance harder.
From an organizational perspective, are employees rewarded to ship new visible features or fix conceptual bugs? Are employees rewarded for finding these conceptual bugs? I have worked at companies who value conceptual integrity and have processes in place to ensure it is maintained across all their software. But this is rare in the industry.
Finally, I think the psychological aspect is the most interesting but may be the hardest to fix. I think most software engineers have a tendency to prefer solving well-defined bounded problems rather than exploring and identifying real problems to solve. It is more comfortable to think you know what problem you’re solving rather than having to be curious, make hypotheses and test them.
For the same reason, I believe that many software engineers don’t like debugging. They can’t start debugging assuming they know what the problem is. They understand that they will have to make observations, make hypotheses and test them. Once the real problem is identified then the work of fixing it is often a smaller part of the process.
When building new software, we’re not forced, like when debugging, to deal with the existing problem. So we prefer assuming we understand the problem and go on to the fun part of making something.
Software design, and concept design in particular, matters because it allows software designers to make those high-level hypotheses about the problem they’re trying to solve, test them, and iterate on them. Because of our current tools, we can’t wait for the whole system to be built to be able to test it.