
OUR THOUGHTSStrategic Advisory
Lifting the lid: understanding what makes development teams thrive
Posted by Tony Luisi . Apr 21.25
Development teams are the engine of innovation in today’s digital business environment. While organisations increasingly demand more features from their development teams, few potentially understand what happens beneath the surface.
While code gets written, features ship and products evolve, there are potentially missed opportunities. Development teams aren’t simply resource pools for delivering business features; they’re complex ecosystems of diverse individuals with unique motivations, challenges and working styles. When leaders fail to recognise the ebb and flow of these complexities, they miss crucial levers for unlocking a team’s full potential.
Having spent years embedded in dozens of development teams across organisations of all sizes, I’ve observed common patterns in what makes some teams consistently deliver exceptional results. In contrast, others struggle despite similar talent levels. The differences rarely come down to technical skills alone; rather, they stem from human elements, communication practices and engineering approaches that enable or constrain a team’s natural capabilities.
This article seeks to lift the lid on what truly drives development team success – not from a theoretical perspective, but from direct observation of teams navigating real work challenges. Whether you’re supporting development teams, working with one or simply trying to understand this critical organisational function better, I hope these insights will reveal what’s happening below the surface to allow you to create environments where teams genuinely thrive.
Part 1: understanding the challenges
The human reality of development teams
One of the most consequential mistakes organisations make is failing to recognise the diversity across individuals in the team (not just technical diversity). Some developers thrive when given autonomy and minimal direction, while others produce their best work when working together to deliver a feature. Some are motivated by technical challenges, others by learning opportunities and others by career advancement. These differences aren’t flaws to correct but natural variations that can become strengths when utilised in the right areas.
Experience levels can complicate this picture further. I’ve worked with junior teams who ‘need their hands held because they have very little experience to draw from’. These teams require different support to a group of seasoned veterans. A common failure mode is applying senior team expectations to junior-heavy teams without providing the necessary scaffolding and mentorship.
The composition of a team directly influences which structure will work best. Highly experienced teams often function well with flatter hierarchies and greater autonomy, while less experienced teams may benefit from more defined leadership and more explicit guidance. The best teams I’ve observed recognise this reality and adapt their structure to their current composition rather than forcing a one-size-fits-all approach.
Interestingly enough, the best teams leverage these differences rather than trying to eliminate them. They create systems where team members can coach each other, with knowledge flowing not just from senior to junior members but in all directions. Junior developers usually come with few rules on what’s good or bad, which can provide a fresh perspective that senior developers tend to overlook or don’t even consider. For example, a junior developer is more willing to adopt a new CSS framework for a project than a senior developer. However, this can only work in environments where everyone’s contribution is valued regardless of experience.
The reality is that organisations risk undermining a team’s potential when they treat team members as interchangeable resources. By contrast, teams that acknowledge and embrace their human complexity create the foundation for exceptional performance. This recognition isn’t just about being considerate, it’s about being effective.
What really challenges development teams
While organisations often focus on velocity, feature completion and delivery dates, development teams struggle with deeper issues that eventually manifest as missed deadlines, quality problems and burnout which consistently undermine effectiveness across teams of all sizes:
Feature push vs. technical debt represents a critical balancing act many teams struggle with. On one side, teams are frequently pushed to deliver new functionality while postponing necessary maintenance and refactoring. As one developer explained, “It's good for short-term gain because it’s relatively easy to do, but longer term it tends to be problematic”. On the flip side, some teams become paralysed by fear of accumulating technical debt, refusing to ship features because they don’t want to ‘dirty the kitchen’. It’s like running a restaurant but being afraid to use the kitchen – why cook anything?
Both extremes create problems – unchecked feature push creates an invisible burden that progressively slows development, while excessive technical debt avoidance prevents value delivery. Successful teams recognise that technical debt doesn’t have to be addressed as a separate initiative – which often fails to deliver business value. Instead, they incrementally improve code quality when revisiting features or parts of the codebase, ensuring at least basic quality standards like automated testing each time they touch an area.
Process paralysis occurs when teams become ‘hamstrung by procedure and process, that they fail to make any kind of movement’. Teams get bogged down by excessive agile ceremonies and constant meetings, leaving little time for actual development. Daily standups, planning sessions, refinement meetings and retrospectives – originally designed to facilitate work – consume so much time that they hinder developer productivity. The processes meant to enable work paradoxically become obstacles to getting work done.
A clear warning sign of process paralysis is little or no contribution by some members in meetings. When several people attend meetings but only a few actively participate, it often indicates that not all need to be there or perhaps aren’t engaged. This can waste valuable development time and signals that the process is not aligned with its intended purpose.
Moreover, teams can get bogged down in policy paralysis where they are not empowered or given agency to make decisions due to policies imposed from above. When every technical decision requires approval from an architect, for example, or when simple changes need multiple levels of sign-off, development grinds to a halt. These approval bottlenecks create dependencies that prevent teams from moving forward autonomously, resulting in frustration, delays and a sense of disempowerment.
Value delivery blindness happens when teams fail to focus on items that deliver real business value. Teams can fail to work closely enough with the business to understand major pain points and priorities. Instead, they end up working on multiple competing initiatives or tasks that make them look busy but don’t address the most impactful problems. This results in impressive activity metrics but limited actual business outcomes.
Lack of delivery also manifests in teams that appear to be ‘delivering’ in terms of getting tasks across their sprint board but actually provide little value to the business. Teams can focus too much on getting their own work done instead of recognising that ‘done’ should mean delivering that value to their customer (the end user).
Lack of psychological safety manifests in various ways that hamper team effectiveness. Imposter syndrome affects developers at all levels, causing even highly skilled team members to question their abilities and hesitate to contribute fully. Meanwhile, communication barriers prevent teams from honestly surfacing and addressing issues. When developers don’t feel comfortable discussing challenges – whether due to fear of judgment, cultural norms or past negative experiences – problems fester until they become crises. These psychological barriers are particularly damaging in environments where mistakes are punished rather than treated as learning opportunities, creating a culture of silence and missed collaboration.
What’s striking is that successful teams don’t expect perfect solutions to these challenges handed down from above. Rather, they create environments where problems can be honestly discussed and collaboratively addressed, recognising that these challenges are inherent aspects of complex technical work that require ongoing attention.
Read on if you’re interested in learning how we can overcome these challenges.
Part 2: enabling team success
Having identified some of the main challenges development teams face, what makes a development team successful? I’ve seen many strategies that can enable success.
Building psychological safety
- Model vulnerability at team lead and leadership levels by openly admitting knowledge gaps. Not knowing a particular library, framework or approach should be viewed as an opportunity for team members to uplift their capabilities and alleviate imposter syndrome
- Regular retrospectives serve as a valuable tool to surface any hidden barriers to team flow. These sessions provide a structured environment where team members can safely discuss challenges and identify opportunities for improvement
- Pair programming sessions offer an effective way for two team members to learn from each other. This collaborative approach not only improves code quality but also strengthens relationships and knowledge sharing within the team
- Real-time reviews of pull requests provide a more effective way of reviewing code compared to asynchronous comments. Having a discussion about why certain patterns were chosen can often shed light on the developer’s thinking rather than focusing solely on what was implemented
- Implement blameless post-mortems after incidents to shift the focus from individual accountability to process improvement. This allows teams to examine what went wrong objectively and make systemic changes to prevent similar issues in the future
Effective meeting and process management
- Regularly review and eliminate low-value ceremonies that don’t demonstrably improve outcomes. Teams should periodically review their recurring meetings and processes to ensure they’re still serving their intended purpose rather than continuing out of habit
- Clarify the purpose and desired outcome of every meeting before scheduling it. This ensures that attendees understand why they’re participating and what should be accomplished by the end of the session, making meetings more focused and productive
- Select the right facilitator for each meeting type. Having an appropriate facilitator who understands the meeting’s purpose and the team’s dynamics helps keep discussions on track and achieve the right outcomes. For example, a developer in the team may be a good fit to facilitate stand-up – asking relevant technical questions and looking for any hidden blockers
- Monitor participation patterns in meetings and understand why some members may not be participating. Reasons for lack of participation can range from the simple explanation of the meeting not providing any value for that person to a person potentially not feeling like they are in an environment safe enough to voice an opinion
- Replace status updates with focused problem-solving discussions. Status information can often be shared asynchronously, allowing meeting time to be used for collaborative problem-solving and decision-making that benefits from real-time interaction
Team empowerment and decision-making
- Embed architects and technical decision-makers within teams when possible. If not, front load any of those kinds of decisions during planning. As a result, teams may need to lengthen their planning time to ensure these kinds of discussions are had and decisions made
- Create clear delegation frameworks (using tools such as an ADR – Architectural Decision Record) that specify what decisions teams can make autonomously. Once decided, trust teams to make decisions within their domain of responsibility
- Encourage teams to challenge low-value work and push back on non-essential requests
- Allow teams to shape their own working practices with ‘ways of working’ discussions
Technical excellence practices
- Integrate technical debt reduction into regular feature work rather than separate initiatives
- Establish incremental improvement standards when revisiting code areas
- Implement pair programming to share knowledge and improve code quality in real-time
- Set up automated testing to catch issues early and build confidence in changes
- Agree on code quality standards that all team members understand and follow
- Make complex technical concepts accessible to non-technical stakeholders
- Balance short-term delivery with long-term maintainability through conscious trade-off decisions
Value delivery focus
- Expand the definition of ‘done’ to include deployment to production
- Implement feature flags to separate deployment from release when necessary
- Clearly articulate business value for all work items in business (not technical) terms
- Prioritise based on business impact rather than technical interest or ease of implementation
- Measure success by outcomes rather than development activity or story points
- Track the time between ‘development complete’ and ‘delivering value in production’
- Celebrate business results rather than just technical achievements
Cross-functional collaboration
- Include business stakeholders in appropriate planning and demo sessions
- Create shared ownership of outcomes between technical and business teams
- Build an understanding of the broader business context for development work
- Use visualisation techniques like event storming to bridge communication gaps
- Translate between technical and business domains in both directions
- Develop a common language for discussing priorities and trade-offs
- Establish regular feedback loops with actual users of the features
Continuous improvement culture
- Create mechanisms for surfacing issues early before they become crises
- Regularly reflect on team effectiveness beyond just delivery metrics
- Experiment with new working practices in time-boxed trials
- Adapt processes to the team’s specific context rather than following frameworks rigidly
- Collect and act on feedback about the development experience itself
- View team processes as products to be iteratively improved
- Build in time for learning and exploration beyond immediate deliverables
High-performing development teams don’t focus on solving individual challenges in isolation. Instead, they create an environment where these reinforcing practices work together to address multiple challenges simultaneously.
By implementing these strategies, teams can break free from the cycle of feature push, process paralysis and value delivery blindness. The result is not just better software delivery but a more engaging and sustainable development experience for the team.
More Ideas
our thoughts
The AI coding partner: a generational shift in product engineering
Posted by Gareth Evans . Apr 14.25
We’ve recently witnessed a fundamental change in how software is engineered. Large Language Models (LLMs) are reshaping the landscape of product development in ways that extend beyond code completion and assistance. This shift isn’t just about productivity gains – it’s a new way of conceptualising, designing and building software products.
> Readour thoughts
Flow metrics – build or buy?
Posted by Steven Gibson . Apr 08.25
It’s now well established that including flow metrics is an effective way to identify areas for improvement and visualise how work flows through your system.
> Readour thoughts
Team Topologies: a solution to the collaboration paradox
Posted by Daniel Walters . Apr 08.25
Let’s face it, we’ve all been in those never-ending meetings where everyone has an opinion but nobody seems to make a decision. Or those situations where you need five approvals just to make a tiny change. It’s frustrating, right?
> Readour thoughts
Improving observability with logging microformats in event-driven systems
Posted by Reuben Dunn . Mar 28.25
In the world of distributed systems and event-driven architectures, observability remains one of the most challenging aspects of building reliable applications. As systems grow in size and complexity, understanding what’s happening inside them becomes increasingly difficult. This is where microformats for logging can make a significant difference.
> Readour thoughts
How executives can help achieve positive change and greater impact
Posted by Daniel Walters . Mar 05.25
There are always more opportunities to improve the effectiveness of an organisation. You are never done with this work. It's easy to get too busy or feel the change involved with some of these opportunities is too complicated and when there’s an opportunity to grow through hiring, some of these may stay on the back burner.
> Read