Eh, doesn't
necessarily mean they're bad programmers. I mean, obviously there
are congenitally bad programmers out there but these days, with the IDEs and 'tooling' we have, it's an awful lot easier to write basically good code. Easy enough in fact, that most genuinely intelligent people with an interest in learning and the right attitude can do it.
In my nearly 30 years as a programmer, I've created some really quite elegant, maintainable, extensible, thoroughly testable implementations with unit tests at or close to 100% test coverage, that were to all intents and purposes defect free, were scalable and performant and went live, if not on or before deadline, close enough as to make no practical difference.
I've also been responsible for some utter "hell on earth" ones too.
The difference? The existence (or in the latter case, a lack) of a culture of software craftsmanship.
Interestingly, those workplaces that had a good culture had humble but strong leadership in the technical departments. These leaders would stand up to the those in the company who would try to bully the implementation teams into cutting corners because these idiots (AKA sales people) had a wrong-headed belief that the projects could be delivered more quickly, if we did a poorer job. I'll always fall back to the Uncle Bob quote: "To go fast, you
have to go well".
The creation and ongoing support of that good culture (assuming the recruitment policy isn’t to hire people who struggle with tying their shoelaces
) is what makes good software implementations.
Now, high quality software architectural design (especially in real-time, distributed, high-demand systems), that's quite another thing. That requires some special smarts to get the most optimal design.
Which is why I leave that to smarter people than me!