On defining done and instituting code milestones — Why they are critical to your teams’ success & velocity.
It was 4.45pm PST and time for regular daily stand-ups. The team had a big smile on their face. Alex spoke beamingly, “I am 99% done! with the auction algorithm”. “Really?”, I said. Was it time to celebrate? Familiar conversation? What does it mean?
My long time mentor Jamie Dinkelacker, once reflected on the usage of the term done in stand-ups with me, “Sudhakar, done is always in the past tense”. ‘Done’ is a verb that has already been inflected for the past participle. This point stuck with me for life. There is nothing like 99% done.
The Last Mile can be the Hardest Mile
In one project, as launch day approached, the team was very confident of hitting the key dates. It was like are you done? Ya!— 99% done. Later as the hours rolled by, the team started seeing issues with missing messages in production, indexer delays, and database performance. Ooops! Much time was spent diagnosing and resolving replication issues. Ultimately, the team implemented their own replication and improved their QA setup to detect missing messages.
Why didn’t we detect this early? Team didn’t do testing at scale early enough. The team’s sense of urgency was not properly communicated or felt by dependent teams and lot of the todos started piling up. Were we 99% done? the last mile turned into 4–5 weeks launch delay, canceled vacation, and many fires to be put out. The team hadn’t incorporated slack time in planning to handle unpredictable situations. Team realised they had to introduce redundancy from the early on and better QA setup for load testing.
Defining “done” is an important aspect of working software for your team. You are in one of two states, done or not done period!
Code Milestones are Critical
Teams need to maintain agility in “how to produce software”, NOT about “how to manage coders”. This is a fundamental distinction; the focus is productivity. Checked in code (CL) can be conceptually thought of as an integral function over time and you need to cut down waste to produce value. From defining done, to introducing non-intrusive tools, to lightweight processes, to not carrying dead code, to minimal work products, to decision meetings etc. all aid in checking in code that add business value.
The Agile manifesto states that “working software is the primary measure of progress.” Empirical studies and retrospectives conclude that implemented, tested, and submitted code worked well. When I recount many words used in stand-ups, and represent it as a tag cloud (see below), you can see “code” level artefacts speak loud in most cases. In speaking with many developers, and asking “what could have gone better?”, teams indicated they could improve CL reviews, tests, and integration.
In one retrospective, I identified the following problems:
A few non intrusive techniques that helped are:
The practices I instilled in different projects varied from team to team, and did what worked for each team. Teams felt they made great progress because of the ability to “focus on one thing” and produce working code.
You can reach the author at sudhakar.ramakrishnan108@gmail.com. Learn about future articles, upcoming courses and workshops in my low bandwidth newsletter.
Checked in code as an integral function |
What worked well? Watch the loud words |
In my previous article on improving productivity, if you recollect, I had pointed out that the energy of two geographically dispersed teams working on a project was dramatically improved when they delivered their first working demo. Here are some of the speed bumps the team encountered:
- Communication breakdowns between the backend team and the UI team due to inconsistent terminology.
- During design consultations these teams were contentious and team members often felt that their opinions were ignored.
- New team members arriving from cancelled projects exacerbated these problems.
“If you chase two rabbits, both will escape”.
Observation
The team’s morale dramatically improved with the working demo. During the retrospective, the team voted with a “green (high energy)” or “red (low energy)” vote to characterise each major event in the project’s lifetime. The code checkin for this working demo was marked with overwhelmingly “high” votes. Other major milestones that positively impacted the morale are early prototypes, getting readability, major modules being checked , and integration with the products backend.In one retrospective, I identified the following problems:
- Issues of ownership and control led to division in vision and direction.
- Conflicts in implementation strategy internally or between cross timezone teams led to counterproductive arguments.
- Engineers in both teams had members whose past projects were cancelled.
A few non intrusive techniques that helped are:
- Use fixed length development cycles
- Introduce lightweight non-intrusive tools for engineers. I once wrote a python script that extracts documentation from checked-in code to highlight what features are in code during the release process that was very much appreciated by devs.
- Track project velocity using leading & lagging indicators, burndown charts and dashboards to
help throw light on large backlogs.
“Managers use people to accomplish work, leaders use work to grow people” — Wayne Strider
Five Lessons Learnt
The practices I instilled in different projects varied from team to team, and did what worked for each team. Teams felt they made great progress because of the ability to “focus on one thing” and produce working code.
- Facilitate Team definition of done and get agreement
- Encourage regular demos to show off code (end to end) and get feedback.
- Narrow the scope of individual milestones and meet demo deadlines.
- Write complete code with unit and system tests.
- Plan when possible for face to face meetings between geographically distributed teams.
You can reach the author at sudhakar.ramakrishnan108@gmail.com. Learn about future articles, upcoming courses and workshops in my low bandwidth newsletter.
Comments
Post a Comment