Programming as a hobby

April 27, 2007

I enjoy programming quite a bit, but seeing as I currently work in consulting, I don’t always get to program at work. However, it’s important to me to stay sharp with these skills, and this means programming as a hobby.

But how the heck do you program as a hobby? Unless you have a specific project you want to work on or a specific problem you’re trying to tackle, programming doesn’t have much of a use. As I see it, you’ve got 2 options: think of a project you want to work on or check out the sites I’m going to tell you about.

The sites I’m talking about are Codegolf and RubyQuiz. Both sites are great and both have contributed to my learning ruby over the past 8 or so months. Each site takes a slight different approach.

Codegolf is more of a competition. As the name references, the goal here is the solve a given programming problem with the absolute least amount of characters possible. This leads to crazy, hard to read, but interesting solutions. However, there’s a catch here: you can not view other’s solutions. You can discuss them on the forums, but as of right now all submissions are closed. On the up side, this does mean all challenges are always open. Forcing yourself to be concise leads to learning a lot about a language very quickly, as well. You can submit solutions in Php, Ruby, Python and Perl.

Rubyquiz, on the other hand, is what I would think of as a collaborative learning community. Each and every Friday a new “quiz” is posted to the website as well as the Ruby mailing list. Everyone has 48 hours to come up with a solution (this is a no spoiler period, don’t spoil it!) and then solutions are posted on the ruby mailing list. The following Thursday, the site’s author writes a summary of the solutions and discusses the best approaches. Best of all, the solutions are available for downloading. This site has exponentially improved my code.

Hope you enjoy these two sites, and happy coding!

I find the topics of Artificial Intelligence and Machine Learning extremely intriguing. In fact, one of the reasons I decided to study Computer Science was my perception of these concepts. I viewed them as extremely complex and equally difficult to implement.

Well, this isn’t always the case. In fact, I’ll show you an easy way to add some AI to your applications using an example. Let’s look at a snipet of code from my rubyquiz submission this week. Now, please, don’t think that I have delusions of grandeur and believe this to be an actual example of true AI, but think of this as barely scratching the surface to simply introduce how to think about adding some type of intelligent behavior to your application.

Anyway, this week’s quiz focused on getting a bit of Morse code from the user and then presenting all the possible translations of the code. I decided to add a nifty little feature that would make a “best guess” at which of the many possible translations was the true intent of the sender. How did I do it? Simply put: word frequency.

Sounds scary, but it’s not. My program read through a text document of a Sherlock Holmes novel, counted the number of times each word appeared and then stored these word -> frequency pairs in a hash. Then, when presenting my possible translations to the user, I simply showed the words with the highest occurrence in the Holmes novel first.

This clever (and simple, I don’t flatter myself) trick gives my program a bit of intelligence. In fact, this is a very simple example of a Bayesian filter (check wikipedia for more info). I’ll post the “intelligent” code snipet below. And just think; if I can do something like this, so can you. And probably something way cooler.

My code

From time to time, people talk about how dynamic languages aren’t suitable for “real” problems as they are quite a bit slower than static, compiled languages. However, I believe that the combination of dynamic languages’ expressiveness and speed more than make up for the lack of pure speed when compare to static languages. And guess what? Dynamic languages aren’t as slow as you think.

I ran across a perfect example today while reading the ruby mailing list. This post describes the implementation of a spelling correcter (much like the one wordpress is using now as a type this blog). Essentially, this application is given a word and then attempts to verify the correctness of it’s spelling. If the word is spelled incorrectly, it gives back suggestions for the word the user was trying to type. This type of technology is used by Google, among others. This problem seems to be quite daunting and, if one would attempt to solve it, it seems like the use of a static language for pure speed would be needed here. The truth is that this is not the case. Some folks who are much more clever than I am were able to write a 21 line Python script and a similarly sized Ruby script to accomplish this task. And they are fast (the Python script was able to process 10 lines per second, and the darn thing is not optimized at all).

Reading these solutions, I was struck with how completely expressive these languages truly are. Take a look at the post and I’m sure you’ll see what I mean. Reading solutions like this – programmed by obviously brilliant people in these two languages – lead me to believe that dynamic OO languages are the wave of the future.