I want you to take a second and imagine a really gruesome problem in software engineering, the kind of thing that would keep a programmer up at night tracing solutions on the ceiling. I know I’m asking an engineer’s question, but I’ve written this blog with non-coders in mind, too. If you’ve been kind enough to go along with my thought experiment, you’re probably thinking about a problem like calculating all the different ways you could fold a single box or preserving coherence in a quantum computer. In the workshop of your mind, there’s a job that requires specialist expertise, and that has been glitterbombed with complexities. That does describe a lot of the struggles in software, but in my experience, a surprisingly common type of barrier involves just the opposite.
I’ve been calling these barriers “Minimal Option Problems”, although I’m not married to the name. These are snags that are baffling to unsnag, not because they concern fantastically complex systems but because the systems are mind-numbingly simple. I’m talking about having a program load from a folder at a specific path, being able to see the folder in Windows Explorer, but being slapped with an error message that there’s nothing at the referenced location. Or what if the video game character you created can rotate left but not right, even though both directions use the same movement logic?
The quantum computer and folding box problems are overwhelming, but they have a lot of bolts you can double-check the tightness on. If you are trying to save to a directory with a single line of code and the writer doesn’t write, what is there left to check? With the folding, there’s a deluge of research materials to imbibe: topological theory and documentation for the language. With the rotation paradox, there’s some basic trig, but what’s left to look up once you know the basic functions that govern yaw?
Notice that I called these “Minimal Options Problems”, not “No Options Problems”. If it looks like you’re out of choices, then there is an aspect of the issue you’re not considering, and usually, the solution is something you can implement. One of the sweet kickbacks about building software rather than hardware is that software and software parts are more easily attainable. If something is going wrong, you probably don’t need to build a mad gadget in your garage or import a control unit from Taiwan. You likely just need to download a plugin or enter the right inputs on your keyboard.
To know what you have to copy or create, you may have to think outside the box. This is a necessary step for many programmers beginning to work with 3D engines. In most 3D graphics, everything is made up of minuscule triangles, and sometimes we want to calculate the line perpendicular to one of those triangles, which looks like this:
This line is called the “surface normal”, and to give one example of why it’s useful to know it, it lets us deduce how light should bounce off the triangle.[1] We can work out the surface normal by taking two edges from the triangle, labelling them A and B and performing this operation on them:[2]
A × B
But how do we implement that sum? It’s not clear how you’d multiply edges, and unless you know the trick, when you try it, you won’t get the surface normal. What else can you try? It seems like nothing because there’s not a whole lot to probe here; all you have are two vectors and a multiplication operator. The stroke of genius is entertaining the idea that someone might write “×” in the middle of their equation and not mean multiply. The detail-oriented among you will have noticed I’m typing “×” instead of “x”. See, the answer here is that to get the surface normal, you need to use a special operation called a cross product, denoted by the “×” character, and not multiplication, denoted by “x”.[2] To me, this has always felt like a really mean trap for beginner graphics programmers, and it’s especially hard to spot if the “×” in your learning materials is written in an atypical font or is hand-drawn.
Even once you’ve learned the distinction, linear algebra can get your ass a second time. A long time ago, I was copying out some equations for some 2D graphics gubbins and found that the shapes appeared to be drawn by an especially stupid monkey. I nearly drove myself mad trying to figure out what was going on until I realised that one of my equations that was meant to be using multiply was using cross-product. What can I say? I was overworked and had been working with cross-products just before that.
Let’s turn to a second Minimal Options Problem: The notorious Ubuntu bug #255161. I know what you’re thinking. Ubuntu Printer Bug? That sounds like a beetle that spits out paper! But it’s not. Let’s check out a 2008 thread on launchpad.net from an “adrianb” who made an unassuming inquiry about a printer error. Attempting to print from OpenOffice that day, Adrian had found the ink would not flow. Printers were sent by God to punish us and fail all the time. This is the kind of computing upset that is least likely to raise eyebrows, and the problem went away by itself. To those outside software development, that disappearance might sound like a stroke of luck, but once you’ve been through the ringer a few times, you realise that if a bug magically vanishes, it may magically reappear in the future. However, try to quash that bug, and you find yourself with another Minimal Options Problem. If you haven’t got the glitch active on your machine, how do you examine it? The answer is to try and recreate the failure, but if you don’t know what causes the mishap, do you know that you’ll be able to trigger it again?
Others in adrainb’s thread report the same bug they are experiencing, only to find it disappearing, then reappearing and disappearing with a whack-a-mole-like interval. With Minimal Options Problems, desperation can set in, and you may start entertaining implausible answers. Six months after Adrian’s post, user paddy-stevepaine tells adrianb that their wife has been complaining that she can’t print on Tuesdays and dangles the possibility that she and the OP are plagued by the same critter. But the computernauts had done their due dilligence, trying other printers, trying different programs, reporting the issue to OpenOffice, but after none of that worked, what are their options? Well, there is that fundamental orchestra of software that we always rely on: the operating system. Your Windows, your Mac, etc. For Adrian, it was basically Ubuntu. That’s an OS just as prestigious as Windows or MacOS, so suggesting the fault is there is like defaming Microsoft or Apple by saying that they fudged basic print functionality in their code.
If it’s nearly impossible that the engineers behind Ubuntu dropped the ball or that printers spontaneously break on Tuesdays and fix themselves on Wednesdays, what is the explanation? The explanation is that both the OS and calendar bugs were real. For more than a year, Ubuntu was blighted by a fault where if it was a Tuesday and OpenOffice tried to print, the OS would misidentify the print command and read it as another type of data. When you have eliminated the impossible, whatever remains, no matter how improbable, is the truth.
Hopefully, you never have to contend with cursed Tuesdays or gag gift mathematical operators, but these examples are to communicate that even when it seems like there are no options, creative thinking can open new pathways you wouldn’t have seriously considered before. Thanks for reading.
Notes
- Introduction to Surface Normals by Unity Staff (Date Unknown, Accessed February 23rd, 2025), Unity Documentation.
- DATA — SURFACE NORMALS by Brian R. Johnson (April, 2014), TAPESTRY: The Art of Representation and Abstraction.
All other sources linked at relevant points in article.