ottonova has a long history of using cross-functional teams for Software Engineering. Very early on we tried to establish them to become more productive and product centred.
It took us a few tries to get it right and oh boy, did we make a lot of mistakes along the way.
I would like to share some of our learnings and put them into basic rules that everyone can use.
Not a band-aid 🩹
Don’t put the cross-functional team structure on top of something else.
Initially we structured our engineering teams around programming languages. We had a PHP/backend team and a JavaScript/frontend team. Both teams had a Team Lead, who was also the engineer’s superior. The teams had a backlog, sprints and were working quite smoothly. Then we put cross-functional teams on top of that. It didn’t work.
Suddenly we had conflicts of interest between the cross-functional teams and the old team structure. Everyone was confused what to focus on. The Team Leads didn’t engage with their engineers on a daily basis anymore. It was messy.
Clarity for everyone should be the first priority when you want to really establish cross-functional teams. No hidden layers, no hidden agendas.
Establish team culture 🗿
A great team shares a connection.
The easiest way to create a connection is to give the team freedom to establish a unique culture and identity. Everything starts with a name.
Give your teams the freedom to chose their own name and celebrate this name with an inauguration ceremony. Everyone in the group should well understand what their purpose and vision is.
Why was the team established?
What are our short, mid and long term goals?
How will we get there?
The more independent this process is, the easier it will be for the team to form a bond and feel connected.
Empower your team 💪
A successful cross-functional team feels empowered to take care of their value stream. They have to be the clear owner of their artefacts and have all resources at hand to complete their tasks.
Take for example a team that is supposed to take care of a customer facing app connected to a backend API. To maintain the app and implement new features without dependencies the team needs a minimum setup like this:
- Mobile engineers for the app (iOS, Android or JavaScript)
- Backend engineers for the API (e.g. JavaScript, PHP, GoLang or Ruby on Rails)
- QA engineers for manual and automated testing
- UI/UX designers
- Product Owner who takes care of stakeholder communication
- Team or Tech Lead
Every dependency to another team causes workflow delays and disruption.
A duo at the helm 🛶
A cross-functional team benefits greatly from a strong and well gelled Team Lead-Product Owner combo.
The Product Owner handles the stakeholder communication, collects the business requirements and pours them into user stories to fill the backlog.
The Team Lead takes care of the software delivery and people management. They unblock tasks, assign experts, make sure that tickets are completed with technical requirements and resolve personal issues.
The harmony of the TL-PO pair can be make-or-break for a team and should always be considered when assembling a cross-functional team.
Part of ottonova’s Software Engineering team since the very beginning.
Always on the lookout to improve our teams and to take the next step.
Clean code and KISS evangelist.