Good points.
Our in house philosophy is to automate our way into the culture and process we would like to have. We rather have a process backed into our tooling instead of being written in some wiki file and slowly be ignored.
For example:
We are using our commit logs in many ways. The commit logs are an important way we communicate with each other and the system. For that we use pre and post hooks commits (one of them verifies you actually right something meaningful in the commit).
If a test is broken, a pre-hook commit will not allow any commit to the code repository unless it has the hashcode #buildfix in it. It verifies we implement the culture and process of "tests and #1 and without it we stop the world", it also sends a message to visual and audio devices in the office to let people know test are broken.
It gives us two things:
* Process: engineers are forced not by a manager but by the tools they wrote themselves.
* Culture: peer pressure. If the build is boken for a while other developers will ask the one that broke the build when will the build will get fixed since they are blocked. They might feel more eager to help the person if he's a juniur and needs help in figuring out the problem. It also creates a Pavlov effect, even if you're not blocked on a failing test you're disliking the connotation of the spinning lights as you remember what happened last time it happened to you. in practice, new engineers tend to break the tests more and without anyone telling them so, they very fast learn to reduce these events.
When doing commits we're also analyzing the patches (simple text parsing, really). If one added a business logic file and did not add a test file in the same patch then a nice email will be sent to all of of the organization, letting them know that "I (Eishay) had just committed code without appropriate test. I'm very sorry about it and I'll explain why I did it". The email includes the code that got committed. After one needs to explain the team about the mis-commit the lesson is learned very fast. This way we build a culture instead of forcing it, and most of the times the developers are writing their own tools that ensure quality.
We have many more examples like that (restricted apis, coding conventions and more) that reduce the need for culture training and preserving so we can focus on stuff that matter.
Another non automatic culture measures we take are to start weekly eng meetings with tests statistics (time they run, slow tests, broken windows etc), and we're doing post mortems all the time. Managers first and then the rest will openly talk about things they f**ked up, it keeps the team learning all the time and not be intimidated when they need to discuss their faults.
--es