Some thoughts on software and creativity.

Stock photo from Pexels by Tim Gouw

I have been studying Japanese for about 5 years now, and recently picked up Korean as well. As part of my daily ritual, I do Anki flashcards to memorize new vocabulary to further my use of the language. Every day, or at least, to the best of my ability, I crank through about 100 flashcards on my commute, reviewing old words and Kanji, and learn about 20–30 new ones to review the next day.

This is not how the field of software should work.

Learning raw vocabulary is essential for doing actual work in a language, such as reading or writing native material. Vocabulary makes up the basis of a natural language, and without such primitives it is impossible to attain an understanding of any language. But in software, outside of some very niche fields, we work mainly in abstractions, not primitives.

Yet in most the same ways as I grind through my hundred or so cards (sometimes when I cheat, I sit down for about three hours and finish off my backlog of around a thousand-and-odd cards), whenever I browse strategies to find a job in the field of Computer Science, nay, more so Software Engineering, that I have chosen, there are many that extol the virtues of services such as Leetcode and Hackerrank.

From an early age I loved making things. Arts and Crafts was my favourite class in primary school. I grew up with LEGOs and and old Thinkpad, and I am not ashamed to say that I owe much of my interest in programming due to Minecraft, making Bukkit plugins for fun; so much fun that I eventually spent more time in Eclipse than Minecraft itself.

But Leetcode and HackerRank represent the side of Computer Science that, and I will admit I was never great at this, frankly I find take away from the magic that is the art of programming.

I am not trying to downplay the importance of understanding the costs of some arbitrary algorithm. Building such a foundation is the reason why I put myself through the gauntlet of University. But even so I find no enjoyment as I go through yet another inductive proof on some property of some contrived algorithm; still however I understand the necessity of learning such things.

With no outlet for my creativity in school, I turn to another interest taking another major; one which many of my peers in my Computer Science courses may look down upon on the holy pedestal upon which the virtues of a STEM education are preached to the congregation. Instead of crafting programs, I craft essays in this major, and read works by other thinkers.

On my free time I turn to improving or creating side projects, honing my skills and learning new tools to make more things as I go in ways that a formal education by itself will not teach. Combined with knowledge from the lectures and problem sets that I so despise, I am made a better programmer and find more enjoyment in the act of creating.

But neither HackerRank nor Leetcode bring enjoyment nor enlightenment. As a fault of my own personality, and I admit is definitely my own problem, I find no enjoyment in essentially useless puzzles for solved problems. I am very much not interested in what the fastest way to sort some list is, or what the fastest way to verify a string is an anagram is. A better way to phrase this thought perhaps, is at least to me, algorithms for the sake of algorithms is boring. I might even be able to broaden this statement, programming for the sake of programming is boring.

Having had what amounts to a head start compared to many of my peers, I’ve been asked by friends on many occasions questions such as “How do I start learning [X language]?” or “How […] do you know this much about everything?”. Before you get up in arms about Dunning-Kruger and statements like “lol this sophomore thinks he’s hot shit cause he made minecraft plugins”, let me be clear that I know absolutely nothing outside of what I learned doing the things I love. There is so much that I don’t know, and I hope that my four to six years that I plan to stay at in this mismatched collection of buildings in frigid Toronto will teach me alongside other things.

I find it particularly hard to answer the first question because, well, I’ve never learned a programming language for its own sake. All the languages I’ve ever picked up I’ve done out of necessity outside of a few exceptions. I picked up Java because of Minecraft. Python because I wanted to reuse scraping code from an XBMC plugin in Snowflake. C# and basic jQuery, because C++ intimidated me and I needed to use CEF for Battlelogium, back when Electron wasn’t a thing. Then when it was, JavaScript, TypeScript, and React, because graphics programming intimidated me when I needed a UI for Snowflake, upon the background of HTML and CSS which I learned because you were hot shit if you had a website in 3rd grade (that was a joke, and I was a weird kid in case you haven’t noticed already). Then finally I got over my fear of C++ in order to fix some bugs that were nagging me with some homebrew projects, but only after getting over my fear of low-level programming by learning Rust with seiri, which itself was born out of boredom and frustration with studying and the disfunctionality of my own hacked together tool that was supposed to replace a disfunctional and bloated iTunes.

With the exception of seiri, with which I chose Rust arbitrarily, every other language and concept I’ve learned, I’ve learned not out of interest, but of necessity. Without an initial goal of something I want to create, I have no willpower to dive into something for the sake of learning. Had I chosen another language for seiri, I might have not come to love Rust’s type system. Without Snowflake, I wouldn’t have learned so many concepts that I take for granted today in my courses and projects. Without Minecraft, I wouldn’t have started on this journey; perhaps I would be taking biology today having had a passing interest in genetics after watching a Discovery channel documentary.

Through necessity, I came to see the fruits of my labour and eventually the beauty in architecture, I find enjoyment and addiction. I’ve always hated math, but I have never been so hyped for a course as I have been for CSC324, or rather, the class where you learn Monads and Endofunctors, or so I hype myself up to be. Type theory, not calculus, nor graph theory, nor whatever underpinning of modern Math and Computer Science, is the only math topic in which I have interest, purely because Type theory is the study of how to arrange and architecture objects. It is the study of how to make things.

But the necessity of HackerRank and Leetcode is not immediately obvious, and while I hear stories of people grinding through problems, I can’t help but feel a twinge of sadness and uncertainty. The thought, that I, too, will have to go through this myself, grinding through hundreds of useless problems that will never result in something I can be proud of, if I want to be able to support myself in today’s society. This was the path I chose, but it was not what I signed up for. I don’t find any enjoyment in this, and enjoyment was what pushed me to pursue this field. By the same token, I have never been good at programming contests, nor did I find them enjoyable. I didn’t care. I was happy to be able to continue on making things.

I know that these thousand or so words that I’ve spent an hour on instead of doing Korean homework are the ramblings of a naive child. In adulthood, one must do things that they may not like. But still it saddens me that so many of my bright peers will never find enjoyment in the same way I have because to them, programming is simply the act of regurgitation. There is no need for creativity outside of that which is required for solving contrived puzzles, which, don’t get me wrong, is a great thing to have, but is different from the creativity needed to create. Programming can be so much more than solving algorithms to follow a predetermined test. A good app, class, or function can be a thing of beauty and human ingenuity in the same way a symphony, a piece, or just a few bars of music can be. No professional composer is judged on their ability to solve contrived theory problems, but by the works they composed. Yet why do we as programmers put so much focus on how well we are able to sort a list a certain way and not by the programs we produce?

I don’t program for the sake of programming. I am not good at programming; I am good at making things, for my own and others sake; oftentimes I will learn whatever is necessary to do so. But learning for learning’s sake is perhaps, at least in this field, something I do despise. Sometimes I think I’m in the wrong field, when everyone around me excels at the canned problems they throw at you in lectures. It seems indeed that a drive for creation is not as relevant as a drive for analysis and memorization. Is this a regrettable issue? For myself, yes, but for others who excel at analysis and memorization, it should not be.

I would like to stress that this essay, or rant, if you insist, is purely my own thoughts on the matter with a fiercely personal viewpoint. I regret the fact that I love to make things rather than learn for the sake of learning, both of which are equally respectable positions to take; but the fact of the matter is that the one I belong to is simply not as looked out for in today’s environment. Perhaps I’ll look back on this one day and see nothing but the ramblings of an overworked, stressed, and naive child. Perhaps my views won’t change even as I find a job that I love, and had to do all the things I rallied against here to get it. Perhaps the field will change, as this field constantly does. I do hope for my own sake that it does.