Go and Brand X: A language comparison
cowlark.com
cowlark.com
The other points raised:
'effective' vs 'good' - seems like a narrower case of the plentiful and in-depth literature available about 'worse is better' (and the converse).
'can't spot any language feature that was invented after about 1985' - at this point the Lisp crowd should probably be reaching for their pitchforks and lighting their torches. Perhaps formalized systems for hygienic macros came a bit later?
Specially given the many syntax mistakes on the Go examples he uses for comparison.
He is comparing two languages he has clearly never used to do any substantive programming. The whole thing is ridiculous.
I see 'effective vs. good' as an opportunity to satisfice.
http://en.wikipedia.org/wiki/The_Paradox_of_Choice
Let's take the notion of satisficing and apply old 80-20 rule. About 80% of your life is not going to matter that much in 5 years. Your choice of toothpaste, the car you drive, which couch you buy -- these can be complex decisions, but they aren't going to have as big an influence on your life as the town you live in, the jobs you take, or your closest friends. It's a minority of decisions you make which will matter the most, so spend your maximum effort optimizing those. For the rest, let's just find something that will do the job.
I think the Go team decided that compilation time, efficient execution, conciseness, and concurrency were the areas that mattered the most for a systems programming language. Most of the programming world understands "Algol-derived" syntax, so why not stick with that? In fact, given that the majority understands that sort of syntax, this should also be considered an optimization -- one which is aimed at achieving as large a user base as possible.
(I wonder if one can consider Python to be an 80-20 satisficed language?)
I'm also reminded of C.A.R. Hoare's famous quip about Algol 60: "Here is a language so far ahead of its time, that it was not only an improvement on its predecessors, but also on nearly all its successors." (Sourced at http://en.wikiquote.org/wiki/C._A._R._Hoare .)
Take a deep breath. This may shock you.
Brand X is Algol-68.
That sort of sounds cool, so why not write an article to show that Algol-68 is more consistent than Go? Then the author just tries to compare features not honestly, but with the intention of making Algol-68 look better than Go, so that he builds up to his cool Brand X is Algol-68. His criticism of Go is mosly unfair, for example, how can he say that Go syntax can look ambiguous? I don't think I've seen a more explicit and unambiguous language than Go.
One thing I find interesting is that I've seen several people claim that Go is all but useless until they implement generics. Java has only had generics for the last 5 years, C# had them after that, and the languages Go is intended to compete with still don't have them (well C++ has templates and I guess C has void *)!
Java very definitely jumped the shark when they added generics.
Hard to invent anything new if you need to keep backward "knowledge" compatibility.
Industrial PL design has always been about doing what programmers already know, but gradually "better". Not challenging them and introducing them to new concepts. As far back as the first Fortran; language designers were told to defer to the programmer's expertise, so much so that the #1 requirement for Fortran was to be an algebriac syntax over assembly language. Fortran didn't dare to do anything different than assembly (that job was left to Lisp.) That's why you see dangerous low-level constructs left in every major HLL: this is to allow the previous generation of programmers the freedom to circumvent the abstraction to get work done. It's a subtle admission of distrust of high-level concepts, because management, and studies in "pragmatics" tell us that programmers need to fall back on sheer muscle and primitive operators to deliver quality software.
PL designers and compiler hackers can wax poetic over their achievements in advancing the art, but the market prefers to keep its investment in time, money and expertise in current technologies. So what you often see is a lousy compromise between the Ideal and the Material. Inline assembly, longjmp, pointer arithmetic, unboxed immediate values, compiler directives and promises to allow the programmer to tell the compiler how to do it's job, etc.
The people behind Go are industrial PL designers; everything they have ever done was for immediate, pragmatic reasons. They cloned Multics to make it cheaper and simpler, doing away with much advanced time-sharing OS research and taking the bare minimum; what they produced was a multitasking OS for minicomputers that wasn't that much more sophisticated than the microcomputer OSes of that day: it was CP/M with a login screen. You can see that theme of "simple, familiar, fast" running through every piece of software tool Bell Labs has ever touched after that. They might appropriated a few technologies from academia, Tcl, SML/NJ, etc. but those were done by researchers brought on board from the outside. When Bell Labs got too ambitious they produced C++, not a change in tone, but a crescendo of everything they have been doing. Worse is Better.