Articles

Maximizing collaboration through ensemble programming

With an average of over 20 years of experience in software development, our leaders have explored various methodologies—from pair programming to test-driven development, Agile, low-code solutions, and even LISP. Despite this extensive experience, we were surprised by the significant impact ensemble programming has had on our approach to development.

What is ensemble programming?

Ensemble programming, also known as mob programming, involves a development team working collaboratively on a single task. This typically involves sharing a single keyboard or participating in a live call, where team members discuss the same problem and collaboratively build solutions.

Initially, we were skeptical, especially given our experience with pair programming, which often felt slow and distracting. However, ensemble programming proved to be a highly productive way of working.

Key benefits of adopting ensemble programming

While ensemble programming may initially seem inefficient, the perceived time investment is well worth it. Here are some specific benefits for teams, developers and organizations.

Teams

Enhanced Decision-Making

The collaborative nature of ensemble programming empowers teams to address complex issues and requirements collectively. This approach facilitates quicker, well-informed decision-making, leading to more robust solutions.

Efficient Problem Solving

Ensemble programming enables teams to resolve issues in real-time using actual code and tests, eliminating blockers and accelerating problem-solving.

Higher Code Quality

By collaboratively writing and reviewing code in real-time, ensemble programming enhances the quality of code. The immediate feedback loop ensures well-considered code and introduces unexpected efficiencies.

Improved Clarity

Articulating and documenting code decisions aloud helps clarify thoughts and aligns the entire team. By capturing the rationale behind each decision, teams can avoid misunderstandings and minimize unnecessary rework.

Stronger Team Dynamics

Working as an ensemble can foster stronger team dynamics by encouraging open communication and collaboration. It also can reveal underlying team dysfunctions, allowing for prompt resolution.

Developers

Accelerated Learning

Programming with your peers offers an immersive learning environment where developers can quickly acquire new skills and knowledge. This hands-on approach accelerates the learning curve for new technologies, codebases, or domains.

Stronger Relationships

Working closely on shared tasks fosters camaraderie and trust among team members, leading to a more supportive work environment.

Simplified Code Reviews

With multiple developers working together on the same code, the need for separate, formal code reviews is significantly reduced.

Organizations

Distributed Knowledge

Ensemble programming distributes knowledge across the team, mitigating the risks associated with having single points of expertise. This approach ensures that critical information and skills are shared, reducing dependency on any one individual.

Effective Task Prioritization

Collaborative work helps teams maintain focus on high-priority tasks. The collective effort helps in aligning team objectives and staying on track, leading to more efficient and effective project completion.

How can teams get started with this new approach?

Different development teams will use ensemble programming, or mobbing, in various ways. Regardless of how your team ends up implementing it, here’s how they can get started:

Step One: Choose the Right Approach

Determine whether to use ensemble programming for:

  • All production code
  • Shared components of code
  • Main feature currently being developed

The method you choose should align with your team’s culture and comfort level.

Step Two: Schedule Dedicated Time

Block off specific time slots for ensemble programming and hold each other accountable for being present and contributing, recognizing that including everyone’s experience and perspectives lead to better solutions.

Prioritize this time and allow only urgent items to interrupt.

Step Three: Plan and Prioritize Tasks

Operate within two-week sprints, with each team member taking the lead on at least one main task. Keep in mind that not everything is suitable for ensemble programming. Handle maintenance items, simple bugs, or additional tests individually.

During ensemble sessions, document any small clean-up tasks or areas requiring additional tests and assign these tasks to be addressed later.

Step Four: Maintain Consistency

Consistently integrate ensemble programming sessions into your workflow to ensure ongoing collaboration and maximize effectiveness. During the planning phase, identify areas where ensemble programming can provide the most significant benefits and where it may not add substantial value.

Best practices for optimal outcomes

Allocate Sufficient Time

Ensure you have dedicated, distraction-free time blocks for ensemble programming. A minimum of two hours is recommended, as rushing can hinder the process. Choose the least disruptive time of day and maintain this schedule consistently.

Foster a Collaborative Environment

Effective ensemble programming requires listening, trust, and humility. Focus on creating the best product, not on being right. Brainstorm different ideas and work through disagreements with a product-first mindset.

Encourage Continuous Learning and Mentorship

Ensemble programming is an excellent opportunity for mentoring and establishing coding standards. Sharing knowledge in real-time accelerates learning among the team, enhancing individual capabilities and strengthening the overall team’s expertise.

Balance Ensemble and Solo Work

While ensemble programming is beneficial, it can be mentally exhausting. Mix ensemble sessions with solo tasks to maintain productivity and avoid burnout.

Maintain Documentation

Keep a record of major decisions and their rationale, whether in a dedicated journal or within the code itself. This practice aids in future reference and ensures continuity in team knowledge.

Slow and steady wins the race

We highly encourage development teams to try ensemble programming. Start by selecting a challenging problem for your next sprint and dedicate a few hours each day to work on it together as a team.

Incorporating ensemble programming into your workflow can lead to significant improvements in code quality and team cohesion. The real-time collaboration and collective problem-solving foster a more robust and resilient development process, ultimately resulting in better software and a stronger, more united team.