I have nothing but sympathy for the election workers in Florda.
I also seriously want a hand-recount. Both of these attitudes
are strongly informed by personal experience. Let me explain.
Freshman year in college, I was one of those crazy types who was
into student government. Don't ask me how I wound up that way;
it was a mixture of running with a progressive crowd,
youthful idiocy, and pure random happenstance. In any case,
the time came, in mid-spring, to hold a campus-wide election for
the President and Vice-President of the Undergraduate Council.
This was kind of a first. In the past, the Council had always elected
its own officers; thanks to a bizzare set of steps and missteps, it
was decided that the student body as a whole would elect the Council's
presidng officers, but wouldn't invest them with any authority beyond
that conferred by holding the gavel. In short, a recipe for
post-election disaster. In this case, though, we got disaster
as part of the elections, too.
One of the messes that had led to the public uprising that created popular
elections had been a series of ballot-box-stuffing scandals that had beset
previous Councils, including some especially embarassing incidents
in which Council members attempted to thwart an anti-UC ballot iniative
by simply throwing out some of the ballots from the boxes they were responsible
for (voting was, at that time, conducted in dining halls around campus).
In response, and partly to jump on this new "computer thingy" bandwagon, the
UC had commissioned a voting program to hold the elections for its
representatives. Written by a fairly zealous freshman,
the program reused the UI from his successful sectioning program (used to sort
students into the discussion sections of large lecture courses), stapled
to a hastily-whipped-up back end that did the tabulation.
Unfortuantely, when it came time for the campus-wide elections, we realized
that the existing program wouldn't work. For one thing, it was wildly
insecure, as in, it didn't even try. Section assignments, well, nobody really
cares about the breach of privacy involved in finding out that Monday at 5 was
your first choice, but Thursday at 4 was your second choice. In the massive
scruitiny and debate surrounding these first-ever popular elections, though,
everyone was all of a sudden expecting that this election be "confidential,"
and "fair," and "trustworthy."
Even more seriously, the program simply wasn't going to work for the campus-wide
elections. To elect its represntatives, the UC uses the Hare Proportional
voting system, a complicated system for electing multiple delegates that requires
rank-ordered preferences and periodically reweights every extant ballot.
To elect President and Vice-President, the newly-amended UC Constitution specifically
required the Single Transferrable Vote system, a slightly less convoluted scheme
that also uses rank-ordered preferences, but manhandles the ballots in a marginally
different way. Oh, and also, the old program had no concept of multiple elections:
in order to use it, we'd have had to require people to vote twice, using two completely separate
Rewriting was out of the question. The program's author wasn't interested in the
job, and everyone else who looked at the code was afraid to touch it. There were
sections in it that -- we are not making this up -- read like:
candidates[candidate]->candidate = candidate;
This is basically where my role in the whole sad story begins. Being young and naive,
I'd volunteered to be on the Election Commission overseeing the voting. There were
three of us from the UC, and three students at large, and it turned out that I was
the only one who knew anything about computers. Suddenly, I was the point man,
off to go talk to the Computer Society about commissioning a new voting
program. Mostly I was a go-between in those first few days, reporting back on
how much money they wanted and so forth. Amazingly, we convinced the UC to pony
up the bucks: enough to bring the Computer Society safely away from the fiscal
insolvency that was a recurring problem for it, and also to buy a computer that could be
physically secured to serve as the vote-server. People would make secure connections
to the box and vote in encrypted sessions. No member of the Election Commission
would retain the entire password for the server; the machine would be physically
located in a locked office owned by the University's Computer Services people,
who were pretty generally acknowledged to be real tightasses about secuirty issues.
And the program? Gleaming, state-of-the-art software! A scripting-controlled
client app would negotiate a secure session, then hand over control to a graphical
curses UI that would let you read position papers, respond to survey questions,
and rank candidates in an arbitrary number of "elections." A back-end database,
updated with the latest info from the Registrar, would confirm that each student
could vote only once. And a shiny new modular C++ vote-counter would allow you to plug in
your choice of algorithms before feeding back to you the beautifully-formatted
tabulation of votse.
Such was the plan.
The first thing to go wrong was that, come twelve midnight on the first day of
voting, the program simply refused to work. Nobody could log on to vote. Of course,
there were candidates all over campus, trying to pull stupid student-government publicity
stunts by being the first to vote. The crack technical team assembled, looked at stuff,
discovered that yes, the server wasn't accepting voting logins even though the test-run
had been successful. About half an hour later, someone figured out the problem -- file
permissions on one of the election data files, I think -- and voting commenced for real.
The Election Commission -- already sick of the election, thanks to the 2000 signatures
we'd had to verify to certify candidates' nominations for office -- met, agreed to extend
the tail end of the election, three days in the future, by half an hour, and went home.
The next day, while adjudicating a dispute between one candidate and his former best friend,
who'd accused him of putting up campaign signs too close to a polling place (with
electronic voting, this now meant any network-accessible computer), we learned that some
people still couldn't vote. Ha ha, hee, it looked like the Registrar's database
of eligible student voters wasn't so accurate. We went over, had them re-run the query,
this time being more careful about including the international students. A quick patch
of the database on the server, and all was well.
Until the day after, when it seemed that some students -- those just returned from
leaves of absence, I think -- couldn't vote. Ho hum, we knew how to deal with this
one. The Computer Society people went over to the Registrar's, got a disk with the
re-refined query output. Someone on the Election Commission had to meet them
at the computer room to let them in, so down I went. And I watched as the
crack programming team proceeded to overwrite the list of candidates with the
list of eligible voters.
Whoops! Slippery little devil, ain't it?
We pulled the network plug from the wall and considered the situation.
No backup list of candidates, and people were going to start noticing, soon.
We retyped the file by hand. We had no clue about the order of candidates,
so people logging in after that point would see a differently sorted list, but
since we'd gone with a random order for the first cut, we figured it didn't make
The day after that, when the election ended at 5:30 PM, we gathered around for
what we hoped would be a mercifully quick process. Some of us, with particular
partisan leanings, were somewhat nervous about the outcome, but we kept our
thoughts to ourselves. The Election Commission was split among two unspoken
supporters of two major tickets -- although by the end of the election, none of
us liked any of the candidates (with the exception of the bullhorn guy and a doomed
sixth-party candidate) very much. In any case, being seen as impartial about the
results of the election were the least of our worries. First, we needed results.
And that counting program? Well, um, ah, it wasn't ready yet. The lead programmer
was still debugging a bit, the president of the Computer Society assured us. But
he'd be done within the hour. We should start the process of getting to the vote
files. And this was when we discovered three major problems.
First, we couldn't get at the files. There was something in the security setup that
blocked us from getting the raw file over the network cable onto the tallying machine.
Second, despite many repeated promises to the contrary, the election program let you
quit within recording a vote in one or both of the elections. You had to go through
a fairly innvolved procesure, but it was quite possible, and in fact, some
people had managed to pull it off. This made some of the
ballots invalid according the file format we were using to store them. Oh, joy.
Third, there were more candidates listed in the ballots than there were in
the election. When retyping the data after the overwrite, we'd misspelled one
candidate's name, and dropped the middle initial from a few others. Result:
separate vote tallies for "Al Gore" and "Albert Gore," as it were.
Oh, and yeah, thanks to someone's undoubtedly brilliant design insight,
the ballots stored the voter's identifying information in cleartext in them.
Which meant that it was unethical to actually look at any of the ballots.
Oh, no, our high-minded early-in-the-night ethics told us we'd need to repair
the damage without looking at the ballots.
My friends, grep is also my friend, and it should be your friend, too.
While most the computer people were off trying to help their compatriot debug,
a friend whose part of the system had worked flawlessly and I started monkeying
with various -A and -B arguments to grep, piped and filtered in various ways.
I managed to extract a count of the number of ballots missing Presidential votes, or
Vice-Presidential ones, or both. And then we did some global search-and-replaces
to patch up the variations in candidates' names to a consistent state. As for
getting the files from point A to point B, we emailed them, in the clear, and may God have
mercy on our souls.
At which point, getting into the evening, the tallying program still wasn't ready.
The candidates, some in high dudgeon, had started to come round to find out
the source of the delay. They had celebration parties on hold because of us;
the only response we could usefully give was to pull aside members of their campaigns
and suggest that they use the party supply of alcohol to try and calm down their
We demanded a hard estimate of the program's readiness from the Computer Society.
Eleven, they said. Okay, we said, and we made an announcement, by email and by one
EC member's booming voice, that we'd announce the results at midnight. There was
grumbling, there was muttering, I scarfed some dinner
Come eleven, the program compiled, but segfaulted. Come eleven-thirty, it was still
segfaulting left and right, and the programmer was poring through core dumps to figure
out why. The Election Commission met again, agreed that we couldn't yet announce a winner,
and agreed to not promise any more firm announcement times.
They talk about long nights of the soul. What followed was a long night of body, mind, and
soul. We gave up on the counting program, although its author didn't. The president of the
Computer Society, acting the part of the classic technical manager, stared at the screen blankly,
tried tapping out a few things rather feebly, and then went off to go talk to the press.
We called in the original vote-program's author.
He looked at the situation and started coding a Perl script to compute the totals. Candidates
screamed at us; we had the big people on the Election Commission deal with it. One member of the
EC, looking miserable, curled up in a corner of the room and tried to sleep. Two others had to go
board a bus for an off-campus event they were due at in the morning. We called the alternate,
woke him from his sleep, and plodded onwards.
Towards morning, the magic Perl started producing results. The totals weren't obviously
wrong -- they added up properly at the start, and the numbers moved in the right direction --
but we really couldn't tell for sure. The morning campus paper got delivered, at which point
it became clear that the folks in the Computer Society had sold us up the river. Our carefully neutral statements,
when mixed with their blaming us for everything that had gone wrong, led the reporter to do
the obvious reporter thing and paint the Election Commission as a bunch of confused
incompetents. I started to seriously consider transferring to another school. Oh, yeah,
this was also the point at which the last remaining Computer Society people basically said, yeah,
bye, been nice knowing you, and went home to sleep.
We got the second tally done by using grep, tail, cat, and a jot of perl.
In essence, we shredded
the ballot file into separate files, one per ballot, and sorted in directories based on
candidate. We counted files, figured out which candidate to eliminate, struck their name from
every ballot, and resorted into directories. The final numbers matched those from the
first count, which in turn almost matched those from the election. I did some additions
and subtractions, and managed to persuade everyone else in the room that the missing ballots
exactly matched the number I'd computed for those ballots missing one or both parts of the election.
We checked the write-ins -- who we'd completely ignored up to this point -- and convinced ourselves
that the write-ins were numerically too few to have upset the (slightly fragile) STV algorithm at
any stage. Then we felt hope, that maybe there might not be a lynch mob waiting for us outside the door.
In fact, there was no one at all there. It was early Saturday morning, one of the most beautiful
mornings I can remember, dewy and bright, cool but warming in the sun. I was absurdly tired,
and depressed, as stressed as I've ever been; I think the others were basically in the same state.
We talked through the election, convinced ourselves that the count was accurate and that there hadn't
been any fraud of the sort we'd ever have a chance of detecting, called the candidates, and went to sleep.
The election was counted by two sets of Perl scripts written on the spot, with hand-tailoring by
half a dozen people, all of whom were alone at the computer at some point or another. We did what
we could; don't blame us for it. Have sympathy on the poor election worker; don't bring down your
own election stresses on their heads.