Saint-Exupery on Engineering Elegance
"A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away."
- Antoine Saint-Exupery
"A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away."
- Antoine Saint-Exupery
“What is the simplest thing that could possibly work?”
- Ward Cunningham
I have been thinking recently about the Agile Manifesto.
Here it is with some annotations.
Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
Right on! This gets to the heart of the "adaptive" vs. "predictive" debate. The post here makes a similar point phrased in terms of "evolutionists" vs. "creationists" using analogies from Richard Dawkins.
Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
Changing requirements is a reality and you need to embrace that and learn to succeed within that reality.
However, I have two concerns with the way this particular item is presented.
First "welcoming change late in an iteration" can directly conflict with your ability to achieve "early and continuous delivery of valuable software". The manifesto leaves it as an exercise for the reader to figure out how to balance those conflicting desires. It can be done, but there is no guidance here how to do it.
Second recognizing the reality of changing requirements doesn't give you a free pass to put off detailed requirements definition. You still want to push hard to define the requirements as early as possible and then only change them based on "new information". Thrashing a decision because of internal indecisiveness is a bad idea, adapting as you get new insights into what works best for the user is a good idea.
The good thing about short iterations is that you can "freeze" and "reopen" requirements quickly (with each iteration). Still at some point you have to at least temporarily freeze the requirements to get the iteration out the door.
Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
Right on! This is a direct corollary of point 1 above. Of course some initiatives will take longer than a "couple of months", but that does not mean they can't deliver working software along the way.
Business people and developers must work together daily throughout the project.
Right on!
Engineers working in a vacuum will produce some beautiful code, which may be irrelevant to the problem that needs to be solved. In the case where the engineers themselves fit the target audience (programming tools, search engines) then engineers can produce great things without the business folks. But those cases are the exception not the rule.
Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
100% agree.
However, when you have multiple motivated individuals they often don't agree on how to proceed forward. The manifesto leaves as an exercise to the reader: how do you get alignment and get past such disagreements.
The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.
It is true that face-to-face is the most powerful way to communicate an idea and it is true that face-to-face is often underused.
However, there are plenty of times when face-to-face is not the best option for "conveying information" especially information that needs to survive for a period of time.
Tribal knowledge is a powerful thing, but if all information only exists as tribal knowledge in peoples' heads than you will have some real issues in achieving "sustainable development" (see two items below).
Working software is the primary measure of progress.
Right on! Such a simple but powerful concept.
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.
100% agree.
Continuous attention to technical excellence and good design enhances agility.
100% agree. An interesting question here is how you go beyond "attention" to "measurement". It is much easier to keep your attention focused when you have some measure of how well you are doing.
Simplicity--the art of maximizing the amount of work not done--is essential.
Right on!
It is easy to state the value of simplicity, it is harder to apply it in practice. Though Dilbert had a good example of simplicity in action that has some lessons for the software world.
The best architectures, requirements, and designs emerge from self-organizing teams.
This is true.
However, it begs the question: what do you do when the team fails to "self-organize"? Give up and go home? Hopefully not. How to catalyze "self-organization" is left as an exercise for the reader.
At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
100% agree. Any complex task that is worth doing demands a certain amount of self-reflection.
By the way, one implication of this last point is that you should make your behavior suit your particular needs and experiences even if that means not exactly following agile development method as described in the various books, training classes, etc.
copyright 2007 Kerry Champion
I ran across an amusing checklist to measure "Agility" in the agile programming sense.
Don't agree with every single point implied by this list, though most rang true. Here are some favorites.
======================================================================
You are not yet Agile if:
“Test-driven” still refers to your car.
Developers only develop, testers only test, and managers just manage.
Simplicity is presumed to be simple.
======================================================================
A more serious checklist to measure agility is available from the same source here.
When deciding on your testing plans and your process for handling bugs, keep in mind this question:
Which practices will go beyond reporting a snapshot of current quality? Which practices will drive positive changes in how we develop going forward?
One unfortunate pattern you see in many software teams is:
This approach is far from optimal, of the various issues here are three that stand out:
I do believe in having dedicated testers and I do believe in the importance of a bug database and I do believe in tracking bug counts. However, those things by themselves aren't enough. You need to go beyond these things to implement QA practices that drive continuous improvement in how you develop, and not just improvement in how you test.
What specific practices make sense depend on your circumstances: size of team, maturity of developers, nature of software being developed, etc. Here are some possibilities to consider:
There are some common threads in the above practices. One thread is to get developers to foresee where bugs are going to be and resolve them before that bug is found by testing. Another thread is to move away from "whip it out and hand it off" approach and have practices that encourage developers to review their code multiple times from multiples perspectives.
copyright 2007 Kerry Champion
My daughter has a t-shirt that says on the front:
There are 10 kinds of people in the world.
On the back it says:
Those that understand binary and those that don't.
She is in Junior High and thinks this is hilarious. It has been a long time since I was in Junior High but I also think it is hilarious. I love it when you can make good use of base-2 nomenclature.
In any case, on to the real topic.
There are 10 kinds of programmers in the world: those that code via trial and error; and those that don't.
When I first started programming as a teenager I was a trial and error coder. Luckily I later worked with some consummate professionals who showed me a better way.
Unfortunately lots of folks who are nominally professional software engineers still use the trial and error approach. The following is a typical scenario:
The problems with the above approach should be obvious. However, it is shockingly frequent that this is exactly how commercial programming gets done.
Sometimes this is because the engineer is simply incompetent, however much more often it is other factors that drive this behavior. For example:
I think it is critical to explicitly talk to the team about why "trial and error" programming is a bad idea, to set up practices that encourage a more mature approach, and to make it part of your recruiting process to screen out this type of programmer. I will talk more about these last two points in subsequent posts.
copyright 2007 Kerry Champion
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |