on debugging trans identity
<iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/936759790&color=%236e5c9e&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"></iframe><div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"><a href="https://soundcloud.com/berlinist-music" title="Berlinist" target="_blank" style="color: #cccccc; text-decoration: none;">Berlinist</a> · <a href="https://soundcloud.com/berlinist-music/firmament" title="Firmament" target="_blank" style="color: #cccccc; text-decoration: none;">Firmament</a></div>
I’ve always been drawn into mazes.
I’m all too fascinated by the architects of puzzles.
I like to think of myself as a puzzle-maestra of sorts. Maybe all programmers are: we build codebases to solve for specific, near-invisible problems. Debug, debug.
I used to draw a lot of mazes. I filled my notebook with paths and fake-outs.
In the third grade, my friend’s little sibling said they wanted to grow up to be a boy. At the time, that was possible in my mind. When did I started cementing the walls?
It’s helpful to build boundaries in your application, to separate code by concern. Functions that interact with design over here. Functions that build infrastructure over here. Neat and tidy.
But when code throws an error, you have to root through your whole filesystem to find it.
How do you know where to start?
Error messages are, on the whole, shitty. Meaningless when they reference something beyond your knowledge. Outside the walls of your worldview.
The New York Times crossword puzzles are 15 by 15 squares. Everything neat. Orderly. On time. I love the crossword for its aha moments. The way that each solve hints the next.
Clever, really—designing a system where one conclusion leads so logically onwards.
I too often wish learning in the real world were more like crosswords.
But I tend to prefer mazes.
When I set out to solve a puzzle in code, I always forget I have a starting point.
The problem begins to overwhelm me. I can’t trace where in the stacks of lines it might be echoing out from.
Throughout my adolescence, throughout my college years, throughout my twenties, I was suicidal.
My brain craved escape from the maze.
A tangled bug in my code.
In crosswords, every clue is numbered, down or up. Each one gets a hint. When you’re stuck, you move across the puzzle to another clue—there’s always something to solve, always somewhere to work.
It’s clear how each solve contributes to the whole.
In a maze, you often have to retrace your steps. Maybe it’s more frustrating, especially if you’re using pen, but I see it as more true to life. Retracing still contributes to the solve.
Seeing progress while building an application is much harder. Bugs can cause regression. You might delete hundreds of lines of code trying to isolate the problem.
Sometimes working backwards is the only way through. Often, in mazes, starting from the finish is best.
There’s a tool—one of the first you learn in JavaScript—called console.log().
console.log() displays for you anything you place between the parentheses.
console.log("Help me. I can't get out.")
The result, of of course:
Help me. I can't get out.
At first this talking with self doesn’t feel useful.
console.log("Hi, there.")
Hi, there.
Hi, computer.
You’re the one building the program. You should know what it might say. But sometimes, you run your application and:
Error. Gibberish.
Remember—you’re not coding in a vacuum. The browser is a player, too. You must satisfy something beyond yourself.
So, you Google the gibberish. Everyone on Stack Overflow is especially unhelpful today. No one responds to your Discord thread. You even Bing! it because you heard ChatGPT and Bing! got hitched, but first you have to join their early access program and—
You just want the damn thing to work.
Your brain hurts.
Maybe your body, too.
So, you figure out that the error occurs in one of three functions (if you’re lucky). You add a console.log() to each function:
function one() {
// do stuff
console.log("Function 1.")
}
function two() {
// do stuff
console.log("Function 2.")
}
function three() {
// do stuff
console.log("Function 3.")
}
You run the code again:
Function 1.
Function 2.
Error. Gibberish.
You’ve learned something valuable now. The error happens in function three(). Sometimes, this alone can be enough to figure it out. Other times, three() drops into a rabbit hole. And warrens into more warrens.
Professional solvers can knock out a Sunday crossword within seven minutes. The crossword doesn’t lead to another puzzle. It’s one and done. It gets ever smaller.
Even in a maze, there’s only so many paths to trace. The finishing place is known. It’s just about getting to it.
In programming, complexity grows with the size of an application. For instance, there’s variables. If you say:
let age = 22
console.log(age)
You get:
22
age becomes shorthand for the number assigned to it.
You can even come back to the code a year later and add:
age = 23
console.log(age)
And this time you’ll get:
22
23
age, see, is variable. It changes with the passage of time—or, in this case, code. JavaScript always executes from top to bottom. From the beginning of its life to its end.
There are exceptions, but we’ll get to that.
Much is variable in code. It can get rather confusing. What, for example, does home equal after this?
function moveOut() {
let home = "a place"
if (age < 18) {
home = "Ohio";
} else if (age <= 26) {
home = "Indiana";
} else if (age < 28) {
home = "Egypt";
} else if (age <= 29) {
home = "England";
}
return home;
}
console.log(moveOut)
“Well,” you may say if you’re clever, “home depends on age, but age is never mentioned in this code, so we’ll get an error.”
For which you’d be technically correct and thereby have earned yourself a gold star.
But in this example, you can imagine that the value of age is coming out of some calculation elsewhere. Now, the value of home is dependent not just on age but on the calculation age goes through.
What if the calculation is dependent on two other variables? Or if happiness is dependent on home? Or gender dependent on age in a separate file? Suddenly, we’re in a rabbit hole if an error gets thrown. Too many moving pieces.
Too many years going by in confusion.
Enigmatologists take much longer to create a puzzle than solve it. Here, the world is infinite. The boxes don’t yet exist to be filled. Where do you start?
Will Shortz, founder of the New York Times crossword, says it’s easy: “Most daily newspaper crosswords are 15 by 15 squares. So, [for example], I had three 15-letter answers. Planet of the Apes, monkeying around and Sir Edward Gibbon.”
Themes. Construct a helpful narrative.
One helpful tool for programmers is rubber ducking. Sounds more sexy than it is. Basically, when you run into your very last wit, you grab the yellow rubber duck you’ve set on your desk especially for this moment. Cradle him in your hands. You try to explain the bug to him in words only rubber ducks can understand.
This act of translation often causes us to frame the bug as part of a story. A theme.
In therapy I often tried to reframe my life narrative. I hoped that forcing it to all make sense for another human might give me insight into something outside the walls of my knowledge.
The problem and the beauty with rubber ducks is they can only respond with a squeak.
Incidentally, the Times pays $750 for a puzzle—$2250 if it’s a weekend. I couldn’t help but notice both numbers are divisible by 15.
Even in code, I try to make meaning. Arbitrary structure.
Instead of writing let before defining a variable, you can write const for “constant.”
Constants cannot be changed. const as in constipated. Once there’s a value put in, nothing’s coming out.
const age = 26
We can zoom into a moment in time. Stay there for a while. Stop the years from going by.
One constant, however tentative, can often lead to the creation of another. If age is always 26, then the calculations dependent on it might be constant, too.
If a constant like brain isn’t changing, maybe neither is heart.
Creating a puzzle is more like solving one than you might think.
Jonathan Blow is one of my favorite enigmatologists. He’s best known, perhaps, as a video game designer, but I think of him as equal parts programmer and philosopher.
He’s also known for having a truly unfortunate last name.
In *The Witness, *Blow’s magnum opus, you’re tasked with exploring a vividly colored island through solving puzzles that at first feel as simple as moving a line from one side of the screen to another.

Throughout the game, these mazes grow in complexity, echoing their paths in the game world. In the picture above, for example, you may find the maze in yellow to mirror the paths of the cords on the ground.
”If I were to say anything about reality, it’s that things influence and interrelate and cause increasing situational complexity,” says Blow in an interview for Time. “You think that you have one or two or three simple things, and then you find that the way those interact creates new phenomena or sub-phenomena, and then those phenomena interact with the original things, and eventually you have a quite complex tapestry.”
In fact there’s a puzzle early in *The Witness *with a shadow cast on it from a nearby outcropping. The challenge is to draw a line from one side of the puzzle to the other, but there are many ways to trace the line. You may, like me, struggle until you realize: if you draw a line that perfectly separates the shadow from the light, it’s solved.
It’s a brilliant twist on puzzles, which when created by humans, are usually all too isolated from each other. It’s a game more about observing than solving.
console.log() is, at the end of the day, just one of the many tools we have to observe code.
I like to think the things we learn in digital can transcend to real life.
In every video game where I was given the choice, I chose to play as a female protagonist.
In The Witness, you never get to inhabit a body besides your own. The first-person camera never interrupts the flow between you and the world.
A world of puzzles, which are certainly more than puzzles. Some enigmas take on real-life beauty.
Throughout The Witness’s 40+ hours, you begin to relate to its creator. Not to Blow the puzzlemaster, but to Jonathan the human. You stop solving puzzles long enough to start solving him.
It’s an indescribably intimate experience. Walking away from the puzzles only to find their creator.
In addition to console.log(), programmers also have walking away as a tool for debugging.