In this context, first time ever since I joined HN, I'll be brave to openly say this out loud: C++ is my favorite language. Ughh... I did it! :)
A little background: I started coding in x86 ASM (because some idiot told me that was the only language computers understood when I was 14), switched to Pascal, then C, then C++, then I got my 1st job as VB6 oracle-to-form data pusher, then I did 5 years of very exciting C++ library development, i.e. other programmers were my customers. [highly recommend this - much easier to market&sell than any other market, learn from DHH, Trolltech or MySQL AB]
In 2002 I moved to higher level languages: Python, some Perl and lots of Ruby and Javascript. And honestly I'm not that more productive coding Ruby than I was ever in C++. Yeah, it's nice to read an entire file, break it down into an array of lines, grep them with some regexp and apply a function on each result - all that in a single line of code, but... well, read on:
C++ allows for some beautiful type-safe and performant high-level design constructs that Java, Python or even Ruby can't touch: just combine multiple inheritance with medium-complexity templates and see what you can do. Only Haskell gives me the same type-safe, nearly as fast and flexible (yet very high level) material to build software of. Being a realist, I don't see Haskell ever "making it" into the industry, but the updated C++ definitely will.
Duck typed languages are nice, but require enormous layers of unit tests to protect yourself from stupid things like misspelled variable names or even renamed/missing code files. Building with Rails without unit testing is a suicide. Doing Haskell without unit testing is actually isn't that bad. And this requirement to test the shit out of your code [2-to-1 ratios aren't uncommon] kills the spirit of exploratory programming for me. Moreover, 200x speed penalty means that simple O(n) algorithms won't cut it for an average data set, forcing you to build more complex solutions just because your language can't scan a big-ass array under 10ms. Moreover, most high-level languages live inside of a VM, which makes them useless for general purpose software development: they represent "fuck you" approach, i.e. they'll easily call your C library, but won't let you easily call them. JAR is as good to me as my swap file: I can't afford to carry around JVM on my back just because I want to call your Java code from Haskell or C++.
"And this requirement to test the shit out of your code [2-to-1 ratios aren't uncommon] kills the spirit of exploratory programming for me."
Which is why most of us don't write unit tests when we're in the exploratory phase of something.
"Moreover, 200x speed penalty means that simple O(n) algorithms won't cut it for an average data set, forcing you to build more complex solutions just because your language can't scan a big-ass array under 10ms."
I think that you and I have different ideas of what an "average" data set is, then, or the performance constraints expected of it. Although given the number of mathematicians and professional scientists who crunch their data in Python these days (see: NumPy, SciPy), I'd also suspect that maybe you should investigate this a bit more deeply.
A little background: I started coding in x86 ASM (because some idiot told me that was the only language computers understood when I was 14), switched to Pascal, then C, then C++, then I got my 1st job as VB6 oracle-to-form data pusher, then I did 5 years of very exciting C++ library development, i.e. other programmers were my customers. [highly recommend this - much easier to market&sell than any other market, learn from DHH, Trolltech or MySQL AB]
In 2002 I moved to higher level languages: Python, some Perl and lots of Ruby and Javascript. And honestly I'm not that more productive coding Ruby than I was ever in C++. Yeah, it's nice to read an entire file, break it down into an array of lines, grep them with some regexp and apply a function on each result - all that in a single line of code, but... well, read on:
C++ allows for some beautiful type-safe and performant high-level design constructs that Java, Python or even Ruby can't touch: just combine multiple inheritance with medium-complexity templates and see what you can do. Only Haskell gives me the same type-safe, nearly as fast and flexible (yet very high level) material to build software of. Being a realist, I don't see Haskell ever "making it" into the industry, but the updated C++ definitely will.
Duck typed languages are nice, but require enormous layers of unit tests to protect yourself from stupid things like misspelled variable names or even renamed/missing code files. Building with Rails without unit testing is a suicide. Doing Haskell without unit testing is actually isn't that bad. And this requirement to test the shit out of your code [2-to-1 ratios aren't uncommon] kills the spirit of exploratory programming for me. Moreover, 200x speed penalty means that simple O(n) algorithms won't cut it for an average data set, forcing you to build more complex solutions just because your language can't scan a big-ass array under 10ms. Moreover, most high-level languages live inside of a VM, which makes them useless for general purpose software development: they represent "fuck you" approach, i.e. they'll easily call your C library, but won't let you easily call them. JAR is as good to me as my swap file: I can't afford to carry around JVM on my back just because I want to call your Java code from Haskell or C++.