If you know me you know that is an important topic for me… I of course believe in being specialist/expert of a topic, but I also believe in being able to help each other when needed, but the question is:
- Are we happy to sacrifice a bit our personals technical wins for the good of the product/project and team?
Some years ago, when I was still actively developing I was what is called back-end developer, I have experience with C# and with PHP, and to be honest I was feeling more comfortable coding in those technologies that in any Front-end ones, why? Because during my journey as a developer I developed more those skills than the others, easy as that.
Even if I was feeling more comfortable with C# or PHP in the teams I worked with there was always other BE technologies(legacy projects) and also FE ones like JQuery or even native JS.
Actually, in the teams I was working with everyone knew JQuery, it wasn’t something really hard to take tasks where the main coding part was in JQuery, for me wasn’t a problem even if I was feeling more comfortable with the others as I already said, and if it was a task where some special knowledge was needed, maybe a different BE technology then I had to pair program with someone who knew about this other technology.
The industry has developed really fast, currently with a lot of different JS frameworks and also many different technologies more environment-related, call it Jenkins, Grafana, Kibana, Kubernetes and a big etc.
With this what I mean is that there are many technologies we could learn and master, nowadays there are many options out there, and it is just not possible to know how to code in each of them.
Imagine the following team SetUp.
In this example, you can see a variety of team members with different skills, in case you wonder, the colors mean the level of expertise.
- Green high.
- Orange medium.
- Red low or nothing at all.
The challenge here is how to transform all red ones in something close to orange, and all oranges little bit closer to the green ones… but is that possible?
First of all the teams have to be willing to it, when you work following the Agile values and principles there are some expectations we are supposed to satisfy, and the first one is to act as a team, putting the benefit of the team on front your own benefit as a professional, but wait, don’t get me wrong… let’s check the image of the team SetUp.
We can see only one person with high level of expertise in Docker, and only two persons with high level of expertise in some FE technologies, when I say that the team goes first what I mean is that if we need to create some knowledge in Docker, as a team we are going to have to do something to make sure our knowledge of Docker increases within the team, I’m not saying we have to be specialists, we have to be realistic, but we need to reach a level that will make the team be able to move forward if that particular person takes holidays or is sick, we have to create a resilient team!
Of course this has a cost, this is not free, but if your organization is committed to following Agile values and principles they will have to accept that this is a cost, and we will have to invest time because will get benefits in the long term, and to be honest, team members need to accept and understand that these are expectations they are gonna have, when doing team member performance evaluations or reviews this could be something to take into account, if a team member has been able to develop new skills during the lasts months this should be highly recognized because is not easy, requires time and energy.
And the same for the experts, are our team members less and less dependent on the experts? Sometimes I said the following about the experts, experts performance should be also measured by the ability of the people around them to take the decisions they would take as experts.
Levels of cross-functionaly
I have no clue if we can identify different levels of cross-funcationaly, but I made the following image that at least try to represent the cross-funcational journey.
The right side is the level of technical expertise of the team, what I mean here is, as more specialists we have within the team higher is the level of technical expertise.
And below we have the level of cross-functionality, as more resilient is the team higher it gets, this is the hard one… I think it’s “easier” to increase individual technical expertise than increase the level of cross-functionally, the reason is that to increase our level of knowledge of something we don’t need anyone, is in our own to do it, while being cross-functional is a team effort with high benefits on the long run.
How can we increase both levels? is there any practice we could use?
Let’s say that team acknowledges that is needed to develop some skills among the team, how can we start? my common sense tells me the following.
What I would do is to empower pair programming, we could identify within our sprint goal some strategic groups of pair programming, for example, if we need to develop a new component in React, let’s put together a person who knows a lot of a React and a person who is willing to increase the knowledge of React.
At the end of the sprint, maybe we could even empower the person who has been learning about React during the sprint to share with the whole team who was it, and which were the new learnings, this I think would put some healthier pressure on them, pressure on the expert to teach and explain well, and pressure on the learner to really understand and internalize the new concepts. The key is the following, as long as both are happy with it, and committed to it, there isn’t going to be a problem to do so.
I know I only talked about some FE and BE examples, but this also includes Testers, what I have seen happening is that if a team is composed by for instance 4 developers and one tester, the testers end up having a lot of tasks to test, creating a bottleneck.
When we talk about the cross-functional team we also have to include testers, a tester should be there to mentor and coach developers in knowing how to really assure the quality of something, performance risks, security issues, tests… is not just about the code itself, it’s also about how this code could affect the product as a whole, and how to make developers really hold accountable about the stuff that develope.
I could extend myself about that topic in particular, but I will do it in a post so I can extend myself about it.
Being cross-functional or not, of course is not that easy, but we should aim for a little bit more every time, creating the needed mechanisms to let the team be more resilient every sprint, a team which is resilient will be super strong and will take a lot of advantage in terms of speed and quality, we all know that nobody is essential nowadays, then let’s just create the needed environment to make it true.