“A software system typically starts out with finite set of
well-understood requirements. As most successful systems evolve,
however, they take on more and more requirements, incorporating
innumerable functional and nonfunctional aspects. In an enterprise
environment, you can easily end up adding to this tangle of modules
a number of third-party libraries and frameworks, all of which
interact and play with each other beneath the surface of the
system’s day-to-day workings. In effect, given just a few years,
the system that started out with a simple, manageable requirement
set has become a behemoth: an unruly and obtuse tower of code.“Into this tower steps the Java developer, newly tasked with its
daily maintenance and evolution. If you are this developer, then
your first task is to gain an intimate understanding of the
structure of the system. Understanding the structure will be key to
your ability to make enhancements and troubleshoot any problems
that, inevitably, will arise. Of course, peering into any unknown
system for the first time is easier said than done. In some cases
you will be able to ask questions of the original developers, in
others you won’t. But even with access to the development team some
systems are simply too massive to be accessed and understood
without mechanical help.“While a number of tools are available to aid you in
comprehending complex programs most are expensive, time-consuming
to learn, and limited in scope of functionality (that is, you will
have no recourse if the tool does not meet your needs). In this
article I propose an alternative approach. Aspect-oriented
programming is a full-fledged programming paradigm that can be
applied to a wide range of programming scenarios, including the
comprehension and maintenance of legacy applications…”