I took a quick look. The piece is better than I remembered. It takes what is a (by now) common point and makes it uncommonly well. The second-last paragraph, in particular, brilliantly summarizes both what people like about LFMs and what (other) people hate about them. Surprisingly, it's fair to both sides.<p>As for the distinction between LFM and LFSP itself, I believe it's fundamental -- or rather, the distinction between M and SP is fundamental. It explains important facts about the software industry that can't be explained any other way ("if X is so good then how come blah blah blah"). I think M vs. SP is fundamental because of a demographic fact: the population of SP is an order of magnitude smaller (at least) than the population of M. Combine that with the economic fact that the demand for software exceeds the supply of SP, and our world begins to make some sense.<p>The only thing I'd change is that the terms "smart people" and "masses" are too judgmental. What we mean by "SP" is people with a high tolerance for abstraction. There are many individuals in M (i.e. who have a low tolerance for abstraction) who are plenty smart. Still, this is a venial flaw, because capacity for abstraction is a big part of being a smart <i>programmer</i>.
Interestingly, this is almost identical to our language decisions. Our engine is C++, the webservices are a wrapper in Java and the stuff on the fringes is a mix of scripting languages. Instead of OCaml, I've been eyeing Scala as the thing I might use to rip out the Java.<p>Before doing our webservices in Java, I'd never done much of it and assumed it to be a closer cousin to C++. Using it at length, at a time when I find myself frustrated with some of the lack of abstractions in C++ (notably missing lambda), it's whetted my appetite to drop in a slicker language at the medium level of our stack.
I agree Java is verbose and old and should rarely be used on new projects.<p>But this thing about smart people makes me cynical. You ever debug a terse Perl program written by a really "smart" person?<p>What about maintenance? What about the dangers of over engineering? These things should not be overlooked.
<i>This means that there is a glass ceiling of abstraction; your designs can only get this abstract and no more. This is reassuring to Joe Average, because he knows that he isn't going to see any code he can't understand.</i><p>That's the intention, but the reality is quite different. When smart people really need to write more abstract code in a weak language they will go to great lengths, including on the fly byte code manipulation and all kinds of weird proxying hacks. Or look what they do with CSS.<p>So, the abstractions are always possible, albeit in a way that is even more complex and definitely more brittle than if they had been implemented in a more powerful language.
I introduced a bunch of Java developers today to applying predicates and mapping functions using the google-collections lib.<p>Question that was asked the most was: "Will other java developers that do/will work on my project(s) understand this code?"<p>How do you un-teach people the
for () { if ... if .. if .. } for () { ... } ...
> <i>It's pretty clear that the core simulation objects have to be written in C++. C is too painful, and anything else is going to give an unacceptable hit in speed</i><p>The author lost me right here. C is too painful, and C++ is materially better? OOP is nice and all, but it's no panacea. I've worked plenty in both languages and find that both score roughly equally in 'pain quotient.'<p>Interestingly, the "LFSP" theory breaks down when you consider memory management and pointers. Those two features of "LFM's" cause far more difficulty for average developers, IMO, than the abstractions available in "LFSP's."
"Debugging is twice as hard as writing the program, so if you write the program as cleverly as you can, by definition, you won't be clever enough to debug it." - Kernighan's law<p>(In reality I think that many smarter languages make debugging easier, not harder, but the point stands that the most <i>interesting</i> or fun solution isn't necessarily the <i>best</i> solution. A good, stable project often needs non-sexy infrastructure, and no language can completely abstract that out.)
Well, I wouldn't want to get in the way of anyone telling themselves that they're smart, but take a look at any startup with scaling problems and what do you see?<p>The web team's doing shopping carts and drill-down tables in Ruby.<p>The platform team's doing ultra-low-latency, distributed, redundant key-value stores in Java, and build scripts in Ruby or whatever, possibly an ETL or two using hadoop to boot.<p>Who're the smart people, again?
While this seems to be an almost constant (and needless) discussion on this site for the last few months, I wonder how presence of LFSP on the JVM/CLR (Scala/F# for ML-style programming, Clojure for Lisp-style programming) going to change the picture)?