Fast Feedback

28.02.2014 Permalink

Uncertainty is a permanent companion when developing non-trivial software systems. The combination of technology, industry, organization and individual constraints that we find in a project is almost always unique. There are hundreds of decisions that have to be taken, and it's hardly possible to foresee all consequences for even one decision on a theoretical level.

Certainly the costliest mistakes we can make is building the wrong system: software engineers believe they understood exactly what users need but they err. Even if the project team documents all requirements in a precise specification odds are that users or their representatives are not able to check if the described system will meet their true needs. This is a well-known risk and agile processes aim to mitigate it by delivering increments of the system on a short-term regular basis.

The underlying principle is fast feedback. We acknowledge that building a complex system is actually more trial-and-error than a linear, foreseeable process. So we produce artifacts that can immediatly be judged by stakeholders. They provide feedback, the creators recalibrate the product and the result is true progress. Agile process methodologies usually apply this principle to the whole system only, but actually there are numerous opportunities to apply fast feedback in a project.

Many days before the first line of code is written usability engineers have the chance to elicit needs and context information from users by jointly working on cheap (paper) prototypes of the user interface. While users always have a hard time describing their needs in prose they can usually decide quickly if an imaginary UI supports their workflow or not.

Another area where feedback is invaluable concerns the architecture of a system. Instead of just plumbing available libraries together in order to produce the first increment with business value, a careful implementation of a few simple use cases on the basis of a rough architecture blueprint reveals deep insights. The result usually has no business value. Developers learn if and how things fit together. They are able to conduct very early load tests to learn about scalability.

A project team that uses a continuous integration (CI) system practices fast feedback. A developer quickly notices if her changes break the existing code base and can apply a fix to it. Here, the importance of "fast" becomes visible: since the feedback is given within few minutes there is no mental context switch necessary, so the fix will usually take only a blink of an eye.

Code reviews are the most effective (and usually cheapest) way to improve on code quality. Actually they promote code quality as well as developer skills at the same time. But in order to keep "technical debt" small these reviews must be conducted quickly, which means it's ok if they are informal and almost spontaneous. I found the combination of Git, Gerrit and Jenkins to be a viable tooling that integrates code reviews as a mandatory step in the CI process.

I have experienced more than once that early system testing of a software that is still under construction actually helps with product quality. Although bug reports for a half-finished system are sometimes a little disturbing for the developers it urges them early to recalibrate their quality standard to meet test expectations. In addition, the cooperation between test and development team is trained, which is beneficial when things start to get hectic.

As the last example in this row I'd like to name interactive development as it is practiced by Lisp developers. With Lisp and its REPL (read-eval-print-loop) it is common to change the running system. Lisp developers try out snippets of code in the REPL, one feedback cycle literally takes only seconds. They apply changes to the code base by using these snippets and what they have learned "in the REPL". The result is usually software that "just works" because it was written under permanent test. (But - of course - well-known test activities like unit testing and system testing remain indispensable.)

To conclude: I'm a firm believer in the merits of the principle of fast feedback. Examples of its beneficial application can be seen throughout the software development process. Therefore I tend to reject everything that may inhibit or slow down feedback: clumsy application servers, writing lengthy specifications up-front, long discussions on the basis of merely belief etc. We can certainly make more use of it if we actively seek for opportunities to apply fast feedback regardless of the process model.