I was seven years old when I got my first computer. It was a regular summer morning and my dad asked me if I wanted a laptop. I said, “sure, I guess.” I didn’t even know what a laptop was. Shoot, I wasn’t even quite sure what my lap was.

He brought in a big box to my room, sat down with me, and opened it up. The smell of plastic and cardboard greeted me with a nice waft when the packaging came off. I pulled off the styrofoam to reveal what was an IBM Thinkpad.

It was so bulky, so clunky, and so husky it violated every rule of sane and proper design. It had a fan that hummed loud, and I mean loud. You felt like you needed those ear muffs that the airport groundcrew wear. It had a little “pointing stick” mouse that got stuck quite easily, especially when my sunflower seed shells accumulated underneath the gapped and blocky keys. As if that wasn’t enough, it also ran Windows 98, although run is a rather generous word. It didn’t matter though, I was in love. I’m of the generation that grew up on the Internet. I don’t know of a life before it, and God forbid I ever know of a life after it.

The squeaks and gurgles of my 56k dial-up connection were the first sounds that ushered me into a world that changed my life forever. A year or so went by of exploring, playing, and discovering an existence outside my tiny neighborhood and school. One day my dad told me that the windows I was typing into were these things called “programs”. These programs could do anything I or anyone else could ever possibly imagine. A pure expression of creativity, willpower, and naive persistence was all I needed.

My dad gave me a book on Perl which he said, “would teach me the basics of programming.” Now, if you’ve ever programmed in Perl, you’ll know what I mean when I say this:

If you put a million monkeys at a million keyboards, one of them will eventually write a Java program. The rest of them will write Perl programs.

Perl was one hell of a way to get introduced to the “basics” of programming. There was nothing basic at all with it. The joke of course is the Perl is write-only, and it most definitely felt that way. After trying to code a CGI form to order Pokemon cards online, I soon abandoned the whole enterprise.

A few years later, inspired by my love of the N64, maps, and the ocean, I sought to create a crazy cool submarine game. Someone told me video games were programmed in C (a somewhat specious claim because most were/are done in C++). So I picked up K&R’s classic The C Programming Language. I actually found it quite readable at age 11, but after trying in vein to make something even barely resembling a video game, I quit.

As I went through high school, my love of computers never waned, but my confidence in my coding abilities did. Programming seemed like a thing I would just never get. Despite the fact that I repaired computers as a side job and did some contract jobs making some very basic pre-Bootstrap hand-rolled websites, I felt like I had serious imposter syndrome. I was never good enough, and even when people told me I “knew computers”, I just silently cowered away inside thinking to myself, “well, real computer people know how to use that terminal thingy and I can barely remember what ls is for. I’ll never get it.”

All the while, I was reading tons of books. I was most captivated by everything I read in philosophy. From Aristotle, to Descartes, to the teenage emo-hormonal favorite Nietzsche. I was in love. When I finally read The Conscious Mind by David Chalmers, I felt like I knew what I wanted to do with my life. I really wanted to study the mind, language, and logic at a philosophical level and figure out those deep mysteries of life that have plagued every great thinker that has come before us. I had my plan: I would become a philosophy professor, teach college on the French Riviera, and spend my nights bouncing around bodegas and discussing epistemology.

That looked like a beautiful place to be a bullshit artist https://www.youtube.com/watch?v=IgoB2JMEowc

Now halfway through college, I realized I really didn’t want to be a professor. While I loved the subject, I really didn’t love the whole Ph.D pursuit it would entail. After all, no destination in life is good enough if the road you take to get there is one you’ll loathe. That didn’t leave me with a whole lot of career options though.

The engineer asks ‘how can I build that?’ the scientist asks ‘how does it work?’ and the philosopher asks ‘do you want fries with that?’

Feeling down and out about my life trajectory, I decided to go back to books to escape my depression. I read a really interesting article about how computers could be used to study language. I had been fascinated by language all throughout my philosophical studies, and it seemed that if there were a path to understanding the mind then it would be through language. I read more and more about Natural Language Processing (NLP), as I would soon discover it was called. I stumbled across this tool called the Natural Language Toolkit (NLTK), and its implementation language, Python.

My first impression was being overtaken by the beauty of Python. It was almost like writing pseudo-code. If I could just reason about a problem, just break it down to its most essential pieces, I could pretty much get it done in Python. And my friends, that ability to reason about the problem was precisely what I was getting better at.

What I had been missing the whole time when trying to program as a kid was not some deep wisdom about how the GCC linker operated, or how POSIX handled threads and dynamic memory. I thought those deep nuances and factoids were what I needed to get a project done. That wasn’t the case though. The kind of programming I wanted to do didn’t involve any of that. What I was missing this whole time was simply being able to think.

When I studied philosophy, I learned how to break a problem down. As an example, take the very most principal problem in all of epistemology: “what is knowledge?” In the thoughtless way in which I was taught throughout my tutelage, I would have consulted a dictionary. Or maybe I would have found a quote to memorize from someone in my teacher-assigned textbook. Or maybe I would have just been a Potter Stewart and said “I know it when I see it.” Whatever the case may have been, before philosophy, I wouldn’t have known where to start. Stepping back and abstracting away all my preconceptions was the first step. When tackling any philosophical problem, I had to get meta, very meta.

Hipster cat thinks outside the meow

In order to discuss what knowledge is, I had to contrast it with something I wouldn’t call knowledge. Ok then… Reading Plato in my 101 class taught me that if we are to make any distinction between knowledge and something else, it must be between truth and beliefs. Beliefs were unjustified forms of knowledge I thought. Ok, getting closer. I exhausted Plato and moved on to Kant. Then I had to break that down further and look at how we could even arrive at something like truth. This led me to understanding further distinctions between a priori and a posteriori forms of knowing. Going deeper, I read Descartes and began to question if using our bodily senses to develop empirical theories of the world is fully reliable. Maybe our senses could merely be hallucinations imparted upon us by some evil demon.

By the time I had an essay written, I had already connected so many different ideas and stepped out of my most basic understanding of the world in ways I never could have imagined. It was a terrible work of philosophy, but I made incredible strides to being able to be a competent thinker. As I continued my studies, my thinking got deeper, richer, and I was better able to abstract upon the ideas I encountered. Whether I was studying ethics, existentialism, or Kripke semantics, I continued to learn how to truly think.

You might be saying, “well that’s great then Ryan, but how does this relate to code?” I think it does in a really deep way. Programming is just ideas — it’s about abstracting away all the 1s and 0s in the computer and using human-readable language to make systems of ideas that work together. Just as our physical bodies and the world around us are the mere jittering of quarks, atoms, and electrons, we abstract our lives beyond that and talk about things and people, not the constituent pieces that make those up.

Programming is about breaking all the potential tasks an application could ever do, and writing those instructions out to perform in the most efficient and readable way possible. Philosophy wasn’t much different — you had to use language, you had to break problems down, you had to think systematically about a multitude of edge cases that the professor could use to destroy your theories. You had to be simple and concise yet discover the truth about some aspect of the world. It was all the same skills as programming, just an entirely different use of them.

You might be thinking, “Well then why not just study philosophy on your own time? Why spend all that money in college when it won’t get you a job?”

Ok true. Philosophy won’t get you a job. It won’t even get you an interview. In and of itself, it is totally useless, but it is useless in the same way that all the other beautiful things in life are: art, music, poetry, literature, and long walks on the beach. Now, would studying computer science have taught the same things to me? Yes. Computer science most definitely will teach you the knowledge and the skills you need to be a programmer. But, it’s not the only study that will teach you the skills you need. I often wonder if it’s even the best study for that.

Having said this of course, to be a developer I had to learn a little or a lot about more than a handful of things. There’s no getting away from the knowledge required to be a programmer, and it’s one hell of a long list:

Variables

Data types

Arrays

Dictionaries/hashes

Loops

Functions

Return statements

If-else blocks

Switch statements

Exceptions

Module importing

Debugging and stack tracing

Object-oriented programming

Inheritance

Encapsulation

Polymorphism

(OOP) design patterns

Generators

Recursion

Dynamic programming

Decorators

Pass by reference/value

Stacks

Queues

Linked Lists

Binary trees

Graphs (directed and undirected)

Threads

Sorting algorithms (merge, heap, insertion, and quick)

Big-O Notation

Public-private key cryptography

SSH

FTP

TCP/IP

HTTP

JSON

REST

SSL

SQL

Git

Continuous Integration

Agile

AWS

Scalability

Testing

Virtual machines

MVC frameworks

Python

JavaScript

HTML

CSS

Linux

Package managers

File systems

Memory allocation

Garbage collection

Compilers

Logic gates

Bit shifting and bit masking

Of course none of this I learned in school, and after four years and tens of thousands of dollars, having to absorb all of this without ever having taking a class, was daunting to say the least. After a few years of being out of school and working professionally I’ve begun to do a lot of reflecting on college and all the expectations everyone had for me. I’m grateful for the skills I’ve learned but at the same I feel uneasy because it seems so wrong to send people to a Liberal Arts school, promise them a great middle-class life, and then burden them with horribly crushing debt and no prospects of a job. Of course this isn’t true for everyone that comes out of school, but for a lot of people in my generation it is that way. I don’t have a solution to this problem, but I do have a few ideas.

This desperately needs to be fixed, along with numerous other changes to our educational system

We need a way to teach people to think critically while learning the knowledge they need for jobs of today and the future. Some majors already do a pretty good job at this, but others could really improve. Now, we don’t want college to be a trade school, but we also don’t want it to be an ivory tower that kids fall out of at 22 with no idea what to do in life. If software is eating the world and robots really are taking our jobs then it stands to reason that thinking is all we have over those cold machines.

Philosophy for example can teach you one half of what you need, but paired with some pragmatic knowledge about the world, it can produce really incredible work. I think innovation is the intersection of two unrelated sets of skills and knowledge — when they come together, they produce something nobody could have ever imagined when designing a curriculum or study. I chose Philosophy and Computer Programming, but the university courses of the future could have such a multitiude of different intersecting disciplines. After all, programming isn’t for everyone! Beyond the thinking skills required for the job, you also need the personality to be able to muster it, just like any line of work. To be a developer you have to be patient, passionate, and placid. Otherwise, if you easily get angry and emotional you’ll end up like this guy: