Process change is a difficult business. People get attached to their habits and tribal affiliations. People resist changes that threaten their social status. Effective process change addresses human issues of fear and hope before interfering with workers’ routines. Deming and the Lean thinkers have much to say about this. One thing you can do is to take an evolutionary approach and keep changes small and incremental whenever possible. Sometimes disruptive changes are truly necessary, but they are also risky and should be treated as such.
One of the things that I find most implausible about Team Software Process is the notion that you ought to send everybody off to boot camp for a few weeks in order to successfully launch the process. If that is a precondition for success, then you should brace yourself for failure. If you have to make a big, discontinuous change, it should be done quickly and decisively, and facilitated by experts. If you know where you want to go, and there is a smooth and incremental path to get there, then you should follow it.
If you are starting from a phased, waterfall-type process and you have functionally-aligned teams, then you might start with a Kanban process. I’ll describe the process for setting up a Kanban system in a future article. If you have more project-aligned teams, then you might start with Scrum or Feature Crews.
If you are already using Scrum, Feature Crews, Feature Driven Development, Extreme Programming, or something similar, then you can use that as a starting point. As long as you are consuming customer-valued work and following through to continuous integration, then you have a foundation to build from. From here you could tackle the front end, upgrade to a Kanban process, or you could upgrade your core engineering workflow. Let’s assume that we’re doing the latter for now.
Since Extreme Programming gives us a nice concrete model to work from, let’s start with that. If you can read between the lines of all of the religious rhetoric of XP, then you might see that it’s a scaled down implementation of a V Model workflow. Most of the individual XP practices are concrete implementations of specific V Model states. The notion of the “irreducible interdependency” of practices is a ruse to keep you buying books and training and consulting. Once you start to look at it that way, you may then feel emboldened to substitute those practices with alternative practices that serve the same function with respect to the V Model.
For example, Test Driven Development, if it is done well, is very much like Design by Contract. Given the right tools, Design by Contract is, in turn, a form of Formal Specification . If you are feeling scholarly, Edsger W. Dijkstra’s 1976 book, A Discipline of Programming, explains a design process which is very clearly the origin of both TDD and Design by Contract. I like to think of TDD as Design by Contract for Dummies, and DbC as Formal Specification for Dummies, so if you’re looking for an opportunity to upgrade your practice, implementing Design by Contract would be an excellent start. And remember, the way to do DbC right is write your postconditions first!
You could also replace Pair Programming with the Capture/Recapture Code Inspection. You could insert Pugh Concept Selection before coding. You could insert Failure Modeling and Threat Modeling before Acceptance Testing. You could add multiple integration stages and insert Taguchi Orthogonal Array testing. You can do any or all of these things (and more) as they are needed. We’ll get into much more detail about all of that as we go along.
But first, if you are practicing Extreme Programming ™ today, please stop thinking of it as Extreme Programming and start thinking of it as Lightweight Lean V Model with Practice Set { Onsite Customer, TDD, Pair Programming, … }.




Adam | 24-Apr-07 at 9:05 am | Permalink
Putting threat modeling right before acceptance testing is a waste of time. There’s no time to fix the design problems you’re likely to encounter.
coreyl | 24-Apr-07 at 10:02 am | Permalink
Firstly, thank you for the comment. Let me clarify some terminology. I am using the words “acceptance test” here in the XP sense i.e. functional verification and validation of a single user story. So I’m suggesting inserting additional design verification between unit testing and story testing. Perhaps you had another definition in mind?
Lean Software Engineering | 30-Apr-07 at 8:53 am | Permalink
Avoid dogma when herding cats…
So that’s why XP and TSP are great, but starting with something simple like Scrum can be great advice. That, and avoid dogma when helping your cats to herd themselves.
……
L505 | 09-May-08 at 2:12 pm | Permalink
“If you are feeling scholarly, Edsger W. Dijkstra’s 1976 book, A Discipline of Programming, explains a design process which is very clearly the origin of both TDD and Design by Contract. I like to think of TDD as Design by Contract for Dummies, and DbC as Formal Specification for Dummies, so if you’re looking for an opportunity to upgrade your practice, implementing Design by Contract would be an excellent start. And remember, the way to do DbC right is write your postconditions first!”
You ought to do some research and you are taking Dijkstra very out of context – because Dijkstra was violently against “unit testing” and “testing programs”.
Corey Ladas | 12-May-08 at 10:31 am | Permalink
Perhaps you misunderstand my point. Dijkstra’s opinion about unit testing is not really relevant to the history of the development of the idea of correctness by construction. He might not have cared for some of the directions that the idea took, but that does not change the facts of history.
If you read the paragraph that you quoted a little more carefully, I am suggesting that people who are unit testing today can move in the direction of greater rigor if they understand the origin of the practice of test-driven development. Do you think that Dijkstra would have approved of a suggestion that people should be more formal in their approach? What would you suggest to the contemporary TDD user?