Software projects are much
like animals in a zoo, which often thrive in the confines of their cage
but cannot survive if released to the wild. Perhaps they don't know how
to forage for food, kill their prey, or evade predators. Regardless of
the reason, the point is this: not all animals can survive in the wild.
The same is true for software.
In
the case of software, "the wild" is the Enterprise Environment. It is
the most hostile, unforgiving habitat for code. In fact, the vast
majority of code written is unfit for the Enterprise Environment. Too
often, developers raise their software in the confines of their local
development environment - it looks good, it works, it passes all the
unit tests - but it isn't ready to be released to the wild.
Only
the most fit, most evolved software can survive this hostile
environment. As software developers gain experience, the software they
produce evolves as well. In broad strokes, the stages of evolution look
something like this:
- Software that works.
The first thing developers learn is how to write software that
satisfies the functional requirements of the client. They know they
have succeeded when their software passes functional testing. Good
developers will even create unit tests to validate their success.
- Software that is elegant.
Satisfying immediate requires is good, but an elegant solution is
better. As developers mature, they learn good Object Oriented
development strategies. They learn how to apply Design Patterns. They
learn how to write sofware that is modular, reusable, and maintainable.
- Software that breaks. Huh? Let me explain...
Developers
that have worked in the Enterprise Environment long enough understand
that "stuff" happens. Murphy's Law is alive and well. Servers go
down, connections get dropped, credentials change, permissions altered,
disk space fills up, and the list goes on...
Before
software is ready to "survive" in the Enterprise Environment, it must
be able to respond appropriately when things go sideways. It's not
enough to simply write a generic error message to System.out. Our
Enterprise clients expect more; they deserve better. As developers of
Enterprise software, it is our job to figure out how deliver a robust,
intelligent system that is ready for anything.
We need to think a few steps ahead and answer a few very important questions:
- What are the failure modes of the system (what are the different ways the system can break)?
- In each failure mode, how will the system know if something breaks?
- Can the system automate, or otherwise facilitate recovery from these failure conditions?
- When and how will someone be notified about the error?
- Who should receive the notification?
- How will they be notified?
- How will we know where the error occured and what the conditions were that caused to the error?
Answering
these questions will help us develop robust software that is equipped
with some essential survival skills: error detection, reporting,
troubleshooting, and recovery. With these characteristics, our
software will be ready to thrive in the Enterprise Environment.