Posted by & filed under XP.

Resistance is not futile. If you try to force change like the Borg, your efforts to help teams will likely be foiled. Even worse, if you succeed at imposing your desired change, you’ll destroy the very potential of those you’re trying to help. 

In my experience teams following Extreme Programming (XP) values and practices have had some of the most joy in their work: fulfilment from meaningful results, continually discovering better ways of working, and having fun while doing so. As a manager, I wish everyone could experience joy in their work. 

I’ve had the privilege to work in, build, and support many teams; some have used XP from the get go, some have re-discovered XP from first principles, and some have been wholly opposed to XP practices. 

XP Teams are not only fun, they take control of how they work, and discover better ways of working. 

Who wouldn’t want that? Where does resistance come from? Don’t get me wrong; XP practices are not for everyone, and aren’t relevant in all contexts. However, it saddens me when people who would otherwise benefit from XP are implicitly or accidentally deterred.

Developers discount XP based on misconceptions. Managers say they support collaborative working while simultaneously reinforcing incentives that demonstrate the opposite. Let’s explore sources of resistance to XP from developers, management, systems, and tools, along with how to help…if appropriate.

Paradox of Giving Control

One cannot coerce teams to take control. Control must be taken. XP Teams take control of and own their ways of working. Management imposed XP is not XP. 

Supportive managers have significant power to influence ways of working, but can only invite and encourage ways of working; coercion cannot create teams that take control.

Developers’ resistance to XP

Curiously, given XP’s origins, much resistance to XP ways of working comes from developers. Perhaps even more so than management. 

It’s not what we’re used to

XP practices are incredible, in the full sense of the word. Not only are they highly effective but it is often difficult to believe they will work well for you, until you’ve had the chance to try them.

Most developers are familiar with the open source development workflows that have gained popularity thanks to GitHub—Long lived branches, pull requests, individual autonomy and collaboration amongst large groups of people across many time zones. This way of working is effective for large open source projects but it’s not as effective as small teams can be at working together towards a common goal. 

Furthermore, many XP practices are both counterintuitive and require a lot of skill. TDD is hard if you’ve not had the privilege to work in a team skilled at it. Many folks say they practice TDD, comparatively few do or can. Ditto Pairing. Ditto CI. People think TDD is about writing “the tests” first, think pairing is about discussing code from time to time, and think CI is about test/build automation. Actually integrating your changes every hour, driving implementation from a single failing test assertion for the next micro-unit of behaviour, and working collaboratively with another person throughout the work are both hard and unfamiliar. 

Pairing conflicts with the popular understanding of “flow”, and stereotypes of introverted developer needs. Pairing requires skill at collaborating in real time. It feels less efficient because you’re shaping the design collaboratively as you go rather than hammering out your personal vision. It takes experience of good pairing to see how flow is improved by continuity, resistance to distractions, and focus on different levels of abstraction throughout. It takes experience of good pairing to see how it saves on re-work on review. It takes experience of good pairing to be convinced it’s fun, even for self-identifying introverts. 

CI conflicts with the popular experience with pull request workflows. It takes skill to break a change down so that you can make an integrable small step in less than an hour. It takes humility and compassion for yourself and your team to accept the overhead of breaking work down into such small steps. It takes experience to see how working in small steps with some overhead of crafting each step will save time in the long run with less rework or breakages. 

TDD is hard, perhaps the hardest of the XP practices to learn, it requires both expertise and also humility. The humility to accept that the design may end up better through working in smaller steps with continuous feedback, than it would through shaping it out first.

These factors often lead to bad experiences where people see more examples of misunderstandings  than good practices. This leads to misnomers like  “TDD couples the tests to the implementation”, “pairing is for extroverts”, and you must have CI on a branch

Developers’ resistance to their own understanding and experience of XP practices are not then wrong or surprising. They likely will be more effective with the ways of working they understand and have become skilled in, even if they’re at a local maximum, even if their team could be more effective.

Individual Autonomy is Glorified

Popular developer culture glorifies individual autonomy and preferences above all else. What helps an individual focus, get into flow, get most done, avoid distractions. Maximise flow, minimise meetings. 

Embracing XP values requires embracing what’s best for the team and the team’s outcomes; at the expense of individual freedom and productivity. 

This wrankles.

Pairing requires preceding at the speed of conversation, and often accepting a more emotionally draining way of working. Pairing requires agreeing on a common tech setup often involving tradeoffs from keyboards to editor of choice.

CI requires effort to keep your changes integrated with everyone else’s rather than blasting off alone.

In short it needs humility and a commitment to the needs of the team. 

The needs of the many outweigh the needs of the few. 

Management incentives that resist XP

Of course resistance to different ways of working doesn’t just come from developers, managers have even more influence. Even managers who think and say they support collaborative working may be oblivious to the ways they signal and support systems that demonstrate the opposite.

Rewarding and Managing Individuals

Do you have OKRs for individuals? Are you performance managing individuals’ outcomes? Do you build promotion packets for individuals based on their direct contributions to the company results?

You are incentivising individuals to avoid collaborating and maximise their individual visible contributions. 

There’s a paradox for managers that managing individuals and optimising individual performance undermines team impact. You lose out on the impact multiplier that teams can have.

Helping teams means switching from holding people accountable for output, to holding them accountable for behaviours. This is often uncomfortable; it’s easier to point at a number that’s not good enough, than have a conversation about behaviour that isn’t meeting your needs or the team’s needs. 

Short termism

Management incentives often conspire to maximise short term results. How much can we get done this quarter, this week, today. It requires effort to support sustainability and protect teams from self-imposed deadlines and urgency stealing their discretion to work collaboratively.

Lack of time discretion 

Can your teams choose what they work on day to day or is their time managed and tracked to project plans and budgets by armies of bureaucrats? Without space to adapt, nobody will.

Lack of Control

Does everyone have to use Jira? There’s your problem ;)

Is a team allowed to not plan every week? Can they choose to not have a standup? Can they work differently?

“But how will we track without standardisation?” You won’t. “How will we manage without metrics?” you have to have real meaningful conversations, not just watch numbers on dashboards that are comforting lies.

Teams need control over their ways of working to be able to uncover better ways of working.

Tools reinforce resistance to XP

The tools we use, and the language and metaphors they employ have a surprisingly big effect on our ways of working.

This impact was starkly visible when a team switched from having daily “standup” conversations from around a Jira board, to a freeform custom layout for their workflow on a Miro board. There was an immediate improvement to the quality of conversation around who needed to work with whom on what, towards which outcomes.

Not to pick on Jira (but it’s such a good example of a tool antithetical to agility) Jira encourages each “issue” (everything is a problem) to be “assigned” (not self organised) to an individual (not a group). The default board view focuses on the work and not the team.

Similarly Github’s UX nudges towards work in isolation, and asynchronous blocking review flows. Building porcelain scripts around the tooling that represent your team’s workflow rather than falling into line with the assumed workflows of the tools designers can change the direction of travel.

While completely compatible with collaborative team-working when used in the right ways, commonplace tools are source of friction to departing from the most common workflows. Friction nudges teams who are starting to explore working together back towards isolation. 

How to help overcome resistance

As a manager, or member of the team with sufficient influence, how can you help teams discover the joy of ways of working that you’ve enjoyed?

Should you?

It’s fundamental that a team is in control and owns its ways of working. That has to include ways of working that you think are worse. 

Help must be offered as a gift, not as a mandate to work in a particular way.

So how to help?

Don’t force it

Explicitly give control to the team and invite them to try new things.

Hiring

If you’re a manager you likely have significant influence over hiring. Hiring people with experiences you think will be beneficial into the team, can have an enormous influence on the team culture and effectiveness. 

However, transplants can be rejected. Beware risks of trying to transplant people you’ve seen succeed elsewhere in different team cultures. What worked elsewhere may not work here. People who were highly effective in other team systems may be ineffective here. Bringing someone who wants to work in a different way into a team may help transform things for the better… or make the existing team and the new joiner unhappy. 

Furthermore, teams that really take control of their work, also take control of hiring. Overruling team hiring decisions will undermine their trust that you genuinely want them to take control.

Share experiences  

What have you seen work? How did it play out? What pitfalls were there? Your team may not have experienced these things, at least share what you’ve seen with them.

Practise together

If you have the time, skills, and trust, getting hands on working with the team can help. Giving folks the experience of working with beneficial practices is a powerful tool. 

The counterintuitive/countercultural nature of some of the practices mean that the best way to understand how they help, is to see it in practice through working with someone experienced.

Coaching

You can help through individual coaching; asking the right questions and inviting people to discover better ways and why, themselves. Beware advising people to do things the way that worked for you, instead be curious, and ask how you can help rather than imposing your help.

Accountability 

A team deciding to try a new practice may never really give it a proper go. Pairing may be squeezed out by some of the management incentives above that they aren’t even consciously aware of. Holding folks accountable to behaviours they’ve agreed to try/change shows that you care and support them. 

Inquiring about dropped working agreements can help signal that you see them as more important than whatever contrary signals you may be sending, unbeknownst to you, through the wider organisational incentives. 

If you’re not a manager you can explicitly ask your manager to help hold yourself, the team and team members accountable to working agreements.

Explicitly Make Time available

Time pressure gets in the way of trying new things. Like the proverbial “too busy to try the wheels“. Try making time explicitly available through simple habits like “On Fridays we mob program”, “We start each morning reviewing code together”, or “We leave a week between planning cycles to try new things”

In summary

Teams practising XP can be highly effective and have great joy in their work. Paradoxically this can’t be imposed, its effectiveness is counterintuitive, and faces resistance from all quarters. You can help by sharing what works, inviting folks to try, and coaching. 

What else have you found that helps? 

Good luck helping! 

Posted by & filed under Leadership, XP.

Spoilers: it’s not about whether remote or office work is better.

The prevalence of return to office mandates has provoked much discourse and strong opinions. For good reasons. Return to office mandates can tear teams apart by pushing out people who cannot relocate, at huge cost.   

Working physically together, in the same space, as a whole team, can be extremely enabling. Supporting a joyful environment. Sadly, too many offices were (and remain) environments hostile to collaboration. Return to those hostile environments has been imposed on many.

It makes me sad to see people…

…forced to return to offices that are noisy, cramped, illness-spreading, collaboration-killing environments. 

…conversing over video chat from across the same open-plan office, because while they’re in the same space it’s not set up to help them collaborate.

…excluded from teamwork because the rest of the team is in another location.

…stuck waiting on pull request reviews from people they are sat right next to.

Most of all I get sad when I see ineffective teams with no ability or motivation to improve—whether remote or co-located.

For many teams there can be huge advantages to co-located working, but these aren’t it. Different approaches better support different people, different teams, different contexts. 

Return to office mandates can destroy the effectiveness of teams who have uncovered better ways of working by going remote.

Tearing your teams apart and undermining their ways of working are tremendously damaging. Fabled watercooler serendipity will not make up for this.

You’ll cause harm by forcing RTO on teams with cultures that benefit from remote. Please, instead, help your teams craft their best environment. 

Remote isn’t always Best

Many people are very passionate about remote work. Remote can bring inclusion benefits. Offices can bring communication bandwidth benefits. 

This claim crossed my feed this week:

Every successful company needs to have the most talented people. The most talented people no longer live in, or want to live in the same place.” 

This suggests that “acquiring” talented people is a zero-sum game. It’s not.

Rather, successful companies maximise what their people can achieve. One factor is indeed how talented the people who join are. Another is their pre-existing skills. Even more significant than these is the extent to which the organisation amplifies & accelerates, or impedes their abilities.  

Different organisations, and different ways of working, are more or less suited to make different individuals the most effective.  

Don’t Compromise

Mediocre teams compromise on their ways of working to avoid conflict; sacrificing their team’s potential on the altar of individual autonomy. 

Effective teams find ways of working that give themselves an advantage. They shape their environment to maximise their effectiveness. 

Mediocre teams compromise on their ways of working to avoid conflict; sacrificing their team’s potential on the altar of individual autonomy. 

Hybrid work policies can easily result in the downsides of being anchored to an office location, with none of the benefits that could come from having everyone together.

It doesn’t just happen with location. Individual preferences for working exclusively in certain parts of the codebase can result in nobody working together towards the same mission. People who feel they get more done if left to their own devices for days or weeks are often right, and it can also be true that the team as a whole is less successful.

It’s easy to avoid conflict and get stuck in mediocrity. Optimising for individual happiness can result in less of the joy that people find in teams that achieve great things together.

Optimising for individual happiness can result in less of the joy that people find in teams that achieve great things together.

If only effective collaboration had such an easy answer as asking everyone to come to an office. 

If you want to build up your teams rather than undermine them, start with curiosity about how they work. Invite and support them to uncover better ways of working for them. What helps them. Their preferences. Their lives. Their mission. Their constraints.

I’m privileged to have experienced working with many effective & ineffective teams & communities. Both in office environments and remotely, with a variety of collaboration styles.

I’ve experienced some of my most joyful work in teams working together in the same space. I’ve benefited from flexibility and inclusion with remote work. I’ve also been able to contribute as part of larger open source communities where I couldn’t even know everyone by name. There are plenty of reasons to be passionate about each approach. 

What I am most passionate about is teams finding the most effective ways to work together. Joy for the individuals involved. Successful team missions. Turning the constraints they’re working with to their advantage.

Beyond a Binary Debate

There are more options than just Office vs Remote. Distributed vs Co-located working is often conflated with Async vs Synchronous working styles. It’s not one or the other.

By Async I mean working independently. Coordinating via tickets, pull requests, mailing lists etc. 

By Sync I mean working together, on the same thing, at the same time—and not necessarily at the same place.  

Those who’ve experienced greatness at one extreme on this chart are often enthusiastic. Top-right and bottom-left have many proponents. However, bottom right can be glorious as well, and this seems to be less discussed. Fans of Async-Remote sometimes characterise Sync-Remote as being “unable to let go of the office”. However, I’ve seen it work tremendously well—often far better than the typical office space allows. 

Teams often compromise somewhere near the middle. A hybrid of workplaces and work-ways. Accommodating a variety of preferences and needs. 

The best teams I’ve seen move towards an edge and find a sweet spot. You can imagine a third dimension of effectiveness. With a pit in the centre.

Office and Async — Escape the Tragedy

I’ve not found a scenario where this quadrant is better than an alternative, despite it being, in my experience, the most common for most “teams”. Where teams are acting more like a mere convenient grouping of individuals than a collective with a common mission.

Don’t suffer and merely survive, aided by your noise cancelling headphones.

This scenario often arises through compromise on ways of working that are the least objectionable to everyone in the team. In contrast, better ways of working tend to arise from finding what works and turning it up to the extreme.

I’m interested to hear from you if you have seen a team better off in the Office & Async quadrant than they would be in another.

If you’re stuck in this quadrant, and you’re not finding it joyful, consider a move to another. Don’t suffer and merely survive, aided by your noise cancelling headphones.

Option 1: Move remote, to get the true benefits of Async 

If you have the luxury of working remotely, and you prefer working asynchronously, then remote will open up lots of benefits.

You’ll avoid commutes. You’ll enable hiring from anywhere, including a wide geographical spread, making it easier to hire great people. You’ll increase timezone coverage for progress that never stops and improve operational coverage. 

Option 2: Move together, to enable Sync

If your team are all spread out within the same office, bring your desks together. Control your space as much as possible. Use the wall space. Separate your area with whiteboards / soundproofing.

If this isn’t possible, consider booking meeting rooms out where you could go to work together. It’s amazing how infrequently large meetings get questioned. Whereas making small changes to enhance the space you’re working in sometimes alarms bureaucracies.

Working in the same space will enable ad-hoc discussions. It facilitates pair programming with regular rotations. You can make the things most important to you visible in the workspace. You’ll also overhear opportunities to help each other.

Option 3: Move remote, to enable Sync 

If you can’t move your desks but have the luxury of working remotely, you could move to the bottom right to make collaboration easier. Then try some of the ways of working mentioned below.

Remote and Async — Open Source Style

Many of the best ways of working in this quadrant have emerged from the ways that distributed open source communities work. Pull requests. Mailing lists. Decision frameworks based on written proposals. 

This style enables large groups of people to collaborate effectively to achieve large things. Often larger than a traditional team could achieve. Sometimes at the cost of speed of decisions. 

Office and Sync — XP Style

Extreme Programming Practices are a great starting point for office & sync. Then experiment and iterate towards what works best for you.

If you have the luxury of being in the same space—be in the same space. i.e. get your desks together. Get big desks so you can sit and work together. Customise your space to be informative & facilitate collaboration. Track things on the walls. Keep living diagrams on whiteboards. Put up big displays with production metrics. 

Remote and Sync — Learn what works

Less has been written about this quadrant. Kent Beck wrote this article recently which partly inspired this post. 

During the pandemic I saw several teams stuck in the Async-Colocated quadrant discover the benefits of collaborative practices. 

re-discovery of XP practices unimpeded by hostile offices

Teams stuck working as isolated individuals within the same office were freed. Absent the noisy office environments where they were artificially separated, they could start working together, in a remote-first way. 

Teams discovered new ways. These included re-discovery of XP practices unimpeded by hostile offices.

Eliminate wasteful Meetings

I saw teams inverting what they used synchronous time for. Things they did together through mere habit, like status updates for stakeholders, became async. Boring meetings of status updates that could be slack messages became slack messages. 

Instead, sync time was protected for actual collaboration. The higher cost of sync time when remote due to lower bandwidth incentivised using it more wisely. 

Always-on Zoom

An always-on video call for teams allowed people to drop in and out to work with each other and catch up on work others were doing in parallel. Analogous to a dedicated team war-room in an office. Without the bureaucratic hurdles to setting one up. Nor the challenge of competing with nearby teams for noise.

Dashboard Nudges 

Automated daily screenshots of dashboards with team KPIs. Regular snapshots sent to teams’ Slack channels replaced the physical TVs from the physical office. These nudges provoked conversation, increasing awareness of both the success of features, and production risks. 

Team Games

Opportunities to relax and have fun together needed to be intentional. Web based multi-player remote games were a go-to for several teams.

Virtual Whiteboarding

Discussions and brainstorms sometimes worked even better than their in-person alternatives. Unlike physical whiteboards, in virtual space there’s no problems with everyone crowding around. Nobody can hog the view. Everyone can participate at once. Not to mention saving a fortune in post-it notes. 

Pair Programming 

Pair programming works well when remote. For many teams it works better remotely; their office environments being so hostile to in-person collaboration. No longer having to compete with the din, pairs could focus.

Communication bandwidth isn’t as high as in-person, but the tooling to work together remotely has come a long way. Tools like VSCode Live-share, and Tuple make working together a breeze. Tooling like mob enables fast handover.  

Continuous Integration

True continuous integration (integrating to main multiple times per day) is even more valuable when you don’t have the opportunity to overhear what others are working on.

Serendipity is not a Strategy

All quadrants benefit from intentionally defining and writing down ways of working, rather than relying on accidental interactions and happenstance in an office.

Don’t rely on watercooler moments.

If you want folks to have unstructured conversations from which new ideas might emerge, create those opportunities intentionally. There are lots of mechanisms to increase luck and the chances of useful conversations occurring. e.g. No-pre-planned meeting days. Blocked lunch breaks. Group volunteering. Team meals. Quarterly Offsites. Retrospectives. 

Look for what’s working for your team and turn it up. Try changing things and uncovering better ways of working!

Posted by & filed under Leadership, XP.

Cycling provides interesting examples for software development. It’s possible to race individually or in teams. A group that’s an effective team will outperform the same group acting as individuals every time. Teams compete towards a goal, and also against the environment, and many other teams, all with their own tactics, all at the same time. 

Ensemble working provides an Advantage

Cycling teams working together in a paceline can travel significantly faster—via the aerodynamic advantage of drafting the slipstream of the rotating leading rider. 

Software teams can build more stuff if each person works independently, than when working together. However, they’ll reach a team goal the fastest through working together, on the same stuff, at the same time, via pair or ensemble programming

Having all the perspectives, experience, and expertise available at the point of meeting resistance from unknown challenges, results in a sort of aerodynamic advantage. We get stuck for less long, and overcome obstacles more easily. 

A pair may not be twice as fast at shipping stuff as two people, but shipping stuff is not important. Working together they’ll achieve a goal a bit faster. Our goals have a cost of delay. The ability to ship a capability with associated revenue significantly faster, more than makes collaborative working worthwhile. 

Individual working provides an Advantage

Cycling teams are comprised of multiple people, they can send riders back for hydration & energy food. They can send riders ahead to mark breakaways and mitigate the risk of the breakaway succeeding at remaining ahead until the end of the race. 

Software teams that are paying attention, will see side opportunities & risks that are tangential to the main focus but too big to ignore. Often it helps for one or two people to go after them. Builds getting slow; someone peels off from the group to go fix that. Competitor launched a new product; someone peels off to explore how it works and whether should this change our plans.

Competitive Market

Unlike many pitch team sports where teams compete head to head, cycling teams compete against several other teams, at the same time. Each competitive team will employ their own tactics. Some teams may be more interested in overall win, or other incentives available such as intermediate sprints. Tactics have to take into account all the competition, not just a single opposing team. There are also environmental factors on the day such as wind and rain conditions, and the terrain. 

Organisations building software are competing against many other organisations with directly or indirectly competing interests. 

Sometimes it is advantageous to collaborate with the competition to conserve resources by working together. Cycling teams can work together to increase the chance of leading the race through a breakaway. Software builders partnering with competitors can build an ecosystem to grow the opportunity available to all parties.

Other times there’s an opportunity to get ahead of the competition by creating a break that your team is uniquely positioned to take advantage of.

Adapt to the riding conditions. Lightweight for climbing or Aero for flat. Wet or Dry. Similarly, as the economic climate changes, so do the tactics that are most successful for building software. 

Dynamic Reteaming to Breakaway

Working together, a breakaway made up of individuals from multiple teams can stay ahead of the race. They must take their own share of the hard work in the wind, and communicate effectively. If they refuse to help each other, the breakaway will fail, and will be absorbed. Breakaways often fail when competing incentives and ineffective communication reduce their advantage over the main peloton. 

There’s often a need and benefit to pulling together or self organising temporary short lived software teams. They can effectively chase an immediate goal that doesn’t neatly map to the existing team structure. 

Dynamic reteaming can be far more effective than dependencies between teams, and like a breakaway it can rapidly get ahead of what an unchanged organisation structure could achieve. 

Temporary teams also often struggle to communicate as effectively as a well established team; lacking the trust that comes from experience working with each other.

Marginal Gains Add Up

A clean well-lubricated chain could save you 5 watts, adding up to several seconds advantage over a race. Small tweaks to fitness training habits every day can add up to an advantage over a season. 

Software teams often underestimate how quickly small investments in their own effectiveness cumulatively create an advantage. Time spent making your deploy pipeline a couple of minutes faster, or time automating manual onboarding steps. The wins from these add up over time to help you outpace the rest.

Specialists 

You need specialists: climbers & sprinters. The rest of the team help get them in position at the right time for the challenges that they can best help with. Get your sprinters to the front of the race with a leadout in time for the sprints. Do the hard work to protect your race-winner’s ability to take advantage of a tactical opportunity when it comes. However, everyone needs to finish the race. Sprinters must be able to get over the mountains within the time limit.

Effective software teams have a mix of generalising specialists. They can all muck-in with whatever needs to be done towards the team goal. There’s also huge value to having the person with expertise in building UIs, the person with Data Science expertise, or the person who’s scaled databases. The right specialists enable help the team to overcome challenges.

Support Staff

Teams need support staff. If riders had to stop and repair their own mechanical issues, or carry their own food they’d be far slower. 

Engineering teams benefit from internal platforms, and developer experience tooling support functions. Invest a portion of your budget in these.

Beware Incentives

Unglamourous work is essential to team success. Teams are ruined if everyone tries to go for the win. 

Cycling teams need domestiques who will protect the leaders and fetch food. Software teams need people who’ll do glue work. People who help the whole team communicate. People who remove the friction slowing the team down. 

Organisational incentives often risk this essential work and destroy the potential of teams. 

Incentivise each of your riders to go for the win and the team will fail.

Incentivise each of your developers to chase promotions and compensation increases, on the basis of their individual impact, and your team will be ineffective. 

Incentivise each of your developers to chase promotions and compensation increases, on the basis of their individual impact, and your team will be ineffective. 

Work Sustainably

Pace yourselves. Only go all out when there’s a need for it, or you’ll not have the energy when it is needed. There’s a sprint at the end of the race. There’s another stage tomorrow. Don’t drop out. 

If you are successful, there will be production incidents and customer crises to handle. These will take your energy reserves.

If you run at 100% every day you’ll have nothing left to give when there’s a real need. 

Posted by & filed under ContinuousDelivery, Leadership, XP.

I was startled from my reverie by a shout, as this gentleman attempted to clear dawdling tourists such as myself out of his way. 

I watched with bemusement but resisted the urge to offer to help—knowing the eye-watering value of Murano glass therein.

He eased the precious cargo over one step at a time. The cart—heavily laden with boxes of fragile glass secured with a flimsy strap—wobbled precariously over every step.

The sun baked the scene in an intense 40 degree furnace, like the one whence the glass came. Bump. Wobble. Heavy breathing. Bump, wobble. 

Deliveries here are hard and risky work. Irreplaceable unique craft pieces, one mistake and they’re lost forever. 

Too many teams suffer through building software like this: crafting a big batch of artisanal changes. Loading up a big batch to deliver to customers. 

many teams suffer through building software like this. 

We suffer through risky deployments, fearful that any mis-step may lead to disaster. 

We optimise our delivery, each engineer efficiently delivering as much as possible; piling our carts high. 

We plan our routes using detailed road maps and follow them religiously, fearful of the consequences of deviating from the route we filed.

Sadly, delivery is an accurate metaphor for many teams’ approach to building software. Software development doesn’t have to be like this. Delivery is a poor metaphor for effective software engineering.

Software is not delivered like packages of pre-made goods. Software is crafted, nurtured, and discovered. Software is grown like a garden. Software is supplied like water or energy. Software is improved through experimentation like knowledge.

Delivery logistics can be optimised for efficiency & throughput. Software needs learning and discovery. Efficient delivery prevents outsized outcomes—efforts to eliminate wasteful deviations from plans limit teams. At very best they’ll achieve only the outcomes they were able to foresee in advance. 

Efficient delivery prevents outsized outcomes.
At very best they’ll achieve only the outcomes they were able to foresee in advance. 

Deliveries can follow planned routes along road maps. Software development is more like exploring an area with a sat-nav. You have a destination in mind but can adapt your route given unforeseen traffic conditions. You can choose to explore things that pique your interest along the way without losing sight of the goal.

Delivery is risky; if you destroy or lose a package it’s gone forever, you can never get it back. Software change can be made low risk and boring if we’re willing to invest in the technical practices, architecture, and tooling to make it so.

Delivery is done when the package reaches its destination. A software change reaching customers is only the beginning of the learning loop. What was the effect of the change? Did it do what we expected? Is there anything that surprises us in the impact on the rest of our production systems? Is it being used in the way we expected? What have we learned about the needs of our users to inform what we do next? Is it valuable or should we undo the change? What was hard about the change and how do we make it easier to do the next? 

Beware the influence of the metaphors we use upon the ways we think and work. The language we use affects how we act. We can do better than delivery.

Posted by & filed under Leadership.

“Strong” is often used as a metaphor for capable, competent, effective leadership. 

Strength is not always the most helpful metaphor for leadership skills. 

Listen to how people describe strong leaders, sometimes there are connotations at odds with effective leadership. Sometimes even hints of toxic masculinity. What does it say about our gender biases that we so often use strength as a metaphor for leadership effectiveness?

If you stopped pouring fuel onto the fires, maybe you would not need heroic firefighters.

What does Strong Imply?

Resilient?

Do you want strong leaders who are tough and resilient, who can withstand the pressures of the role… 

…or leaders who facilitate simple mechanisms to help the team handle big challenges

Do you need strong leaders who don’t need help? Is everyone else too busy to help? What’s causing that busy-ness? Is the lack of slack in your system precluding the possibility for collaboration towards better outcomes? 

Adding a leader who can handle more is a treatment for a symptom. The underlying disease may be incentives for high utilisation. Are you cramming quarterly plans full? Are you setting OKRs with goals to stretch beyond what you know you can achieve? 

Does this road need an extra lane to handle more cars? or a train, or a bicycle? The fix for your overload may need more creative thinking.

Powerful?

Do you need strong leaders who are powerful and can wield that power to achieve great feats? Why is achieving great outcomes so hard in your organisation? What’s getting in the way of folks self-organising towards the most important outcomes? What is disempowering any and every individual on the team from getting things done? 

Is it bureaucracy? What would happen if you removed all the rules? What if you gave everyone authority (with accountability) to spend money as they saw fit, and autonomy to choose what to work on? 

Is it fear of failures? Tackle the things causing it to be unsafe to fail rather than adding a more reckless leader. Praise people for saying no to things. Celebrate what’s learned from failures as well as successes. Reward humility and vulnerability. Bet on a team where everyone learns from each other’s missteps and comes to trust each other, over a team that avoids traps but never achieves greatness.

Is it perchance that your mighty leaders are not leaving space for others to step up?

Dispassionate?

Do you need leaders who don’t let emotion cloud their judgement? It sounds positive, but everyone has emotions; we are not Vulcans. 

Do we not want leaders who are sensitive to the emotional impact of decisions and events on those they have a responsibility to serve? As well as aware of how their own emotions are influencing their judgement.

Feelings exist and we ignore them at our peril. A rational decision is not rational if it leaves the team despondent, fearful, angry, or demotivated.

Decisive?

Do you want leaders who think they know better than their teams? The group is often smarter than any one individual. Do you want to limit your success to the limits of your leader? Why do you have a team if one person knows best? 

Do you want leaders who act confident in their own judgement? Or those who are open about their rationale, their intent, as well as the reasons their judgement could be wrong. Articulating intent enables the team to adapt in the face of new information.

Do you want stubborn leaders who need persuading to try something different? People who stick to their guns even in the face of evidence they may be wrong? 

What’s making it hard for the groups to make decisions without a decisive leader? 

Groups get stuck when there’s a lack of psychological safety: Are folks safe to express their opinions? Leaders who are quick to express their strong opinions undermine safety. A power imbalance adds friction to the voicing of dissenting opinions. 

Decisive leaders are not necessary for decisive teams. Groups get stuck when they think they need consensus, unanimity or permission, lacking mechanisms such as 

Inspirational?

If you need a leader to inspire the team to achieve great things, what’s destroying the team’s intrinsic motivation? 

Inspire sounds positive but has coercive undertones. 

A charismatic leader who inspires their team to follow them without dissent may be very effective; as long as their chosen destination is actually a good outcome. 

The organisation can lose its resilience and adaptability in the face of a leader whom folks blindly follow.

Visible?

Folks often want a visible leader so that people know who to go to if they want to get something done.

Good leadership is often nearly invisible. Tending to the systems. A quiet word of feedback here. Pointing out an opportunity there. Asking the right questions at the right times. 

Which of these organisations has a highly visible leader?

Which of these organisations is fragile? 

Different?

“We need a strong leader” implies “we need a different leader”. 

What is causing the current leadership (whether vested in a single person explicitly or distributed) to be inadequate?

Changing or adding one person with authority can be a quick fix, but isn’t guaranteed to work; especially if you don’t have a diagnosis that explains the need for a new leader. Do you really need a superhero to save you? 

What are your best hopes for what a new leader will do? What stops you doing those without them? 

Instead

Helping a team overcome its weaknesses requires an appreciation for weakness more than a show of strength. Being the strongest member of a team can even be a disadvantage.

We need leaders who

  • model vulnerability, being open about their weaknesses, limitations, and uncertainties.
  • build others up rather than hoarding power themselves. 
  • can adapt and help their team adapt to their context. Diagnosis and strategy over strength and power.
  • connect people, more than leaders who translate.
  • are curious about the options their team sees, more than they inspire action towards their preconceptions.
  • remove impediments to others making decisions more than they make decisions.
  • set examples with boundaries, protecting their mental health more than projecting invincibility.
  • disperse power instead of wielding power. 
  • tend to the systems that enable us more than using systems to control us.

Strength? Of a sort: Courage and humility. 

Reflecting

What’s behind your desire for a strong leader?

How strong is your organisation if you remove the strong leader? 

What mechanisms could make the group’s success inevitable, despite the fallibility of whoever is currently serving as leader? 

Posted by & filed under Leadership, XP.

Many software teams struggle with ever growing cost of change, and technical debt that risks overwhelming them. 

It’s always interesting to talk with folks and understand, how the system and incentives created this state. 

Often I hear from software engineers that management doesn’t give them permission for (or doesn’t prioritise) work such as tidying, refactoring, testing, observability.

Blaming management in this way may be accurate in many situations (they are indeed probably accountable for the system that created this outcome). However, the problem with blame is that it tends to short-circuit further thinking. How could the system be improved with the influence and control you do have, perhaps with minimal authority.

But what about from the management side? I often hear from engineering and product managers that they’re unaware, or learn too late, that folks were accumulating debt. It becomes visible when teams are no longer able to achieve goals.  

Management has a bad reputation in the tech community. I’ve been very fortunate to work almost exclusively with managers who genuinely care deeply about the people and teams they support; who want what’s best for them in the long term.

And yet, it’s still common, with the best of intentions, to create systems that result in unsustainable software development, and lots of technical debt. 

How does this happen? 

The risks are not very visible. If managers were given the option of twice as much this month, in exchange for nothing for the next 6 months, they probably wouldn’t take it (perverse incentives like annual bonuses notwithstanding). Would that it were so simple. 

The decks are stacked against sustainability. It requires active effort from managers to combat the natural incentives.

Here’s three practical ways you can help as a manager.

  1. Converse; don’t Coerce
  2. Encourage Healthy Habits
  3. Celebrate Sustainability

Converse; don’t Coerce

Get Curious

People will always want more than you’re able to achieve. Meaning we’re often starting from a position of saying no to lots of things that are very valuable; it’s faster to identify opportunities than it is to win them.

Most people don’t want to give bad news. Most people don’t want to hear bad news.  

This sets us up for miscommunication. 

<Manager> we need to do X this week
<Maker> Ok [unsaid: I’m going to risk a production outage by skipping testing]

If sufficient trust exists then it’s possible the risk will be vocalised, but the manager has not invited this feedback. Nor have they provided enough information for the maker to form their own opinion on the merits of the risk. 

It’s an instruction. There’s no curiosity as to what the impact or tradeoffs are, which shuts off thinking. 

It encourages risks. Some might infer an unsaid “…whatever it takes”. This could lead to taking risks such as skipping normal safety, or working long hours

It’s informationless. It’s a blanket “we need”. It doesn’t say what the value or tolerable costs are. The recipient has no information to make good judgements themselves with.

Things get a little better with even the slightest bit of curiosity.

<Manager> can we do X this week? 
<Maker> I think so [unsaid: cutting corners]
* next week *
<Manager> can we do Y this week?
<Maker> I think so [unsaid: that means they’ve decided not to clean up the debt from X]

At least the manager is now making it clear that there’s some degree of choice, although the power dynamic might make the choice seem illusionary

It’s a closed question. The manager’s likely to get yes or no answers. They’re not showing curiosity about the consequences of the team making X or Y happen. 

The manager is still asking the team to do things. Having to ask a team to do something is often a sign of a bug in the organisation. An organisational smell.

What’s stopping the team self-organising to the most important work? What information were the team missing to help them spot that X&Y were more important? What skills or perspectives are they missing to be able to make the best choices? 

Use Open Questions

Things improve further if we ask open questions:

<Manager> what would we drop if we tried to do X this week? 
<Maker> well we were planning on implementing the actions from last week’s post mortem, if we postponed those we might be able to do X.

or

<Manager> on a scale of 1-5, how risky would it be to release X this week? 
<Maker> Hmm, probably a 4, we’d not have any time to test or do a canary deployment so we’d lose our usual safety nets

Here the manager has asked open questions, and solicited information that might help make better decisions. Even if the manager then asks the maker to do the same thing, the risks have at least been taken more intentionally.

Prefer information over instructions

What if we didn’t ask the team to do X at all?

<Manager> I’ve learned that we could close a $n deal if we can ship X this week. 
<Maker> Hey that’s more than the total cost savings from what we were working on, let’s do X instead.

or

<Manager> I’ve learned that we could close a $n deal if we can ship X this week. 
<Maker> Hmm, but if we rush we risk breaking the service. Last time this cost us $10*n

However, this is somewhat optimistic. Even with all the information, people often have recency bias and eagerness to please. The power dynamic between manager and maker often exacerbates this.

Incentives conspire to eliminate slack time that would be used to keep development sustainable. 

Combining Curiosity and Information

<Manager> I’ve learned that we could close a $n deal if we can ship X this week. 
<Maker> Hmm, that sounds like a lot, I can get it done
<Manager> How risky is it on a scale of 1-5?
<Maker> Probably a 1, we’ve still got time to test it carefully. 
<Manager> What things are we dropping that we’d otherwise be doing?
<Maker> Oh we were going to refactor Y as changes in that area are slow
<Manager> Oh I thought Y was done months ago
<Maker> We shipped it months ago but have since noticed the design trips us up and we never have time to fix it with all these urgent opportunities.
<Manager> How much time has it cost us? 
<Maker> More than it takes to ship X just this month

Here the manager and maker have built a much richer understanding of the situation and tradeoffs. They are much better placed to make a decision than if the maker had simply been asked to ship X.

Encourage Healthy Habits

Team habits can help people escape the trap of needing permission from unsupportive or oblivious management. You will probably be unsupportive or oblivious at some point. Unintentionally coercing people is so easy. 

You can counter this by encouraging your team to adopt habits that will resist your efforts to coerce them into doing the wrong thing.

If your team practices TDD then you’d have to break a strong habit to encourage people to release a feature without tests.

If your team habitually drops everything to bring the build time down every time it creeps above 5 minutes, then they’re more likely to do the same even if you’ve asked them to deliver a feature.

If your team habitually prioritises work based on cost of delay, then they’ll likely ask you questions to find out the value before jumping on it. Even if you have omitted the information in your request.

Habits are hard to break. This can be a good thing. The right habits can add resistance to the forces that conspire to create creeping loss of sustainability. 

Celebrate Sustainability

If you publicly appreciate internal improvements you will signal for more.

If your only questions about the work are inquiries about when it will be finished, you’ll incentivise unsustainable working.

If your promo process only recognises features and customer impact, you’ll discourage sustainability.

Do you celebrate with the team as much when they halve their deploy time, as when the ship that flagship feature?

Do you thank folks for taking extra days to refactor and clean up the code?

Do you ask “how much more could we simplify it?” or “when will we be done?”

Do you ask “what if tried doing less?” or “how can we do more?”

Posted by & filed under Leadership, XP.

I’ve worked in and with teams who would identify as agile for many years. I’ve written about how I think the most interesting part of the agile manifesto is the “uncovering better ways” mindset. 

With this in mind, I’ve been pondering how the principles in the agile manifesto have aged. Where do (and don’t) I share the same principles. 

Given the “better ways” of developing software we’ve uncovered, can we “turn up the dials” on the principles as well as the ways of working? 

Principles tend to stand the test of time better than specifics. The agile manifesto still reads as an aspirational document today, but I think there’s room for improvement.  

Here’s my take on things I’d tweak in each principle; hopefully staying true to the values

Bettering Ourselves

Building working software is a powerful tool to achieve our ends. However, I wouldn’t consider it the highest priority of a team. If we can achieve our goals without software (which can be a liability) that’s even better. 

Moreover, if the software we’re asked to build is harmful for humanity, or counter to our organisational/personal values; avoiding that comes before satisfying the customer. The negative impact software can have on society is increasingly evident as more of our society is controlled by software.

“Bettering ourselves” (optimise for learning) is at the heart of agile to me. To borrow from Captain Picard, I’d state our highest priority as:

Our highest priority is to better ourselves, our organisation, and the rest of humanity. Continuous delivery of software is our tool to achieve this.

Learning we’re Wrong

We’re not passively waiting for requirements. We can take more ownership over our goals and understand customer needs ourselves. We’ve shifted from requirements to forming our own hypotheses of what customers need.

It’s not that requirements change, it’s our understanding that improves. We learn how we were wrong and adapt our goals in response.

We don’t need to build for a customer-proxy (stakeholder who wants the software). We’re can build products for people; they are our customers.  By meeting customer needs, we build a competitive advantage for ourselves.

We welcome learning that we’re wrong, even late in development. Changing our software in response to what we learn helps us meet customer needs and gives us a competitive advantage.

Continuous Delivery

The only thing worth changing in the continuous delivery principle, is that our tooling and platforms are so much better now than 20 years ago. We can deliver considerably faster and smaller.

A team can feasibly ship multiple times a day—given a good continuous delivery pipeline, reliable & fast tests, production safety net from canary deploys, and production observability. We’re no longer having to burn CDs with software builds.

Deliver increments to working software frequently, from a couple of hours to a couple of weeks, with a preference to the shorter timescale. 

All the Brilliant People

I’d replace project with product; due to the temporary-team fixed time/budget/requirements connotations of project.

I think longer lived product teams are more effective. I appreciate this won’t be for folks working in a project/consultancy context but I avoid those ;) 

I’d also expand to “all the brilliant people” as per Woody Zuill’s description of mob programming. Get everyone needed to achieve the goals together into the team, collaborating together every day. Minimising dependencies and handoffs.

All the brilliant people work together daily on the product. Developers, businesspeople, customers, designers, testers, ux, data scientists …  

Product Teams over Individuals on Projects

As per above, I prefer sustained investment in stable product teams over the project model.

Teams of motivated individuals build products. Give them the environment and support they need, and trust them to get the job done. 

Communication Quality over Efficiency

This is the only principle I feel like I’m watering down rather than turning up.

I think face to face conversation is still the highest bandwidth communication method. However, face to face communication is not always feasible for practical & inclusion reasons. Reasons such as geographic location, neurodiversity, family commitments, carbon footprints, and global pandemics! 

If face to face communication is infeasible then it’s not the most effective method of communication; even if it would be the highest bandwidth method.

I think the general principle is it’s better to trade off efficiency for quality of communication. Be willing to sacrifice time for better communication. You’ll save time in the long run. Prefer the highest bandwidth communication you can enable, even if it feels inefficient.

Prioritise communication quality over time efficiency. Learn the most effective method of conveying information to and within your team, for your context and each other’s individual needs. 

Results are the primary measure of progress

I don’t see working software as the primary measure of progress. We can ship oodles of working software every day and benefit nobody.

How are people’s lives enriched by our toil? How are our organisational goals furthered by our software? How is society better?

Have we achieved what we set out to? What have we learned from our experiments?

The less software needed the better!

The results of working software in production is the primary measure of progress. Get software into production early, starting with a walking skeleton.

Sustainability

I’d make the call for sustainbility more imperative. We don’t rely on static processes to keep development sustainable. It requires active effort and adaptation to combat the natural incentives in play.

We don’t go fast now at the expense of tomorrow. We strive to keep the cost of change curve low. 

Prioritise sustainable development over speed. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.

Technical Excellence

I find myself avoiding the words agile and agility since “agile” has become so semantically diffused it can create confusion.

Continuous attention to technical excellence and good design keeps cost of change low and lets us learn and adapt swiftly.

Simplicity

The principle of simplicity is timeless.

Diverse Teams

I’d add diversity to the description of teams that produce the best results. Self-organising teams with a monoculture are not going to produce the best ideas; there’ll be shared blind spots.

I think it can also be useful to expound on some of the things teams need to self-organise effectively.

The best architectures, requirements, and designs emerge from diverse teams that can self organise. Having the skills needed, clarity on their goals, with a high level of psychological safety

Double-loop Learning

I’d just add adjusting goals, in addition to tuning team behaviours. The most effective teams benefit from double loop learning. Learning-through-doing that our goals are wrong, or our assumptions when choosing our goals were wrong. 

At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behaviour accordingly, reviewing their goals based on what they have learned.

Your Team’s Principles

How do your principles differ? I’ve only thought about things I’d tweak from the manifesto principles above, not what I’d add. What would you add?

Posted by & filed under Leadership, XP.

What if we could visualise the cost of attrition?

Here’s a team. Someone leaves. We hire a replacement.
We get lucky and manage to find someone more skilled. Looks like we’re better off?

Really when someone leaves we lose all the relationships they had with the rest of the team as well. The team is a diminished more like 40% than the apparent 20% by their loss. It takes longer to rebuild the team than is apparent. Relationships take time.

It’s worse than that. The team probably wasn’t maximally-connected to start with. And it’s not just the interpersonal relationships that matter but the knowledge of tech and domain. A departure can break teams apart and organisational knowledge needs to be rebuilt.

Your organisation probably has multiple teams. Someone leaving your team reduces its connectedness to the rest of the organisation. Increasing the time to recover even with a swift new hire.

Internal mobility is less of a hit to the team’s connectedness due to pre-existing relationships. It also increases the whole organisations resilience by establishing more inter-team relationships.

Teams following the Isolated-individual model of work… (as opposed to collaborative work like pairing and collective ownership) …are particularly brittle & significantly impacted by staff churn.

How would we think about retention if we could visualise the full impact of someone leaving our team?

Beware looking at teams on a spreadsheet. If you have a hiring rate matching attrition rate it might look like the team health is maintained. It’s probably not.

Tracking tenure by team and average tenure in team can be interesting proxy indicators. Teams can be growing but have dropping tenure.

Bear in mind “All models are wrong, some are useful”. Sometimes teams benefit more from fresh ideas than the value of relationships lost in a change. Sometimes gaining someone who helps everyone else in the team form connections at a faster rate can accelerate the team.

 

This post is also available as a Twitter Thread

Posted by & filed under XP.

How many better ways of working have you uncovered lately?

This past year a lot of people have been forced into an unplanned and unwanted experiment. Many teams have had to figure out how to work in a remote-first way for the first time. 

I was privileged to be working in a team that was already distributed, making the transition for us easier than many found it. But adapting to work without office equipment was still new. 

Going without the offices that we were used to was uncomfortable in many ways. It was particularly difficult for those not privileged enough to have good working environments at home. 

While nobody would wish the challenges of the past year upon anyone, disruption to the way we were used to working, helped us uncover some better ways. Nothing groundbreaking. But some things were driven home.

Like how much easier video discussions are when everyone is fully visible, at the same size on the screen, and close-mic’ed. Better than the hybrid experience when part of the team are using a conference room with shared microphone and camera.

We also learned how bad our open plan office environment was for collaborative working. Compared with the experience of two people pairing over a video chat, each in their own quiet spaces.

We had some resilience because we were already distributed. How much more resilient might we have been, had we been more used to experimenting and adapting the ways we worked, safely.

The opening sentence of the agile manifesto doesn’t seem to be as much discussed as the values & principles. I think it’s arguably the most interesting bit.

“We are uncovering better ways of developing software by doing it and helping others do it.”

The Agile Manifesto

This brings three questions to mind that might be useful reflection prompts:

  1. How many better ways of developing software have you uncovered recently? Have we already found the best ways of developing software? I hope not!
  2. Are the people who are developing software in your organisation, the same people who are uncovering better ways of doing it? Or does management tell people how to work?
  3. When deciding how to work, are you thinking foremost of what’s easiest for you? or what’s most helpful for others?

We didn’t need a pandemic to try the experiment of no office, but for many folks it was the first time trying that experiment. What if we experimented more? Experimenting with self-selected, smaller, low-risk experiments?

How much has your team changed the way it works lately? Could you be stuck in a local maximum? Are your ways of working best for your team as it is now, or tradition inherited from those who came before, who may have been in a different context?

Every person is different. Every team is different. Transplanting ways of working from one team to another may not yield the best working environment. 

Ways of working often come from “things I’ve seen work before” or your preferences. Why would they be best for this team now? What are you doing to “uncover” what works best for you now?

Uncovering is a great metaphor. Move things around, remove some things, see what you discover! 

Teams often limit themselves by only trying experiments where they believe the outcome will be an improvement. Improvement is then limited by the experience and imagination of those present.

How about trying experiments where you expect the result to be no different? Or where you have no idea what will happen? Or even where you expect the result to be worse?

Here’s some practical experiments you could try in your team to see what you learn:

Try removing something

What activities, ceremonies, processes, and practices do you have? What would happen if you stopped doing one of them? They may seem like purely beneficial things. Even if they are, by trying to remove them you might learn more about their value (or lack thereof) to you. As well as their influence on your behaviour.

  • Imagine there’s No Offices (We’ve had this experiment forced upon us lately)
  • Imagine there’s No Meetings. Maybe we’d expect more miscommunications and wasted effort. Perhaps worth testing—maybe we’ll understand the value of meetings more clearly by abstaining for a time. Maybe we’d also learn to communicate asynchronously through writing more clearly. 
  • Imagine there’s No Estimates. Do you estimate all your upcoming tasks to measure progress? What would happen if you stopped doing it? If you’re required to give estimates what if you estimated everything as one day?
  • Imagine there’s No Staging. Do you test your changes in a staging environment for a time before promoting to prod? What if you didn’t? How would you be forced to adapt to mitigate the risks you had been mitigating in staging.
  • Imagine there’s No Branches. Do you work independently from others on your team? What if you had to all work on the same branch? How would you adapt?
  • Imagine there’s No Backlogs. What if you discarded everything you’re not doing now or next? What would happen? Maybe worth trying.
  • Imagine there’s No Managers. Do you know what your manager is doing? What would happen if they were unavailable for a while? How would your team need to adapt?

Removing things might seem risky and likely to make things worse. But what can we know about our resilience if we only do experiments where we think we know the outcomes.

It can be interesting to try removing something and see if we achieve similar outcomes without it.

It can help you understand the real value of the practice or process to your team. Help you understand your team better, and how things normally go right.

Try constraining something

Add an artificial limit on something you do often and see what you learn. Here’s some popular examples.

  • Keep tests green at all times
  • Implementation code may only be factored out of tests, not written directly. 
  • No more than 1 test in a commit
  • Deploy every time tests go green
  • Only one level of code indentation, or one dot per line
  • Only mock types you own
  • No fewer than 3 people work on a task if you usually work alone, or no more than 1 person working on a task if you usually work paired.
  • No more than n tasks in progress
  • Don’t start a new task until previous is in production.
  • No changing code owned by another team. 

Try the opposite

What ways of working do you tend to choose? What if you tried the opposite for a time and see what you learn? Try to prove it’s no worse and see what happens.

  • Do you always take on the team’s frontend tasks? What if anyone but you took them?
  • Work together in pairs? Try working apart individually.
  • Work individually? Try working together in pairs.
  • Feel we need to plan better? What if we just started without planning, together.
  • Hiring to go faster? What if you tried having fewer people involved instead.

Try the extreme 

An idea from extreme programming is to look for what’s working and then try to turn it up to the maximum; turn the dials up to 11. 

A few ideas:

  • Pair programming on complicated tasks? Try pairing on boring tasks too.
  • Pairing? Try the whole team worked together as an ensemble/mob.
  • Deploying daily? Try to deploy hourly.
  • Do you declare a production incident when there’s a problem with customer impact? What if every “operational surprise” were treated as an incident.

Reflecting

Only run experiments that your team all consent to. Set a time limit and a reflection point to review. 

Ask yourselves: What was surprising? Are we having more or less fun? What were the upsides? What were the downsides? Are we achieving more or less? 

Make it the default to revert to the previous ways of working. Normalise trying things you don’t expect to work, and reverting. Celebrate learning that something is not right for you. If every experiment becomes a permanent change for your team, then you’re not really experimenting you’re just changing. 

Be bold enough to try things that probably won’t work. You might uncover new insights into your team, your colleagues, and what brings you joy and success at work.

Posted by & filed under Leadership, XP.

Instead of starting from “how do we hire top talent?”, start from “what are our weaknesses?”

Why are you hiring? Are you hiring to do more, or are you hiring to achieve more?

Design your hiring process to find the right people to strengthen your teams’ weaknesses, rather than trying to find the best people. 

Instead of “how can we find the smartest people?” think about “how can we find people who will make our team stronger?”

People are not Talent. An organisation can amplify or stifle the brilliance of people. It can grow skills or curtail talent.

Often the language used by those hiring betrays their view of people as resources. Or, to use its current popular disguise: “talent”. 

“We hire top talent” “the candidate didn’t meet our bar”, “our hiring funnel selects for the best”. “we hire smart people and get out of their way”. We design “fair tests” that are an “objective assessment” of how closely people match our preconceptions of good.

The starting point for the talent mindset is that we want to hire the smartest people in the “talent pool”. If only we can hire all the smartest people, that will give us a competitive advantage!

If you focus on hiring brilliant people, and manage to find people who are slightly smarter on average than your competitors, will you win? Achievements in tech seldom stem solely from the brilliance of any one individual. Successes don’t have a single root cause any more than failures do. 

We’re dealing with such complex systems; teams that can capture and combine the brilliance of several people will win. 

With the right conditions a team can be smarter than any individual. With the wrong conditions a team can be disastrously wrong; suffering from over confidence and groupthink, or infighting and undermining each other. Hiring the right people to help create the right conditions in the team gives us a better chance of winning than hiring the smartest people.  

Talent MindsetWeaknesses Mindset
Find top TalentFind skills that unlock our potential
Grow TeamTransform Team
Help teams do more thingsHelp teams achieve greater things
People who can do what we’re doingPeople can do things we can’t do
Hire the best personHire the person who’s best for the team
People who match our biased idea of goodPeople who have what we’re missing
Fair tests & Objective assessmentEqual opportunity to demonstrate what they’d add to our team
Consistent processChoose your own adventure
Hire the most experienced/skilled candidateHire the person who’ll have the greatest impact on the team’s ability.
Number of candidates & Conversion rateHow fast can we move for the right candidate?
Centralised Process & BureaucracyTeams choose their own people
Grading candidatesCollaborating with candidates
Prejudging what a good candidate looks likeReflecting on our team’s weaknesses
FungibilitySuitability
Smart peoplePeople who make the team smarter
IntelligenceAmplifying others
Culture FitMissing Perspectives
People who’ve accomplished great thingsPeople who’ll unblock our greatness
Exceptional individuals. People we can grow and who will grow us
What didn’t the candidate demonstrate against checklistWhat would the candidate add to our team

Talent-oriented hiring

If we start out with the intent to find the “best people” it will shape our entire process.

We write down our prejudices about what good looks like in job descriptions. We design a series of obstacles^Winterviews to filter out candidates who don’t match these preconceptions. Those who successfully run the gauntlet are rewarded with an offer, then we figure out how to best put them to use. 

Hiring processes are centralised to maximise efficiency & throughput. We look at KPIs around the number of candidates at each stage in the funnel, conversion rates. 

Interviewing gets shared out around teams like a tax that everyone pays into. Everyone is expected to interview for the wider organisation.

Hiring committees are formed and processes are standardised. We try to ensure that every candidate is assessed as fairly as possible, against consistent criteria. 

We pat ourselves on the back about how we only hire the top 1% of applicants to our funnel. We’re hiring “top talent” and working here is a privilege. We’re the best of the best. 

Weaknesses-oriented hiring

There’s another approach. Instead of starting from our idea of talent and the strengths we’re looking for, start from our weaknesses. What’s missing in our team that could help us achieve more? 

Maybe we have a team of all seniors, frequently stuck in analysis. We need some fresh perspectives and bias for action.  

Maybe we are suffering from groupthink and need someone with a different background and new perspectives. Someone who can help generate some healthy debate?

Maybe we have all the technical skills we need but nobody is skilled at facilitating discussions. We struggle to get the best out of the team.

Perhaps we’re all fearful of a scaling challenge to come. We could use someone experienced who can lend the team some courage to meet the challenge.

Maybe those in the existing team specialise in frontend tech, and we’ve realised we need to build and run a data service. We could learn to do it, but bringing someone in with existing knowledge will help us learn faster.

Maybe we are all software engineers, but are spending most of our time diagnosing and operating production systems. Let’s add an SRE in the team.

Maybe we don’t even know what our weaknesses are—until we experience collaboration with the right person who shows us how to unlock our potential.

Identify your weaknesses. Use them to draft role descriptions and design your interview processes. 

Design your interviews to assess what the candidate brings to your team. How do they reduce your weaknesses and what strengths would they add? 

Leave space in the process to discover things people could bring to your team that you weren’t aware you needed. 

A talent-oriented process would assess how the candidate stacks up against our definition of good. A weaknesses-oriented process involves collaborating with the candidate, to see whether (and how) they might make your team stronger. 

If possible, have candidates join in with real work with the team. When this is not feasible for either side, design exercises that allow people on your team to collaborate with them. 

Pair together on a problem. Not what many companies call paired interviews where it’s really an assessor watching you code under pressure. Instead, really work together to solve something. Help the candidate. Bounce ideas off each other. Share who’s actually doing the typing, as you would if you were pairing with a colleague. Don’t judge if they solved the same problems you solved; see what you can achieve together.

A weaknesses-oriented process might mean saying no to someone eminently qualified and highly skilled; because you have their skills well covered in the team already. 

A weaknesses-oriented process might mean saying yes to someone inexperienced who’s good at asking the right questions. Someone whose feedback will help the experienced engineers in the team keep things simple and operable.

Why not both? 

It’s often worth thinking about when something good is not appropriate. There are rarely “best practices”, only practices that have proven useful in a given context.

At scale I can see the need for the talent-oriented hiring approach in addition to weaknesses-oriented.

Exposing all of your teams’ variety of hiring needs to candidates may create too much confusion.

You may well want a mechanism to ensure some similarity. A mechanism to select for those who share the organisational values. To find those with enough common core skills to increase the chances that they can move from team to team. Indeed, long-lived and continuously funded teams are not a given in all organisations.

If you’re getting thousands of applications a day you’ll probably want a mechanism to improve signal to noise ratio for teams wishing to hire. Especially if you don’t want to use education results as a filter. 

I suspect a lot of hiring dysfunction comes from people copying the (very visible) talent-oriented top-of-funnel hiring practices that big companies use. Copy-pasting as the entire hiring mechanism for their smallish team.

Start from reflecting on your weaknesses. Whose help could you use? Some of the practices from the talent-oriented approach may be useful, but don’t make them your starting point. Start from your weaknesses if you want strong teams.