> My heart goes out to the people I overhear at work, the ones who are struggling the most, lamenting and complaining that tool X (In this case scala) is “so” embarrassingly awful and, with the implication that it’s to blame
Yah, I have noticed lately a division between two types of programmers.
The first is the "infrastructure oriented" programmer. They assume that the rank and file programmers will be expected to write bad code. They look at problems in the codebase as a sign that there is a missing piece of infrastructure. They 1) wait for the pain level to get high enough on the team, 2) identify a class of problems that is not getting solved well, 3) install or implement a new service/middleware/library that solves that class of problem elegantly, and 4) port all of the crappy code over to the new reality.
The second is the "pattern oriented" programmer. They assume that sloppy code will create areas of rot around it that become cost centers, and that "low hanging fruit" cleanup tasks will generally pay for themselves. When there are problems in the codebase, they go back and refactor. They advocate for team discussions of patterns, establish precedent for the team to follow, and expect other members of the team to learn and apply those patterns correctly.
I'm not really sure whether these two types of programmers should work together. Each group's primary assumption:
1) Programmers will inevitably do sloppy things, and'
2) "Low-hanging cleanup" pays for itself
... is correct in practice. The problem is they are somewhat at odds in terms of pointing to a high level strategy.
If you are committed to ripping out and replacing large parts of the codebase when they become unworkable, there's not really any point to trying to keep up with tidying.
And if you tidy, you won't really need to rip out large parts of the codebase.
So maybe we should just each try to find a team that fits with our values, rather than argue about it.