There are numerous variants of this on the
Web. The original version was published in the December 1991
issue of Developer's Insight. I have been unable to
track that down, but what follows is the closest approximation
I can recover.
How to Shoot Yourself In the Foot
Developer's Insight, December 1991 (approx
version)
The proliferation of modern programming languages (all of
which seem to have stolen countless features from one another)
sometimes makes it difficult to remember what language you're
currently using. This guide is offered as a public service to
help programmers who find themselves in such dilemmas.
- C
- You shoot yourself in the foot.
- C++
- You accidently create a dozen instances of yourself and
shoot them all in the foot. Providing emergency medical
assistance is impossible since you can't tell which are bitwise
copies and which are just pointing at others and saying "That's
me, over there."
- FORTRAN
- You shoot yourself in each toe, iteratively, until you run
out of toes, then you read in the next foot and repeat. If you
run out of bullets, you continue anyway because you have no
exception-handling facility.
- Modula-2
- After realizing that you can't actually accomplish anything
in this language, you shoot yourself in the head.
- COBOL
- USEing a COLT 45
HANDGUN, AIM gun at LEG.FOOT, THEN place
ARM.HAND.FINGER on HANDGUN.TRIGGER and SQUEEZE. THEN return
HANDGUN to HOLSTER. CHECK whether
shoelace needs to be retied.
- Lisp
- You shoot yourself in the appendage which holds the gun
with which you shoot yourself in the appendage which holds the
gun with which you shoot yourself in the appendage which
holds...
- BASIC
- Shoot yourself in the foot with a water pistol. On big
systems, continue until entire lower body is waterlogged.
- Forth
- Foot yourself in the shoot.
- APL
- You shoot yourself in the foot; then spend all day figuring
out how to do it in fewer characters.
- Pascal
- The compiler won't let you shoot yourself in the foot.
- Snobol
- If you succeed, shoot yourself in the left foot. If you
fail, shoot yourself in the right foot.
- HyperTalk
- Put the first bullet of the gun into foot left of leg of
you. Answer the result.
- Prolog
- You tell your program you want to be shot in the foot. The
program figures out how to do it, but the syntax doesn't allow
it to explain.
- 370 JCL
- You send your foot down to MIS with a 4000-page document
explaining how you want it to be shot. Three years later, your
foot comes back deep-fried.
Of course, it didn't end there; there are many
extensions to this idea (some included below). What many fail
to recognise, however (especially those that add more
complicated options for C, or reorder the list) is the
meta-joke. Given the first line, the list starts off looking
like yet another insult to C. But after reading the whole list,
and coming back to the beginning, it becomes clear this is
actually a compliment to C!
I have compiled the following lists from
a variety of different
sources on the Web, and from
emailed suggestions; it
includes contributions from Giles Constant, James Davis, Steve
DiVerdi, Fritz Freiheit, Murray S. Kucherawy, Simon Mikkelsen,
Doug Snell, Reynir Stefánsson, Wayne Throop, and Nick
Wallis.
- FORTRAN-77
- You shoot yourself in each toe, iteratively, until you run
out of toes, then you read in the next foot and repeat. If you
run out of bullets, you continue anyway because you still can't
do exception-processing.
- Modula-2 (alternative)
- You perform a shooting on what might be currently a foot
with what might be currently a bullet shot by what might
currently be a gun.
- BASIC (compiled)
- You shoot yourself in the foot with a BB using a SCUD
missile launcher.
- Visual Basic
- You'll really only appear to have shot yourself in
the foot, but you'll have so much fun doing it that you won't
care.
- Forth (alternative)
- BULLET DUP3 * GUN LOAD FOOT AIM TRIGGER
PULL BANG! EMIT DEAD IF DROP ROT THEN (This takes about
five bytes of memory, executes in two to ten clock cycles on
any processor and can be used to replace any existing function
of the language as well as in any future words). (Welcome to
bottom up programming - where you, too, can perform compiler
pre-processing instead of writing code)
- APL (alternative)
- You hear a gunshot and there's a hole in your foot, but you
don't remember enough linear algebra to understand what
happened.
or
@#&^$%&%^ foot
- Pascal (alternative)
- Same as Modula-2 except that the bullet is not the right
type for the gun and your hand is blown off.
- Snobol (alternative)
- You grab your foot with your hand, then rewrite your hand
to be a bullet. The act of shooting the original foot then
changes your hand/bullet into yet another foot (a left
foot).
- Prolog (alternative)
- You attempt to shoot yourself in the foot, but the bullet,
failing to find its mark, backtracks to the gun, which then
explodes in your face.
or
No.
- COMAL
- You attempt to shoot yourself in the foot with a water
pistol, but the bore is clogged, and the pressure build-up
blows apart both the pistol and your hand.
or
draw_pistol
aim_at_foot(left)
pull_trigger
hop(swearing)
- Scheme
- As Lisp, but none of the other appendages are aware of this
happening.
- Algol
- You shoot yourself in the foot with a musket. The musket is
aesthetically fascinating and the wound baffles the adolescent
medic in the emergency room.
- Ada
- If you are dumb enough to actually use this language, the
United States Department of Defense will kidnap you, stand you
up in front of a firing squad and tell the soldiers, "Shoot at
the feet."
or
The Department of Defense shoots you in the foot after offering
you a blindfold and a last cigarette.
or
After correctly packaging your foot, you attempt to
concurrently load the gun, pull the trigger, scream and shoot
yourself in the foot. When you try, however, you discover that
your foot is of the wrong type.
or
After correctly packing your foot, you attempt to concurrently
load the gun, pull the trigger, scream, and confidently aim at
your foot knowing it is safe. However the cordite in the round
does an Unchecked Conversion, fires and shoots you in the foot
anyway.
- Eiffel
- You create a GUN object, two
FOOT objects and a BULLET object. The GUN
passes both the FOOT objects a
reference to the BULLET. The
FOOT objects increment their hole
counts and forget about the BULLET. A
little demon then drives a garbage truck over your feet and
grabs the bullet (both of it) on the way.
- Smalltalk
- You spend so much time playing with the graphics and
windowing system that your boss shoots you in the foot, takes
away your workstation and makes you develop in COBOL on a
character terminal.
or
You send the message shoot to gun, with
selectors bullet and myFoot. A window pops up
saying Gunpowder doesNotUnderstand: spark. After
several fruitless hours spent browsing the methods for
Trigger, FiringPin and IdealGas, you
take the easy way out and create ShotFoot, a subclass
of Foot with an additional instance variable
bulletHole.
- Object Oriented Pascal
- You perform a shooting on what might currently be a foot
with what might currently be a bullet fired from what might
currently be a gun.
- PL/I
- You consume all available system resources, including all
the offline bullets. The Data Processing & Payroll
Department doubles its size, triples its budget, acquires four
new mainframes and drops the original one on your foot.
- Postscript
- foot bullets 6 locate loadgun aim gun shoot showpage
or
It takes the bullet ten minutes to travel from the gun to your
foot, by which time you're long since gone out to lunch. The
text comes out great, though.
- PERL
- You stab yourself in the foot repeatedly with an incredibly
large and very heavy Swiss Army knife.
or
You pick up the gun and begin to load it. The gun and your foot
begin to grow to huge proportions and the world around you
slows down, until the gun fires. It makes a tiny hole, which
you don't feel.
- Assembly Language
- You crash the OS and overwrite the root disk. The system
administrator arrives and shoots you in the foot. After a
moment of contemplation, the administrator shoots himself in
the foot and then hops around the room rabidly shooting at
everyone in sight.
or
You try to shoot yourself in the foot only to discover you must
first reinvent the gun, the bullet, and your foot.or
The bullet travels to your foot instantly, but it took you
three weeks to load the round and aim the gun.
- BCPL
- You shoot yourself somewhere in the leg -- you can't get
any finer resolution than that.
- Concurrent Euclid
- You shoot yourself in somebody else's foot.
- Motif
- You spend days writing a UIL description of your foot, the
trajectory, the bullet and the intricate scrollwork on the
ivory handles of the gun. When you finally get around to
pulling the trigger, the gun jams.
- Powerbuilder
- While attempting to load the gun you discover that the
LoadGun system function is buggy; as a work around you tape the
bullet to the outside of the gun and unsuccessfully attempt to
fire it with a nail. In frustration you club your foot with the
butt of the gun and explain to your client that this
approximates the functionality of shooting yourself in the foot
and that the next version of Powerbuilder will fix it.
- Standard ML
- By the time you get your code to typecheck, you're using a
shoot to foot yourself in the gun.
- MUMPS
- You shoot 583149 AK-47 teflon-tipped, hollow-point,
armour-piercing bullets into even-numbered toes on odd-numbered
feet of everyone in the building -- with one line of code.
Three weeks later you shoot yourself in the head rather than
try to modify that line.
- Java
- You locate the
Gun
class, but discover that
the Bullet
class is abstract, so you extend it and
write the missing part of the implementation. Then you
implement the ShootAble
interface for your
foot, and recompile the Foot
class. The interface
lets the bullet call the doDamage
method on the
Foot
, so the Foot
can damage itself
in the most effective way. Now you run the program, and call
the doShoot
method on the instance of the
Gun
class. First the Gun
creates an
instance of Bullet
, which calls the
doFire
method on the Gun
. The
Gun
calls the hit(Bullet)
method on
the Foot
, and the instance of Bullet
is passed to the Foot
. But this causes an
IllegalHitByBullet
exception to be thrown, and you
die.
FOOTOS
-- A Guide to Modern Operating Systemsextended the joke to operating systems, with Unix
playing the role of C, of course. And this too has
grown...
- Unix
- You shoot yourself in the foot
or
% ls
foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o: No such file or directory
% ls
%
- 370 JCL (alternative)
- You shoot yourself in the head just thinking about it.
- DOS JCL
- You first find the building you're in in the phone book,
then find your office number in the corporate phone book. Then
you have to write this down, then describe, in cubits, your
exact location, in relation to the door (right hand side
thereof). Then you need to write down the location of the gun
(loading it is a proprietary utility), then you load it, and
the COBOL program, and run them, and, with luck, it may be run
tonight.
- VMS
-
$ MOUNT/DENSITY=.45/LABEL=BULLET/MESSAGE="BYE" BULLET::BULLET$GUN SYS$BULLET
$ SET GUN/LOAD/SAFETY=OFF/SIGHT=NONE/HAND=LEFT/CHAMBER=1/ACTION=AUTOMATIC/
LOG/ALL/FULL SYS$GUN_3$DUA3:[000000]GUN.GNU
$ SHOOT/LOG/AUTO SYS$GUN SYS$SYSTEM:[FOOT]FOOT.FOOT
%DCL-W-ACTIMAGE, error activating image GUN
-CLI-E-IMGNAME, image file $3$DUA240:[GUN]GUN.EXE;1
-IMGACT-F-NOTNATIVE, image is not an OpenVMS Alpha AXP image
or
%SYS-F-FTSHT, foot shot
(fifty lines of traceback omitted)
- sh,csh, etc
- You can't remember the syntax for anything, so you spend
five hours reading manual pages, then your foot falls asleep.
You shoot the computer and switch to C.
- Apple System 7
- Double click the gun icon and a window giving a selection
for guns, target areas, plus balloon help with medical
remedies, and assorted sound effects. Click "shoot" button and
a small bomb appears with note "Error of Type 1 has
occurred."
- Windows 3.1
- Double click the gun icon and wait. Eventually a window
opens giving a selection for guns, target areas, plus balloon
help with medical remedies, and assorted sound effects. Click
"shoot" button and a small box appears with note "Unable to
open Shoot.dll, check that path is correct."
- Windows 95
- Your gun is not compatible with this OS and you must buy an
upgrade and install it before you can continue. Then you will
be informed that you don't have enough memory.
- CP/M
- I remember when shooting yourself in the foot with a BB gun
was a big deal.
- DOS
- You finally found the gun, but can't locate the file with
the foot for the life of you.
- MSDOS
- You shoot yourself in the foot, but can unshoot yourself
with add-on software.
And it has extended even further, to databases,
and other computer-related things...
- Access
- You try to point the gun at your foot, but it shoots holes
in all your Borland distribution diskettes instead.
- Paradox
- Not only can you shoot yourself in the foot, your users can
too.
- dBase
- You squeeze the trigger, but the bullet moves so slowly
that by the time your foot feels the pain, you've forgotten why
you shot yourself anyway.
or
You buy a gun. Bullets are only available from another company
and are promised to work so you buy them. Then you find out
that the next version of the gun is the one scheduled to
actually shoot bullets.
- DBase IV, V1.0
- You pull the trigger, but it turns out that the gun was a
poorly designed hand grenade and the whole building blows
up.
- SQL
- You cut your foot off, send it out to a service bureau and
when it returns, it has a hole in it but will no longer fit the
attachment at the end of your leg.
or
Insert into Foot
Select Bullet
From Gun.Hand
Where Chamber = 'LOADED'
And Trigger = 'PULLED'
- Clipper
- You grab a bullet, get ready to insert it in the gun so
that you can shoot yourself in the foot and discover that the
gun that the bullets fits has not yet been built, but should be
arriving in the mail _REAL_SOON_NOW_.
- Oracle
- The menus for coding foot_shooting have not been
implemented yet and you can't do foot shooting in SQL.
- English
- You put your foot in your mouth, then bite it off. (For
those who don't know, English is a McDonnell Douglas/PICK query
language which allegedly requires 110% of system resources to
run happily.)
- Revelation [an implementation of the PICK Operating
System]
- You'll be able to shoot yourself in the foot just as soon
as you figure out what all these bullets are for.
- FlagShip
- Starting at the top of your head, you aim the gun at
yourself repeatedly until, half an hour later, the gun is
finally pointing at your foot and you pull the trigger. A new
foot with a hole in it appears but you can't work out how to
get rid of the old one and your gun doesn't work anymore.
- FidoNet
- You put your foot in your mouth, then echo it
internationally.
- PicoSpan [a UNIX-based computer conferencing
system]
- You can't shoot yourself in the foot because you're not a
host.
or (host variation)
Whenever you shoot yourself in the foot, someone opens a topic
in policy about it.
- Internet
- You put your foot in your mouth, shoot it, then spam the
bullet so that everybody gets shot in the foot.
- troff
- rmtroff -ms -Hdrwp | lpr -Pwp2 & .*place bullet in
footer .B .NR FT +3i .in 4 .bu Shoot! .br .sp .in -4 .br .bp NR
HD -2i .*
- Genetic Algorithms
- You create 10,000 strings describing the best way to shoot
yourself in the foot. By the time the program produces the
optimal solution, humans have evolved wings and the problem is
moot.
- CSP (Communicating Sequential Processes)
- You only fail to shoot everything that isn't your
foot.
In July 2002 Jim Nidositko emailed me the
following story, with contributions to the list
Last summer, I found myself analyzing the plague of problems
afflicting a sorely neglected MS-SQL Server implementation.
This process was made more interesting by the fact that this
analysis was being performed with an eye toward moving the
database over to Sybase. My previous database experiences
involved Oracle and Ingres, so I found myself learning about
both platforms at the same time.
In short order I uncovered the fact of their shared heritage
(early versions of MS-SQL Server were licensed from Sybase).
This became a strong platform for understanding the
differences between these two systems. I found it
particularly fascinating that MS made it blindingly easy to
get the system up and running, but in doing so it pretty much
assured that you would shoot yourself in the foot by allowing
the user to avoid performing basic tasks that are essential
to good database design. Sybase, in contrast, makes it
stupefyingly difficult to get a system up and running,
thereby reducing your likelihood of foot shooting (by making
it nearly impossible to shoot anything), but the Sybase
documentation is so abysmal that you're also more or less
assured of soundly shooting yourself for the difficulty of
finding the information that will prevent this from among the
confusing and circuitous cross references. This melange of
similarities and contrasts inspired me to author the
following vignettes. (Keep in mind, we were specifically
trying to avoid any foot shooting, so these bits each
end with advice toward that end.)
- MS-SQL Server
- MS-SQL Server's gun comes pre-loaded with an unlimited
supply of Teflon coated bullets, and it only has two
discernible features: the muzzle and the trigger. If that
wasn't enough, MS-SQL Server also puts the gun in your hand,
applies local anesthetic to the skin of your forefinger and
stitches it to the gun's trigger. Meanwhile, another process
has set up a spinal block to numb your lower body. It will then
proceeded to surgically remove your foot, cryogenically freeze
it for preservation, and attach it to the muzzle of the gun so
that no matter where you aim, you will shoot your foot. In
order to avoid shooting yourself in the foot, you need to
unstitch your trigger finger, remove your foot from the muzzle
of the gun, and have it surgically reattached. Then you
probably want to get some crutches and go out to buy a book on
SQL Server Performance Tuning.
- Sybase
- Sybase's gun requires assembly, and you need to go out and
purchase your own clip and bullets to load the gun. Assembly is
complicated by the fact that Sybase has hidden the gun behind a
big stack of reference manuals, but it hasn't told you where
that stack is. While you were off finding the gun, assembling
it, buying bullets, etc., Sybase was also busy surgically
removing your foot and cryogenically freezing it for
preservation. Instead of attaching it to the muzzle of the gun,
though, it packed your foot on dry ice and sent it UPS-Ground
to an unnamed hookah bar somewhere in the middle east. In order
to shoot your foot, you must modify your gun with a GPS system
for targeting and hire some guy named "Indy" to find the hookah
bar and wire the coordinates back to you. By this time, you've
probably become so daunted at the tasks stand between you and
shooting your foot that you hire a guy who's read all the books
on Sybase to help you shoot your foot. If you're lucky, he'll
be smart enough both to find your foot and to stop you from
shooting it.
In May 2003 Kristof Elst emailed me his
contribution to the list
I'm a highly frustrated Magic Software developer who would
rather be back to coding tsql. So I made my own version.
- Magic software
- You spend 1 week looking up the correct syntax for GUN.
When you find it, you realise that GUN will not let you shoot
in your own foot. It will allow you to shoot almost anything
but your foot. You then decide to build your own gun. You can't
use the standard barrel since this will only allow for standard
bullets, which will not fire if the barrel is pointed at your
foot. After four weeks, you have created your own custom gun.
It blows up in your hand without warning, because you failed to
initialise the safety catch and it doesn't know whether the
initial state is "0", 0, NULL, "ZERO", 0.0, 0,0, "0.0", or
"0,00". You fix the problem with your remaining hand by nesting
12 safety catches, and then decide to build the gun without
safety catch. You then shoot the management and retire to a
happy life where you code in languages that will allow you to
shoot your foot in under 10 days.