Me after debugging this one thing for three days only to find it was a single extra period.. (Matthew Henry on Unsplash)
The summer holidays are here. The high schoolers that make up a large portion of my friend group are rejoicing. For the first couple of weeks or so, everyone relishes just doing nothing. Then, everyone starts complaining again.
You see, listlessness overcomes most of these students eventually. During the school year, everything is so boring and stressful that everyone is sick of it almost all the time and feel restless as a result. But as soon as the holidays roll in and they think things will start to look up, they get bored quickly. I call the phenomenon “Having No Intrinsic Purpose”.
My sister’s descent into a hollow existence is a classic example of this phenomenon. After a few fruitless projects, she hit a rock bottom: a week-long period filled with makeup tutorials on YouTube, mobile gaming, and social media. At the end of this period, she became more vocal about her suffering, and I was obliged to help. And that’s where this piece gets technical.
She wanted something mechanical to do that didn’t require consistent creative input. Her previous intellectual avenue, fiction writing, needed conscious mental exertion most of the time, hence her regular burnout. After a quick search for ‘valuable skills to learn in 2018’, I suggested she do some programming. I suggested it because it’s quite safe to say that it’s a valuable skill going forward, and I do it too, and could help her if things got hard. On day one of her coding streak (at the time of writing), things are looking good. Engagement is high and general fulfillment in life seems better.
So you might be wondering: what’s with the title?
I’m building a software business out of an idea management platform, but I don’t write much code. Tian Ooi is the lead engineer. When I do code, it’s because there’s some extreme circumstance (deadlines, sick leaves, etc.). Even then, I hate programming after about two days of it.
I hate it because the majority of programming that is done feels robotic to me. The daily work of engineers in my business involves many popular, well-loved technologies like React Native, MongoDB, and Ruby on Rails, so it’s not like we’re writing any assembly code or (God forbid) Java. It’s just that programming isn’t what I would like it to be right now.
The aim of programming is usually quite clear, and so is the process of getting there. You have a set of things to accomplish, and you make the code do it to a satisfactory degree. The problem is that without any warning, twenty million things will go wrong throughout the process of getting the code to do this. From my experience, not every single thing that can screw up will screw up. But things that should just work will end up screwing up instead, causing even more problems than anticipated.
Programming is tedious. No, it’s fucking tedious. This makes it impossible to be creative with code, because even conventional, common uses of code barely work. Coding is not yet at the point where you can just start writing it without a clear goal in mind. You can’t explore with code, you can only build with it. In oil painting, this is like only being able to paint a picture that you have clearly in your head already. It’s like every drop of color must be pre-planned and pre-calculated, and every random stroke that is made on the canvas will cause the entire canvas to catch fire.
What most of the code you write is: trash. (Steve Johnson on Unsplash)
Creativity is hardly possible with programming because randomness is hardly possible in programming. There are well-defined ways things are done, and on the basic level that’s fine. The problem is that most coding environments are designed to only accept a limited subset of predefined workflows. Hence, when programming, you have to stick to these few ways things are done, otherwise your shit won’t work. This has a couple of important impacts on the programming experience:
First, venturing beyond the abilities of those set workflows is nearly impossible, or so unpleasant that you might as well not even try. That’s why new workflows are constantly being made in the form of new languages or frameworks. Yes, all the programming that has ever been done to this point could have been written in binary. The only reason this isn’t done is because there aren’t enough people who are that insane.
Second, when different, advanced things actually do need to be made, they have to stick to those few set ways too, and that makes the experience of programming them immensely difficult. This sounds like a restatement of the first point, but I’m trying to highlight the experience here. Programming in this situation can be truly, universally, objectively hellish.
Everyone reading must understand this, and I feel that some readers unfamiliar with the tech pool might have difficulty understanding the nature of this suffering. So I came up with a close analogy: imagine you’re tasked with moving fifty watermelons from point A to point B, which are 30 miles away, within the span of six hours. You have a truck that can fit all fifty watermelons in it at once, easily.
Sounds like an easy solution, right? Just load the watermelons into the truck and drive to point B. Six hours is plenty of time to do that, right? Well, depending on what type of programming we’re talking about, this scenario could play out a few different ways for a programmer.
If you’re a C developer, you’re already screwed because you forgot to import anything. Also, your truck is full of garbage, rendering it unusable. If you’re a Javascript developer, you’ll be able to start loading the watermelons onto the truck, but halfway through you’ll be stalled by circular dependencies on 6 of your 79 npm packages. If you’re a systems developer, you haven’t even got the truck, so you instead choose to harvest the seeds from some of the watermelons, jog the 30 miles, and plant the seeds at point B, hoping that you’ll grow 30 watermelons there eventually. If you’re a Ruby on Rails developer, the truck is actually self-driving, so all you have to do is load all the watermelons. But in the process, you used an ActiveRecord method wrong and now all your watermelons are actually avocados. But on the bright side, you’ve also got 24 different cookbooks on how to prepare avocados.
See? It’s that infuriating. Seriously.
Photo by Dmitry Bayer on Unsplash
I’m not saying current programming technology is awful. Code is responsible for an incredible array of modern things like jet planes, computers, the stock market, and, soon, maybe even sentient intelligence. I’m just asking you to stop debugging that gradle error for a minute and imagine what would be possible if we could code as easily as we can draw a picture with a pen on a piece of paper. What if we could make an app as easily as we could describe it with a few sentences? What if we could create the logic for a robotic arm using the relationships we can already express about it physically? What if we could write code that’s so safe that we could randomly experiment with it to discover new things?
There is enormous power available through coding that would be more accessible, predictable, and potent if it were just more pleasant. If you don’t believe me, try learning to code yourself. Your first month will be an ecstatic high where you feel like you have control over the entire galaxy. But as soon as you try and do any real world things with code, like put a software product on the market, you’ll see what I mean. There’s a reason life in Silicon Valley tech companies is so stressful. There’s a reason engineers are paid so well at competitive companies that rely on this technology.
On a personal scale, if you remove all the pressures on your coding activities like deadlines or concrete goals, and instead focus on just the learning experience, you might enjoy it for a long time. You should be aware, however, that the industry is dominated by people who code for twelve hours straight six days a week. There are rare cases where some twelve year old comes up with self-aware artificial intelligence after two months of weekend coding sprees, but trust me, it’s not that easy.
On a bigger scale, we programmers are the ones who should take responsibility:
We should be making tools that enable people to do something with code and just have it work. Or at least, we should make that even remotely possible a bit more frequently than 10% of the time. We should be coming up with creative ways to turn simple project requirements and restrictions into safe, scalable code rather than inventing more and more abstract ways to represent information and relationships with code.
We should be making coding easier and more powerful. When we do that, we’ll unlock the creativity of so many more people. When we make code more self-functioning, we’ll make so many jobs that much more pleasant. More importantly, we can get on with our lives. We’ve wasted enough time already.
Come on, people. Coding is a pain in the ass. It’s a pain in the ass way too often. You know it’s true. It’s time to debug this shit and focus on the impact of what we make, rather than how to make it.