all of their examples are pre ai anyway. it’s almost impossible to change a core data model thing without ai too.
all the legacy codebases I’ve worked in have very much been shaped by the original abstractions they decided on. as much as I wanted to change them, there wasn’t really a way to do so because of the scale and backwards compatibility requirements


most things should have an alternate implementation, just in the unit tests. imo that’s the main justification for most of SOLID.
but also I’ve noticed that being explicit about your interfaces does produce better thought out code. if you program to an interface and limit your assumptions about implementation, you’ll end up with easier to reason about code.
the other chunk is consistency is the most important thing in a large codebase. some of these rules are followed too closely in areas, but if I’m working my way through an unfamiliar area of the code, I can assume that it is structured based on the corporate conventions.
I’m not really an oop guy, but in an oop language I write pretty standard SOLID style code. in rust a lot of idiomatic code does follow SOLID, but the patterns are different. writing traits for everything instead of interfaces isn’t any different but is pretty common