MORE ABOUT THIS BOOK
CLOSE TO THE MACHINE (Chapter 1)
 SPACE IS NUMERIC
I HAVE NO IDEA WHAT TIME IT IS. There are no windows in this office and no clock, only the blinking red LED display of a microwave, which flashes 12:00, 12:00, 12:00, 12:00. Joel and I have been programming for days. We have a bug, a stubborn demon of a bug. So the red pulse no-time feels right, like a read-out of our brains, which have somehow synchronized themselves at the same blink rate.
But what if they select all the text and
Damn! The NULL case!
And if not were out of the text field and they hit space
yeah, like for
So what if we space-pad?
I dont know . Wait a minute!
Yeah, we could space-pad
and do space as numeric.
Yes! Well call SendKey(space) to?
the numeric object.
My God! That fixes it!
Yeah! Thatll work if
space is numeric!
if space is numeric!
We lock eyes. We barely breathe. For a slim moment, we are together in a universe where two human beings can simultaneously understand the statement if space is numeric!
Joel and I started this round of debugging on Friday morning. Sometime later, maybe Friday night, another programmer, Danny, came to work. I suppose it must be Sunday by now because its been a while since weve seen my clients employees around the office. Along the way, at odd times of day or night that have completely escaped us, weve ordered in three meals of Chinese food, eaten six large pizzas, consumed several beers, had innumerable bottles of fizzy water, and finished two entire bottles of wine. It has occurred to me that if people really knew how software got written, Im not sure if theyd give their money to a bank or get on an airplane ever again.
What are we working on? An artificial intelligence project to find subversive talk over international phone lines? Software for the second start-up of a Silicon Valley executive banished from his first company? A system to help AIDS patients get services across a city? The details escape me just now. We may be helping poor sick peopleor tuning a set of low-level routines to verify bits on a distributed database protocolI dont care. I should care; in another part of my beinglater, perhaps when we emerge from this room full of computersI will care very much why and for whom and for what purpose I am writing software. But just now: no. I have passed through a membrane where the real world and its uses no longer matter. I am a software engineer, an independent contractor working for a department of a city government. Ive hired Joel and three other programmers to work with me. Down the hall is Danny, a slim guy in wire-rimmed glasses who comes to work with a big, wire-haired dog. Across the bay in his converted backyard shed is Mark, who works on the database. Somewhere, probably asleep by now, is Bill the network guy. Right now, there are only two things in the universe that matter to us. One, we have some bad bugs to fix. Two, were supposed to install the system on Monday, which I think is tomorrow.
Oh, no, no! moans Joel, who is slumped over his keyboard. No-o-o-o. It comes out in a long wail. It has the sound of lost love, lifetime regret. Weve both been programmers long enough to know that we are at that place. If we find one more serious problem we cant solve right away, we will not make it. We wont install. Well go the terrible, familiar way of all software: well be late.
No, no, no, no. What if the members of the set start with spaces. Oh, God. It wont work.
He is as near to naked despair as has ever been shown to me by anyone not in a film. Here, in that place,we have no shame. He has seen me sleeping on the floor, drooling. We have both seen Dannys puffy white midsectionyoung as he is, its a pitywhen he stripped to his underwear in the heat of the machine room. I have seen Joels dandruff, light coating of cat fur on his clothes, noticed things about his body I should not. And Im sure hes seen my sticky hair, noticed how dull I look without make-up, caught sight of other details too intimate to mention. Still, none of this matters anymore. Our bodies were abandoned long ago, reduced to hunger and sleeplessness and the ravages of sitting for hours at a keyboard and a mouse. Our physical selves have been battered away. Now we know each other in one way and one way only: the code.
Besides, I know I can now give him pleasure of an order which is rare in any life: I am about to save him from despair.
No problem, I say evenly. I put my hand on his shoulder, intending a gesture of reassurance. The parameters never start with a space.
It is just as I hoped. His despair vanishes. He becomes electric, turns to the keyboard and begins to type at a rapid speed. Now he is gone from me. He is disappearing into the codenow that he knows it will work, now that I have reassured him that, in our universe, the one we created together, space can indeed be forever and reliably numeric.
The connection, the shared thought-stream, is cut. It has all the frustration of being abandoned by a lover justbefore climax. I know this is not physical love. He is too young, he works for me; hes a man and Ive been tending toward women; in any case, hes too prim and business-schooled for my tastes. I know this sensation is not real attraction: it is only the spillover, the excess charge, of the mind back into the abandoned body. Only. Ha. This is another real-world thing that does not matter. My entire self wants to melt into this brilliant, electric being who has shared his mind with me for twenty seconds.
Restless, I go into the next room where Danny is slouched at his keyboard. The big, wire-haired dog growls at me. Danny looks up, scowls like his dog, then goes back to typing. I am the designer of this system, his boss on this project. But hes not even trying to hide his contempt. Normal programmer, I think. He has fifteen windows full of code open on his desktop. He has overpopulated his eyes, thoughts, imagination. He is drowning in bugs and I know I could help him, but he wants me dead just at the moment. I am the last-straw irritant. Talking: Shit! What the hell is wrong with me? Why would I want to talk to him? Cant I see that his stack is overflowing?
Joel may have the overlapping controls working, I say.
Oh, yeah? He doesnt look up.
Hes been using me as a programming dummy, I say. Do you want to talk me through the navigation errors? Navigation errors: bad. You click to go somewhere but get somewhere else. Very, very bad.
What? He pretends not to hear me.
Navigation errors. How are they?
Im working on them. Huge, hateful scowl. Contempt that one human being should not express to another under any circumstances. Hostility that should kill me, if I were not used to it, familiar with it, practiced in receiving it. Besides, we are at that place. I know that this hateful programmer is all I have between me and the navigation bug. Ill come back later, I say.
Later: how much later can it get? Daylight cant be far off now. This small shoal of pre-installation madness is washing away even as I wander back down the hall to Joel.
Yes! Its working! says Joel, hearing my approach.
He looks up at me. You were right, he says. The ultimate one programmer can say to another, the accolade given so rarely as to be almost unknown in our species. He looks right at me as he says it: You were right. As always.
This is beyond rare. Right: the thing a programmer desires above, beyond all. As always: unspeakable, incalculable gift.
I could not have been right without you, I say. This is true beyond question. I only opened the door. You figured out how to go through.
I immediately see a certain perfume advertisement: a man holding a violin embraces a woman at a piano. I want to be that ad. I want efficacies of reality to vanish, and I want to be the man with violin, my programmer to be the woman at the piano. As in the ad, I want the teacher to interrupt the lesson and embrace the student. I want the rules to be broken. Tabu. That is the name of theperfume. I want to do what is taboo. I am the boss, the senior, the employer, the person in charge. So I must not touch him. It is all taboo. Still
Danny appears in the doorway.
The navigation bug is fixed. Im going home.
Ill test it
It is sometime in the early morning. Joel and I are not sure if the night guard is still on duty. If we leave, we may not get back up the elevator. We leave anyway.
We find ourselves on the street in a light drizzle. He has on a raincoat, one that he usually wears over his too-prim, too-straight, good-biz-school suits. I have on a second-hand-store leather bomber jacket, black beret, boots. Someone walking by might wonder what we were doing together at this still-dark hour of the morning.
Goodnight, I say. Were still charged with thought energy. I dont dare extend my hand to shake his.
Goodnight, he says.
We stand awkwardly for two beats more. This will sound strange, he says, but I hope I dont see you tomorrow.
We stare at each other, still drifting in the wake of our shared mind-stream. I know exactly what he means. We will only see each other tomorrow if I find a really bad bug.
Not strange at all, I say, I hope I dont see you, either.
I dont see him. The next day, I find a few minor bugs, fix them, and decide the software is good enough. Mind-meld fantasies recede as the system goes live. We install the beginnings of a city-wide registration system for AIDS patients. Instead of carrying around soiled and wrinkled eligibility documents, AIDS clients only have to prove once that they are really sick and really poor. It is an odd system, if I think of it, certifying that people are truly desperate in the face of possible death.
Still, this time Im working on a good project, I tell myself. We are helping people, say the programmers over and over, nearly in disbelief at their good fortune. Three programmers, the network guy, mefifty-eight years of collective technical experienceand the idea of helping people with a computer is a first for any of us.
Yet I am continually anxious. How do we protect this database full of the names of people with AIDS? Is a million-dollar computer system the best use of continually shrinking funds? It was easier when I didnt have to think about the real-world effect of my work. It was easierand I got paid morewhen I was writing an abstracted interface to any arbitrary input device. When I was designing a user interface paradigm, defining a test-bed methodology. I could disappear into weird passions of logic. I could stay in a world peopled entirely by programmers, other weird logic-dreamers like myself, all caught up in our own inner electricities. It was easier and more valued. In my profession, software engineering, there is something almost shameful in this helpful, social-servicessystem were building. The whole project smacks of end usersthose contemptible, oblivious people who just want to use the stuff we write and dont care how we did it.
What are you working on? asked an acquaintance I ran into at a book signing. Shes a woman with her own start-up company. Her offices used to be in the loft just below mine, two blocks from South Park, in San Franciscos Multimedia Gulch. She is tall and strikingly attractive; she wears hip, fashionable clothes; her company already has its first million in venture-capital funding. What are you working on, she wanted to know, I mean, that isnt under non-D?
Under non-D. Nondisclosure. Thats the cool thing to be doing: working on a system so new, so just started-up, that you cant talk about it under pain of lawsuit.
Oh, not much, I answered, trying to sound breezy. A city-wide network for AIDS service providers: how unhip could I get? If I wanted to do something for people with AIDS, I should make my first ten million in stock options, then attend some fancy party where I wear a red ribbon on my chest. I should be a sponsor for Digital Queers. But actually working on a project for end users? Where my client is a government agency? In the libertarian world of computing, where creating wealth is all, I am worse than uncool: I am aiding and abetting the bureaucracy, I am a net consumer of federal taxesIm whats wrong with this country.
Oh, Im basically just plugging in other peoplessoftware these days. Not much engineering. You know, I waved vaguely, plumbing mostly.
My vagueness paid off. The woman winked at me. Networks, she said.
Yeah. Something like that, I said. I was disgusted with myself, but, when she walked away, I was relieved.
The end users I was so ashamed of came late in the system development process. I didnt meet them until the software was half-written. This is not how these things are supposed to gothe system is not supposed to predate the people who will use itbut it often goes that way anyhow.
The project was eight months old when my client-contact, a project manager in a city department, a business-like woman of fifty, finally set up a meeting. Representatives of several social-service agencies were invited; eight came. A printed agenda was handed around the conference table. The first item was Review agenda. My programmer-mind whirred at the implication of endless reiteration: Agenda. Review agenda. Agenda. Forever.
Who dreamed up this stuff? asked a woman who directed a hospice and home-care agency. This is all useless! We had finally come to item four on the agenda: Review System Specifications. The hospice director waved a big stack of paperthe specifications arrived at by a task forcethen tossed it across the table. A heavyset woman apparently of Middle-Eastern descent, she hadprobably smoked a very large number of cigarettes in the course of her fifty-odd years on earth. Her laugh trailed off into a chesty rumble, which she used as a kind of drum roll to finish off her scorn.
The other users were no more impressed. A black woman who ran a shelterelegant, trailing Kente cloth. She kept folding and draping her acres of fabric as some sort of displacement for her boredom. Each time I started talking, I had to speak over a high jangle of her many bracelets set playing as she rearranged herself and ignored me with something that was not quite hostility. A woman who ran a clinic for lesbians, a self-described femme with hennaed hair and red fingernails: Why didnt someone come talk to us first? she asked. A good question. My client sat shamefaced. A young, handsome black man, assistant to the hospice director, quick and smart: he simply shook his head and kept a skeptical smile on his face. Finally a dentist and a doctor, two white males who looked pale and watery in this sea of diversity: they worried that the system would get in the way of giving services. And around the table they went, complaint by complaint.
I started to panic. Before this meeting, the users existed only in my mind, projections, all mine. They were abstractions, the initiators of tasks that set off remote procedure calls; triggers to a set of logical and machine events that ended in an update to a relational database on a central server. Now I was confronted with their fleshly existence. And now I had to think about the actual existenceof the people who used the services delivered by the users agencies, sick people who were no fools, who would do what they needed to do to get pills, food vouchers, a place to sleep.
I wished, earnestly, I could just replace the abstractions with the actual people. But it was already too late for that. The system pre-existed the people. Screens were prototyped. Data elements were defined. The machine events already had more reality, had been with me longer, than the human beings at the conference table. Immediately, I saw it was a problem not of replacing one reality with another but of two realities. I was there at the edge: the interface of the system, in all its existence, to the people, in all their existence.
I talked, asked questions, but I saw I was operating at a different speed from the people at the table. Notch down, I told myself. Notch down. The users were bright, all too sensitive to each others feelings. Anyone who was the slightest bit cut off was gotten back to sweetly: You were saying? Their courtesy was structural, built into their process. I had to keep my hand over my mouth to keep from jumping in. Notch down, I told myself again. Slow down. But it was not working. My brain whirred out a stream of logic-speak: The agency sees the client records if and only if there is a relationship defined between the agency and the client, I heard myself saying. By definition, as soon as the client receives services from the agency, the system considers the client to have a relationship with the provider. An internal index is created whichrepresents the relationship. The hospice director closed her eyes to concentrate. She would have smoked if she could have; she looked at me as if through something she had just exhaled.
I took notes, pages of revisions that had to be done immediately or else doom the system to instant disuse. The system had no life without the user, I saw. Id like to say that I was instantly converted to the notion of real human need, to the impact I would have on the working lives of these people at the table, on the people living with AIDS; Id like to claim a sudden sense of real-world responsibility. But that would be lying. What I really thought was this: I must save the system.
I ran off to call the programmers. Living in my hugely different world from the sick patients, the forbearing service providers, the earnest and caring users at the meeting, I didnt wait to find a regular phone. I went into the next room, took out my cell phone, began punching numbers into it, and hit the send button: We have to talk, I said.
By the time I saw Joel, Danny, and Mark, I had reduced the users objections to a set of five system changes. I would like to use the word reduce like a cook: something boiled down to its essence. But I was aware that the real human essence was already absent from the list Id prepared. An item like How will we know if the clients have TB?the fear of sitting in a small, poorly ventilated room with someone who has medication-resistant TB, the normal and complicated biological urgency of that questionbecame a list of data elements to be added to thescreens and the database. I tried to communicate some of the sense of the meeting to the programmers. They were interested, but in a mild, backgrounded way. Immediately, they seized the list of changes and, as I watched, they turned them into further abstractions.
We can add a parameter to the remote procedure call.
We should check the referential integrity on that.
Should the code be attached to that control or should it be in global scope?
Global, because this other object here needs to know about the condition.
No! No globals. We agreed. No more globals!
We have entered the code zone. Here thought is telegraphic and exquisitely precise. I feel no need to slow myself down. On the contrary, the faster the better. Joel runs off a stream of detail, and halfway through a sentence, Mark, the database programmer, completes the thought. I mention a screen element, and Danny, who programs the desktop software, thinks of two elements Ive forgotten. Mark will later say all bugs are Dannys fault, but, for now, they work together like cheerful little parallel-processing machines, breaking the problem into pieces that they attack simultaneously. Danny will later become the angry programmer scowling at me from behind his broken code, but now he is still a jovial guy with wire-rimmed glasses and a dog that accompanies him everywhere. Neato, he says to something Mark has proposed, grinning, patting the dog, happy as a clam.
Should we modify the call to AddUser
to check for User Type
Or should we add a new procedure call
something like ModifyPermissions.
But wont that add a new set of data elements that repeat
Yeah, a repeating set
which well have to
Procedure calls. Relational database normalization. Objects going in and out of scope. Though my mind is racing, I feel calm. Its the spacey calm of satellites speeding over the earth at a thousand miles per second: relative to each other, we float. The images of patients with AIDS recede, the beleaguered service providers are forgotten, the whole grim reality of the epidemic fades. We give ourselves over to the sheer fun of the technical, to the nearly sexual pleasure of the clicking thought-stream.
Some part of me mourns, but I know there is no other way: human needs must cross the line into code. They must pass through this semipermeable membrane where urgency, fear, and hope are filtered out, and only reason travels across. There is no other way. Real, death-inducing viruses do not travel here. Actual human confusions cannot live here. Everything we want accomplished, everything the system is to provide, must be denatured in its crossing to the machine, or else the system will die.
CLOSE TO THE MACHINE. Copyright 1997 by Ellen Ullman.