Page 136 -
P. 136

when software teams adopt good requirements engineering practices, they find that these
                          problems are greatly reduced, and that their projects go much more smoothly.

                          Iteration Abuse
                          Iteration, or the repetition of a particular task or activity with the goal of improving its
                          main work product, is a practice employed by many programmers. There are several pop-
                          ular development methodologies (Extreme Programming and Rational Unified Process, for
                          example—see Chapter 12) that rely on iterative development. These methodologies use
                          iteration effectively, by planning and executing a series of small steps that build on previ-
                          ous iterations to produce a series of intermediate builds; each successive build adds new
                          functionality to a previous build. Each build is intended to be production quality, and is
                          fully tested. Changes are controlled by having each new iteration concentrate on adding
                          new functionality, rather than making many changes to existing behavior.
                          However, many software teams abuse iteration. They do not use successive iterations to
                          add new functionality to a build that is already production quality. Instead, the iterations
                          are meant to be a sort of guessing game. The first iteration is presented to users and stake-
                          holders, who are expected to tell the programmers what’s wrong with it. The program-
                          mers then go back, fix those things, and deliver a second build, which the users and
                          stakeholders again correct. This is expected to continue until the software does everything
                          that the users and stakeholders need it to do.

                          This sort of iteration makes intuitive sense to everyone involved. The programmers like it
                          because they can dive right into the project and do what they do best: program. And it
                          feels right to the users and stakeholders as well, because it’s much less work for them than
                          sitting down and really thinking about what they need out of the software. All they have
                          to do is play with the demo versions and give their opinions.

                          Unfortunately, this is all too good to be true. The first iteration is easy to deliver—expecta-
                          tions are low, and people are excited to get their hands on a build so quickly and to give
                          their input. The next iterations seem to be doing their job, and the software does look like
                          it’s starting to get better. But as the software gets more complex, each iteration takes
                          longer and longer to do. There seem to be more bugs in each new build. The programmers

                          find that they have to take more time to rip out things that they put in earlier. The code
                          starts to degenerate into an unmaintainable mess because the programmers keep patching
                          and repatching code that they should have built differently in the first place. The iterations
                          finally end, but not with fully working software. Rather, the users and stakeholders get
                          increasingly fed up with long delays and with buggy software that doesn’t do what they
                          need. They eventually settle on a build that is close enough to something that fulfills their
                          needs; they can concoct workarounds for any remaining problems that keep them from
                          getting their work done.

                          This sort of “iterative” development falls apart because software is difficult to change. After
                          an object or function is written, it is generally used elsewhere in the code. The objects or
                          functions that reference it, in turn, are called from other objects or functions, and so on.



                   128  CHAPTER SIX
   131   132   133   134   135   136   137   138   139   140   141