Building & Running Effective Software Development Teams
Over my journey in software development, I’ve had the good fortune of exposure to many different team structures and project management philosophies. Some, more effective than others…
The following post attempts to summarize my collection of experiences into a preferred method of working. It’s intended to be used as a compass to ensure a project remains on track without prescribing an exact path that must be followed. Flexibility and compromise are key ingredients when working among a team.
My overarching philosophy in software and product development is:
Small teams can build great things
That’s not to say a project or company should only ever have a couple of people. It’s a reference to the number of people the core software development team should interact with on a day-to-day basis. A simple way to think about this team size is the 2 pizza rule.
My preferred methodology is Agile to provide rapid, continuous feedback, validation, and learning to the software development lifecycle that will help guide us towards building the correct product.
I believe that projects with a focused & capable leader have a high chance of success.
Case Studies:
TEAM SIZE & COMPOSITION⌗
The ideal team size should vary depending on the stage and success of the project. Early in a project and before confirmed product/market fit I favor generalists that can do a bit of everything to avoid blockers to forward progress. There is always a time and place for deep subject matter experts if the project is dependent on them. Their fit is largely determined by the project’s resource constraints and recruiting pipeline. Sometimes the right candidate will need to be added earlier than initially expected. Creating a forward-looking backlog of work can help them onboard when there is a timing mismatch.
When building a mental model I find analogies helpful. I’ve broken down the software development lifecycle into 5 distinct stages that map roughly to a skier’s progression. Within each stage, there is a list of common tasks and roles of responsibility.
1. Bunny Slope/Kickoff (1-3)⌗
Few things in software development trump the fun, excitement & naivety of starting a new project. This stage provides the opportunity to lay a strong foundation but should be balanced with the realities & timelines of delivering working software. This phase can be difficult to parallelize work which lends itself to a small focused team ensuring there aren’t too many cooks in the kitchen.
Tasks
- Inception
- Establish goals & success metrics
- Create an initial backlog of epics & stories
- Create product designs
- Establish regular workflow cadence (Standup, IPM, Backlog Grooming, Retrospectives)
- Start iterating on stories
- Procure essential tools & licenses
- Setup development, staging & production environments
- Establish best practices (testing, linting, code review, documentation, pairing, styleguide)
- Setup CI/CD
- Setup observability & logging
- All team members should have the confidence to change code & deploy while maintaining uptime
Roles
- Product Owner
- Full-Stack Developer
- Designer/Developer
2. Green Trail/MVP (3-6)⌗
Building upon a strong foundation the team will ideally be working through the backlog of each iteration to deliver an MVP product.
Tasks
- Adhere to regular workflow cadence
- Iterate on stories
- Validate goals & success metrics
- Establish an incident response playbook
- Improve development process by implementing action items from retrospectives
Roles
- Full-Stack Developer
- Mobile Developer
- Smart Contract Developer
- Devops Engineer
3. Blue Trail/Traction (5-10)⌗
The project has found product/market fit. Continue to delight users and expand upon the products capabilities.
Tasks
- Continue to iterate on stories
- Re-incept with new learnings to update backlog with priorities
- Make onboarding new team members as smooth as possible
- Establish on-call schedule and rotations
- Schedule & run fire drills
Roles
- Full-Stack Developer
- Product Manager
- Incident Response
- Site Reliability Engineer
4. Black Diamond Trail/Scaling (10+)⌗
The project has growing usage. There is often tension between new feature development and stability. It is common to begin specialization of roles.
Tasks
- Maintain high site reliability
- Continue iterating on stories
- Performance tuning & optimization
Roles
- Backend Developer
- Frontend Developer
- QA/Test Engineer
- Data Scientist
5. Double Black Diamond Trail/Divide & Conquer (15+)⌗
At this stage, if the project has become too complex for a single team to manage it’s time to begin splitting the project into independent functional groups.
Tasks
- Establish cross-team communication mechanisms and procedures
- Regular all-hands meeting
Roles
- Project Lead
- Engineering Manager
- Data Engineer
FINDING CANDIDATES⌗
- Have a hook
- Hard problems as a gravitational force
- Conferences
- Hackathons
- Open Source
- Thought Leadership
- Recruiters
- Always be hiring
- Fast feedback
- Expect a long lead time for specialized skills
- Communicate expectations and timelines to interviewers
KEEPING TEAMMATES⌗
- Enjoyment
- Opportunity
- Growth
- Feedback
- Minimize key person risk
- Minimize knowledge silos
- Plan for attrition