Tuesday, February 10, 2009

Switching Development Methods... Again

By design or accident, I often find myself switching development environments (Microsoft Visual Studio to Eclipse to g++/make) or languages (Java to C++ to Ruby to Objective-C) when I start to get good at one of them. Originally, I began as a C++ programmer in high school, and then was moved over to Java with BlueJ in high school. I later moved to RealJ and then to JCreator LE during the course of school when I started developing using LWJGL. My freshman year in college, we moved to the "next great thing," Eclipse. Luckily, I managed to skip out on using BlueJ again. BlueJ had been a good beginner tool because it hid the unique details of how Java programs run, but it also keeps you in a very limited box.

Sophomore year, I was thrown back into C++ with templates in a data structures class. I got up to speed on C++ as fast as I could by doing a lot of examples, and playing around with as many language structures as I came across. Still, I remember the disbelief of another student who, late in the semester during a pair programming lab, didn't realize there was a delete keyword in C++, and that garbage collection didn't exist. So much for college teaching you the languages you need to learn.

My classes stayed in C++ until a Junior class in Operating Systems, were my classmates and I got to work on implementing features in the Pintos operating system. Did I mention none of us knew any real (pure) C? Of course, C is similar to C++, but there are those gotchas in many similar languages, such as void pointers. I did ok, K & R helped a whole lot, but I still don't feel attached to any language.

It was during the Operating System class that I quit using Windows entirely and switched to Debian Linux/Gnome. The change wasn't related to the class I was taking, but rather being genuinely disgruntled about paying for an operating system that crashed, was susceptible to viruses, and had an aura of a trash can which hasn't been emptied for several months.

Switching to Linux had to be the best thing I've done for my programming ability. I experimented with Bash scripts, and I started learning Perl during the summer by coding every example in the Llama book and pursuing my own projects. This was my first introduction to scripting languages.

Over the summer, my job had me writing in a variety of new languages, without any introduction. JavaScript, PHP, and Ruby rounded out the list, my formal experience before these assignments being merely that I had heard these languages existed. "Here's a book and a few good websites... go do this project," were my instructions, and I did as asked. They weren't critical projects to the team, but rather additional "it would be nice" projects that the team would never get to. This was also where I was introduced to QtRuby, and had a very hard time adapting to the duck-typing of Ruby.

It was at this company where I began my learning of the many in-depth features of Vim. Vim takes the concept of manipulating text and turns it into a super-ability. I've gotten better with it since, but the people I worked with moved like bolts of lightning in Vim.

I reverted back to Java last semester during my Graphics/GUI programming course. After all that C/C++ code, coding Java is about as simple as microwaving a frozen dinner. Combined with my Vim experience, my productivity grew several fold, and I finished the projects more quickly than I ever could have using another IDE. I returned to Swing development from way in high school, and JOGL... another Java binding for OpenGL, except designed for Swing, unlike LWJGL.

Over Christmas break, I applied my Qt knowledge to develop a bunch in Qt with C++ and work in OpenGL as well. I worked a lot in QtRuby, and the recent projects such as the color wheel have been as a result of this. I played with Python for a little while, and tried to decide whether to pursue it or Ruby, and ended up deciding on Ruby, since I kept writing Rubish Python.

Unfortunately, I've now moved over to iPhone development for a school project. This means using a Mac/XCode/Objective-C. This feels exactly like the "Here's some resources go do the job" from before, but by this time I'm getting used to it. Languages and development environments are starting to feel interchangeable. I don't have a lot of attachment to any language, except to Ruby because of a lot of the unique language constructs it offers over C++. I guess "real world" programming requires you to do whatever it takes to get the job done, but it also makes all languages emotionally neutral.

Part of me wishes for the old days of Java development where picking the language for the job was easy, because there was only one that you knew. However, another part wishes I knew more in-depth of each of the languages, and that I'm afraid of hurting myself through not knowing any language really well (though I am very proficient in Java, C++, and Ruby). Languages have become merely notations for doing something, pawns to get a computer to accomplish whatever you wish.

My journey is not yet complete. I want to explore more into Haskell (I played with Erlang a few months ago), Lisp, SQL, and Smalltalk to see more of the world of programming, but sort of want some language to call home.

No comments:

Post a Comment