When a new team and projects starts there are a lot of things what should be agreed together. There are general practicalities and as well technical things which are affecting team's daily work. This article is focusing more technical things what should be agreed as a team before team starts coding.
What is team's working agreement and why you need it?
Team's working agreement contains jointly agreed guidelines how we work as a team and what kind of processes we utilize during the software development. The main focus of working agreement is to build and strengthen team's culture and create a unified way of working. Unified way of working in this context means processes and as well as technical things which align the coding. Unified way of working aims especially to increased quality, productivity and scaling benefits. When this framework is setted up it will help to scale and on-board new people to the team more easily.
Team's working agreement
Every team has own way of working and this article describes one suggestion about what things you should agree. Working agreement is not something which will be set in stone and then you can forget it. Team should check working agreement's state every now and then in the spirit of the continuous improvement. Team should agree how and when way of working related things should be evaluated. Especially retrospectives are good moment for that evaluation.
This article has got a lot influence from my recent experience when we agreed these things together with a new product development team. Article presents 6 main principles in a high level what we agreed.
#1 Agree operational model
Operational model determines how team structures the daily work routines. There are multiple factors which align the selection of the operation model like ex. people, nature of the project/product and stakeholders. Operational model is usually based on Agile frameworks (Scrum, Kanban etc.) but it can be waterfall as well.
Operation model aims that team has a common way of working which is transparent, supportive, iterative and encourages to knowledge sharing & continuous improvement. Operational model is one part to create team culture.
#2 Agree technology stack
Each member of the team has different kind of technology related skills & point of interests so it's important to recognize them in a team level. Technology maturity assesment is a one tool to evaluate current skills of the team. Assesment can be a survey which has list of different kind of technologies and scale. Technology maturity assesment is an important tool if team members don't know each others skills and interests before.
Jointly agreed technology stack of the team aligns daily work but it's also kind of a communication tool to other teams and people in the organization. Team's preferred technology stack must be also compatible with company's high level guidelines (Enterprise architecture) to verify that everything works smoothly in the big picture. It's important to frequently discuss in the team about technology stack and evaluate is up-to-date or not.
#3 Agree reference architecture
Team is usually working with one piece of the big puzzle where all pieces are tightly or loosely coupled. From the architecture point of view it's important to ensure that our piece fits nicely to the puzzle. System architecture (=one piece in the puzzle) must be adaptable, scalable, fault tolerant, jointly agreed and understandable for all team members. There is no point for fancy architecture which is not understandable for all. Jointly agreed technology stack provides tools to fulfill architecture requirements.
Reference architecture aims that all components owned by the team are built with using jointly agreed principals and rules. Typically reference architecture contains multiple levels like:
- Cloud architecture and governance
- Integration and API architecture
- Data architecture
- Internal application architecture
#4 Agree preferred way to produce code
After agreeing operational model, technology stack and reference architecture it's important to concentrate more details which are related to producing code. Jointly agreed coding guidelines and processes are aiming to increased quality, productivity, code readability and maintainability.
Definition of Done is a tool which determines jointly agreed standards and requirements which must be filled that individual user story or bug can be marked to done. Each team should determine their own definition of done.
Definition of done can contain technical as well as more process related requirements. Defined definition of done can look like this:
- Acceptance criteria is filled
- Functionality tests are passed and tested by other than developer
- Unit or integration tests have been created
- Code is peer reviewed and follows jointly agreed standards
- Infrastructure is created with code
- Deployment is automatized with DevOps pipeline and pipeline is created with YAML
- Monitoring and alerts are configured for solution
- Implementation is documented
#5 Agree delivery strategy
Delivery strategy determines how team delivers new versions of the application using automation to the production and what kind of DevOps practices are used to fill all quality and security requirements.
Typically changes can be delivered to production in continuously or in specified release cycles like two times a month. Continuous delivery means that changes are updated to the production with high frequency even multiple times per day. Continuous delivery enables better risk management because changes are smaller and changes are deployed often so team gets feedback in early stage.
#6 Agree how to ensure operational excellence in production
Every team wants to keep customers and stakeholders happy so team's duty is to ensure that production environment is working all the time. It's a fact that every system sometimes has unexpected error situations and team has to be ready to those situations. Working agreement should determine tools and patterns how team ensures operational excellence in production.
Typically this means that team determines mechanism to monitor application/service availability and enable alerts about unexpected errors.