Twitter on ScalaRuby on Rails wasn't up to the task on the back end processing, so the twitter dev team is switching to scala. Scala is a language, like closure, that compiles to java bytecodes. Concurrency and performance seem to have been a big part of their decision.
I find it fascinating that there are two truisms at work in software development projects that require performance.
Premature Optimization
As developers, this one has been pounded into our heads over and over again. Spending the time to optimize something prematurely is wasted effort. The better approach by far is to get working code and see what needs to be optimized and spend the time and effort on that optimization. Often times even someone who knows the intimate innards of the code base will guess wrongly about the bottlenecks before profiling.
Glass Ceiling
The second and less talked about problem is what happened to the twitter folks. They had a perfectly workable system, but one which could not scale. At some point they came to the conclusion that there was no way to further optimize the existing code base. They needed to scrap parts of the existing code base and rewrite them in another language.
Concurrency, the monkey wrench
Concurrency is a feature that can be very, very difficult to add once you've gotten to the "working" stage if you didn't think about it at the beginning. Depending on the problem domain, it can still be possibly to swap out the hot spots and rewrite them in a fashion that is more amenable to concurrency. Yet, I am amazed at how often I read articles like this where the developers felt like it was more work to do that then to simply rewrite the entire thing with concurrency in mind.
I'm afraid because we are so bad at guessing where the bottlenecks in our code is going to be, that guessing where we will need concurrency may also be difficult. Some problem domains are not so difficult or the code bases are structured in such a way that it's much easier to swap out parts.
The lesson here to me is that when writing code, it makes a lot of sense to use high level languages to prototype functionality. But, it is critically important to structure that code in such a way that portions can be rewritten later in an environment that can take advantage of concurrency without having to scrap the entire ball of wax.
This begs the question, are blended or multi-language environments the wave of the future?