A thought occurred to me a while ago, and I thought I’d write it up:
Some languages are better at others for Really Big Systems, those with hundreds, or perhaps even thousands of people who work on them. They allow people to divy up work without stepping on one anothers’ toes. Other languages are great for writing quick little hacks or small, one-off programs to just get something done. Generally, people talk about the former as ‘scaling well’, but there’s an important point missing there: for most people, what really counts is not the absolute upper limit, but the range of problems a language can handle. To haul out the poor, bedraggled transportation example once again, some things, like Boeing 747’s, are pretty good if you have to fly halfway around the world. They’re not so good if you need to pop out to the grocery store for milk. Bicycles are a great way of getting around the congested streets of the Italian town I live in, but a little less useful once you start talking about distances upwards of 10 km. Cars, on the other hand, are popular because they’re pretty good at a lot of things. It might be a lot slower than flying, but you could drive from Oregon to Maine if you needed to. A car might not be quite as convenient as a bike or scooter in downtown Padova, but you can still use it. So the car, while ultimately being inferior to the 747 in terms of its upper range, is way more flexible. I think the same thing generally holds true for languages. Java is seen as being good for big, ‘enterprisey’ sorts of things… and it probably is – it has a lot of mechanisms to keep people from getting in one another’s ways. On the other hand, writing a quick sysadmin program in Java is, at least for me, not all that fun compared to a language like Tcl or Ruby. Tcl is more or less in the opposite corner. Sure, if you know what you’re doing, you can write massive programs with it, but it’s probably not its sweet spot. Currently, I’m pretty happy with where Ruby is: it lets me do the simple stuff quickly and easily, and has decent mechanisms for growing and organizing a codebase, although of course you have to be careful with things like reopening classes (“monkeypatching”) lest they interfere with the work of others.