A Man With A Plan
June 3rd, 2008
One of the first things I did when I decided to undertake this project was to ask the programming subreddit for help. There were many helpful suggestions thrown my way, and I tried to do my best to make sense of them all.
The most recommended, if the most controversial, was to read Structure and Interpretation of Computer Programs [US] [CAN]. This book, known as SICP, is the publicly available textbook for a (former) introductory MIT course of the same name. Another popular choice was Introduction to Algorithms [US] [CAN]. In his post, “Get That Job At Google,” Steve Yegge recommends that the best “long-term warm-up” you can have before interviewing at Google is a good review of data structures and algorithms. His initial recommendation of a good book for this purpose is The Algorithm Design Manual [US] [CAN], but later states that “if you want to come into your interviews prepped,” then you really should be reading Introduction to Algorithms.
Since I’m trying to put an honest effort into getting the best “do it yourself” education I can, I’ve chosen to take these recommendations to heart. I’m expecting the delivery of these two books from Amazon within the next 48 hours.
Before explaining my other long term goals for this project, I want to note a certain fear I have with this project. That fear is summed up for me with just one word: Math.
When I was a kid, I used to absolutely love math. Math, as it turned out, loved me right back. Up until the 9th grade, I never had an issue with math; it all seemed to come so naturally. In fact, math could be downright boring. My first 9th grade math teacher, Andrea Loken, recognized this boredom immediately and rectified the situation. Within a week of starting the class, she came to me with an offer to move me into the advanced math class. My ego decided this was quite acceptable.
In the advanced class, I found that my usual “sit back and let the math happen” approach simply didn’t work. High school in general wasn’t the best time of my life, so I refuse to blame this class for my math issues later on. My issues largely were to do with laziness in the 10th and 11th grade which created a weak foundation of math knowledge that I’ve never recovered from. As a result, I’m not actually sure what the building blocks are to get me to where I want to be in terms of math know-how. My concern is that I’ll be reading along in one of my ‘teach yourself’ computer books and some math skill I really should know will pop up… and I won’t know it.
My solution to this is to turn to the only math book I have at my tangible disposal, my college textbook: Mathematics for College Technology [US] [CA]. My original plan was to take a couple of weeks and skim through the text, cover to cover, and to properly study whichever topics pop up as required knowledge.
After thinking about it in a little more depth, I think I’ll probably end up just diving right into the computer books while concurrently reviewing the math text.
Beyond math revision, SICP, and Intro to Algorithms, my plan becomes a little less focused. I have a short list of concepts with which I intend to become familiar:
- Database design & development. Normalization of data, when to denormalize, locking issues, stored procedures. So much to know, so little time!
- Version Control, both centralized and distributed. Not only do I want to understand the functional differences between the types, but I’m also very interested in how these tools are properly used – especially in a team environment.
- Programming languages. What are the differences and relative strengths/weaknesses of programming languages which are functional, object-oriented, imperative, declarative, statically typed, weakly typed… the list goes ever onward. By the end of this, I’m hoping that the concept of “the right tool for the job” will become a little clearer to me than it is now.
- Debugging techniques. What’s the “right way” to go about finding issues when they inevitably appear?
- Testing. Methodologies, technologies, ensuring the best quality I can.
- Low level knowledge. How does a computer actually work? What’s the operating system actually doing behind the scenes? How do I optimize my code when, and if, it really matters?
- Personal skills. This one isn’t strictly about software, but how can I build teams that work? How can I communicate effectively? How do I trick a user into telling me what they really want?
- Additional math. Once I’m back up to where I think I should be, I’m going to continue onward – learning what I can about probability/statistics and discrete math.
As I stated earlier, I ordered a number of books a few nights ago. I’m publishing the list below for “internet peer review.” A complete list, as it forms itself over the months and years to come, will eventually be posted in a more appropriate place.
- Structure and Interpretation of Computer Programs, Second Edition [US] [CAN]
- Introduction to Algorithms, Second Edition [US] [CAN]
- Design Patterns: Elements of Reusable Object-Oriented Software [US] [CAN]
- The Pragmatic Programmer: From Journeyman to Master [US] [CAN]
- Code Complete, Second Edition [US] [CAN]
- Refactoring: Improving the Design of Existing Code [US] [CAN]
- Software Estimation: Demystifying the Black Art [US] [CAN]
- Peopleware: Productive Projects and Teams [US] [CAN]
I’ll admit that I’m probably already getting a little bit off target. I’m betting on the assumption that when you don’t know what you don’t know, it’s probably a decent first step to expose yourself to a lot of things and sort of feel your way out with the help of your friends.
I’m turning to you now, Internet Community. If you see any topics for which I’m desperately lacking, if you have any suggestions on further reading, or if you just want to let it be known that I’m “Doing It Wrong,” then by all means let me know.
June 3rd, 2008 at 3:35 am
try http://www.amazon.com/Concrete-Mathematics-Foundation-Computer-Science/dp/0201558025
June 3rd, 2008 at 4:38 am
I don’t mean to discourage you at all, but Intro to Algorithms does assume basic calculus for most of the proofs. I’m not sure about SICP, but I’d guess it probably does, too.
June 5th, 2008 at 5:02 pm
Hey Jesse,
I’m in a very similar situation and applaud you for blogging about it. I’ve subscribed and look forward to future posts!
I would recommend these resources:
http://programminggroundup.blogspot.com/
http://www.swc.scipy.org/index.html
http://htdp.org
I also recommend reading Code by Charles Petzold. It really helped me wrap my head around how computers actually work.
July 9th, 2008 at 2:48 am
Hello Jesse,
I just came across a book that looks like it would be a good edition to your reading list:
“Introduction to Computer Theory” by Daniel I. A. Cohen
http://www.amazon.com/gp/product/0471137723
While Amazon is charging way too much for it, the book sellers have some pretty good deals on new copies.
This book looks great because it starts from scratch and builds up all the formalisms/math needed from a basis of zero knowledge. That’s why I thought it worth buying and figured you’d be interested as well.