Back in January, we began working in teams.
A team is made of three people: One designer and two programmers. A system administrator will also assist the team when necessary…
Each team will stay together for two months (a “term”). When two months are up, the teams split up and form again with different people. This way everyone gets to work with everyone else…
During the two month term, there will be four iterations. An iteration lasts for two weeks. An iteration can tackle one feature, a variety of smaller features, or part of a bigger feature that will require multiple iterations to complete.
It went well and we’ve stuck to this model while also evolving it along the way. This two-month recap offered up the results of the first term and some lessons learned. For example:
Lesson: Get out the scope hammer early and often
For two week iterations, true scope should be nailed down no later than half-way through. We found ourselves up against the wall a few times because we didn’t cut scope early enough. So we decided that on Monday of the second week we’ll review the work done during the previous week and the work remaining to complete the iteration. Since humans are notoriously bad estimators, we’ll be extra conservative with scope. We’ll bring out the hammer and beat down the scope. And then we’ll do it again on Wednesday, two days before the end of the iteration.
It’s now nine months later, so let’s check in again and see what else we’ve learned since then.
Lesson: Deploy is not the finish line
After an iteration is deployed, teams now go into a cooldown phase — something we didn’t have originally. This means team members go into support mode and deal with issues related to the deploy and any general concerns coming back from the Support team. That means fixing bugs, revising copy in the help section and/or email responses, and responding to queries at our Answers forum.
There’s no set length for this phase since you can’t plot exactly how it will play out. So we wait and see. We only assume the latest deploy is good to go once Support is in the clear for 6-12 hours. Then, and only then, is it time to move on to a new iteration.
Worth noting: It’s usually not a full court press on Support in this phase so this period also serves as a general cooldown and cleanup period. If one of the programmers is chasing an on-call issue, the other can refactor some code from the iteration that could be a general plugin. Meanwhile, the designer can help someone else explore an idea.
Lesson: Get away from calendar mode
We originally thought it best to have teams work strictly in two week iterations. But we’ve realized mapping iterations to calendar days causes problems. If you go from this Monday (the 1st) to that Monday (the 14th), you ignore vacations, holidays, summer schedules with 4-day workweeks, etc.
So we now measure iterations in number of working days. We’ll estimate how long it will take a team to finish a unit of work. If it’s seven working days and it’s during the summer, that means we’ll work on it Monday-Thursday (4 days) and Monday-Wednesday (3 days). We’ll then deploy on Wednesday night.
If something pops up that distracts the team for a day — say a major emergency or the need to help some other team out — everything just shifts forward a day. The deploy that was scheduled on Wednesday moves to Thursday. This means that iterations can end on any day of the week and start on any day of the week.
We noticed a similar issue with the length of team terms. It can be hard for a team to gel if it’s two-month term is during heavy vacation times (say, August or December). We’re now trying three-month terms to give teams more time to work together.
Lesson: Track your iterations
It’s important to stop and take a look back at how the time was spent. A term time card for a two-month term might look something like this:
Iteration 1: Estimated 7 days, actual days 7, quiet period 2 days
Iteration 2: Estimated 5 days, actual days 6, quiet period 1 days
Iteration 3: Estimated 10 days, actual days 9, quiet period 3 days
Iteration 4: Estimated 4 days, actual days 5, quiet period 3 days
When we look back at this time card, we see that Iteration 4 had the most problems. It was off a day and it had the longest quiet period relative to its duration. At that point, we know to dive in for closer review and see what caused issues with that iteration.
Lesson: Have a project “scribe”
At our last meetup, one of our Sys Admins expressed feeling out of the loop with the teams. Of course, we’re now at 20 people so no matter how we try, it’s going to be harder to keep the same intimate vibe we had when we were half that size. But we are taking steps to keep that tight-team feel whenever we can.
For one thing, we plan on meeting in person more often. The new office has helped spur more face-to-face meetings and trips to HQ for out-of-towners.
Also, we’ve added a role for project “scribe.” There’s one on each team and that person’s responsibility is to keep everyone else informed of what’s happening. The scribe posts a summary at the beginning and end of each iteration explaining what’s being tackled, what we got done, what issues arose, what delays occurred, etc. When everyone knows what’s going on with everyone else, the company feels more connected.
In this post, Sam takes on the role of scribe and describes not only the motivation for the feature but also the design considerations and what’s not in scope.
Lesson: Put together Support documentation ahead of launch
With teams racing to deploy, Support docs related to a new feature can easily wind up an afterthought. But launching without Help content can create major headaches for Support and leave customers scratching their heads.
So we now have a “final stages” phase where the team shares any necessary info that will be helpful for email responses to customers, the Help section, Answers, and the Product Blog. The more this stuff is ready to go, the smoother we can handle the deploy and its aftermath.
Scribe summary gets turned into a FAQ page at the Help section.
Lesson: Let people work on what they want to work on
Finding the right balance between mixing up teams/projects and letting people work on what they want to work on is a delicate balance. Originally, we tried to ensure everyone got to work with everyone else while also alternating people between the Support, Slack, and Iteration teams.
As for what to work on, the original idea was that Jason and David would pitch ideas and the team would pitch ideas and together we’d come up with a concensus of what to work on. It’s happened where Jason or David propose something, but the team already had another idea that they felt passionate about and they did it. And that’s great.
But there are also certain projects, like a big infrastructure project, that are important enough to the business that we need to get them done — even if doesn’t originate as an idea from the team itself. That’s reasonable too.
Despite the efforts to be inclusive, the old structure left some people feeling like the decision-making was left in the hands of just a few. They worried about feeling more like consultants or outside “the core” of decision making.
So that led to our new Iterations app. It’s a teamwork app that we built and use internally where everyone can post ideas, share them, have a permalink, leave comments, and let rough ideas ripen.
Jeremy suggests a project and gets +1s from others. This item has since been completed and deployed.
We’ll post more on this separately.
Lesson: Allow for brainstorming upfront
When you’re iterating fast, it’s tempting to go into 100% dive-in mode right away. But that comes at a price. We’ve realized there’s a need to dedicate more time to examing the problem space before getting started. It might take an extra day or two, but if it prevents a rush down the wrong path then it’s worth it.
We also realized that we handled this brainstorming phase better during our in-person meetup. We got to look at a UI, write things on a chalkboard, hash out ideas, etc. When it’s just a phone call, you have more illusion of agreement and then hang up.
So we’re trying to replicate this “gather round the document” mode at the beginning of each iteration. We’re still experimenting with the best way to do this. (Should we use SubEthaEdit for sharing docs? Screen share with WebEx? Seek other ways to reproduce the brainstorming environment we have when we’re all in the same office?)
Lesson: Don’t forget about bugs
Bugs were getting short shrift in the old setup. The Slack team, which should be tackling bugs, wound up doing product development instead. We’re putting a moratorium on giving Slack anything that isn’t working on bugs.
Lesson: Keep the conversation going
Even when we don’t have a meetup, we want to keep opinions out in the open. A lot of the issues discussed in this post emerged spontaneously during Campfire chats or project calls. And we’re thankful they did. Even if we’re meeting up soon, we encourage people to not “save up” complaints/issues for later. Gripes don’t marinate well. Just because we’re meeting in the near future doesn’t mean we can’t try things out right now.
Isaac Priestley
on 05 Nov 10Do you deploy right away once the iteration is complete?
Or do you have a QA period where development is complete on the feature but it’s being evaluated before being deployed?
Nate
on 05 Nov 10Wow! It looks like you’ve learned a lot. Human behavior (or company behavior in this case) really is specific to the individual and you can’t really nail it down using just theory and ideas. Good to see you making adjustments and evolving new ideas and methods to make it work smoothly.
Chris Dunn
on 05 Nov 10Great thoughts on team development. Especially like the nailing down scope. Working with that hammer right now.
Deltaplan
on 05 Nov 10Holy sh.. guys, you’ve really got “summer schedules with 4-day workweeks” ?
My “summer schedules” are more like “6 to 7-day workweeks”, to cope with the extra work when half the people are on vacation and there are the summer trainees to take care of in addition to the regular work, and most of our customers are awaiting big releases when they come back from vacation in September, etc…
Joe
on 05 Nov 10Wow this is all great advice, especially since your experience has led you here.
Please, keep sharing these lessons as they happen, its a great way to see what is indeed working out there.
Greg M.
on 05 Nov 10How have you found the transition to more in-person meetings? Positives and negatives?
Chris Patton
on 05 Nov 10We’re still experimenting with the best way to do this. (Should we use SubEthaEdit for sharing docs? Screen share with WebEx? Seek other ways to reproduce the brainstorming environment we have when we’re all in the same office?)
Americo Savinon
on 05 Nov 10Great post Matt.
Sounds to me like the beginning of the second part of “Getting Real”, but know you guys may want to call it something like: “Staying Real”
Daniel
on 05 Nov 10Great stuff!
I find it interesting how you talk about face-to-face meetings now, and what caused the change in opinion. Earlier you’ve exalted the fact that for instance David used to be several timezones away, and how you’ve stuck with the idea of not seeing much of each other. I know it’s more about avoiding interruptions than avoiding each other, but it still feels like a change in tactics that you make a point of meeting more often now.
The question is: Did the previous avoidance of in-person meetings work because you were fewer people, or because you didn’t have you (awesome) office yet, and it simply had to work? I.e. would more face-to-face meeting always have been better, but you just couldn’t do it before, or were they truely not necessary before?
Marcus
on 05 Nov 10As inspiration, we use what we call “Fix Next Sprint” to manage bugs. Any bug reported during iteration X automatically gets placed first in the queue for the iteration X+1, usually placed on the team that created the bug. Great way to get bugs fixed as soon as possible, while there’s still a semblance of hope that the people who wrote the code remembers anything about it.
Emily
on 05 Nov 10Thanks for sharing your wisdom and methods with all of us. You make it better for everyone. I need this post today and it helped me.
JF
on 05 Nov 10Re: face-to-face meetings… The word “meeting” is what is throwing this off. We’ve always had some face-to-face interactions where necessary, but they were, and they remain, the exception. We are bringing people in from out of town a bit more frequently than before, but it’s still rare.
This is more of a tweak around the margins than a major shift in our attitudes around meetings and face-to-face interactions.
Daniel
on 05 Nov 10@JF: Thanks for the clarification. I’ll still say that what you’re doing qualifies as a “meeting” if you sit down to brainstorm etc. but that’s semantics.
I also do understand, that it’s not a major shift, but it still seems like a softening of the attitudes you’ve expressed previously. What struck me was particularly the line about avoiding the illusion of agreement. So what I wondered was, if you’re finding that in-person interaction avoids that, how did you avoid it before without the in-person gettogehters? Or, were there other factors that made it less of an issue before? Or was it actually a challenge to avoid it, before you had the new office space?
Lastly, I think there’s a typo in the post:
What’s an “in-face” meeting? An “in your face!” meeting perhaps? Sounds delightful :-)
Kelly
on 05 Nov 10Great read, as usual!
I guess this does come as a little bit of a surprise given all that I’ve read on this site and in Rework. This entire process does seem to be adding quite a bit of complexity to your product development process, or so it seems. I think Daniel’s comment above would also qualify as something I was surprised about but JF did clear that up.
It feels like your process is now more “strict” than it felt in the past, based on the ways it was described.
Is this new way to work for you just the natural evolution of a growing organization…that you need to build in more “process” to properly get things done?
Micheal
on 05 Nov 10@37signals
How do you prevent the developers from being idle early on while the designer is initially mocking up the UI? Do you lag the developers from joining the project?
Michael Dubakov
on 05 Nov 10It looks like a very lightweight iterative process. It ressembles Scrum a little bit, but has its own bells and whistles.
For example, scribes seems a replacement of daily meetings.
Also the idea to vary iteration duration is interesting one, never heard of it before. But sounds very reasonable for such type of work!
Cooldown phase helps to relief “deadline is alway close” problem with iterations. There is less pressure. Nice thing.
Rich
on 05 Nov 10Sounds like a “team lead” sort of position. Not quite managing, but…coordinating. Facilitating.
Randy Cox
on 05 Nov 10So when will you be releasing the Iterations app so we can all start using it?
Max
on 06 Nov 10ehi guys, all different all 37signals style, no meetings, no human contact, programming upside down and all the cool stuff you shared with us during these years…
But… don’t you realize that in these years, one piece at a time, you are reinventing the wheel? (37signals branded, minimal, but the wheel!)
Myself
on 06 Nov 10How does each team coordinate? Is there a software architect? How do you make sure that some new hired doesn’t use crappy practices, or uses global variables? I know you have quite smart people there, but still. How do you keep an overal conceptual integrity on the code itself when multiply people with multiple styles are touching the code at all levels?
Ian
on 08 Nov 10@37signals – you are reinventing wheel as usual.
daniel
on 09 Nov 10What exactly is “quiet period”? Is it time for reflection, post-mortem, documentation, etc?
Brian Jones
on 10 Nov 10I could be mistaken, but this post almost sounds like you guys are learning from your mistakes. ;)
JF
on 11 Nov 10Brian: I know you’re just pulling our chain, but these aren’t mistakes. What we’ve done has worked well, we’re just refining it so it works even better.
This discussion is closed.