I was able to attend the DDDEurope conference in Amsterdam with some people from the GumtreeDevTeam. After last year in Brussels, my expectations were quite high and I haven’t been disappointed 👍
Domain Driven Organization Design (Thomas Ploch)
I was personally drawn to this talk by the interesting title. I say “interesting” because Gumtree is currently going through a transformation and what we are trying to do turned out to be pretty similar to what Flixbus has already done. Thomas, Head of software architecture @ Flixbus took a very interesting look at complexity theory and adaptive systems. He started the talk by asking the question:
Can we derive some core principles to create organisations that inhibit the “Adaptivity” property from complexity theory?
It seems that a successful complex adaptive system (CAS) has the following properties: Self-Organizing, Emergent, Non-Linear, Having Order/Chaos Dynamics.
Let’s dive into each one of those individually.
Autonomy is key to enabling self-organizing behavior. Autonomy without direction will eventually drive any complex system into chaos. To avoid chaos we need attractors. An
attractor is a point within a system that drives agents close to it into a stable state.
I quite liked the analogy to the school of fish adaptive system. Each fish is an independent agent but they are all collaborating towards some attractor, for example not getting eaten by another fish.
For individuals that happens to be mostly around meaning, sense of purpose and moral.
Another really interesting role is that of the
change agents. They are those early adopters, the ones that can really influence other people and start a snowball by converting other people into change agents and get the critical mass needed for change to happen.
Now you might be asking what does a change agent look like? Well they normally have some interesting traits: Empathy, Ability to context switch, Knowledgeable, Challenge the status quo.
Emergence is a phenomenon whereby larger entities arise through interactions among smaller or simpler entities such that the larger entities exhibit properties the smaller/simpler entities do not exhibit.
Organizations are made up of individuals with very intricate connections and rich interactions between them that increases exponentially with the number of people. Some properties are extremely hard to predict simply due to the number and different nature of interactions but as leaders we can foster the right culture to make sure the right behaviors will emerge.
A really good point Thomas made during his talk was regarding experimentation and value potential exploration. It really needs to be a daily activity that drives learnings, new goals, outcomes and any changes we might need to compete and succeed.
Predictability in Complex Adaptive Systems is limited to global patterns rather than the chaotic local details.
The key poit here is to understand the full picture. What are all the different types of value streams the company is offering to customers and how they do function?
Value stream event model
Temporal sequence of events required to design, produce, and provide a valuable outcome, and along which information, materials, and worth flows.
One of the most interesting parts of the talk for me was the idea to use Event Storming to map the company value stream. According to Thomas they used this technique quite successfully across the whole company and at different levels. I have previously been involved in many event storming events (one of them with Alberto himself 😎) but I never thought about running a workshop with people outside of tech. I am very keen to try it out and will let you know of the outcomes!
Order / Chaos Dynamics
I really enjoyed the talk, it made me think and realize there is a lot more to learn about the topic. I am sure there are papers on CAS that could really help leaders around the world better understand the business itself. Change is inevitable we just need to deal with it. Having the right tools, mindset and thinking process is a great way to start.
Again, looking at the similarities, one day we might be able to model and simulate org structures and changes without actually implementing them. Without going through painful restructures and wrong setups, by simply trying them out on a computer we might find out the ability to deliver decrease. Or maybe the time to market goes down but quality become unacceptable. Or maybe…
Designing With Capabilities (Scott Wlaschin)
I was very intrigued by Scott’s talk, it made me think how powerful some concepts can be when applied properly during the design phase. I definitely want to try this out in one of our production services with the GumtreeDevTeam.
Scott started talking about security and design and how the two thing are related to each other. He came up with some interesting examples regarding configuration and then moved on to another example that I will focus on in the rest of this article. The concepts are pretty much the same.
The traditional approach, no matter if you use port and adapter or multi-layered architecture, is to have some data access layer that will give the rest of the application the ability to perform some operations. Think about something like the
userService it will most likely have some methods to retrieve a user but also something to update details or change password. By creating a service that can do many different things we are implicitly allowing every user of this service to do things they are not meant to do. Most of the times all you need is
getUserById and what you get is the ability to
changePassword. Don’t think about the immediate code you are writing, but the fact that the surface area is much larger than it should be hence giving more chance to be abused.
The concept of capability is really to give the caller the ability to do exactly one thing. No more. It is a bit like an interface with a single method in it. The great thing is that is most modern languages you can use functions for that.
Capabilities implemented using functions can be secure but also extremely flexible because functions can be easily composed. Going back to the
getUserById example you can :
- Provide a single use function. Once used it will return an error if called again.
- Implement some logging/auditing to know when or how the capability is used.
- Implement some rate limiting. You might want to make sure your service is not abused.
- Easily change the implementation for testing purposes.
An the list goes on.
Scott is definitely a good speaker and a great thinker. He inspired me to try out a different approach to designing service that will hugely enhance security and flexibility. Some people might object that this approach will generate a big number of classes / functions / objects but after all having a more granular access if a great benefit to have well worth the effort.