During a recent “look back at the year” team call, some of my colleagues discussed a really insightful point about knowledge sharing. It was felt that perhaps sometimes there is knowledge out there amongst the teams that should be shared more widely than it is. I actually think we’re the best we’ve ever been at sharing information just widely enough to achieve balance. Does everyone really need to know everything?
tl;dr
Technical knowledge is easier to gain than Domain knowledge. Technical knowledge should be widely known, especially when it affects folks outside a squad (more on that name later). Good examples are the -ilities: security, supportability, traceability, reliability, performance-ility, etc. Domain knowledge on the other hand, can be owned and kept within a squad. A team that owns some business capability can expose a “contract” for interacting with their domains through software where needed/appropriate. If your team is working through a transition into this model though, it can understandably feel frustrating at times when some piece of knowledge has to be obtained in real-time because you’re stuck working on or with something that you’re unfamiliar with.
In full
Of course it’s totally correct that you don’t want low truck numbers where any one individual is carrying all the knowledge for “A Thing” on their own. In the distant past, we had a truck number of one for several systems. We didn’t have squads; we had a team of individual software developers, so the risk of someone leaving, being sick, or on holiday, was high, and the impact was worse. You’d think the solution was to force devs to work on unfamiliar things, engage in knowledge sharing sessions, or (shudders) – write detailed documentation. Success is never guaranteed with these brute-force approaches because when you optimise for going fast, you give work to the person who you believe will get it done quickest instead of someone else who’ll have to catch up first just for the sake of sharing the love. For some teams with a wide enough range of systems and domains of varying complexity, it simply isn’t possible.
So what is the solution? Well, Service Oriented Architecture gives you tools to solve this problem.
ASIDE: If you’re an experienced software professional thinking “Pfft!”, hold your horses – I get it. It’s not for everyone – it’s a tool that could help in some teams. It shouldn’t be implemented dogmatically out of sheer bloody-mindedness, and teams should even stop if it’s not working for them.
SOA (and it’s smartmouth younger cousin “Microservices” and wise-yet-hard-to-decipher uncle Domain Driven Design) aren’t necessarily technical patterns – they’re people patterns. They’re what you look to if your team gets to the point that you can no longer expect everyone to know everything, but have no idea or control over who knows what. It’s the “goldilocks zone” between only one person knowing any given fact (or learning it just-in-time), and everyone knowing that fact just-in-case. The idea is to minimise the coupling between humans and groups of humans resulting from a lack of information.
Yes, we initially adopted something of the Spotify Model for our teams, which is where the terms “Tribe” and “Squad” came from. I think I heard even Spotify don’t use the Spotify Model any more, but that doesn’t matter. If you’re stepping into a new model it’s good to have a starting point. Just make sure it is a starting point, and you evolve it to your needs through introspection. Be agile (not Agile). For example, there is the concept of “Chapters” in the Spotify Model, but we feel that technical Communities of Practice seems to solve the same problem without making you feel like joining a cult (or at least isn’t so on-the-nose about it).
Since domain knowledge is the hard-to-gain nectar that’s specific to your business that you want to look after, you want hard-core, small, tightly-knit groups of folks who understand fully grok small areas of the business really well. Yes, all the teams should share technical things like programming languages, software patterns and practices, how the CI pipelines work, how to do automated testing etc, but developers are good at learning technical things. You can gain technical knowledge from a few YouTube videos, but gaining domain knowledge is much harder work, and the sources are more limited.
How big should a squad be? You might be aiming for a two-pizza team. Smaller is probably better than larger, though be aware that if you have small squads and suffer an unusual amount of disruption to your team structure, they can struggle to cope with the loss of knowledge. I believe that with the aforementioned introspection and fine-tuning, it’s still a great way to approach the problem.
