Sounds like valid issues to me. Pristine software isn’t the objective of most businesses. Leaving as a problem for another day, if we’re lucky that day will come, for many businesses, products, and startups it doesn’t and the shoddy prototype usually isn’t to blame.
I feel like SWE’s that make this gripe really need to step back and understand their role and the process for value creation. Because it’s certainly a process, the quality of code/architecture matters little if the low bar of functionality is met. Functionality can be sold to customers or used to test the market. It’s basically the whole MVP thing and the MVP should be a bit jank. If it wasn’t, you spent too much time/effort on it.
All said, there’s definitely some approaches to make it less jank from day one. Unfortunately, jankiness is a subjective metric.
It’s not about pristine software. Customers expect something that works. But changes will then be requested and the expectation is that the software will continue working. It’s hard to do that with janky code.
If you have a good architecture and keep good code hygiene, then velocity is easy. Without that, everything will slow to a crawl.
> If you have a good architecture and keep good code hygiene
That's a big "if" however - customers have a tendency to come up with requirements that aren't covered (or only covered in awkward ways) by the architecture you envisioned initially, while many of the well-architected parts will remain unused.
Then redesign the architecture. No need to go for a full rewrite as it can be done progressively. One thing I’ve seen is that people can be afraid to delete code, even if it’s not used anywhere.
> You will never get the chance of "customers requesting changes" if you never ship.
Why does good code imply never shipping?
Managers and Developers have different thresholds for “good enough to release”. The former are not the one on call for bugs or the one that get blamed for outage, but they are the ones that get praised when projects are completed quickly. Anything that’s past demo level is good for them.
I'm not saying they're mutually exclusive. I'm just saying that we can't expect them to come as a packaged deal.
For example:
Company A - janky code, ships quick
Company B - great code, ships quick
Company C - great code, ships slow
Company D - janky code. Ships slow
The average survival rate will be in the following order:
B > A > C > D
My point is company A will capture the market and iterate quicker than company C.
Company B is what you're probably thinking of , and what many people think they are building.
Company D is what most people are actually building.
Company C will win out in the long run over company B if they have capital and network.
I like this. It has a lot to do with the company building journey too. Some companies that I feel are probably the B types had a super clear product vision that quickly resonated with users. So the original architecture that fit their vision was probably easy to scale for the features that came as a natural progression of the product. Meanwhile, a company that builds a product and tries to pivot or found the original vision only partially what customers wanted, well these situations put you in the position where it’s probably easier to just force what you have to work for the basis of your iteration. Starting from zero is usually not as easy as it sounds. It’s more like you make a Hail Mary football pass, usually ugly and risky but can get quick results.
I feel like SWE’s that make this gripe really need to step back and understand their role and the process for value creation. Because it’s certainly a process, the quality of code/architecture matters little if the low bar of functionality is met. Functionality can be sold to customers or used to test the market. It’s basically the whole MVP thing and the MVP should be a bit jank. If it wasn’t, you spent too much time/effort on it.
All said, there’s definitely some approaches to make it less jank from day one. Unfortunately, jankiness is a subjective metric.