what will be the dominant tool for the next ten years?
There's a lot happening in programming languages in 2013. I believe we are approaching an inflection point that will see a major rotation in the tool of choice for service platforms. This post is a biased opinion piece detailing where I think things are headed.
"the end of the free lunch"
Herb Sutter summarized the ongoing implications of systems design trends for tools in his memorable posts the free lunch is over and welcome to the jungle. tl; dr - moore's law will not save us. But it did, for a while. In the 90s, we witnessed incredible, seemingly monthly upgrades in cpu capabilities, network capacity and storage technology. and our problems were still small - most of us were content to merely drive our stake into the internet and begin to build out basic services. Given small problems and fast systems, we defaulted to tools that excelled at producing working code quickly - namely the big dynamic/scripting languages of the 90s: perl,python,ruby and php. Of course all the databases were written in c so it wasn't a complete win for the dynamic languages, but they dominated the application stack.
At about the time intel introduced its "i" line of cpus (i{3,5,7}) it became clear that the curve was flattening and clock rates increases were topping out. More-cores was going to be the way forward. the dynamic languages had never been designed to exploit multicore - their syntax was lacking concurrency primitives, and they tended to rely on compiled native libraries to deliver performance-sensitive features. Meanwhile, our goals became much more ambitious and our userbases scaled into the tens of millions. tools started to fail.
our present situation
The only meaningful systems innovation in recent years has been the rise of ssd. CPU and network systems continue to evolve meaningfully but aren't providing fundamental enhancements as were common and expected in the 90s. And our problems continue to become more complex. the tools of the 90s are being squeezed out by diminishing returns in system performance, the reality of multicore, and the rapid increase in the complexity of the problems we are trying to solve...literally the end of "the free lunch"! Of course the dynamic language stacks won't completely vanish - there will always be legacy code, trivial problems, and the desire to prototype...but I suggest that these tools will no longer support the application stack in production.
requirements for a successful tool as of 2013
At a minimum, a viable tool must now support:
- strong static typing
- concurrency
- unicode
- separate compilation (including the ability to separate interface from implementation)
with the following as "nice to haves":
- "batteries included"
- community
- low cognitive overhead
If I were to name this category of tool, it would be the "high level systems language". meaning a tool that provides for a meaningful set of abstractions and features, but the ability to model systems in a way that tends to produce high-performance programs.
assessing some current contenders and a highly biased scoring
- c++11. meets 1,3,4,5,6, sort-of-supports 2 but lacking a standard event loop. fails on 7. c++ will never die but its not clear that c++11 as a major rev will attract new users who aren't driven by absolute performance as a overriding goal.
- rust. meets all points but 5,7. Rust looks promising, but its still early in the game and probably won't be ready for production deployment until 2015. Mozilla's endorsement can't hurt, especially if the servo engine actually ends up being something people care about.
- go. meets all points. Go is very strong right now. Its very low cognitive overhead and decent timing (mature while rust etc are still in development) is resulting in a lot of people deploying production code and liking the results. If anything hurts Go, it is the obsessive simplicity of the language, which may hinder adoption by coders looking for modern features.
- java. Meets all points. were it introduced today,it might fail 7, but given its ubiquity, its safe to say we have all been exposed to it.
- c#. Meets all points but fails on 6 since the community seems fractured between windows coders and those depending on mono.
- haskell. Meets all points but fails massively on 7, to the point that it makes the other wins meaningless. nn my opinion haskell is destined to become our lisp - a language constantly held out as being "better" by a very vocal minority with a dearth of meaningful results for everyday coders.
- scala. Very similar to haskell in that it meets all points but 7, but the massive installed base for java and the well-known successes of twitter etc may outweigh that.
- d. A dark horse. meets all points, but suffers from some unfortunate history. recent benchmarks show at least one compiler toolchain - ldc, providing for incredible performance relative to c++, and the language is feature-rich.
- nimrod. Maybe not worth mentioning here but seems to be cited a lot lately. Meets 1,2,3,4 but misses the rest, most due to its fledgling status.
imho, the winners
- Go has incredible momentum, is easy to pick up, provides for high performance programs with low-ish memory use (despite the mandatory gc), and programmers can learn it quickly.
- java already dominates backend coding and seems to be modernizing itself at the right pace to calm bosses and satisfy coders.
the maybes
- scala has some big wins under its belt but suffers from being too complex. It remains to be seen if a better java (v8) will dampen interest in scala.
- rust has a lot of hype but already some bloggers are bemoaning its complex syntax. Rust may also arrive too late - by 2015, mindshare may be too hard to capture.
- d is a real darkhorse here, but if it keeps scoring huge benchmark wins, people may pick it up, and it may accrue some refugees from go who want more features.
- c++11 could conceivably introduce a new generation to a cleaner dialect of c++, but the universe of third party libraries will continue to represent past visions of the language.
the losers
- haskell has high demands for learners and fails to produce meaningful performance results when coded idiomatically. I predict infatuation with haskell will turn to derision as coders fail to see the big wins that were hyped.
- c# seems to be perceived as a windows technology with tenuous support otherwise.
- nimrod is interesting but its just too fringe to bother investing time in.
last update 2013-09-02