It’s that time of year when classes are finally over, the last exam has been taken and it’s time to do things which aren’t at all related to school and schoolwork. Last summer I stayed on campus working on a bunch of interesting projects and learning about programming languages (parsers in particular). This year I’m off to Virginia Tech to work with Dr. Barbara Ryder’s software engineering group. I’ll be working on performance analysis of large framework based Java programs such as Eclipse and IBM’s WebSphere. I’m not exactly sure what my work will be, but it seems like I’ll be having to a fair amount of data gathering (by running said applications in different configurations) and then playing with the data I get. I also hope to learn a ton of useful things from Dr. Ryder and the other people working with her and get a feel for what research at a large university might be like.
My primary interest is still programming languages (it’s been that way for the better part of a year now) and I’m definitely interested in learning more about them, in particular about compiler backends. Last winter I implemented a tiny domain specific language for experimenting with pattern generation via context free grammars. One thing that I’ve been thinking about is extending this language of mine (which doesn’t quite have a name yet) . I have a few ideas of what sort of things I’d like to see it do, but I want to put those ideas down in a concrete form before I start messing with the code. My software engineering class last semester has quite firmly taught me the value of doing at least some amount of planning and design before starting a programming project.
Thanks to my Digital Circuits class I’ve been exposed to some really low-level assembler and C code. We’ve been programming really down to the metal on microprocessors and it’s been a useful experience. Programming low-level systems software is very different from building a programming language, but that’s something for another blog post. I’d really like to do something useful on a small embedded microprocessor (or similar) but I don’t have enough experience in the area to come up with an interesting, feasible project all on my own. Writing my own embedded operating system would surely be an interesting project (not to mention some serious geek street cred) but I’m not sure if I’m up to something like that just yet.
All that being said, I still have my copy of Structure and Implementation of Computer Programs sitting around, only about half -read. I’ve always harbored a special fascination regarding Lisp and its derivatives and I’m starting to feel guilty that I still haven’t done much more than dabble in it. At the beginning of the year, I really wanted learn low-level C and high level Lisp in parallel, but due to a number of reasons it didn’t work out that way. I learned a fair amount of C and a somewhat larger amount of C++ (and C/C++ is a very misleading term), but barely touched Lisp at all.
Looking back at the few months since the beginning of the year, I’ve learned two very important life lessons:
- Having some sort of plan is essential to getting the most out of your time (and consequently, your life)
- Having too little on your plate leads to boredom, but having too much leads to burnout.
Since I really do want to get the most out of the summer (and the rest of the year) I think it’s important to have a plan that is based on a proper selection of activities and a clear division of my time and energy between them. Luckily for me, my summer is already clearly broken into two phases: I’m spending about two months at Virginia Tech and then almost a month back at Lafayette. Right now, the best way for me to take advantage of that fact would be to work on different things at the two places. At Viriginia Tech, my main focus will be my work with Dr. Ryder’s group, but I think that as a second project my programming languages experiment would be a good fit. The group I’ll be working with seems to have done previous programming language-related work in the past, so I might find myself in the company of some good brains to pick if problems crop up (which inevitably they will).
Once I’m back at Lafayette, I think it’ll be time to buckle down and finally learn some real Lisp. However, I might not want to just look at nested parentheses all day long, so a schedule of C in the morning and Lisp in the evening might turn out to be the best solution. C and Lisp are at two opposite ends of the philosophy (and implementation) of programming languages and programming philosophy, but I feel that both has it’s place and I do really like them both.
Summer is a good time to let your hair down after the hectic semester, but it’s also a great way to spend time learning stuff that isn’t really taught in class. I had a great experience last year and I’m looking forward to having a similarly fulfilling experience this year as well. By the end I’d like to have a functioning little language of my own (which I hope to write more about) as well as have some solid Lisp and C experience under my belt. I won’t put a definite tag on what I expect out of my Virginia Tech experience, because I would like to keep an open mind and maybe just go with the flow, but I will do my best to make it a worthwhile experience. And of course, I will be blogging about as much of it was I can so that everyone else out there can perhaps learn some of what I am learning.
I’m glad it’s finally summer!!