Technology density

I lost my left contact density a few days ago. By the time I found it (sticking to the wall) it had dried up and deformed. As the days go by, we’re packing more and more technology into smaller and smaller spaces. In particular, the current slew of smartphones is taking technological density to all new levels. The newest phones like the iPhone 4 and the Nexus S contain as much computing power as my first desktop back in 2001 and the software running on them does much more interesting things than what I run on my first machines.

This great density has a number of interesting side effects, not all of which are acceptable to all people. For example, one consequence of packing so much power into a tiny package is that doing home repairs (or even changing the batteries) is not for the faint of heart and requires special tools and trailing. This makes a lot of people uncomfortable and for good reason. If you’re paying good money for a product, you want it to be under your control as much as possible (including being able to make repairs). Losing that ability and having to trust someone else with your computing experience should make you uncomfortable and think twice about what you’re paying for.

However thanks to increasing density we have the power of mobile. We are literally carrying networked supercomputers in our pockets which in turn opens up a whole new world of possibilities. Things like augmented reality, real-time translation and even more mundane things like just being able to get email and look up information whenever wherever are all very exciting and people are coming up with great applications every day. If there is one thing we can learn from the march of computer technology, it’s that people will apply and extend their technology in novel and imaginative ways. I think we’re only just at the beginning of seeing computer technology finally becoming ubiquitous and seamless.

We’re living in exciting times and of course there are challenges. Net neutrality, locked down platforms, a variety of competing devices, vendors and standards are all major issues that will continue to be around for a while to come. But in the long term, I think we’ll see these problems be addressed. The solutions won’t be perfect, but they will be enough to form a basis and foundation for the next generation of revolutionary technology. What will that next generation be? I have no idea (though I think biology will play a role).

So what happens between now and then? The same thing that’s happening right now. Our phones will keep getting smarter and companies like Google and Apple will continue pushing consumer technology to new limits. And as that incredibly dense technology gets pushed to millions of users, it will support a growing ecosystem of smaller applications doing really interesting things and bridging the gap between the virtual and physical worlds. We can see this trend in apps like Instagram, Four Square and a number of augmented reality and translation apps. And I think the best is yet to come.

Language paralysis

It’s winter break which means that I have a good amount of free time on my hands. Though I’m all in favor of sitting around and doing nothing, I do get bored after a few days of that and tend to look for something to keep my mind occupied. I decided that this time I would sit down and learn a new programming language, something I’ve been wanting to do for a while. But the thing is I can’t make up my mind as to which one.

I’ve considered learning one of three languages, each of which is a powerful yet somewhat quirky and niche language. My choices are Common Lisp, Scheme or Haskell. Common Lisp and Scheme are both Lisp dialects, but with different purposes and hence a different feel. From what I’ve learned Common Lisp is a full-fledged industrial strength, general purpose programming language while Scheme has a thriving research community surrounding it and is a great test-bed for implementing programming-language related ideas. Both share Lisp’s defining characteristics such as powerful dynamism and macro facilities. Both are inherently functional languages but are also capable of playing host to other programming paradigms (Common Lisp in particular with its Common Lisp Object System).

Haskell on the other hand is quickly becoming one of the most powerful programming languages on the planet and may be coming close to threatening Lisp’s throne. It’s a purely functional programming language with an increasingly powerful and capable type-system. It’s an excellent tool for language and type-system related research thanks to great parsing facilities and it seems to me that Haskell is at the forefront of computer science research today. Haskell doesn’t have a macro system, but I’ve never heard that be an issue.

All my choices are powerful languages with strong communities, but I simply can’t make up my mind as to which one to learn. I admire all of them and can see the strengths of each, but neither one is really compelling enough for me to sit down and decide to learn it. It’s time to explore some of the reasons behind my current paralysis and see if I can figure out a solution.

Looking back on my history of learning programming languages all the ones I’ve learned to any depth have been motivated by external cause. I learned Java because it was used in my basic CS courses. I learned C++ because I used it in my software engineering class. I learned C for operating systems and digital circuits courses. I learned Python because we use it for most of our research code at school (and it’s become the language I’m most familiar with). I’ve also picked up some JavaScript because I wanted to use it to give some dynamism to my website.

Unfortunately I don’t have similar motivations to help me make my current decisions. My current research is being done in Ruby because of it’s flexible object system. I have some ideas for a side project to pursue next semester but it’s not likely to be something requiring Lisp or Haskell’s particular talents. I’m not going to be doing any research into languages or type systems until the summer at least (and maybe not until later this year). As of this moment, I have zero external motivation to pick and learn any of these languages.

The thing is I really do want to learn one (and eventually all) of these languages. I think it’s a good idea for programmers to be continually learning new languages and expanding the ways in which we can think of our problems. However, I’m coming to realize that simply sitting down and going through a tutorial isn’t enough, at least not for me. I need an actual problem that I intend to solve in the given language. It doesn’t have to be anything fancy, but it should be something that gives me a well-rounded view of the language and it’s capabilities (especially when the language is Lisp or Haskell).

I consider myself a language buff. But it’s one thing to say that I’m interested and read about them and another to sit down, learn them and write code in them. Right now, I’m very interested in learning about Common Lisp, Scheme and Haskell and read both blogs and papers about them. But I can’t take that interest and use it to bridge the gap to learning and using them. Motivation has always been a bit of a problem for me and I’m rather annoyed that it’s preventing me from learning what I want to.

Since I still have about two and a half weeks of vacation left I’m going to give some serious thought as to what sort of programs I want to write in the near future and how I can choose the language that is most beneficial along those lines. At this point I’m open to suggestions for Lisp/Haskell projects that would be interesting as well as hearing about how other people motivate themselves to learn languages that they aren’t actively using.