Exaggerating the negatives

A disturbingly fecal perspective pervades the practice of programming.

  • “Everybody writes shit code.”
  • “Anything I wrote more than a few months ago is shit.”
  • “If your old code isn’t shit, you’re not improving.”
  • “If what you’re releasing isn’t shit, you’re not releasing fast enough.”

In this household we discuss excrement a great deal, on account of the many pets.

  • “It’s Tuesday, did y’all remember to pick up the dog poop?”
  • “Please don’t leave guinea pig shit in the bathtub.”

I wouldn’t honestly mind if the kids called it shit – they don’t – but I think I would discourage it anyway. We’ve been thinking about why some words are off-limits to our children. I grew up thinking that the adults had some absurd Bible Belt beliefs on this topic. Now I know that some expressions from my own adult vocabulary would definitely seem wrong as part of the kids’, and I have to figure out why.

I think what it comes down to is that the kids fight and I don’t want phrases like “eat shit and die” to end up in their arsenal of habits. You can already hit your brother with anything that vaguely resembles a sword; you don’t need expressions for it too. As Julie is fond of quoting, “It is easy to be heavy: hard to be light”, G. K. Chesterton, 1908 and children have not yet developed the verbal skill to be light with a sword, especially not when they are upset. The off-limits expressions are the ones that are just too easy to weaponize and too subtly difficult to use lightly.

Somebody else’s shit is on the dresser. Have you noticed that their stuff is shit and your shit is stuff? God! And you say, get that shit off of there and let me put my stuff down! George Carlin, 1981

Cussing is not the problem; hyperbolic non-communication is the problem. Grievances or laments about the “garbage fire” are heavy. Not light. Professionals are speaking on subjects of purported importance and routinely failing to articulate anything more sophisticated than putting on an angry face and hitting their brother with a stick.


We recently finished reading The Giver Quartet, a four-book series beginning with The Giver. Lois Lowry, 1993 It opens on the protagonist, Jonas, considering his misgivings about the upcoming Ceremony of Twelve where he, as a 12-year-old, is to be assigned his permanent role in the community. Keeping in mind the community’s encouragement of “precision of language”, he settles on the word “apprehensive” to describe his emotion. At the evening Telling of Feelings, Jonas describes this apprehension to his family. As those familiar with the novel know, sinister details about the community will soon unfold – but I believe Lowry is still at this point in the story showing us parts of the society that are well-functioning despite some unsettlingly alien tinges.

In place of the reassuring conversation that ensues, we could imagine a similar but less productive discourse in which Jonas tells his family that he feels like shit today. Perhaps his parents are offended at his apparent distaste for the ceremony. Perhaps they are understanding but the only consolation they are able to offer is that they, too, feel shitty at times.


What are we neglecting to say when we habitually exaggerate the negatives? Julie and I have now produced an entire course The tweet history project with no profanity that amounts to an answer to this question. Haskell learners have asked for “opinionated” resources – people want to know how to do a good job – and so we set out on a lengthy discussion of what makes code better or worse.

The course is built around a program I wrote in 2016. We chose this program because it is one of the first complete things I ever produced using Haskell, and so we figured it would provide us some very real examples of common missteps and how to correct them, without the awkwardness of reviewing somebody else’s work in public. And it did turn out to be a great source of discussion topics. We split up unwieldy large definitions, add types, try out other libraries, organize code into modules, avoid some use of partial functions, and make it run noticeably faster. We give reasons for our changes.

At no point do we laugh about the original being awful. It worked, and it was suitable for its purpose. When a project is acceptable, you may stop, even if there are improvements yet to be made. The code I wrote might not have been acceptable in a different context, so we made the improvements for instructional purposes – not because the project itself was a problem or an embarrassment.

If I were to direct insults at my own code, there’s no way I could ask readers not to see insults also insinuated toward them. I’m discussing code that I wrote as a Haskell beginner but with two computer science degrees and a decade in the profession. I write introductory courses for people who may have no prior software experience at all. If I tell my readers that my work was complete garbage, what must they infer about their own efforts? How could I bring fecal judgements down upon any piece of code without being shamefully rude?

Prudence does not inhibit me from expressing opinions. I can tell you which of two choices I like better, and I can tell you why I think so. Some programs contain a little room for improvement, some contain a great deal.

I have at times abandoned code that I decided was not worth trying to redeem, easier to start over. It can feel pretty miserable, that sort of setback. But if work truly is discarded, then maybe calling it garbage isn’t an exaggeration but still represents an unnecessarily demoralizing attitude. Some tasks require multiple attempts. The first attempts can be failures that frustrate and embarrass you, or they can be the initial steps in a multi-step process. The difference is often just which perspective you choose.

I am not Bob Ross, and I do not believe that every mistake is a happy accident. I do believe we can remain calm, refrain from perceiving every misstep as an overwhelming tragedy, describe problems in specifics, and fix what we can.


A couple years ago, we moved into an old house, and we have been gradually replacing many of its components. Some parts simply wear down over time, like the shingles on the roof. Some systems beg replacement because the technology has improved since 1947. Iron drain pipes are awful to work with, heavy and difficult to cut. And over time, they corrode. Debris snags on the rough interior surface, leading to clogs. Nowadays we make them out of hard plastic – smooth, lightweight, easy to cut and glue.

Electrical systems don’t seem to have changed all that much, except for the advent of “three-prong” outlets. This third hole accommodates an important safety feature: the “equipment ground”, an additional wire alongside the hot and neutral within the cable that runs through the wall, all the way back to the circuit breaker. Upgrading the system means replacing the old cables with new cables that are bundles of three wires instead of two.

From a main service panel outside, our power is conducted through an imposingly thick cable to a subpanel in the basement. I called in the professionals to replace this cable, and even they had a serious time with it. After a great deal of pushing and tugging, someone on the team proudly reported that they’d finally gotten it through.

“It must have been all that cussing that did it,” said the boss.

“No,” I heard the first electrician reply, “I only cussed once.”