1 Care about others productivity
Treat other devs as clients and make your code easy and accessible for others to work on as possible. Being clever in code isnt worth it if others cant understand it.
How can we insure others can be productive with our code?
- Write well defined API
- Write tests for your code so others can use it with confidence
- Writing business logic summaries. This helps others understand the problem you where solving.
- Write technical detail summaries. This will help others understand why you chose the technical solution that you chose.
2 Make it easy for everyone to impliment their best ideas
Everyone should feel they have room to solve problems the best way they know how without asking for permission. Sometimes the wrong policies and standards can choke creativity and original thought. We must avoid this, and encourage every one to bring their best ideas to the table everyday.
Note: Policies and standards are important, but cannot jeopardize creative and original thinking.
How do we insure everyone impliments their best ideas?
- Build applications using a microservices pattern so small teams can choose the best technology to solve their problem
- Manangers should as much as possible be outcome focused rather than policy focused
- "Innovate or die" should be repeated once a day
3. Work 40 productive hours rather than 60 stressed out hours a week
How do we avoid stress? How do we keep our output high and only work 40 hours?
- Write tests
- Deploy often so the only bugs we have are small
- Write code that explains itself
- Impliment a monitoring strategy
- Create play books for when things go wrong
Technical Practices which will help us acheive these goals
1 Prefer to use One Language for everything
Its difficult to become an expert at 1 thing. It is much more difficult to become an expert at 5 things. If it is possible to write in 1 language, we should. We accomplish this with:
- Andriod - Javascrip (React Native)
2 Test everything
When a codebase is not tested, it becomes scary to refactor or improve. You might break something without knowing it. When a codebase is surrounded in tests, it is not scary to refactor or improve because you get instant feedback if things break. We accomplish this with:
- Frontend Unit Tests - Jest
- Frontend Integration Tests - Jest
- Backend Unit - Jest
- Backend Integreation Tests - Jest
3 Document everything
People are more productive when things are documented. New people become productive more quickly when things are documented. We accomplish this with:
4 Modularize everything
"Write programs that do one thing and do it well" - Peter Salus. We accomplish this by:
- organizing our backend code into microservices with the Serverless Framework
- organizing our frontend code into React Components / Containers
5 Always prefer leveraging existing services
"The thing that distinguishes the best, fastest, most effecient engineering organization is how little code they actually write" - Joe Emison
Code is a liability, not an asset. Always aim to have less of it. Outsourcing as much undifferentiated heavy lifting (an auth service for example) as possible will help us write less code. We accomplish this by committing to the serverless architecture model, making it trivial to integrate outside services into our code.
6 Deployment Often
We accomplish this with:
- Serverless Framework attached to a CI Pipeline
- Deploy on each commit with Github Actions
- Deploy unfinished features by using feature toggles