View Single Post
Old 05-18-2010, 07:26 PM  
Un4given
Registered User
 
Un4given's Avatar
 
Join Date: Jan 2008
Posts: 16
Page 2 of 2

Best Practices Are Not Mature

Most programmers have had the experience of trying to modify a
system that works well, but in which it's virtually impossible to make changes
without breaking some of its functionality. Programmers call this fragile code.

Code becomes fragile when it's put together in an ad hoc fashion, without
enough attention being paid to its architecture. An architecture is the overall
structure and design of a system,. New technologies need new
architectures. For example, when Microsoft introduced "event-driven programming"
to BASIC in 1991 via its new Visual Basic development environment,
it provided powerful new capabilities, but also the potential for new
problems.

One of these problems was a poor design practice, which became so prevalent
that it ended up with a name of its own: the Magic Pushbutton. In eventdriven
programming, all a programmer does is write a few "event handlers,"
which are routines that respond to the user's actions. This technology means
that instead of having to write the core functionality for each new program
over and over again, a programmer can just add functionality to an application
skeleton that's provided for them

In the Magic Pushbutton, the only event handler that does any real work is
the one that's called when the user clicks the OK button. If the programmer
doesn't deliberately organize the program's code in a better way, then it all
accumulates in this one routine, which ends up as a huge, unmanageable blob
of code.

Technology Experience Is Incomplete

We've seen that software technologies change rapidly. New technologies
supplant older ones every few years, and even more frequently, new versions
of existing technology appear that radically change the functionality and
use of that technology. This change is necessary and inevitable.

Moreover, developers work with an enormous range of specialized third party
software components. Experience with these components can rarely be
carried over into future projects, because those future projects are unlikely to
use the same third-party components. Experience with enterprise application
frameworks is similar; these frameworks are so extensive that different projects
that use the same framework may well use totally different parts of it.

Whatever a developer was working on even three to four years ago is
unlikely to be of any direct use today. So what use is an experienced developer?
Is it true that every significant new piece of software is written by
developers who are essentially novices to the task?

It's true that long lists of desired technology skills, which are so prevalent
in IT job advertisements, are virtually useless. The bulk of the technical
knowledge required for a project will normally be learned on the job. However,
the "softer" skills that make one a good developer, or even a good team leader
or architect, do apply from one project to the next, and can accumulate over
time. These skills include the software development best practices. Sadly,
these skills are rarely mentioned in job ads.

Software Development Is Research

As noted in previous points, the requirements for a piece of software will
invariably be incomplete. There will be conceptual gaps that must be filled,
and there will be assumptions that aren't justified and aspects that just won't
work. Because clients aren't software experts, they won't always be able to
distinguish between what's possible and what's not, or know what trade-offs
are available. They need to work with the developers to discover this.

This means that the development process is a process of discovery?
progressively finding out the exact character of the software that will meet the
customer's needs. Developers must combine analytical and creative skills to
find out what their customer really wants (even if the customer's description
is confused and incomplete) and invent ways to combine these requirements
into a system that's logically consistent and easy to use.

We can't take it for granted that a given software tool or component will
work as we expect it to, or do everything that we need when we use it to create
our software. Even if the product chosen is mature and well regarded, and
even if the developers have used it before, because of the complexity of software,
you can rarely be sure that it can be used for the functions and circumstances
that are unique to a particular project. You can't tell if it will do the job
until you've actually made it do the job, and have seen that it works.

So software development is also a process of discovering whether and how
the chosen technology can be made to perform the role that's required of it.
Sometimes it will work as expected. Sometimes it won't, but there's a workaround
that takes more effort than originally planned. And sometimes the
technology just can't do what's needed. Software projects rarely run smoothly
from beginning to end. They frequently encounter setbacks and dead ends,
simply because of the scope of the unknown. In a very real sense software
projects are simply the process of discovering the unknowns: once the
unknowns are known, then the project is effectively at an end.

Construction Is Actually Design

Bridge building consists of a sequence of well-defined phases. The first step is
to perform the planning and design, which results in a set of plans and blueprints
that can be signed off. Once these tasks are completed, then construction
can start. The construction phase largely consists of well-defined,
repetitive tasks that can be accomplished by less highly skilled workers.

In contrast, software development is a process of research, so at no point
can definitive plans be drawn up. The more definitive you try to make the
plans, the more flawed they'll be, and the more labor there will be in revising
them to meet changing circumstances. As the shape of the software becomes
increasingly clear over the course of a project, the design of that software must
be revised again and again

If tasks can't be well defined, then we can't cleanly separate the design
and construction phases. Indeed, there's no construction as such; there's only
design on smaller and smaller scales.

Programming is more than just writing code. Each step requires the developer
to analyze some portion of the problem and design some aspect of the
solution.

Change Is Considered Easy

Last-minute changes to requirements are rare in bridge building because the
consequences are so severe. If you discover during the course of a project that
the foundations are in the wrong place, then it takes considerable effort to dig
them out and rebuild them in another place. This is obvious to clients and
contractors alike.

Compare this to software. Software is soft, by definition. Any part of it can
be changed at any time, just by rewriting that portion of the code. We expect
that bugs can and will be fixed wherever they appear in the system, as indeed
they are. Anyone who has written macros for Microsoft Office, or learned how
to write small programs at school or at a university, knows how flexible software
is and how quickly you can make substantial changes.

It's true that substantial changes can often be made quickly and easily, but
to properly implement them you really have to revise the architecture of the
software so that it gracefully supports the new functionality; otherwise you'll
just create a mess and make the software more fragile.

Change Is Inevitable

We've seen how software development is actually a process of design from
beginning to end. It includes design work to accommodate requirements
whose details become clearer as the project progresses, and design work to
reflect what's learned about the tools and components used to develop the
software. The process of software development is one of continuous design,
and therefore of continuous change.

Moreover, clients see how easily changes can be made, and expect that
they can change their minds at any point. Indeed, they often do, as they learn
more about what their budding software can achieve for them.

Change is inevitable, and if a piece of software isn't built to support change
then it will fall apart even as it is being built. The quality of software shows
itself when the software is first extended or modified. If the process of development
becomes one of extension and modification, then any software that
resists change will have a difficulties.

About the author


I have worked in Information Systems since 1995, including adult with
ExtremePaychecks and RageCash (2001 - 2006). As a consultant my goal is to
decrease the viscosity of the development process by discovering and
implementing new methodologies.
Un4given is offline   Share thread on Digg Share thread on Twitter Share thread on Reddit Share thread on Facebook Reply With Quote