|
The Software Engineering Institute (SEI) of Carnegie Mellon University has documented a 39
percent productivity improvement in overall operations for engineering teams with well-established
continuous process improvement programs (CPI) as compared with teams that rely solely on the talent
of their members. Whether one implements a CPI program according to the SEI or some other CPI program,
it probably does not matter in the larger scheme of things. What is important is that a 39 percent productivity
improvement across a large engineering team significantly overcompensates for the cost of implementing effective
engineering processes and tools.
I have heard several knowledgeable people question the perceived cost of implementing effective
engineering processes. Consider that the 39 percent improvement figure includes the cost of those
tools and techniques. It is very difficult to nail down the specific cost of implementing software-development
tools and techniques from one engineering team to another. This is because some of the tools and techniques
would likely be implemented with or without a special focused effort, and often many members already have
experience in the common tools and techniques to be deployed. And then, as learning occurs (assuming the
tools and techniques are right for the job) operations improve gradually and implementation cost are offset
by productivity gains. A 39 percent productivity improvement across a large engineering team will pay for a
lot of tools and techniques.
Predictability: The prior example regarding unreasonable release dates can be solved with an
accurate estimating process. Typical estimates at the start of a release (before requirements are fully
known) can be off by as much as 400 percent, according to industry benchmarks. That means that a project
estimated at six months might actually take up to two years to complete, or cost five times what was planned.
These poor estimates are developed by managers who do not ask the engineers for their input into the estimate
or base the estimate on their own anecdotal experience (“gut feel”) from supposedly previous work.
In contrast, accurate estimates are based on extensive documented historical data, require the use of
a measuring technique that breaks work down into recognizable components (WBS elements, use cases, functions,
transactions, etc.), evaluates components for complexity, considers technical and environmental impact
(language, tools, object reuse, experience and motivation of the team, closeness to the domain experts,
etc.), and adjusts the estimate further for overall risk factors (stability of the requirements and other
unknowns). There are engineering teams that regularly estimate project cost and schedule as described here
at the start of every release cycle and with an accuracy of greater then 90 percent. That would be a less
than 10 percent error at project completion, as compared to a 400 percent error. Think about it: what would
a 400 percent error in estimate do to the cost of goods sold (COGS) in your company? Now compare that with a
10 percent error, and decide which would be more palatable to the CFO and CEO.
Flexibility: Building software is more like writing a book than manufacturing a laptop computer.
There is a certain structure like the table of contents or book outline to a program, which can guide the
development. And certain parts of software programs are often drawn from, reused from, or copied from previous
efforts.
Some software engineers have lambasted the implementation of engineering processes for as long as
engineering processes have been around. I have personally been accused of "limiting creativity" or
for "trying to turn this place into HP(!)" as I laid down another rule for yet another process. But
these complainers miss the larger picture--the cost vs. product picture, or the "let’s not reinvent
the wheel" picture. In fact, this is a major difference between an engineered solution and a non-engineered
solution; engineering should consider the whole system picture. The trouble is, the whole picture is often
not visible at any point in time along the SDLC (sometimes, not even at the end of the project). Therefore,
if the whole picture is not visible, how does one proceed? Certainly stopping or waiting until all of the
requirements are defined is a proven way to kill a large project. The answer is flexibility.
The Agile Alliance describes several processes for staying flexible during software development. Key
to these flexible processes are the concepts of staying in close collaboration with the domain experts
(end users, clients), keeping the domain experts deeply involved throughout the SDLC, and iterating through
small incremental releases that build collectively toward the public product release. If one were to never
estimate the larger project, only focusing at the next two-day or one-week release, one would never know when
the project was complete until it was too late and well over budget. This is one of the common misunderstandings
with Agile development. If instead--as part of each iteration--both the immediate iteration and the entire
release are re-estimated (based on the new information from work completed to that point in the project), then
real tradeoff decisions can be made to ensure total project success.
To successfully re-estimate a project on a daily/weekly basis requires an effective estimating process
based on solid and deep historical data and an automated tool that enables an estimate to be created quickly
and easily (see my previous article: Estimating Software).
What does it cost to lock down requirements or freeze design on a large project? The conventional
wisdom is that success demands that no changes be made to the project requirements. Like errors, changes
made to requirements can have an ever-increasing cascading effect on a project the deeper into the SDLC
these changes are made. The difference, however, should be that change is intentional and the cost of the
cascading effect should be taken into consideration before proceeding, but errors are not intentional and
the cascading effects are often hidden. The cost of making a change can be estimated, but the cost of an error
is usually a surprise.
I have heard well-meaning people say, “Keep the users away until the software is complete.” They seem to
be afraid that the users will want changes, and I guess they cannot handle changes. I have even heard senior
engineers say, “Keep the users away so that they will not change the requirements.” But what if we taught our
engineers that making changes is simply the process for “getting it right”? I love this example that Ward
Cunningham once gave me in a coffee-shop conversation:
"A lot of programmers are afraid to make schema changes. What if they were to start a project with the
simplest schema. Then as the project evolved, they would be forced to change the schema many times. By the
end of the project, they would no longer be afraid to change schema.”
What a great example of designing with simplicity and developing with courage! Think of the cost of the
alternative--building a system that users do not want, will not use, will not buy! What is the value of
a software product that does not sell?
Build versus buy: It is important to note that there is a significant time investment, as well as
cost, involved in implementing processes. Highly effective engineering teams are typically a product of
slow evolutionary change (continuous process improvement), rather than dictated efficiency (the natural
aversion of the subjugated to the actions of a dictator tends to cancel out any productivity gains). Many
techniques need to be tried across a few projects before it is confirmed that they are right for that team,
that set of products, and that environment. It typically takes several projects before a new process is
ingrained into the whole SDLC methodology. And then there will be processes that need to be thrown out and
replaced (which starts the process all over again).
SEI tracks the typical evolution of an engineering team through its assessment program as averaging over
five years to achieve the highest level--the 39 percent productivity improvement that comes when the team
is operating at its highest level of optimization). Most engineering teams, however, never achieve that
level.
When a merger contract is signed, should a company wait for five years as the engineering team is built
to a high level of efficiency? Perhaps. It may be critical to company success for the company to have a
highly effective engineering team. However, those who negotiate a merger are unlikely to be willing to wait
five years to achieve their projected cost savings.
An alternative to building a highly effective internal engineering team is to buy one. Some companies
specialize in providing software-engineering services and can assemble highly effective engineering teams
in a matter of weeks, not years. The real trick is understanding that to engage another company to outsource
engineering is a serious partnership, requiring significant scrutiny to ensure that the outsourcing company
truly has the highly effective engineering-team capabilities it claims. Compounding the challenge is the fact
that many of the companies that build such teams are located outside the United States, perhaps related to the
fact that most teams assessed at the highest level by SEI--175 out of 180--are also located outside the United
States.
Deciding to outsource engineering is nothing new, but the decision to do so should be carefully and
systematically thought through (see my article: Why Outsource?). On the other hand, to have a team operating
at 39 percent higher productivity, producing fewer (or no) errors through predictable and flexible processes,
and priced at offshore rates--this can be a very compelling proposition.
|