One
significant problem in software development is not being able to end an
argument by pointing to an official reference. Veteran developers
acquire considerable knowledge about ‘best practices’ in their careers,
but there is no authoritative source for all of this learning. There is
no way to know whether a style, technique, approach, algorithm, etc. is
well-known, or just a quirk of a very small number of programmers.
I
have heard a wide range of different things referred to as best
practices, so it’s not unusual to have someone claim that their eclectic
practice is more widely adapted than it is. In a sense there is no
‘normal’ in programming, there is such a wide diversification of
knowledge and approaches, but there are clearly ways of working that
consistently produce better results. Over time we should be converging
on a stronger understanding, rather than just continually retrying every
possible permutation.
Our
not having a standard base of knowledge makes it easier for people from
outside the industry to make “claims” of understanding how to develop
software. If for instance you can’t point to a reference that says there
should be separate development, test and production environments, then
it is really hard to talk people out of just using one environment and
hacking at it directly. A newbie manager can easily dismiss 3
environments as being too costly and there is no way to convince them
otherwise. No doubt it is possible get do everything all on the same
machine, it’s just that the chaos is going to extract a serious toll in
time and quality, but to people unfamiliar with software development
issues like ‘quality’ find that they are not easily digestible.
Another
example is that I’ve seen essentials like source code control set up in
all manner of weird arrangements, yet most of these variations provide
‘less’ support than the technology can really offer. A well-organized
repository not only helps synchronise multiple people, but it also
provides insurance for existing releases. Replicating a bug in
development is a huge step in being able to fix it, and basing that work
on the certainty that the source code is identical between the
different environments is crucial.
Schemas
in relational databases are another classic area where people easily
and often deviate from reasonable usage, and either claim their missteps
as known or dismiss the idea that there is only a small window of
reasonable ways to set up databases. If you use an RDBMS correctly it is
a strong, stable technology. If you don’t, then it becomes a black hole
of problems. A normalized schema is easily sharable between different
systems, while a quirky one is implicitly tied to a very specific code
base. It makes little sense to utilize a sharable resource in a way that
isn’t sharable.
Documentation
and design are two other areas where people often have very eclectic
practices. Given the increasing time-pressures of the industry, there is
a wide range of approaches happening out there that swing from ‘none’
to ‘way over the top’, with a lot of developers believing that one
extreme or the other is best. Neither too much or too little
documentation serves the development, and often documentation isn’t
really the end-product, but just necessary steps in a long chain of work
that eventually culminates in a version of the system. A complete lack
of design is a reliable way to create a ball of mud, but overdoing it
can burn resources and lead to serious over-engineering.
Extreme
positions are common elsewhere in software as well. I’ve always figured
that in their zeal to over-simplify, many people have settled on their
own unique minimal subset of black and white rules, but often the
underlying problems are really trade-offs that require subtle balancing
instead. I’ll often see people crediting K.I.S.S (keep it simple stupid)
as the basis for some over-the-top complexity that is clearly
counter-productive. They become so focused on simplifying some small
aspect of the problem that they lose sight that they’ve made everything
else worse.
Since
I’ve moved around a lot I’ve encountered a great variety of good and
insane opinions about software development. I think it would be helpful
if we could consolidate the best of the good ones into some single point
of reference. A book would be best, but a wiki might serve better. One
single point of reference that can be quoted as needed. No doubt there
will be some contradictions, but we should be able to categorize the
different practices by family and history.
We
do have to be concerned that software development is often hostage to
what amounts to pop culture these days. New “trendy” ideas get injected,
and it often takes time before people realize that they are essentially
defective. My favorite example was Hungarian notation, which has
hopefully vanished from most work by now. We need to distinguish between
established best practices and upcoming ‘popular’ practices. The former
have been around for a long time and have earned their respect. The
latter may make it to ‘best’ someday, but they’re still so young that it
is really hard to tell yet (and I think more of these new practices are
deemed ineffective then promoted to ‘best’ status).
What
would definitely help in software development is to be able to sit down
with management or rogue programmers and be able to stop a wayward
discussion early with a statement like “storing all of the fields in the
database as text blobs is not considered by X to be a best practice...,
so we’re not going to continue doing it that way”. With that ability,
we’d at least be able to look at a code base or an existing project and
get some idea of conformity. I would not expect everyone to build things
the same way, but rather this would show up projects that deviated way
too far to the extremes (and because of that are very likely to fail).
After decades, I think it’s time to bring more of what we know together
into a usable reference.
No comments:
Post a Comment
Thanks for the Feedback!