Reminding ourselves that people vary, that certain broad generalizations hold, and that there are exceptions to each generalization, let's look at some of people's natural ways of working. People generally work better by starting with something concrete and tangible, such as examples, by altering rather than creating from scratch, by watching, and by getting feedback. One of my favorite sentences comes from Wenger and Lave (1993) about the power of the concrete:
ConcreteCognitive research provides support for the idea that our minds operate directly from concrete examples (an idea that is remarkably in harmony with the properties of neural networks). Johnson-Laird and Byrne (1991) suggest that people perform logical deduction by imagining concrete situations and concrete counterexamples rather than from manipulating predicate calculus in their heads. For example, in a problem about billiard balls, "it is possible to frame rules that capture [the] inference, but it seems likely that people will make it by imagining the layout of the balls." They suggest that in performing deduction, we
Notice that even the third step, the validation step, involves constructing concrete examples. Robert Glass (1995, p. 178) relates a remarkably similar version of the software design process. Citing other researchers, he relates that people do the following when composing plans:
If people really do make use of concrete situations in their thinking, we should find such artifacts among programmers' work products. User composites and interaction diagrams are two such artifacts. In the user composites technique, the development team creates a composite sketch of one or more fictitious users of the system. Ideally, they invent several: one user who is lazy, one who is fanatically detail-oriented, one who is an expert in all the shortcuts, another who is slow to learn, and so on. They make these composite sketches as concrete and real as possible, even giving the imaginary people names. By putting very concrete images of future users in front of the design team, the team can more easily imagine how each would react differently to the system and can create system capabilities suited to those different sorts of people. Interaction diagrams (of which there are two forms, collaboration diagrams and sequence charts) tell the story of objects interacting over time. They are created by drawing object instances on the page and drawing arrows showing the messages between them. In collaboration diagrams, the objects are placed anywhere on the page, and the arrows are drawn between them and numbered to show the time sequencing of the messages. In sequence charts, the objects are all placed as column heads at the top of the page. The interactions are shown going down the page as arrows from one column to the next. Of the two, sequence charts are a recommended part of many OO design techniques. Collaboration diagrams, which are mathematically isomorphic to sequence charts, are so rarely mentioned in methodology texts that it was only after several years of teaching and coaching that I noticed that beginners often showed me their discussion results in collaboration diagrams, not sequence charts or class diagrams. I suspect the reason that collaboration diagrams are not mentioned in methodologies is that they are temporary artifacts. They are useful in creating designs and in communicating about specific situations, but they are not preserved in the heavily distilled design documentation the project team feels obliged to produce. As we become better at preserving records of transient discussions, I expect to see such diagrams used more in design and documentation. TangibleBeyond concrete is providing something tangible, something that people can touch. Pelle Ehn used paper prototypes in the mid-1980s, helping a typesetters union discover how computer systems might help them. He used cardboard boxes and bits of paper to represent the computer screen and its contents, to understand how the as-yet-unimagined system might work. The people worked through their daily operations to discover ways in which a computer might be useful. They felt comfortable manipulating these tangible, movable, and unfinished-looking props. Paper-based user-interface prototypes have grown to be a favorite of professional user-interface designers (Hohmann, 1997). During the early, discovery phases of designing a user interface, such "low-fidelity" prototypes are considered even more effective than the screens simulated with care on a live computer screen. They are not only tangible but almost invite a person to change them.
An extension of the low-fidelity mock-up technique is one called informance (Burns 1994). An informance is an interactive performance, showing the not-yet-built system in use in its predicted future setting, using a mock-up so concrete that people can interact with it. Informance allows trial users to live the life of the future user in a realistic future environment. One reported informance showed a hair stylist using a proposed system while cutting hair. In another, the group built a walk-through apartment in which actors playing patients used computers to talk with each other and build community while staying in bed. By making the informance setting concrete, everyone involved in development can see the strong and weak points of the proposed idea. A popular design technique that takes advantage of tangibility is the Class-Responsibility-Collaborator (CRC) card technique mentioned earlier. In this technique, an index card is put on a table to represent a specific instance of an object nominated for use in a design. The designer picks the card up and moves it around, at the same time discussing its behavior with respect to the other cards on the table. CRC cards are concrete and tangible examples that let designers work multi-modally through concrete situations. People consistently report that moving the cards online reduces their effectiveness. There is something about picking up a couple of cards and saying, "This object sends . . . this other object . . . the request to do XYZ . . . No, that's not right; let's try another one . . ." that triggers an emotional, physical response about the quality of the design. Something to AlterCopying and altering previous work is a standard mode of operation used almost daily by people in all fields. Faced with starting a new letter, invoice, proposal, document, program, or project plan, a person finds a previously done sample, copies it to a new work area, and changes all the particulars until the work product becomes what the needs. A cook will copy a recipe and vary just one part. A project manager takes over the previous project's plan and changes the line items to reflect the current project. A requirements document or database schema gets similarly copied and altered. Children (and adults) learn hypercard programming by copying someone else's program and guessing at the simple things to change.
This copy-alter technique has been applied even to completed applications. Airline companies traded frequent-flyer applications in the late 1990s. A frequent-flyer application, by itself, provides little competitive advantage to an airline company. So one company would recover development costs by selling its frequent-flyer application to its competitor. The buyer received a graphical model that generated application code that would need tuning, and the actual, generated, and tuned code from the previous company. The buyer recognized that the application would not be quite correct but that it would take less effort to alter it than to build it from scratch. Glass (1995, p. 182) tells that a first design model
You can and should start taking advantage of people's strengths in copying and altering work samples. Create a small, online library of real samples for work products produced on your (or some previous) project. Other people can then simply copy one of the samples as the base for their own work. In copying it, they will pick up both the structure and style from the sample, while changing the details to fit their purpose. The implication is, of course, that you would like the work samples you collect to be relatively "good," having structure and style you don't mind having copied. They don't have to be perfect, of course, just "good enough." One book already does this. Developing Object-Oriented Software: An Experience-Based Approach (IBM OOTC 1997) is a collection of work product samples used by IBM's OOTC on various projects during the mid-1990s. The OOTC avoided fighting over methodology by providing examples of various work products and letting each project team choose the examples they felt compelled to use. You may notice that many of the foregoing stories use surprising low-tech items, with much use of paper and cardboard. O'Dell (1998) wrote about the World Bank's successful knowledge management and transfer experiences with an appropriate lesson:
Watching and ListeningHumans have a knack for learning by watching as well as by doing. Wenger and Lave (1993) discuss success and failure in apprenticeship-based professions. They highlight the value of line-of-sight and line-of-hearing learning in these professions. After I read the book, I made the following unhappy discovery:
This room setup is the basis for the "Expert in Earshot" strategy (Cockburn 2000a), which is further developed in "Convection Currents of Information" on page 107. Programming in pairs is a programming technique that provides line-of-sight-and-hearing learning. Larry Constantine (1995) found this technique so effective that he nicknamed Brian Kernighan's use of pair programming "dynamic duo" teams. Pair programming has been repopularized largely through Extreme Programming (Beck 2000). Groups who practice pair programming report faster learning of both programming techniques and problem domain, as well as faster code production and lower defect rates (Cockburn 2001b). Supporting Concentration and CommunicationSoftware development as both a thinking-intensive and communication-intensive activity presents an interesting dichotomy. Programmers need sufficient quiet time to get into a quiet and productive mode known as flow (Csikszentmihalyi 1991). After spending 20 minutes getting into a state of flow, it takes only a minute or two of other conversation to disrupt it. Every project team should find a way to provide quiet times sufficient to get into flow and should protect those times. DeMarco and Lister (1999) suggest designating two hours as quiet time every day, turning off all phones and banning all meetings during this time. I watched one organization adopt this convention. It was so appreciated, from the CEO on down, that among three dozen suggestions for improvements to the company's working habits this was uniformly acclaimed as the most critical. XP recommends a "caves and common" room layout (Auer 2002). The center of the room is used for group work: tables with two to six workstations and space for two people at each workstation (see Figure 3-13). The outside of the room is set up with individual areas where people put their bags, make phone calls, answer e-mail messages, and so on. With this layout, the people have close access to other people while they are designing and private space for their personal needs. I have found no consensus on the question of private offices versus shared workspace. People regularly tell me that they have produced their best work when they shared an office with someone else on the project or worked in war-room seating. Some say that they enjoyed the quiet of their private offices but produced better work when they didn't have a private office. Others, however, are so strongly attached to their private offices that they would quit rather than move into a shared workspace. That may be too high a price to pay for communication. Personality-Matched Work AssignmentsFor people to perform as well as they can, it helps if their job assignments are aligned with the strong points of their personalities, not their weak points. Methodologies name the roles that must be present on a project but don't mention the personality characteristics required for each role. Here are three examples of a person whose personality characteristics did not match those required for the role:
What could be done with these people instead? On the first project, the person was too high on the project ladder to be replaced, and so the project continued to suffer. On the second project, the person was eventually replaced with someone who had good communication skills, who taught the novice programmers basic OO design skills. On the third project, we were luckier. The person was spectacularly good at defining requirements, where his careful thinking and attention to detail paid off. In exchange for his working on the requirements, he continued doing OO design and programming on sections of the system where the quality of the design was not a critical issue. Everyone benefited: He had fun doing the programming, and the project was safer due to the high quality of his requirements work. TalentThe best programmers on the team may be so much better than the rest that just a few of the best programmers can put out more than all the rest combined.
This combination of talent and practiced skill I call personal prowess. Although a manager can increase the skill of the team members by encouraging them to learn and sending them to courses, he can't change the talent level of the team. A talented designer will still outperform an average designer with good skills. John Wooden, the famously successful college basketball coach, considers talent such a key issue that he labeled his first coaching secret "Secret #1: The team with the best players almost always wins" (Hill 2001, p. 63). Rewards That Preserve JoyInventing reward structures is tricky. I recently got tripped up on this myself, in what I thought was a simple work-reward situation:
If I had that much trouble with that simple situation, how much harder is it to find an appropriate reward for creating software? Should you reward
In a Dilbert cartoon, the manager offers rewards related to the number of program bugs discovered. A programmer immediately announces: "I'm writing myself a minivan this afternoon!" (How like the dandelions!) Even if you can name an appropriate reward structure, what does the organization actually reward? Is it aligned with what is most important for the company?
Programmers detect the mismatch and sometimes find subtle ways in which to retaliate.
This sort of mismatch leads to programmers behaving in ways that hurt the company, just as Cameron's "investment" view of dandelion picking hurt my plans for the backyard. One person wrote to me that he feels stock options are a form of reward that aligns the good of the company with the programmer's behavior. He wrote that he is now working in maintenance, not because it is more fun but because it is the best way to protect his stock ownership in the company. Reward schemes are an even more slippery subject than I have implied so far, though. Alfie Kohn (1999) writes that rewards actually reduce the intrinsic joy and output quality of an otherwise fun activity:
If rewarding intrinsically motivated behavior destroys intrinsic motivation, what rewards might retain a person's intrinsic motivation?
Pride-in-WorkPride-in-work is exemplified by an ad for Scotch whiskey that I saw some years ago (sorry, it was long enough ago that I have to paraphrase this example). The ad ran something like this: "If you want a set of hand-carved golf clubs from Ian McGregor, you'll have to wait two years. There are three people ahead of you. (Good things take time.)" The ad made it clear that Ian McGregor took pride in his work, and as a result, he did an outstanding job (as did the Scotch distillery, by extension). The clientele could tell the difference and were willing to wait. I only recently became aware of the possible role that pride-in-work might play on a project, but it wasn't long before I heard a programmer say this:
He continued by saying that he wasn't really happy with his job, even though things were "working." Pride-in-AccomplishmentWinning is a great reward. We create a "small win," a powerful motivator, whenever we complete something (Weick 2001). In software, we create an early win by delivering running, tested, useful code quickly. Using the principle of small wins as a motivating reward, a team delivers as early as possible the smallest thing that will count as a win for the team. That early delivery demonstrates to both the sponsor and the team that the team can work together and deliver. It boosts the morale of both. To keep with Weick's principle of small wins, the team will then deliver more running, tested, useful function at regular intervals. This is the "Early and Regular Delivery" strategy underlying incremental delivery, described in Surviving Object-Oriented Software (Cockburn 1998). One question that arises with Early and Regular Delivery is what to deliver first. On the one hand, it seems a good idea to leave the hardest thing until the end so that the team knows everything possible about the system before attacking the hardest problem. This is the "hardest-last" strategy. It has a surprisingly bad track record, because many projects simply can't be done by the people assigned. Continually deferring the hardest part to the end, the project schedule does not become more reliable over time but stays unstable until the last piece of design magic is found . . . or the sponsors run out of money. The opposite strategy is to get the hardest part out of the way, using a "worst-things-first" strategy. This is better, but it has a weakness in that if the team cannot solve the hardest problem right away, no one knows what is wrong: Is the problem too hard? Is the team wrong? Is the process wrong? Are the tools wrong? The repaired strategy is "simplest first, worst second." By constructing a "walking skeleton," a barely connected version of the system that can handle just one small type of action, the team learns how to work together and gains an early win. With one victory under its collective belt, the team is in a stronger position to attack the worst problem. If the team can succeed with this, it once again gains doubly: The hardest part of the project is over (stabilizing the project plan), and the team accomplishes a major win. If the team is not yet strong enough to attack the worst problem, team members attack the hardest problem they are sure they can solve. This gives them more practice on their assignment, a bigger win for their morale, and greater confidence in their ability to attack the hardest problem. They continue in this way until they solve the hardest problem, and the project starts to become easier. Pride-in-ContributionThe third possible intrinsic reward is pride-in-contribution. People's desire to contribute is so strong that I regularly see programmers damage their health and private lives in their effort to contribute to the team. Here is a story of a key developer who changed his attitude toward the project when it was made clear to him what his contribution to the project and the community meant.
The interesting thing to me is that the executive did not draw on the programmer's feeling of pride-in-work with respect to the perfection of the design. Instead, he drew on pride-in-contribution to the community Combining RewardsLaubacher and Malone at MIT's Sloan School of Management highlight the combination of rewards needed for high-tech workers (Laubacher 2000). They start with this caution:
They amend that with the following:
Open-source projects seem to offer all three of the intrinsic reward mechanisms. The people involved comment on their pleasure in contributing, on the pride they feel about their work, and on their own and others' accomplishments. Those who contribute to open-source software are a notably committed group of people who generate very high-quality code. In their case, software creation clearly is a cooperative "game," done more for fun than for profit. Even with all of the above discussion in place, it is still not true that a single reward mechanism will work for all people. The space shuttle projects, for example, benefit from people who take pride in finding every mistake and who therefore take their time and review every work artifact carefully. It may be difficult to find appropriate rewards on a project like this if the people involved are looking for high-risk projects that will let them go fast and get rich quickly. This difference among people is good, because so many different kinds of systems need to be built. FeedbackPeople benefit from clear and frequent feedback. In general, the quicker the feedback, the better the effect.
Seymour Cray illustrated that a little bit of feedback can replace a lot of analytical work. Of all the published methodologies, Extreme Programming (XP) perhaps puts the most emphasis on feedback, both during design and in the overall project. XP calls for programmers to work in pairs during design and programming. The second person catches many programming errors during program entry. The programmers keep unit tests in an automated test suite. Whenever they change a section of code, they run the test suite to discover right away whether they have broken something that had been working. They produce running, tested code every few weeks. The on-site customers evaluate the new parts of the system and give feedback on its usefulness while the work is still fresh in everyone's minds. They review their own working habits every few weeks, reflecting on how well they worked in the previous iteration. Actually, every development team should review its working habits every few weeks, whether or not it uses pair programming or XP. The project "postmortem" that some teams hold at the end of a project happens too late to help the project. Holding regular reflection sessions during the project is much more effective. The team has a chance to incorporate feedback along the way and to work in the time needed to benefit the project. Periodic mid-project reflection sessions are the single practice common across all of the Crystal methodologies described in Chapter 6. Every two to six weeks, depending on the project's cycle duration, the team gathers to discuss what went well, what didn't, and what to try out during the next period. With regular feedback reflection periods in place, the team can construct other methods, such as Highsmith's product review sessions (2000), to gain feedback about the project. |