“Hello, I am calling to ask about the process of being admitted to the UW Computer Science Masters Program,” I said to the highly skeptical admissions counselor on the other end of the line. I had just spent fours years programming full-time for a living and was hoping to add a credential to my resume to back-up my skillset.
Going back to school for an undergraduate degree to gain the supposedly necessary skills (95% which I had already learned on the job) to achieve a masters degree seemed…well…like a complete waste of time, money and energy. Why couldn’t I just skip ahead and go right to the masters since I had most of the knowledge needed, I wondered?
I was so naive.
What I was greeted with from the other end of the phone was a brief pause followed by what can only be described as derisive laughter. “We almost never accept anyone into our CS masters program who does not enter as an undergraduate, the groundwork required for the Masters is the equivalent of 15 years of work experience, only one person has ever done it.”
I can’t remember what else was said on the call but the derisive laughter continued to ring in my ears for years after I hung up the phone. I also knew, in my heart, that what this person had just told me was complete and total bullshit, though I didn’t yet understand exactly why.
Crafting A Clandestine CS Degree
So I went on the UW Computer Science program website and clicked through their curriculum. They had listed all of the courses required to achieve an undergraduate degree online and I went through the online catalog examining the required classes and writing down the textbooks being used for these. If they wouldn’t let me into their program, I reasoned, I would just reverse engineer it and enroll myself anyways.
Many of the topic areas were second nature to me, things that I did all day long at work already such as object-oriented programming. A few of the areas were clear learning gaps for me…I started taking careful notes about what those gaps were and decided I was going to fill them all as best I could without racking up $100K in debt and removing myself from the workforce for several years.
I decided I was going to craft a second-hand computer science degree from myself out of scotch-tape and silly-string.
Identifying The Gaps
Once I had a full list of all the courses…compilers, operating systems, databases, regular expressions, cryptography, programming language design, design patterns, algorithms etc, I went on Amazon and looked up all the textbooks and found used versions of each of them for 20% of the price.
Over the next 9 months I read those books every single night, underlined them, wrote in their margins, did further research online and treated them the way I would normally treat a college course. I made an effort to recognize and use the concepts in my work on a daily basis and spent time writing practice programs using these concepts.
At work I had conversations about the subject matter with my colleagues who had spent the time and energy going to school. Several members of my family have CS degrees and I talked about the subject matter with them as well. I was also greatly helped by books that were not listed on any curriculum: Gayle Laakmann’s bible on cracking programming interviews and stacks of other books such as these very excellent books on the Linux Command Line and a host of others.
College Textbooks: Mostly Fluff, Don’t Feel Intimidated
During my clandestine studies, I realized quickly that only 30% of the material in an average college textbook was actually valuable core knowledge and the other 70% (sometimes much more) was just fluff that was added every year to create an excuse to issue a new textbook. Once I came to understand this, I realized that my task could be completed in a much more efficient manner than I had previously expected.
The second part of my realization was that only 30% of each paragraph in each textbook was valuable and the rest of the text was just exposition (text setting up the delivery of those key knowledge nuggets).
If I simply extracted the 30% of the 30%, I realized, I would have a very compact set of information which I could revisit regularly and quickly memorize.
Decoding Academic Nonsense-Speak With The Help Of Cursing
My other core revelation was that much of the fancy-sounding gibberish used in the textbooks could be rewritten in a simplified format without any loss in meaning.
The same was true of complex algorithms and computer science-y equations. Given a stream of nonsensical pseudo-code, I could simply write what that code was doing from a high level and it would greatly increase the legibility and memorability of that code. This method of algorithm and code analysis greatly increased my ability to rapidly understand what was going on.
I began systematically underlining the key bits of knowledge and algorithms and re-wording them in ways that normal humans talk, often with several added explatives to show my contempt for for the author’s chosen language.
Quick Sort, explained in english: “You just divide that shit in half and move the bigger ones to the right and the smaller ones to the left. Then you do that shit over and over again until its sorted.”
Once I had learned to defang the impenetrable cloud of academic double-speak, my rate of learning greatly accelerated.
Creating A Compact Study Guide
Along the way, I extracted all the key points from all of the textbooks into a guide which I titled: “Essential Computer Science.” By the end of my studies, this guide was only about 20 pages of bullet points. That 20 page guide saved me a lot of time when it came time to practice for interviews.
I have since added new sections to this guide to provide simple algorithms for common interview questions as well as domain-specific sections for things like Objective-C, which I derived from my collection of programming books for work.
The terrible truth of the software industry is that, if you can pass the interviews, you get get a job almost anywhere. The ability to pass interviews is often completely unrelated to what you might have learned in school.
Self-Directed Learning, A Very Different Experience (And Cheaper!)
The experience of learning this way was incredibly different from my experience as an undergraduate student at UMASS: It felt really good. Concepts that I had skimmed across while viewing other people’s code were given detailed treatment and an underlying historical context for how they came about in my textbooks.
Encountering the material in this way triggered a deep sense of interest in my part and I greatly enjoyed absorbing the material and read about it from multiple different sources in a way that I never would have done if I had gone in for an undergraduate CS degree.
This scotch-tape and silly-string education I received by perusing these used college textbooks was one of the best experiences of my life.
Later, when I began to interview for more senior programming roles, the material was extremely valuable. One hiring manager even went as far as to say: “You have more knowledge of computer science than most of the people I know who have a degree and four years of experience.”
Coding Combat Training
The final piece of the puzzle to passing pro-level interviews is being able to whiteboard. I built up a workbook for myself of coding problems to practice solving on a pad with pen and paper.
While white boarding seems threatening, I found I could rapidly gain the ability to pass many such interviews by practicing for 30 minutes a day solving my practice coding problems with a paper pad. After 3-4 days of casual training, I realized my brain could get up to speed much faster than I had expected.
After several years in the industry it became obvious to me that programming was not my true calling, but having gained this experience set me up to achieve jobs which I could never have remotely considered ever before. I am never going to be the best programmer in the world, but I will always value the experience and learning.
The other thing I learned: Never trust the gatekeepers. If you are motivated, you can sometimes find a faster, cheaper, more efficient path than shelling out hundreds of thousands of dollars and years of your life when you don’t really need to do so. Or if you find yourself well down a track that isn’t optimal for you, you can jump to a new track provided you put in the effort, thanks to the internet.
I never did get around to bothering trying to get that masters degree, it doesn’t seem to have held me back.
Summary of Key Points
- 70% of college textbooks are fluff added to have a reason to sell new books every year
- 30% of the core material in college textbooks is really required
- 30% of that material can be extracted into bullet points, the rest is exposition
- You can reverse engineer computer science degrees by combing through university websites and examining the requirement
- Most college textbooks are available in used form for a fraction of their actual price, last year’s books are just as good as this year’s books yet much cheaper
- Rewrite algorithms and core concepts in simple language with lots of swears to make them easier to understand and remember
- Be skeptical if anyone ever tells you that you need a degree to do anything
- Keep a collection of coding problems, it only takes (me) 30 minutes of practice with a pen and paper per day for a week to get my brain used to the process of white boarding. Not so bad.