I have been a working in the software field for over 14 years now. I started as a Windows sysadmin, then Linux sysadmin, and for the last 6 years I have been a full-time software engineer.
I came upon the excellent Teach Yourself CS and quickly identified myself as a "Type 2" engineer. I have been very good at teaching myself enough to progress to the next technical level in the software industry but done a lousy job at mastering the fundamentals. I first taught myself Linux. Next I mastered Python. Then it was Ruby. I most recently got a basic understanding of functors, applicatives, and monads after working through LearnYouAHaskell. However, I know what big O notation is but cannot do it. I understand binary but don't ask me to do any bit twiddling. I haven't the foggiest how queuing theory works or even how to implement quicksort.
The odd thing is that I actually have a degree in computer science. I discovered programming mid-way through my junior year in university. It was immediately obvious that computer science would be far more rewarding both emotionally and financially than my then major in economics. Unfortunately, it did not go smoothly. I took all the courses I could possibly take concurrently in order to graduate before I ran out of money. I was a solid B student but earned a number of Cs. One of my professors discouraged me from staying in the major.
Once I finally graduated, I struggled to hold a job programming. I just couldn't still at a desk for 8 hours a day or even concentrate on programming problems for that length of time. I was diagnosed with ADHD as a young child but my parents chose not medicate me as I never had any (big) problems in school. However, it was a big problem for my job as a programmer. One year of university, I decided to pursue another passion of mine, travel. I took a job with the U.S. Foreign Service as a Window System Administrator. The job took me Tel Aviv, Hong Kong, and finally Kathmandu. The work wasn't terrifically interesting but the lifestyle was awesome. After five years in the service I found myself managing the IT operations for the US Embassy in Kathmandu. I had a team of 15 people under me and a sizable annual budget.
Meanwhile, my bookshelf continued to swell with large books that I would start but never complete. Ray Kurzweil's Age of Spiritual Machines, The Singularity is Near, the Selfish Gene, The Black Swan, Elementary Game Theory, you get the picture. I was tired of starting books but rarely finishing them. It was time for a change. I decided to treat my ADHD and I started taking Ritalin. My world turned upside down. My reading speed went from 10 pages an hour to 30-40. I read voraciously and could spend all day doing it. I got into Linux and spent a weekend configuring wifi on my linux laptop. I read Dive into Python and dove in. I read K&R and failed to understand pointers but loved trying. Fuck my managerial career, I wanted to code all day. So I quit my stable, well-paid job in the U.S. Foreign Service and got a job as a Linux System Administrator. As a sysadmin I wrote 1000s of lines of Ruby code to automate my employers deployments. That work led to a position as a software engineer.
I now work remotely as a software engineer for an awesome company. I am well compensated for my work. That's not a stopping point. I love computers and I love programming and I am sick of nibbling at the edges. To that end, I am embarking on reading all the books recommended by Teach Yourself CS and placing my problem solutions in this repository.
Here is my adapted list of books and my current status on each. I have added a few entries because I had committed myself to reading them before discovering Teach Yourself CS. Most notably, there is haskell book at the front of the list that I read immediately prior to discovering the Teach Yourself CS website.
Book | Status | Exercises Completed | Date Finished |
---|---|---|---|
LearnYouAHaskell | DONE | No | 15 Feb 2017 |
~~ Real World Haskell~~ | STOPPED at ch 6 | ||
Nand2Tetris | |||
Computer Science from the Bottum Up | |||
Algorithm Design Manual | |||
Mathematics for CS | |||
How to Solve It | |||
Operating Systems, 3 easy pieces | |||
Computer Networking, Top Down Approach | |||
Dragon Book | |||
Distributed Systems |
note: I have stopped reading Real World Haskell due to increasing frustration with how the material was presented. I have added HaskellBook in its place on the "Fun" list.
note1: I have added Computer Science from the Bottum Up as it is a nice hands-on tutorial writing low-level C programs on Linux.
To be frank, this process is more than a little daunting. I have two small children and my wife has a demanding career of her own. This might take me five years.
Project | Status | Exercises Completed | Date Finished |
---|---|---|---|
BuildYourOwnTextEditor | Started | No | |
Haskell Book |
When and wherever possible I will do all work in Emacs.
Bryan W. Berry March 15, 2017