Dealing with "Coupling" is one of the things that makes SW a genuinely difficult activity. But I think Coupling is at least as big a deal for SW dev teams as it is for the software itself.
Coupling is an interesting idea, and there are many dimensions to it. I particularly like the @mtnygard model of coupling described in this video, and have been quoting it for years.
2/14
At its roots the management of coupling is, I think, one of the deep fundamentals of design. Skill in this is what differentiates great SW design, from average or poor design to a large degree.
3/14
I argue in my latest book that the ability to change our SW is the defining characteristic of its quality. Sure you need more, but if you can't change the code, the only alternative is that you have to get the 'more' by being perfectly right first time. Good luck with that!!
4/14
In SW though, there are ways that help us to deal with coupling that we are more familiar with. For example, #ContinuousIntegration allows teams to work on more coupled SW, by validating that our small changes don't break things.
5/14
Types in languages allow us to know where change needs to happen between more coupled bits of code.
All this is complex enough, but for people, teams and org structures, this is an even more complicated problem.
6/14
The classic response to "scaling dev" is to divide work into specialisms: Biz, architecture, UI, BackEnd, Testing, Ops and so on.
This builds a series of silos that EVERY FEATURE must pass though, this is a lot of people who's work is dependent, coupled, to everyone else's.
7/14
Progress is difficult, I can't write the code, until I have a UX design, I can't test the code until the devs tell me it is "dev-complete" and so on.
Worse, I can't improve the design, because the plan is based on the current assumed design.
8/14
One way of thinking about what agile development, based on small, autonomous, teams is really about, is that it is about distributing decision-making - decoupling for teams & orgs.
9/14
Great dev is very significantly about reducing the scale of change. Small teams matter because they are more independent (more decoupled). Small changes matter because each change is less entangled with others (more decoupled).
10/14
If your work relies on the work of other people outside your team, before you can make progress, your dev system would almost certainly work better if it was more loosely coupled.
11/14
Managing coupling is the foundation to scaling SW well, and to scaling software development too. Autonomous teams, who are responsible for the software that they create work best to scale, *because* they are decoupled.
12/14
One aspect of many aspects of this is covered in my current video, which describes one way to decouple a common over-coupled get keeping approach to dev, through non-blocking code reviews.
Thanks to @tdpauw for pointing them out to me.
13/14
You can read more about the role of coupling as one of the 5 techniques for managing complexity in my book "Modern Software Engineering"
14/14 amzn.to/3hKezti
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Agile isn't dead, but it is widely misunderstood and more unusual than most people think.
a #Thread
1/12
I have spent the vast majority of my career working in what today we'd call 'agile' teams and organisations, but I hadn't heard the term until 20 odd years ago.
2/12
'Agile', with a capital 'A', has become the commonest form of SW dev, but it isn't 'agile' in the sense of the agile manifesto, it does not, as @pragdave says promote 'agility'
Microservices are maybe not what you think they are, so here's a #Thread to describe them...
1/14
Microservices are distinct from Services, although they are commonly confused.
Services, as an approach to software design, have been around for many decades. Service Oriented design was popular in the 1990s and early 2000s.
2/14
The big difference is not the size, despite the name, it is the independence of the service from other services.
Most definitions of Microservices include:
Independently Deployable
Loosely coupled
Organised around business capabilities
Owned by a small team
We could consider languages, how computers work, OS commands, understanding of design techniques and tools like editors and IDEs.
We could think of the need to collaborate, reducing dependencies & coupling, and focus on outcomes, but there's something more important.
2/18
I think that if I am to pick one thing, one pice of advice, it is this:
I confess that I am not a big fan of "The Test Pyramid" so here's a #Thread on what I think is a better focus for your automated testing strategy...
1/14
The Test Pyramid is usually described as something like this, though there are lots of different versions.
I don't think this helps much.
2/14
Part of the problem is that it is nearly right, we'd like to invest in our test strategy so that there are lots of the tests that are easy to write and give us the fastest feedback at the lowest cost and fewer of the more complex, more costly, slower tests.
In this tweet @christofebert says "optimising for velocity is dangerous" in software development. The article that he references is behind a paywall, so I haven't read it, but here are some thoughts, and some evidence that counters this view.
As ever it depends on what you measure, what does "optimising for velocity" mean?
Velocity is speed + direction. In software terms, I assume that we mean that speed is the rate at which we can deliver software.
2/17
The DORA metrics call this: "Throughput", which is a measure of the efficiency with which we can deliver software.
Start by measuring your Cycle Time, from "idea" to "working software in the hands of users"
2/14
Now optimise whatever it takes to reduce your Cycle Time in a series of steps. Each reduction will highlight the next steps that stop you going faster. Work to eliminate those barriers!