While
 it is not always true, you’ll frequently find that in restaurants there
 is a reasonable correlation between the quality of the food and the 
management of the kitchen. In my youth I had always found that a messy 
kitchen often meant low quality food and/or bad service. Of course it’s 
not always that simple, but usually a disaster area behind the curtains 
percolated out to the rest of the organization. Since I prefer to ‘do 
things well if I have to do them’ when searching for jobs back then, I 
stayed far away from disorganized, sloppy or dirty restaurants, even if 
it was well-hidden behind the scene.
The
 same is essentially true in software development. Projects that are set
 up correctly have strong processes, gravitate towards best practices 
and control the client’s expectations are considerably more likely to 
produce quality software. The correlation isn’t always as strong though,
 since I have seen smooth development shops that still produce fugly 
software. But I’ve never seen a badly organized shop produce excellence.
  
One
 far too common problem I’ve seen is that the client expectations are 
out of whack. In the printing industry people often say “Fast, Cheap or 
Quality, pick two” as the means to explain the types of trade-offs 
necessary when purchasing print work. In software we get the same saying
 but it ends with “pick one”. I figure it’s worse for our industry 
because our work is considerably longer. Print jobs are often measured 
in hours, days or perhaps weeks, while software is usually measured in 
weeks, months and years. I’ve seen far too many software projects where 
clients insist on all three and then have a hard time understanding why 
some “fiddling” with a few screens might require more than a trivial 
effort. 
A
 development project that is set up well not only attends to the 
implementation and distribution of software, but it also must control 
the client’s expectations. They need to be reasonable. Failure to do 
this means too much pressure on features and quick fixes, which means 
accumulating a heavy technical debt. Left unchecked, the project spirals
 downwards until it combusts. 
You
 can see the symptoms of that type of pressure directly in the code 
base. Poor analysis, little design, poor use of tools and overly 
frequent ‘micro’ releases. As well, there is generally a high bug count 
and a lot of time burned on ‘second-line support’. If developers are 
busy with band-aides then clearly they’re not coding new stuff. Too much
 support and too little features just amplifies the pressure, which 
eventually becomes so toxic that big things start to break.
Getting
 out of this type of spiral can be difficult or impossible. Resetting 
the expectations of people who are already disappointed is an extremely 
tough task. However, just like those reality TV shows where they help 
people in serious financial debt learn about handling their finances 
(like Til Debt Do U$ Part) in a more reasonable manner, the ticket to 
really fixing the development problems is to tackle the technical debt, 
which mostly means being cost conscious (features & make-work) and 
reducing lifestyle expectations (release dates). Digging out takes a 
massive amount of time and means a lot less progress, but it only gets 
worse if it is put off for longer. 
Reversing
 the slide means revisiting the development and release procedures. It 
also means lots of cleanup and refactoring. And it usually means 
revisiting all of the development tools to upgrade their usage to known 
best practices. For confidence, a few low hanging features might be 
tossed in as well, but all major changes need to be put on hold until 
the implementation and release process stabilizes. A smooth development 
effort should produce minimal support effort. It should be reliable and 
repeatable. The code should be clean and consistent.
Getting
 back to the kitchen in a messed up restaurant, not only do you need to 
clean up the work area and replace any defective equipment, but you also
 need to set some processes in place to insure that it doesn’t happen 
again. Once that back-room problem has been dealt with, you can consider a
 new strategy and/or a new menu, but neither of those will help if the 
kitchen lacks the ability to execute.
You’d
 think that new projects were less vulnerable to this type of problem, 
but most often the pressure to get something working right away 
overrides the desire to set things up properly. The developers start 
letting little issues slip and then after enough time, they get hit with
 ‘death by a thousand cuts’. The most visible “source” of the problem is
 the client expectations, but they only become overwhelming because of a
 lack of management. Still it is ultimately up to the developers to 
‘insist’ that the technical debt not be ignored. At some point it will 
always be dangerously large, so at very least ‘cleanup’ should be a 
recurring work item. Personally I like to start each new development 
iteration with some significant cleanup, mostly because its boring and 
it gives one a chance to take a breather after the last release. If that
 becomes a steady habit, while there is always technical debt and time 
pressure, at least it never builds up to toxic levels. 
In
 the end its not just what you code, but how you code it and how you 
leverage the development and systems tools as well. Digging out of 
technical debt is an on-going problem and mostly the fixed time
allocated to do the work should be relative to the size of the debt. It doesn’t need to
 happen in one big effort, but it can’t be ignored indefinitely either. A
 smooth development process means that the developers can spend more 
time contemplating the behavior of the code, which is really the only 
route to quality. A disorganized process means a strong head wind which 
is only overcome by dangerous short-cuts. Thus smooth is good and it is a
 primary requirement to achieving quality. You can’t have the later 
without spending time to get the former.
No comments:
Post a Comment
Thanks for the Feedback!