In late 2013, an email lit my phone up as I was trying to get my drunk body to bed. My mentor & employer had emailed me in reply to my resignation. A resignation that was preceded by a fight. We had a falling out. The email was simple. He wished me all the best and he acknowledged my disillusionment with software development as a profession. Wise & brilliant as he is, he added a little nugget of wisdom. He wrote,
The challenge of life is to find passion when it ebbs.
At that time, I was, if I may say so, a reckless romantic; A head full of dreams about computer programming and my place in it. I wanted to be a hero with a computer in someone else’s story. My ambitions were fuelled by niche subcultures mythologizing genius individuals in every second sentence. I was in retrospect, disappointed at myself; For not being able to attain the level I wished to operate in. I was stubborn and inexperienced. I had had it with programming. I wanted out.
At the end of that episode, I didn’t leave the industry, neither did I leave that job at that moment. But I had a mild epiphany, local maxima if you will. I realized that the grand vision of myself, being a singular protagonist, solving problems with my keyboard, was a delusion. Over time, I came to internalize that the job is not only “programming”; But a vast and layered onion that’s referred to as software development. At its core, it’s a craft, not much unlike carpentry or metalworking. And I am just a working craftsman, working with other craftspeople; Being part of something bigger than myself.
This idea, of me taking a small part in crafting software on a factory floor, led me to relentlessly sharpening and acquiring tools; Tools, that I thought would help me do my job better. These tools are varied in nature, sometimes psychological, something mathematical, and occasionally purely technical. I acquired skills, and skills to improve those skills. The standards of my craft went up with each new tool I added to my tool belt; Everything I built was, or had to be “industrial strength”. Looking back, my unrelenting acquisition of skills did push me forward in my profession; And I am in no position to say that it was unnecessary. It does play a key role in building reliable, consistent software systems; But, in this process, I lost the magic of computer programming. I got lost among this unrelenting effort to build bolder, heavier industrial software. I became narrower in my acceptance of what programming was. I became an opinionated fool, basking in his glorified delusion, sneering at anything that’s below the standards. There was no warmth left in my craft. I forgot why I started doing it in the first place.
For me, the beauty of computing came back last summer. On one of my local excursions to the city lake, I was thinking about vaccines, for obvious reasons; More specifically mRNA vaccines. Inevitably that led me to recall high school biology, and replication, and DNA. I had a moment of thoughtful pause before I realized that DNAs are self-replicating programs; Given the right environment, it can reproduce by itself! All the information needed to create another DNA is contained inside the DNA. You and I, are living breathing computers, executing the programs on DNAs, all to create more DNAs! "Richard Dawkins was right after all", I had thought to myself.
As a nerd relishing luxuries under peak engineering culture without a care in the world, I asked the natural next question; Can a computer program replicate itself? Turned out it can. Douglas Hofstadter, in his book, "Gödel, Escher, Bach", even gave a name for such computer programs; Quine. So, I ended up searching the inter-webs, for quines. All the quines I found, were ugly, asymmetric when looked upon; Exploiting various quirks of the systems & protocols involved. None of them were elegant; Until I found this,
((lambda (f) (list f (list (quote quote) f))) (quote (lambda (f) (list f (list (quote quote) f)))))
Pure, elegant, symmetric self-referencing; The program, when ran writes itself. Written in LISP, it's a beautiful conglomerate of self-referencing and brevity that likely cannot be described in any other way other than in the form of a computer program. After I understood the underlying structure, I started to take it further and made it self-modifying, like an organism mutating in predictable ways; A story for another time. However, those few days of intellectual excursion didn't yield anything of tangible value. None of it was remotely useful in my day job, or my dating life. Was I able to express my mild obsession with self-referentialism with those bits of computer code? Maybe. But the hackish amusement was magical!
My earliest well-formed memory of computer programming was in the summer of 2001. There were three of us in a room with our family computer my Father bought that year. It was a warm night, and past my bedtime. Usually, I wasn’t allowed to stay up that late, but that night it was my Father, my cousin, and I, poring over a CRT screen full of grey glyphs and characters. We were writing a BASIC program to find whether a given number was a prime. Following a tattered second-hand manual and a book titled ‘BASIC FOR SCHOOLS’, the core principle of the program we were writing was to emulate the same arithmetic that I had learned in school. It wasn’t a complicated program, neither was it any useful, but the act of putting my arithmetic thoughts onto a computer, simply by typing words and symbols in; Seemingly translating thoughts out of thin air. The excitement was not very different from getting a new bike or getting a kiss on the cheeks. The kind of excitement that blooms with possibilities.
[...], a word about the role of the humanities in software development. As vocational skills have become the order of the day, the liberal arts and social sciences are often dismissed as a sideshow for mushy technophobes or, worse, academics. One victim of this cultural hegemony is diversity (of people, and of approach) in the technology industry. Such narrow focus is self-defeating. Students of the humanities are more like to have an inductive, open-ended approach to reasoning; they're more likely to probe beyond the standard methodologies, and they're more likely to question accepted practices.
The failure of modern computing education is its portrayal of computer programming, as an industrial tool. Something that’s not to be fiddled with. Most programming courses are either geared towards industrial usage of said skill or steeped in academic noodles. And yes, such treatment of the discipline does yield very useful results. But that’s not the only way to practice it! Not everyone who plays tennis or golf on the weekend is doing it because it’s useful. Crosswords and sudoku puzzles probably never yield direct economic growth. But we still do it! Like gardening or baking, programming has every possibility to be just another hobby. But, even as I say that, there’s a tragedy bigger than the general mindset of educators; The languages programmers speak. Its definition is drowning in elitism. If you ever open up a programming textbook, it almost always starts close to the building blocks of the computer itself, almost as if you need to understand the underlying strata of computing to make anything worthy to be called an act of programming. And that creates a barrier to the magical aspects of computing in general. I say, let the experts deal with the nitty-gritty details of the machines; And free the people to just program, to express themselves. Dabble in a language that’s closer to them than the constructs of computers themselves.
In today’s world, one doesn’t even need to “write” anything to program. From these letters that get automatically assembled every week to my Instagram hashtag generator; Barely useful programs strung together with my dried-up Sunday boredom and a smartphone, are borderline magical. Granted, your magic may not be the same as mine, but there’s no reason why you can’t experience it!