Both of these problems – from what I saw – come from two different causes. The 1st – inexperienced developers who have no awareness to what these concepts mean. The 2nd – missing or lacking guidelines that define what makes a piece of software maintainable and operate-able. While decent code reviews and training plans can mitigate the 1st cause, they are usually insufficient as they cost too much or since the experienced developers also have a lack of knowledge, or since there are no guidelines in the group on how things should be.
When I built my development team – which was mostly composed of inexperienced developers I decided that I should define such guidelines for our team in a way that would help us improve. So after looking back at the problems I saw in the past and consulting with my peers, I concluded with to the below guidelines. While some of them are Java oriented, the rest are relevant for every Object Oriented project.
In the page named Operability & Maintainability you can find the insights I gained regarding those two aspects.