The Bad Build System Drinking Game
Software build systems. A lot of them are bad, but how bad is yours?
Play the build system drinking game and find out.
- Take a shot if your build system takes more than 2 minutes to
do an incremental build. Take 2 shots if it takes more than 5
minutes.
- Take a shot if your build system takes more than 10 minutes to do
a full build. Take two shots if it takes a long time to do a full
build, and there are no incremental builds.
- Take a shot if your build system downloads things from the
internet without being asked to. This could be either because your
build system is trying to act as a package manager, or because your build
system invokes your operating system's package manager. Or perhaps it
just invokes wget! Take two shots if it downloads things using an
unauthenticated protocol (such as HTTP) by default.
- Take a shot if your build system only works on one platform.
Take two shots if it only works on a specific release (or narrow range of
releases) of that platform. For example, if it only works on Windows XP,
or Ubuntu 12.04, but not later or earlier releases of those platforms,
you have to take two shots.
- Take a shot if your build system makes very specific
assumptions about the build environment, such as "the current
username is bob" or "the build directory is always /opt/build." Take two
shots if those very specific assumptions require more than two pages of
documentation. Take three shots if those assumptions are
undocumented.
- Take a shot if any part of your build system is proprietary.
Take three shots if it's proprietary and the company that made it went out
of business or lost the source code. This still happens sometimes in the
embedded systems world.
- Take a shot if you get mysterious errors if you don't run
"make clean" (or something like it) after certain things have changed in
the source tree. Take two shots if make clean sometimes doesn't do
enough and you have to "manually" clean the source directory with "git
clean" or "rm -rf".
- Take a shot if you can't parallelize your build by running
"make -j", "mvn -T 2" or a similar option. This could
be because of poorly written Makefiles (or other build files), or because
the build system itself doesn't support parallelization. Take two shots
if the same user can't launch two builds in parallel in different source
directories on same computer. This could happen if the build system
creates a lockfile somewhere-- for example, the Scala Build Tool ("sbt")
does this.
- Take a shot if your build system dumps the build products into the
source directory (i.e. doesn't support out-of-tree builds.). Take
two shots if the build products aren't in the git or svn ignore
list, and create noise when running "git diff" or "svn diff."
- Take a shot if your build system was not designed to be run from
the command line. For example, if it requires you to visit a web
site or click buttons in a dialog box, take a shot.
- Take a shot if your build system recursively invokes itself.
Take a shot if your build system generates build files and then invokes a
different build system. Take two shots if your build system generates
shell scripts or m4 scripts, like automake does.
- Take a shot if your build system writes more than a screen or two
(24 or 48 lines) of output to standard output or standard error for a
simple incremental build. Take two shots if it generates more than a
megabyte of output. Take three shots if it generates more than a
megabyte of output, but leaves out the exception text from failing unit
tests (like Maven does.)
- Take a shot if your build system does more than build the software
by default. For example, if it runs tests by default (especially
really long tests), take a shot. If it starts a web server or SQL server
by default, take a shot. Take two shots if there is no way to skip
running tests. Take three shots if your build system deploys software to
production by default when run without any additional options.
- Take a shot if your project contains build files for more than one
build system. For example, if your project has build files for both
automake and cmake, or both Maven and sbt, take a shot. Take two shots
if there are things that you can only do with one build system or the
other. Take three shots if nobody knows exactly what can be done with
one build system or the other.
- Take a shot if your project's dependencies are undocumented...
for example, if it depends on the bash shell or curl being installed but
that isn't documented anywhere. Take two shots if it depends on an older
version of a certain dependency being installed, but this isn't
documented anywhere.
- Take three shots if your project has conflicting dependencies.
For example, if your project pulls in Guava 11, but also pulls in another
dependency that itself requires Guava 8, take three shots.
- Take a shot if your build system interacts with source control
in any way other than just getting a commit revision to identify the
version-- for example, if it runs a git or subversion checkout as part of
the build process.
- Take a shot if your build system is based on XML. Take a shot
if your build system is based on any external scripting language that the
user has to install separately. Take two shots if your build system is
based on Perl.
- Take a shot if your project's build files don't work with the
latest version of the build system. For example, if your project uses
automake and it doesn't work with the latest automake version, take a
shot. Take two shots if you informed someone on the project about this
and he or she told you to downgrade your build system's version.
- Take a shot if your builds sometimes mysteriously fail and nobody
knows why. Take two shots if people know why but are too lazy to fix
it.
- Take two shots if your project can't get repeatable builds.
This could happen because your build system has a dependency manager
which periodically refetches the latest versions of dependencies without
being explicitly asked to do so-- like Maven does. Or it could be
because your Makefiles are poorly written and pull in too much from the
environment. Either way, take two shots.
- Take a shot if your project's build spews warnings messages.
Take two shots if months go by and the warnings still aren't fixed.
- Take a shot if you can't build your project without building other
bundled projects. Take a shot recursively for every bad thing
that appears in the build system of those other projects.
- Take a shot if you are the only one who knows how the build
system works. Take two shots if nobody knows how the build system
works.
- Take a shot if you think that your build system might have started
as a prank that got way out of hand. Take two shots if you're sure
of it.