What makes a good engineering culture?
From http://www.theeffectiveengineer.com/blog/what-makes-a-good-engineering-culture
1. Optimize for iteration speed
- Continous deployment to support rapid validation
- High test coverage to reduce build and site breakages
- Fast unit tests to encourage people to run them
- Fast and incremental compiles and reloads to reduce development time
Bill Walsh, 49ers to 3 Super bowls,
Commit, Explode, Recover
A team crippled with indecisiveness will just cause individual efforts to flounders
2. Push relentlessly toward automation
Consider operational burden per engineer
- ratio of users to engineer
- radio of features to engineers
Automating solutions and scripting repetitive tasks are important because they free up the engineers team to work on the actual product
Easy’s motto of “Measure anything, measure everything” Automation must be driven by data and monitoring
3. Build the right software abstractions
MIT professor, Daniel Jackson
Pick the right one, and programming will flow naturally from design modules will have small and simple interface
new functionality will more likely fit in without extensive reorganization
Google, Jeff Dean and Sanjay Ghemawat
Keeping core abstractions simple and general
- reduces the need for custom solutions
- increases the team’s familiarity and expertise with the common abstraction
- common libraries get more robust
- monitoring gets more intelligent
- performance characteristics get better understood
- tests get more comprehensive
4. Develop a focus on high code quality with code reviews
Technical debt easily accumulate from poorly written code
5. Maintain a respectful work environment
6. Build shared ownership of code
Free engineers from the sense that they’re stuck on certain projects and encourages them to work on a diversity of projects
Swarm : The idea is that everyone on your team works on the same story at the same time
7. Invest in automated testing
Unit test coverage and some degrees of integrating test coverage is the only scalable way of managing a large codebase with a large group of people without constantly breaking the build or the product.