One of the central features of the hacker mindset is that we thirst for novelity. Whether it’s the latest new operating system, programming language, framework or platform, we hackers are instinctively drawn to explore the great unknowns, to boldly go where no one has gone before. Without this quest to find something new Linus Torvalds wouldn’t have gotten eager volunteers to hack on his hobby operating system, the dot-com boom of the 90s would never have happened and we might still be using computers with 2Mhz processors and 64KB of RAM.
However while this inquisitiveness drives industry and innovation, it can be somewhat damaging for the lone hacker, especially for someone who is still very much in training (like myself). There’s so much to do out there, so many shiny toys to play with, it’s hard to make up your mind about which ones to try out. It’s very tempting to just go about trying one thing after another. Unfortunately, if you’re looking to be an ace coder at any point in the not-so-distant future, you’re going to have to reign in your passion and curiosity, sit down and make some choices. Case in point: me.
Ever since I’ve been coding seriously (about three years now) I’ve been writing code for memory managed environments: first Java, now Python. Memory management does have it’s advantages: you can focus on the higher level algorithms and data structures and let the environment take care of the details. I have a limited idea of pointers and manual memory management and I’m sure that a lot of the code I’ve written would have been rather more tedious to write in an unmanaged setting. However, at this point I do feel somewhat spoilt by having all this work done for me. Also I did flirt with assembly language a while ago and I’ve always had a love for working close to the metal: actually understanding and controlling what the machine did as it processed my instructions. All these things being combined, I’ve been developing a thirst to do something low-level and actually taking the time to learn to write C and C++. Luckily for me I’m having a software engineering course in C++ and a computer organization course next semsester which will give me ample opportunity for low-level programming. But with 3 weeks still to go before my courses start, I was tempted to start learning some C on my own. And I would have if it weren’t for my other great current interest: Lisp.
Lisp is more than a wonderful language: it’s a whole new way of thinking. It’s functional style combined with macros make it powerful tool for a wide variety of problems. Moreover, the Scheme dialect is great tool for learning basic algorithms and computer science concepts. I’ve been in contact with Scheme for more than a year, but I’ve hadn’t the time to actually sit down and learn it properly. I’ve also been hoping to go through and actually finish Structure and Implementation of Computer Programs. The next few weeks with nothing much to do seemed like a great time to buckle down, learn some Lisp and rehash some fundamentals. Unfortunately, it won’t be easy doing that and learning C/C++ at the same time.
Therein lies the hacker’s dilemma: you have two amazing problems (learning C or learning Lisp) both of which promise endless hours of intellectual enjoyment. It would be great if I could do both, but I’m only human and if I do both, I won’t be very good at either. For me it’s just the question of learning a new language for my own benefit, but in many cases it can be more important: choosing a framework for your webapp, a platform to develop for, different ways to organize your project and your team. Staying stuck in this dilemma for too long isn’t productive at all. My courseload for my first semester at college was pretty light, and I wanted to do some serious programming in all my free time. Unfortunately I faced the same choice: between Lisp and Assembly. I never came to a clean decision and as a result most of my first semester was wasted. In my last semester I had a choice between studying programming languages and parallel computing. Since I would actually be doing a course, I had to make a choice and had quite a fruitful semester learning about programming languages.
Now it’s time for a choice as well. I really don’t want to waste the next three weeks not doing anything substantial. I’ll be learning C/C++ next semester anyway and I already know enough that the first few weeks shouldn’t be too hard. Keeping that in mind I’ve decided that I’m going to put C/C++ on the shelf for the time being and focus on Lisp and finishing SICP. Once the semester starts, I’ll have to reevaluate and probably devote more time to C++ keeping Lisp for the weekends. There are some more choices I’ll have to make soon: focusing full time on my current research or exploring Scala and Hadoop, but for the time being, I’m not thinking about it. But one thing is certain: I’ll only become an expert programmer if I can balance my curiousity and passion with a healthy dose of realism and focus. I have passion and enthusiasm (I think) but the focus could use some work. One more thing on the list for this year.