Sometimes I program for programmers. There is tremendous satisfaction to be found in writing programs purely for their own sake, polishing an idea into a tiny jewel with precisely beveled facets. Painting, sculpture, and architecture can speak to the untrained eye and find the heart, but a concise, sparkling snippet of code demands a great deal from the reader. Even practitioners who could read the code rarely do. My brushstrokes are invisible. I am at peace with this.
Most programs, though, are more utilitarian. These programs have customers and users. They exist to perform a task. My task is to touch my computer in very specific ways to compose and refine software which, via some abstruse and as of yet unseen mechanism, produces money, a portion of which is deposited in my bank account twice a month.
My program is a toolkit for performing data analysis. My customers are executives at retailers you shop at, who want to turn unending red-hot ribbons of transactions from cash registers, shipping facilities, and hand-scanners into a cold, steady pulse of what practitioners euphemistically call Business Intelligence. Like a spider perched in the center of its web, they gaze upon automatically delivered PDF reports and gently oscillating dashboard readouts to achieve a sensation of instrumental agency over the far-flung corners of their empires. In the best of times (which is to say, as imagined through the medium of heavily scripted product demos), they inhabit a plane of capitalistic nirvana.
My customers purchase my program through an elaborate courtship ritual spanning months. My users have no choice in the matter. My users are data analysts, who spend hours of every working day staring at the forms and buttons of my program’s user interface. They learned some of what they need to know from the documentation, but during orientation two years ago they had a brief full-day training session. Corporate even sprang for boxed lunches containing one fruit cup, one granola bar, and one triangle-cut ham and Swiss cheese sandwich on white bread. Three business-casual shirts earned mustard stains that day.
M is one of my users. She is ambitious, hardworking, and constantly buried in meetings, emails, and drive-by micromanagement. Her corporate-issue laptop was obsolete on her first day. At any given time she has eight dozen browser tabs open, of which seven dozen are work-related. This year her employer migrated her team from cubicles (roughly 60 square feet allocated per person) to a long shelf punctuated every four feet by eye-level baffles. They’re still called cubicles, naturally. M is assured that this new, noisier, elbow-room-free environment is ideal for fostering creative collaboration among colleagues. It is also somewhat cheaper.
Sometimes, when the office is nearly empty, in the wee hours of the morning or late at night, M uses the third floor women’s bathroom to scream.
A newly-hired product manager of whom I have already taken a dim view is wrapping up a presentation detailing a bold new direction for improving the accessibility and onboarding of my program, based on a few hours of aimless pawing at it. With a practiced rictus that, in his mind, no doubt closely resembles a genial human smile, he sums up thusly:
“It needs to be simple. We need to make sure idiots can use it.”
M is busy, distracted, and at times frustrated with how little her degree in electrical engineering has contributed to her career progression, but she is not an idiot.
My program is an essential part of her day. My program is not the best part of her day. Usually the best part of her day is a close tie between showering at the gym after her morning workout and curling up on the couch in the evening to watch serial killer documentaries with her teething puppy. Nor is my program the worst part of her day. Today the worst part of her day will be cleaning puppy vomit from a throw pillow after discovering that the DVR did not record yesterday’s serial killer documentaries. Even after all these hours spent together, when my program does what it needs to do, M barely notices. When my program fails and devours half a day’s modeling, she might prefer to be cleaning up puppy vomit.
I did not design my program from whole cloth. It is hard to say it was designed at all. I inherited my program from a procession of fellow cobblers. I study their brushstrokes. Printed on retro-chic green-and-white-striped fanfold paper, my program would make a breathtaking fire hazard. I work in a small team. I patch holes. I smooth uneven surfaces. I iterate. Every change I make trickles down into the hours, minutes, and seconds spent by thousands of analysts like M, 8 hours a day, five days a week, excluding federal holidays.
I can save M time, if I’m careful. I can make forms clearer, helping her find the information she needs. I can improve performance, saving hours of staring at spinning progress bars, or perhaps letting M’s overtaxed laptop squeak through one more meeting without a recharge. A confusing workflow can gain a shortcut. A common task can be solved with a convenient context menu.
My program isn’t perfect, and it won’t be. It isn’t simple, because it can’t be; M’s job isn’t simple, either. Life isn’t simple.
On a different day, I might snap at my PM’s remark. We make tools. The purpose of the product is to give intelligent, creative, notionally self-directed humans leverage on intellectual work. My users aren’t programmers or product managers, and they aren’t seeking emotional investment in a CRUD application. I’m not here to corral wayward mouth-breathers through a funnel. I’m not a Taylorist, optimizing the motions of a white-collar assembly line. I’m good at manipulating computers. I don’t like to manipulate people.
Today, though, I’m busy. Distracted. Frustrated. Miserable. I don’t know how I’m going to make it through the rest of the rest of this meeting, let alone another three hours of code archaeology.
Sometimes the length of a surprise text message tells you all you need to know. Several years ago, a programmer much like me was working on the chat application that runs on my phone, introducing a feature that analyzes the sentiment of received messages. For reasons I will never understand, this language model decided that the worst paragraph I will read today should be delivered with an animated burst of balloons and confetti. I am in no state to file a bug report.
Part of my mind is already making a list of plans to cancel. No point in refunding those movie tickets; maybe I could give them to a coworker. No point cleaning my apartment tomorrow. I might puke. Or eat that pint of ice cream in my freezer. Maybe both, when I get home. The lightly-used second toothbrush in my bathroom needs to be thrown away.
I do not have a third-floor bathroom to cry in, so this comment block will have to do. My brushstrokes are invisible.
My hand trembles on my keyboard, and through bleary eyes I notice that the tab order in a form I have open is wrong- it’s selecting invisible elements and skipping over a custom dropdown. I realize I have reproduced an intermittent data entry bug reported by beta users last week. I begin preparing a patch. The task seeps into the painful empty space in my chest.
We’ve never met, M. We won’t. I will keep trying to make things better, all the same. It’s the least I can do.