But those environments weren't quite ready at the time programmers were starting to use Java
widely. In fact, at the time the most common programming environments were emacs (or, in-
side of Sun, vi) and command lines in terminal windows. So the decision was made to use the
filesystem as a cheap emulator of a database, just until the integrated environment using a real
database was ready.
Of course, the integrated development environment with database never appeared. So we still
use the filesystem as a database surrogate, and our package names have to be reflected in those
filesystems. Fortunately, the IDEs that have appeared take much of the work out of using the
filesystem in that way, doing all of the extra directory creation and transitions for us. It is less
of a pain than it once was, but can still lead to confusion and lots of extra directories in the
source code structure.
[ 12 ] This is actually not precisely true, because of classloaders (see the discussion in Chapter 2 ) . If we
want to be completely precise, we would have to say that the two classes need to have the same name and
have to be loaded by classloaders that are in the same classloader hierarchy. But this topic is supposed
to be about the good parts of Java, so I'm going to avoid talking about classloaders whenever possible.
[ 13 ] I first heard this from my manager at the time, Mark Hodapp. I find it useful to remind myself of this
fairly often, even though the initial interpretation of the adage, in which it is taken to mean that stupidity
is more clearly seen in the light of history, is not the one he meant.