Lambda the Ultimate

inactiveTopic Michael Vanier: LFM's and LFSP's
started 9/20/2002; 2:27:17 AM - last post 6/13/2003; 2:31:10 PM
jon fernquest - Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 2:27:17 AM (reads: 3766, responses: 34)
Michael Vanier: LFM's and LFSP's
The author vividly describes an important barrier to progress in programming languages: fear of programming language features that allow gifted programmers to make better and more powerful abstractions.

Why are "languages designed for smart people" (LFSPs) so much more fun to program in than "languages designed for the masses" (LFMs)? .... LFSPs have a much greater support for abstraction, and in particular for defining your own abstractions, than LFMs. This is not accidental; LFMs deliberately restrict the abstractive power of the language, because of the feeling that users "can't handle" that much power... This is reassuring to Joe Average, because he knows that he isn't going to see any code he can't understand. It is reassuring to Joe Boss, because he knows that he can always fire you and hire another programmer to maintain and extend your code. But it is incredibly frustrating to Joe Wizard Hacker, because he knows that his design can be made N times more general and more abstract but the language forces him to do the Same Old Thing again and again.

Can extensions to mainstream languages that introduce innovative features like multi-dispatch or functional language features in an incremental (controllable, gradual) fashion reduce this fear?


Posted to Software-Eng by jon fernquest on 9/20/02; 2:30:32 AM

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 2:33:54 AM (reads: 2939, responses: 0)
Can features such as these be added incrementally?

Michael Vanier - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 4:10:38 AM (reads: 2914, responses: 2)
Ah, my old rants come back to haunt me ;-)

There are a bunch of extensions to java, at least, that add new functionality. Off the top of my head, I can think of Pizza (generic types, parametric polymorphism), Generic Java (generic types), AspectJ (aspect-oriented programming), and multimethods (I forget the name or names). Maybe the real win of java is that the language is sufficiently simple that it's easy to add such extensions. Unfortunately, the java syntax was not designed to be extended, so some of these extensions end up looking quite odd. But Generic Java, at least, stands a very good chance of becoming part of the core language. That's a good sign, because my impression is that the java folks have been awfully conservative with language extensions. Guy Steele's OOPSLA talk on "Growing a Language" (don't have the link, sorry) talks about this and strongly advocates an evolutionary approach to language design. This approach seems to be working out well for perl and python, at least, which have formal procedures for adding features to the language (so does java, but very few features are ever added).

One rule of thumb I use when evaluating languages is this: what features of this language should have been implementable directly by users? For instance, in lisp you can write your own object system (or systems), be they multi-methods or not. In java you take what they give you and that's that. I don't think java is a *bad* language, but one of the consequences of its design is that it can be extremely tedious to write certain kinds of code. For instance, try writing code in a functional style. You can fake this using objects, but the syntactic pain is immense. And because there are no macros, there is no way to change this; you just have to grin and bear it.

I think it would be cool to have an S-expression based syntax for java and allow users to write syntactic macros like in lisp for java.

Ocaml, as I mention in the article, is quite happy to give users an enormous amount of power. This leads to a lot of perplexed users and a long learning curve, but at least you don't feel stifled. They also have an amazing code generation system (camlp4) which I suspect will do for ocaml what template metaprogramming did for C++.

Bryn Keller - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 10:13:04 AM (reads: 2918, responses: 1)
It might be worth mentioning these links again here:

Adewale Oshineye - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 2:59:49 PM (reads: 2948, responses: 0)
And of course there's ELIDE http://www.cs.ubc.ca/labs/spl/projects/elide/ which offers the ability to extend the Java language with new syntax that is useful to a particular application. It's like a poor man's Lisp macro system.

Alex Peake - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 3:01:21 PM (reads: 2818, responses: 0)
I have just been reading Gabriel's "Patterns of Software" some parts of which relate to the original question (just to add some context to my current thinking).

IMHO, I think it somewhat depends on what your goal is.

If your goal is in your own programming tasks, and you are not "employer constrained" (and that includes clients), I think you are better off using the "full powered" languages.

If you are "employer constrained" (say, to Java) then perhaps this is the best way to allow you to use the power (though I have been using an alternate here - generative programming).

If your task is education then it has been shown (PLT) that you are better off starting "full power" (Scheme).

If your task it "to change the world", Gabriel might suggest to (almost) forget it, on the basis that the powerful languages cannot be used by the masses, even subsets of powerful features. The features require real mathematical thinking, which the masses are deficient in (by choice or capability).

Michael Vanier - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 6:46:10 PM (reads: 2801, responses: 1)
Note though that the PLT approach is to introduce full scheme in stages, with several language subsets leading up to the full language.

I've worked a bit with java lately, and I must say I'm impressed with how much can be accomplished with a really big API, even if the language isn't that powerful. Now, I assume that the pain that went into creating that API and the classes that instantiate it would have been greatly reduced in a more powerful language. However, I can see some logic in the notion that you don't want people to use features that they can't understand (there are lots of horror stories of this kind of thing in C++ projects, for instance). Whether that justifies neutering the entire language is another matter. Perhaps you could have a single language that has "beginner", "journeyman" and "expert" levels at which you could program, with average programmers never going beyond the journeyman level. This would only work if even the expert level code exported APIs that could be used by journeymen.

Alex Moffat - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/20/2002; 8:09:08 PM (reads: 2761, responses: 1)
Another problem, possibly related to the LFM and LFSP language design issue. You've probably read of Dr. David A. Dunning's research that suggests that incompetent people have the most difficulty in recognizing their incompetence. This is an observation anyone who has worked in the mixed ability corporate development team can understand. A single language with different levels might suffer because the incompetent would more rapidly "progress" to the expert level than the more competent, who were more cognisant of their limits. Perhaps this is part of the problem Michael mentions with C++ and is the reason the dangerous features get used by people who don't really understand them. I really don't know how to handle this rather basic people issue.

Here's a copy of the NY Times article about the research http://www.geocities.com/jrstrader2000/Incompetent.htm (I looked through quite a few google results and this is a good ref)

Adewale Oshineye - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 2:20:32 AM (reads: 2829, responses: 0)
That's always been the problem. If you have different levels of power available then everyone will immediately start using the most powerful level because they don't know they can't handle that power and because it makes them more employable.

Perl, C++ and, to a lesser extent, Java all suffer from this problem. Java has been able to mitigate it by striving to be simple and restricting powerful features to obscure libraries (e.g the reflection APIs). The only safe way to have different language levels seems to be to have 2 levels-- a level for ordinary programmers and another level for the language's implementers. This way the onus is on the language implementers to use the power that only they have, to build useful/flexible libraries for the ordinary programmers who will use the language.

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 3:54:01 AM (reads: 2862, responses: 0)
But... but... but...

I agree with what you originally worte, that good languages provide better tools for creating abstractions. So how bad can a lgnauge be, if it can be used to design and implement good libraries (aka APIs)?

Saying that language features influence library design sound trivial. But the issues here are rather subtle.

When you start to design a substantial library, you soon realize that small defects in the language can be very annoying, and rule out certain approaches to the design of the library. "Bigger" problems with the language may turn out to be not that problematic.

One would have thought that the lack of parameterized types in Java would be a huge problem for a Collections API. Turned out, that an ugly (SE-wise) solution works, and a fairly decent Collections library can be designed.

As another example, I can mention my experience thinking about the optimal design of a Collections library for Ada, which has many great features for library design. Turns out, combining them to produce a good library is much harder than one might expect, and small issues with the language, can be really problematic (e.g., Ada, trying hard to be as safe as possible, has some scoping rules that combine badly with the way consturctors and destructors are defined).

Which bring me back to my observation, that worse languages often have better libraries. This is something language designers should think about

jon fernquest - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 4:23:14 AM (reads: 2751, responses: 0)
> Incompetent people have the most difficulty in
> recognizing their incompetence.

This just sounds like a big stick likely to be wielded by someone defining competence in terms favorable to themselves.

But I do believe that "humility is a virtue" and is the best mindset for increasing your competence.

My experience in consulting led me to believe that there were all sorts of opportunities for using innovative software methods, but what usually drives a deal is special relationships and specialized domain knowledge. You may learn about innovative software methods in academia, but the last two items....are most likely gained by immersing yourself in some thoroughly non-academic business.

Alex Moffat - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 5:29:12 AM (reads: 2738, responses: 0)
"> Incompetent people have the most difficulty in > recognizing their incompetence.

This just sounds like a big stick likely to be wielded by someone defining competence in terms favorable to themselves."

It does, but the studies seem to be convincing. The explanation was that the same skills were required to do a task well as to judge your own ability to to the task. The more you understand of a subject the more accurately you can assess the depth of your knowledge.

Alex Peake - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 3:41:05 PM (reads: 2692, responses: 1)
> Which bring me back to my observation, that worse languages often have better libraries. This is something language designers should think about

But...

These (Java, VB, C#, ...) are "Languages for the Masses" - high volume sales to support the development of lots of APIs (libraries).

More concretely, why would you not, for example, use Franz Commom Lisp? Large libraries (including Web, Database, ...), interoperability with Java (so use all those features you want), interoperability with COM and Corba (so all those features), C FFI,...

AND a LFSP to boot.

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 3:52:15 PM (reads: 2772, responses: 0)
As I said, there are many issues. The most obvious one is, of course, the number of users. The second most obvious one is corporate backing. Now that these fairly uninteresting factors are out of the way, I still suggest there may be language issues.

why would you not, for example, use Franz Commom Lisp?

This has nothing to do with which language I use! Don't you realize I am an egghead talking about ideas in the abstract?!

Anyway, one of the things Common Lisp lovers like to say about Scheme is that Common Lisp is better suited for production work than Scheme is, beacuse of its libraries. But is there a language design reason why all these libraries can't be written in Scheme? I really don't know enough Common Lisp to answer.

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/21/2002; 4:00:04 PM (reads: 2726, responses: 0)
Le me try to make this a bit more concerete. Type systems put constraints on valid programs. If the type system is not expressive enough, it may lead you to impose restrictions that make library code less reusable.

This doesn't mean that type systems always do so, but this is something that should be asked when you look at the type system of any given language.

For example see Kernighan's paper on Pascal.

Patrick Logan - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/22/2002; 6:15:02 PM (reads: 2669, responses: 0)
Question: What makes a language for "smart people" vs. a language for "the masses"? It appears to me to be cultural and psychological more than technical, although the culture does seem to be born out of the evolution of the personal computer. Witness: the original lab-based personal computer was arguably a Smalltalk & Lisp machine; the original affordable personal computer and its languages have evolved to be more and more like that original lab computer and its Smalltalk & Lisp languages.

Aside: Scheme can be seen as a cleaned-up core of Common Lisp. Since CL can be implemented in Scheme, Scheme can certainly do what CL does.

Another aside: The Data General CL system developed at DG's RTP facility ca. 1983-1986. It was derived from a Scheme system implemented by R. Kent Dybvig as part of his PhD work.

Michael Vanier - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/22/2002; 6:31:15 PM (reads: 2652, responses: 0)
I would say that there's a kind of "bondage and discipline" mentality to languages for the masses that says, in effect, "here are the rules and you just have to learn to live with them" whereas languages for smart people say, in effect, "you can make your own rules" to a greater or lesser extent. For instance, in java, if you don't like the object system, too bad; you just have to grin and bear it. In common lisp, it's not that hard to define your own object system. This all has to do with the kind of abstractive power that the language allows programmers to use.

This is not always cut and dried; ocaml, for instance, imposes static typing on the programmer whether he/she likes it or not (I know that some lisp folks like Paul Graham find this very unpleasant). But ocaml provides so many ways to abstract designs that the benefits far outweigh whatever drawbacks static typing might have.

Isaac Gouy - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/22/2002; 7:25:21 PM (reads: 2632, responses: 0)
>> Incompetent people have the most difficulty in >> recognizing their incompetence. >This just sounds like a big stick likely to be wielded by someone >defining competence in terms favorable to themselves.

This paper is worth reading just for the Pittsburgh bank robber story- "Unskilled and Unaware of It: How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments" Justin Kruger and David Dunning http://www.apa.org/journals/psp/psp7761121.html

>"smart people" vs. a language for "the masses" "Why are "languages designed for smart people" (LFSPs) so much more fun to program in than "languages designed for the masses" (LFMs)?"

I'm suprised that no one has questioned the assertion that one group of programming languages "were designed for smart people" and another group "were designed for the masses" (masses aka dumb people?)!

I guess we are all "smart people" ;-)

Can someone find language design documents that show this criteria has been used?

Michael Vanier - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/22/2002; 10:25:31 PM (reads: 2657, responses: 0)
Take a look at the Java language white paper:

http://java.sun.com/docs/overviews/java/java-overview-1.html

Here's a quote:

"We wanted to build a system that could be programmed easily without a lot of esoteric training and which leveraged today's standard practice."

And another:

"Java omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than benefit. These omitted features primarily consist of operator overloading (although the Java language does have method overloading), multiple inheritance, and extensive automatic coercions."

An even more telling point for me is that many of the java developers (notably James Gosling and Guy Steele) have been serious Lisp programmers in the past (Steele is the author of "Common Lisp, the Language" and the co-inventor of scheme). So there is no way that they couldn't know about the features of lisp that give it its high abstraction level. They deliberately left these out because learning to use them requires "esoteric training" and is not "standard practice".

Understand, I'm not blaming them for what they did. But it's pretty clear that java was designed for average programmers and not for wizards.

Isaac Gouy - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/23/2002; 8:48:43 AM (reads: 2603, responses: 0)
Excellent! We can agree that many language designers want the result of their work to be widely used, and make compatibility with syntax/concepts of widely used languages an explicit design goal, in an attempt to achieve widespread adoption of their new language. Another example: Bjarne Stroustup, Simula + C (widespread use) -> C++.

Now let's deal with the assertion that there are "languages designed for smart people". Is there an example of a language explicitly designed for "smart people"?

scruzia - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/23/2002; 10:17:52 AM (reads: 2696, responses: 0)
IMHO, a more important distinction here is LDC's vs LDT's: Languages Designed for Cowboys vs Languages Designed for Teams. It's not quite the same distinction, but there is some overlap:

... languages for the masses [say], in effect, "here are the rules and you just have to learn to live with them" whereas languages for smart people say, in effect, "you can make your own rules" ...

Cowboys "make their own rules" and do not care whether anyone else can understand their programs. There is a tendency (not overwhelming, but distinct and noticeable) for very smart people to believe that anyone who "thinks different" is less smart. Sometimes they're right -- but not always.

I believe that some of the features omitted from Java were omitted because they tend to result in less readable programs. I know, there's a slippery blame-shifting thing going on here ("readable -- by whom?"), but most programs are not just written for computer consumption. There are human readers too. In any kind of writing intended in part for humans to read, the writer has some responsibility to make that writing understandable for his or her intended audience.

In the programming industry, there is also a time issue. Even the smartest programmer, if under a time crunch, will have trouble understanding a program that is built too much out of its own poorly-documented little domain-specific language made of idiosyncratic macros, operator overloadings, and/or home-grown preprocessors. Not all programs written in LFC's are like that, but enough of them are for Steele and Gosling to have rejected some of those features.

It's a matter of degree, and of taste.

Isaac Gouy - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/23/2002; 1:42:29 PM (reads: 2588, responses: 1)
IMHO LFSP/LFM could be made into a pretty funny satire. LDC/LDT doesn't seem to have as much potential for humour.

Stating that programming languages I like are "languages for smart people" and the ones I like less have been dumbed-down by design, for the masses, isn't the high-standard of debate I've become used to on LtU.

"An even more telling point ... there is no way that they couldn't know about the features of lisp that give it its high abstraction level. They deliberately left these out because..."

...because they'd decided the lisp features weren't much use? ;-)

Let's not put words into peoples' mouths - anyone can do that.

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/23/2002; 2:01:07 PM (reads: 2660, responses: 0)
I tend to agree that, though interesting, Michael's rant was analyzed to death in this thread

I appreciate the sentiments Michael raised, but I suggest we go back to our regular program, featuring discussions of specific issues, and programming language features...

Kimberley Burchett - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/23/2002; 8:09:13 PM (reads: 2575, responses: 0)
Arc is an example of a language specifically designed for smart people.

jon fernquest - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/24/2002; 2:41:21 AM (reads: 2539, responses: 1)
> Stating that programming languages I like are
> "languages for smart people"
> and the ones I like less have been dumbed-down
> by design, for the masses, isn't
> the high-standard of debate I've become used to on LtU

"Dumbing-down" is surely an essential meta-feature of programming language features.

I'd argue the reverse of the above: I like Haskell less because it doesn't sufficiently dumb down some of its features, likes *Hugs type extensions*, essential for the modular monadic semantic definition of languages in LPS, and for which to-date I have yet to find anything that helps me understand all the issues or even which extension is being used where. :) ...

I always thought there was a time and a place to be smart, like when you're selecting the tools you're going to work with, anticipating problems and debugging unanticipated problems, and a time and a place to be dumb like using simple idioms when coding so other people don't have to be smart to understand you....even the most complex ideas can be expressed in a simple manner.

Ehud Lamm - Re: Michael Vanier: LFM's and LFSP's  blueArrow
9/25/2002; 12:45:39 PM (reads: 2561, responses: 0)
'Engineering for people' may be a less offensive way of saying the same thing as "languages for dumb people"

BTW: When I write code I try to be as dumb as I can, while still getting the job done (and a quality I can live with).

andrew cooke - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/11/2003; 6:29:25 AM (reads: 1599, responses: 0)
Just been directed here by a post on LL1 - Paul Graham was smirking about the phrase LFM.

Some days it feels like every other dismissive, rude or intolerant remark comes from a Lisp user. It's got to the point where, if I'm emailing someone to try and get them to make a more useful contribution (something above "heh heh your language sucks") I've started asking whether they're Lisp users. I keep getting surprised "yes, why do you ask?" replies...

Why are Lisp users so socially inept?

Sorry if Lisp users find this post offensive. I had a good friend at school who had bad body odour. I regret never talking to him about it. I'm now trying to change my ways...

Hmmm. Wonder what the origin of the phrase "lusers" really was?

ferix - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/11/2003; 8:00:20 AM (reads: 1570, responses: 0)
I came to this thread via Paul's LL1 post as well. I actually enjoy a lot of Paul Graham's writings, but I also find the LFSP/LFM names to be quite vain. Perhaps someone should suggest the LFC/LFT (Cowboys/Teams respectively) alternative to the LL1 list.

But then again, maybe Paul wouldn't see the subtextual message in being labelled a cowboy. Or maybe he wouldn't care.

I think a good answer to the debate came from Will Clinger during a Language Wizards Panel. His guiding philosophy is that "Humans are Stupid." See the April 24 video stream for his full monologue; the gist of it is that we need to rely on abstraction to get anything done.

If you buy that, then you can see that the debate should really be, "Okay, given that we're all stupid, does the abstractive power of a so-called LFSP outweigh its cognitive overhead."

Michael Vanier - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/11/2003; 5:23:40 PM (reads: 1537, responses: 2)
Paul certainly seems to love those terms. Unfortunately, my name is associated with them as well, so I get the fallout. I think the terms are valid as far as they go (they reflected a kind of frustration I felt at the time), but I don't see the LFM name as being inherently pejorative. It's like the difference between a racing car and a station wagon; they both have their place, and not everyone should be driving a racing car. "Languages for experts" would have been a much better term for LFSP, and less pejorative to boot.

BTW I agree that we're all stupid ;-)

As for why lisp people have bad manners, I'm pretty sure the reason is that so many good ideas that seem to be new were actually standard in lisps of the past, and lisp rarely gets the credit it deserves. I think most programmers think that the java developers invented garbage collection, for instance. Also, given that you're writing a dynamically-typed language, it's hard to outdo lisp, and lisp programmers get annoyed to see scripting languages constantly reinventing bits of lisp. Someone once said "those who do not understand lisp are doomed to reinvent it".

Of course, static typing is a whole other ball game, and much of the history of static type systems is an attempt to recover the flexibility of lisp with the safety/speed benefits of static typing -- a noble pursuit IMO, and one I hope succeeds (although the obstacles are large).

BTW Paul's manners are not bad compared to many other lisp people. Just check out comp.lang.lisp and look at some posts by Erik Naggum -- he gives a whole new meaning to the term "sociopathic" ;-) I jokingly refer to c.l.l. as "comp.lang.pointless-flamewar".

andrew cooke - Re: LFM's and LFSP's  blueArrow
6/11/2003; 6:06:01 PM (reads: 1566, responses: 0)
oh yes, erik was an early influence on my opinion of lisp users - my comment wasn't particularly directed at paul graham (normally when i write his name i'm introducing his (excellent) book (the macros one) to someone!). and i can understand their frustration, but, you know, it's just a programming language, not a religion or a reflection on their manhood (hey - Languages For Small..., no let's not go there ;o)

(i'm just playing; no more from me on this; i'm sure there are female lisp users too; not all lisp users are "lisp users"; contents may settle during transit).

ps the links near the start of this thread, and ehud's initial comment, are still very interesting.

Dan Shappir - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/12/2003; 2:29:07 AM (reads: 1543, responses: 0)
Just check out comp.lang.lisp and look at some posts by Erik Naggum -- he gives a whole new meaning to the term "sociopathic" ;-)

Highly amusing. We should introduce him to LtU.

But seriously, I'm amazed that such an enormous bandwidth on a PL specific group should be devoted to the manners (or lack there of) of a single poster. Sort of reminiscent of the endless postings, and counter postings, about Dave Winer's integrity.

Frank Atanassow - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/12/2003; 7:25:23 AM (reads: 1482, responses: 1)
Just been directed here by a post on LL1

Can you give the archive URL?

andrew cooke - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/12/2003; 11:41:31 AM (reads: 1509, responses: 0)
http://www.ai.mit.edu/~gregs/ll1-discuss-archive-html/msg03327.html

Isaac Gouy - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/12/2003; 1:12:00 PM (reads: 1448, responses: 0)
Languages For Mobs?
Mob Software: The Erotic Life of Code
Richard P. Gabriel & Ron Goldman

Isaac Gouy - Re: Michael Vanier: LFM's and LFSP's  blueArrow
6/13/2003; 2:31:10 PM (reads: 1425, responses: 0)
Why are Lisp users so socially inept?
Richard Gabriel seems to combine Lisp expertise and an open-minded curiousity.

Models of Software Acceptance: How Winners Win
p46 onward dealt with programming languages - Lisp, Smalltalk, Java, C++