In the last 6 months I have at least to some learned the following:
- Objective-C (including a working knowledge of XCode)
- Struts (though I was introduced to it last summer)
- the iPhone SDK
- the Facebook API
- Enough javascript to start using Greasemonkey to increase productivity
and yet I feel like I am slipping in terms of the amount of fundamental things I know about the general space I’m working in. I don’t know if that’s just the natural tendency of the specific to crowd out the general over time, or that I’m only now becoming aware of some of the more technically oriented things that I maybe should have paid attention to in school instead of whatever I was doing.
Here is a list of most of the things I feel I ought to be able to talk intelligently about that I really can’t:
- Compilers
- How the JVM works
- Data Structures - especially tree structures (I honestly can’t tell you what red/black trees do)
- Graph theory/algorithms
- Probability theory
- Design Patterns beyond singletons
- Functional programming (this is particularly discouraging since when we learned some Scheme way back in Junior year I remember taking to it really easily)
Honestly, I’m a little overwhelmed looking at that list, and one of the few things that helps is the realization that there’s not a deadline, other than a realization that for some of these (Data structures, especially) I’m just not doing my job as well as I could, so if over the next 5 years I knock out most of these I’ll still be ok, and probably be ahead of the curve at most places. So in the grand tradition of lists here’s a list of some of the things that I’m going to force myself to do.
- Study the Dragon Book.
- Write a significant project in Ruby (for now I think that means developing a Scrabble simulator with Dylan and my sister)
- Find a good data structures book and study it. (The Algorithm Design Manual, by Steven Skiena?)
- Work through The Little Schemer
- Read Refactoring
None of those get me closer to understanding the JVM. I’m not sure if I’ll be any better at probability theory or graph theory, but I’m fairly certain the preceding list will take a while (12-18 months or more). There is an implicit assumption that during this time I will be working full time programming, which is why the list is so heavy on reading and less about doing stuff like writing compilers. I’m not sure how my brain would handle writing Java, XML, SQL and God knows what else at work and then coming home to try to write a recursive-descent parser for common lisp in Ruby or whatever.
If you’re a programmer (and lets face it of the 6 people who are reading this at my site and not on facebook, 5 of you are and work in places that generate Billions of dollars from applied Computer Science), I’m interested in your opinion on these things, as well as where you’re strong/weak. Two of the things that I didn’t mention because I think I’m fairly strong in that I believe are absolutely necessary to be an effective Computer Scientist/Software Engineer are regular expressions and a firm understanding of networking/networking protocols.





