7 ms·
Beating the Averages (2001)
- sillysaurusx 4y agoOne of the best essays of my youth. Launched a decade long quest to understand and use lisp. The most surprising thing is there people still dismiss it. Irony of ironies is that the dismissal comes on a site powered by lisp. Indeed, HN wouldn’t have been possible without it. I went back and read it again, and unsurprisingly pg addressed this point too: > But I don't expect to convince anyone (over 25) to go out and learn Lisp. The purpose of this article is not to change anyone's mind, but to reassure people already interested in using Lisp-- people who know that Lisp is a powerful language, but worry because it isn't widely used. In a competitive situation, that's an advantage. Lisp's power is multiplied by the fact that your competitors don't get it. Every time you feel like discounting Lisp, just remember “The world wouldn’t have Hacker News.”
- aidenn0 4y agoAs someone who was already learning lisp when this essay came out, I do want to point out that the world was very different when Viaweb launched. Recent versions of Javascript are probably closer to lisp than any of the languages their competitors were using; Python has come a long way, and mainstream backend choices are more varied than Perl, C, or a buggy C++ implementation. There is still an astonishing dearth of languages that take both dynamicism and performance seriously[1], but you're even starting to see bits of metaprogramming become more mainstream. Tooling is still mostly terrible outside of the lisp and smalltalk worlds ; I have mixed feelings about LSP, because while it greatly improved things, it appears to have done so by establishing a local maximum that few development environments will escape from. Jupyter is really cool, but it's the exception that proofs the rule. So compared to the '90s, your backend language will probably support garbage collection, anonymous functions, higher order functions, and maybe symbolic computation and/or a rich type system. It's harder to beat the averages when the average has gotten closer to where you are. 1: While performance is a property of implementations (not languages), performance is not just about implementation. The Lisp standard has several places where limits are placed on allowed dynamic modifications specifically for performance.
- lisper 4y agoYes, the world has been busily re-inventing (parts of) Common Lisp for 20 years. But they still haven't got one of the most important features: generic functions, and so every programmer who doesn't use Common Lisp has to shoulder the cognitive burden of figuring out whether to write x.f(z) or f(x,z) every single time they want to invoke f. I shudder to think of the aggregate effort wasted by this additional cognitive load over all the non-Lisp code that has been written over the years.
- aidenn0 4y agoOff the top of my head, Generic Functions have these features: 1. Dynamic Dispatch 2. Multiple Dispatch 3. Auxiliary Methods 4. Namespace independent of specialization parameter(s) I find it interesting that you focus on #4. People coming to Lisp complain about #4 a lot, and people leaving lisp complain about the lack of #4. If you aren't going to use multiple dispatch (which, empirically is rare in CL code), then #4 seems to be more a matter of what one is used to. Heck, when I program in a Lisp-1, I struggle with the semantic overhead of avoiding accidentally binding a variable that happens to be the name of a function. Also, the fact that many Lispers end up writing GFs named things like widget-frobnicate and sprocket-frobnicate might indicate that coupling the namespace with the primary operand might not be completely unwanted. Also, Python is almost certainly the worst offender with consistency here -- e.g. "len(x)" vs "x.len()". P.S. C++, Javascript, and Python have libraries available implementing multiple dispatch.
- lisper 4y ago> many Lispers end up writing GFs named things like widget-frobnicate and sprocket-frobnicate If they do that, they're doing it wrong. Probably because they are bringing in ideas from the non-Lisp world, not realizing that these techniques are not actually good programming practice, they are strategies for dealing with deficiencies in mainstream languages. IMHO languages should be made to serve programmers. Programmers should not have to work to serve the language. So if I want to frobnicate something I want to be able to write (frobnicate the-thing) and have it Just Work. Common Lisp gives me that (when it's is used properly). No other language does. > when I program in a Lisp-1, I struggle with the semantic overhead of avoiding accidentally binding a variable that happens to be the name of a function Yes, that is why Lisp-2 is the Right Answer.
- waynesonfire 4y ago> Lisp, just remember “The world wouldn’t have Hacker News.” Great insight because Lisp is the only general purpose programming language.
- rcoveson 4y agoI think you're being sarcastic, but it wouldn't suprise me if Erik Naggum once said this and meant it.
- santoshalper 4y agoHacker news could have been built in any number of languages. HackerNews is built using Lisp because Paul Graham likes Lisp. I also like Lisp, but nothing about HackerNews required it.
- jackallis 4y agonow, my question is does PG still feels the same way after 20 years. Would he amend the article?
- yellowstuff 4y agoLisp is great, and Paul Graham has done some good things with it, but the only other people who ever actually listened to PG and tried to build something practical in Lisp lived to regret that decision: https://web.archive.org/web/20051207043012/http://reddit.com/blog/2005/12/night-of-living-python.html https://web.archive.org/web/20051207043012/http://reddit.com...
- deleted 4y ago[deleted]
- goto11 4y ago> Indeed, HN wouldn’t have been possible without it. This seems a rather extreme claim. Can you back that up?
- simonebrunozzi 4y ago> Indeed, HN wouldn’t have been possible without it. It would have been possible with CGI scripts. Or PHP. Or Perl. Or a myriad other things.
- zh3 4y agoQuite - it's the simple but effective design that matters (not whatever language it's implemented in). It could be that Lisp because forces one to think more than just hacking out code, the end result is better designed.
- deleted 4y ago[deleted]
- AnimalMuppet 4y agoSlashdot was written in Perl, so I'm pretty sure that HN didn't need to be written in Lisp. HN is, primarily, the community it developed, not the code running on the server. Crediting Lisp seems like you're reaching.
- ilrwbwrkhv 4y agoImba.io is one of these beating the average languages. Shame people keep messing with React.
- eruditely 4y agoThanks for mentioning this, I'll check out imba.io. Also the essay itself is a classic, I wonder what other new techniques or technologies have been invented that let us beat the averages, other than just lisp, though.
- abraxas 4y agoI would wager that the landscape today is a bit of an opposite. The secret sauce today is to reject as much excessive technology as possible while still meeting your business goals. A lot of productivity is wasted on framework churn.
- nibbleshifter 4y agoexactly this. Take the time to pick the bare minimum of shit, that let's you get the job done, and stick with it.
- amadeuspagel 4y agoOn the other hand, Choose Boring Technology[1]. [1]: https://mcfunley.com/choose-boring-technology https://mcfunley.com/choose-boring-technology
- Jtsummers 4y agoIn the Viaweb case, Lisp would have been their boring technology. They already knew it well.
- abraxas 4y agoI believe this is far more pertinent in today's crazy zoo of languages, frameworks, freak show databases from flash in the pan vendors and the incidental complexity that is woven into nearly every project for no good reason.
- henning 4y agoIf you have a culture around a language that supports code generation (like Go) or has reflection/bytecode generation mechanisms (like Python and Java) you can still achieve the ultimate goal of reducing tedious boilerplate code that Lisp's macros let you achieve, but it's not quite as cool as writing a macro and seeing a little bit of new syntax expand out to a bunch of generated boilerplate in a REPL, and it's not as powerful as just being able to take pretty much any AST as a parameter and returning a new one back to be evaluated.
- deleted 4y ago[deleted]
- elisharobinson 4y agoi dont think this would apply as much in the modern context of package driven development . Nobody is delivering value as a SE without some package manager today . we are so far beyond the discussion if its a good idea to write your own tools for doing http request . And large scale adoption of the modern open source ecosystem was only possible after 2013 . Also to keep in mind that we are in a post moore's law era where people are relearning how to make things more performant.
- mrkeen 4y agoWhen I first heard of the term "web application", I started trying to download/install and play with GlassFish and Tomcat and JBoss, etc. When one seemed too complicated I'd jump to the next. There were jars and wars and admin panels and endless configuration. Total mind-fuck. I never got the hang of them. The next time I visited web apps, Jetty was around and seemed way smoother in comparison. Microsoft's IIS used to have an outrageous footprint (if memory serves, you needed a whole computer to host a domain, or something like that). So Apache took off. Then virtual machines. But even they were too bloated, so Docker took off. And the BSD people Likewise with Spring. It was huge and super-powered! By the time I got the hang of it, it had already become Spring Boot, shedding a bunch of the Enterprise baggage (especially xml) and trying to become leaner and meaner. I was completely blown away when I saw https://sparkjava.com/ https://sparkjava.com/ and once again when I saw https://learnbchs.org/easy.html https://learnbchs.org/easy.html Now when I code web apps (or "microservices" these days), my mindset is that http is just a function from request to response, and I feel so much better for it! > we are so far beyond the discussion if its a good idea to write your own tools for doing http request In short, I've become skeptical of the value-adds of gigantic software artifacts, as well as existing ways of doing things. I can't wait for more shitty little side-projects to displace bloated incumbents. > And large scale adoption of the modern open source ecosystem was only possible after 2013 . What happened in 2013? It looks like CPAN's been doing its thing since 1995.
- dhab 4y agoHow do you know there are less vulnerabilities in a smaller package than there are in a better adopted one(usu bigger)? And isn’t it more likely that big packages (they got big I feel due to expanding user-base requirements) get the patch sooner?
- parentheses 4y agoClassic post that always makes me want to deep-dive into lisp. I ended up searching for something lisp-related and finding this: https://news.ycombinator.com/item?id=32088260 https://news.ycombinator.com/item?id=32088260
- abraxas 4y agoI believe long gone are the days when the language choice would constitute a significant competitive edge. It can still hurt as heck if you pick a bad one but I don't think the post here aged all that well.
- arwhatever 4y agoMy last team used what I think of as a contemporary “Python paradox” language, only to find that the team refused to say “no” to any technology or pattern, and so they were over -engineering the project far beyond anything I had seen elsewhere. Is but one single data point, but it cost me quite some months to learn (I tried to talk them into simpler solutions for a while and then gave up and bailed).
- Akronymus 4y agoHuh? What happened? I didn't post this 6 hrs ago. But rather 2 days ago.
- deleted 4y ago[deleted]
- Jtsummers 4y agoIt probably got picked up in the second chance pool. When posts in that pool get picked up they get their time reset so that they end up, artificially, on the front page since time since submission + upvotes + comment activity are the primary criteria for getting to and staying on the front page. After some period of time the time stamp will get reset back to its original. https://news.ycombinator.com/pool https://news.ycombinator.com/pool
- Akronymus 4y agoOh. That makes sense.
- paulsutter 4y agoBut what happens if a company chooses truly the worst language. Like PHP? Oh, right. That was Facebook. They ALSO ran circles around their competitors and crushed them. I hear they are worth /even more/ than Viaweb! Great PHP story: > Dustin was like, 'Hey, I want to help out" > Zuckerberg told Moskovitz, "That's pretty cool. But you don't know any PHP." > "That weekend he went home, bought the book 'PERL for Dummies,' came back, and was like, 'OK, I'm ready to go,'" Zuck said, and told him, "The site's written in PHP, not PERL, dude." - https://www.youtube.com/watch?v=xFFs9UgOAlE https://www.youtube.com/watch?v=xFFs9UgOAlE
- thebigspacefuck 4y agoPHP seems like it would be a reasonable choice in early 2004. Ruby on Rails wasn’t out yet and LAMP was a very common stack. The competition MySpace was originally using Perl which nobody understood so they had to rewrite it in ColdFusion.
- AnimalMuppet 4y agoI'll post the same rant I usually do whenever this article comes up: "The Blub Paradox" is mistaken. It's a misunderstanding. To see why, think about Haskell. Haskell users are sure they're at the top of the power curve. When they look at Lisp, they're sure that they're looking down. "How can you get anything done in Lisp? It doesn't even have a decent type system." But Lisp users, when they look at Haskell, they also are sure that they're looking down. "How can you get anything done in Haskell? It doesn't even have macros." This situation - two languages, each certain that they're looking down at the other - tells us that there's something wrong. And what's wrong is the idea that languages can be ranked on a one-dimensional axis labeled "power". So, what is "power"? Or perhaps better put, power to do what? Well, to write programs. What programs? General programs? I've never written a general program in my life. I've written a bunch of specific ones, though. When I'm choosing a language, I care about its power to write a specific program. (Because why do I care about how good a language is for writing a program that I'm not trying to write? Why would I care about that?) So, ask what technical issue makes it hard to write the program you're trying to write. Then look at what language goes the furthest in the direction of making that problem easier. (You could go further, to think of the set of technical issues as a vector in a multi-dimensional space, and languages as a tree in that multi-dimensional space. Pick the language that reaches furthest in the direction of the vector of the technical problems.) But you have to have a somewhat broad idea of "language". It includes libraries and ecosystem. It includes the ability to write code that can be maintained over multiple decades (if that's part of what you need). TL;DR: The Blub Paradox is mistaken. For it to work, you have to be able to rank languages in one dimension (power). You can't. It's much messier than that.
- sokoloff 4y ago> why do I care about how good a language is for writing a program that I'm not trying to write? Why would I care about that? If you’re planning to pick a language de novo for each program, you don’t care about this. That’s probably not the common case that a dev intends/is willing to learn a new language for each new program.
- AnimalMuppet 4y ago
- woojoo666 4y ago> What's less often understood is that there is a more general principle here: that if you have a choice of several languages, it is, all other things being equal, a mistake to program in anything but the most powerful one. Interesting how this advice really doesn't apply anymore. If you want to build fast, it's less about the language itself, and more about the community and packages. Trying to write a web app using Lisp will most likely set you far behind any startup that just uses NextJS.