Coach's Reflections



I. Enjoyable projects seem more likely to be successful. The developers will take pride in their work and quality will be high.

A variety of factors are related to the above goals of pride and enjoyment:

Social interaction makes for happy workers and a cohesive team. Computer programmers are not a social lot on the whole, but for everyone it is a fundamentally healthy exercise to communicate with others. Pair programming definitely involves communication, but it is perhaps more important in this regard to have the whole group present as much as possible (as opposed to pairs working in isolation), such that interaction is maximized and "team spirit" is fostered. The expectations of others becomes a powerful motivating force - for example, missing a meeting meets with the disapproval of the other members and the intense disappointment of the intended/assigned partner. This harnessing of "peer pressure" is generally inadvertent/subconscious but becomes a powerful technique. As a result, our meeting attendance was generally quite high and regular throughout the 2 semesters. By having everyone there at once, we could check on how other pairs were doing, what their intent was with such and such an interface or architecture, and also have light-hearted competitive comments floating about ("psh, this is Ed's code, must be full of bugs"). Having social events (Ed and Toby's parties, the awards banquet, etc) and bringing candy to the labs (even if it's technically not allowed) also improved the communication and relations between the group members. The benefits of snacks are actually mentioned several times in the XP book; Communal eating is an important social experience.

Small groups are preferable - it seems we were more effective this semester with approximately half the people. We got a much better feel for whom everybody was; it was more personal, informal, fun. Scheduling was easier to manage. People were more apt to take responsibility. Having more say in what goes on, more ownership of what one produces, leads to more pride and enjoyment derived from ones work.

Letting people do what they what they want to do (GUI, engine, etc) wherever possible is also fundamental to keeping developers happy, interested, and proud of their work.

Switching up people and tasks leads to higher team cohesion and better code. If two people are very similar, they will tend to work together whenever possible, creating a sub-clique within the group. When it comes to code, they will write with a specialized/particular style suited to them and likely leave out comments, since they understand their partner's thinking. By moving people about, and changing the things they are working on, lots of questions will be asked ("Why is this named this way? Wouldn't this be better instead?"), which will (hopefully) lead to comments addressing these concerns and clearer, more maintainable code overall.

II. Pacing affects morale and productivity.

Having a consistent schedule is preferable; for the most part, we had very steady progress. Schedules that shift necessarily introduce lazy bits and stressful bits; stress will cause frustration, laziness will lead to apathy. Also, if project velocity slips (like with a lot of refactoring and bug fixes) the work becomes a lot less interesting; new functionality is fun.

Scheduling is tough to manage. When we started a new application there were many different areas to investigate. However, as time went on we found that more and more often a group of stories that would be dependent on one critical story. Learning new technology often provided a painful lesson in this regard. We were adrift for quite a while last semester while trying find what JavaSound calls we needed, and which ones were in fact actually implemented in JDK1.3. XP further complicated the issue as the team tried not to look too far ahead - soon there was nothing else for most pairs to do while one pair, assigned to the critical story, tried to make sense of it all. We solved this by breaking the "everybody work together at once in parallel" format and serialized development for the troublesome parts. It worked.

Experience leads to tremendous gains in velocity. When it came to Composer, our second system, we already knew how to solve almost all of its problems. It took approximately 30 hours to implement functionality similar to what took over 100 hours in RiffDesigner, our first system. Reuse paid off in spades. The actual coding took very little time. Now we understand how some of those consultants (like Kent Beck of XP) can throw together accounting systems so fast.


Update 2001-06-29, Copyright (c) 2001 Music Sequencer Group

SourceForge logo