What you probably didn’t bargain for though is that with first-class functions, closures and a prototype inheritance system it’s one of the more expressive and flexible languages out there. Expressiveness and flexibility sound like good things but for many tasks actually lead to problems.
Now quickly, answer this question: If you were planning to write a codebase that you expected to reach more than 1 million lines of code (the codebase for our web application CaplinTrader has around 1.5 million lines of code if you include all the test code), would have hundreds of developers working on it, and would ultimately ship as examples, toolkits and library APIs for customer developers to customise would you write it in Java or Lisp?
Now, I’m actually a big fan of Lisp, so if you answered Lisp then good for you and Paul Graham, but I think you know that you are in the minority.
The problem is that when your language is flexible enough to implement multiple different OO concepts, or has features that allow you to program in radically different paradigms then questions about code arise that simply don’t come up in more restrictive languages. Nobody who writes Java has had to worry about the right way to implement Object Orientation, or when to write higher order functions as opposed to abstracting using inheritance, or when to use the dynamicism of the language instead of a clunky visitor design pattern.