We strive always to “do the simplest thing that could possibly work”. We’re quite serious about this. We have found that with the right architecture and correctly-factored code, we can rapidly extend our software when the need arises. If we work on something “we’re gonna need”, we’re not working on something we DO need.
We emphasize communication in every way. In our code, we all use the same formatting conventions, naming conventions, and coding standards. This means that all methods, no matter who wrote them, look familiar and are easy to understand when we come upon them.
We code so as to express intention, not algorithm. Our method names say what they accomplish, not how they accomplish it. At every level, we try to make our methods read like a human description of what is going on.
So that we can communicate design, we do it the same way, using CRC cards. Whenever we begin to work on some new objects, a few of us will sit down and do some cards. Whenever we make big changes, we’ll get a larger group together and work out what is to be done. But what about the formal documentation?
We are fanatics for testing. We would like to have more lines of test than we do of actual code. Every class must have a corresponding unit test class. Each public method should have at least one unit test method. We presently have over 1400 unit tests in the system.
When we release code, all the unit tests must run at 100%. You can’t release unless they do: if they don’t, you fix the problem immediately.
We have functional tests as well, that test the system from end to end by paying one or more people and checking the results. There are hundreds of functional tests.
The result of all this testing is that we know the system works, and when we make errors we find them immediately.
Aggressiveness (Fearlessness) (Finally: Courage)
The result of the other three values is that we can be aggressive, or fearless. (When XP was published, Kent chose “Courage”.) We can change any part of the system to be better because we know we have a solid system of tests. We can try things and if we don’t like how they work, we throw them away and try again. We know we won’t break the system, which gives us the confidence to move forward rapidly.