I've been using Clojure on and off for a while----currently off, though not because of the language itself. The thread now seems to have moved in a different direction, but I have to say (looking at the Seajure and Y Combinator threads) that Steve Yegge has some good points. And ending up here with a thread titled "stand firm against..." seems to be exactly the sort of community problem that he is worried about.
I wish that we did not have to deal with a fundamental disagreement about what a language is \for. If a programming language is something like Hermann Hesse's Glass Bead Game----an intellectual diversion for superior intellects----then spending time contemning "Joe Developer" and "deploring" people who want to suggest different directions for the language is a worthwhile activity. But ultimately programming languages are about getting things \done, just as cars are about \going places. It is still possible (though increasingly difficult) to tinker with your own car before driving it. In the beginning, it was obligatory. You had to choose a third-party auto-body manufacturer. You had to crank the engine yourself. You even had to manually set the ignition timing while you were driving. There was a lot of cruft you had to deal with that had nothing to do with getting from point A to point B. The first users of cars had to be willing to work with them as a kind of \hobby----you had to give over a certain amount of time out of your day just to just keeping the things running. At some point, a transition happened. They became mass-market devices. The tinkerers never went away, but their increased numbers, and the increased numbers of people simply \using cars, led to an increase in simplicity and reliability. Every time there was an issue to deal with, there were that many more people with a stake in fixing it. Some people may miss the old hobbyist culture around cars, but I don't think anyone really wants to go back to Model T days. The remarkable thing nowadays is that a \huge number of people become good drivers (although admittedly there are quite a few that shouldn't be on the roads)----and driving is a fairly demanding and crucial activity. Sadly, we cannot say the same thing for computer users. Clojure is still in the Model T days (though it is continuously improving). Getting a non-broken Emacs setup is not always easy (I attended a Clojure class a few weeks ago where we spent the first couple of hours just trying to get Clojure and Emacs working). There is no built-in command-line REPL or interpreter. Debugging is cryptic and not particularly helpful, and occasionally outright misleading (see what someone posted to the Seajure and Y Combinator threads on his roundabout way of discovering that Clojure needed advance declarations). The documentation is not quite as consolidated and organized as the Java or Python documentation (though it has also gotten better), and people really wanting to get things done must deal with two independent sets of documentation, Java and Clojure, the latter of which is simply organized alphabetically. Supposing that they do get over this hump and now wish to develop a practical project, they are immediately faced with more choices. There is no standard, immediate path for developing web apps, GUIs, or even shell scripts----you have to use your sixth sense of what libraries may or may not actually work (which on the Internet can be quite difficult, as something that doesn't really work rarely \tells you so itself). You can jump into Python as a complete noob in the morning, and have a useful program by the afternoon. This is much less likely to happen with Clojure. There are plenty of smart people who lack both the time and the system administration chops to deal with getting into Clojure. This is very sad, because once you get into it, Clojure is very easy and very sensible. There are surely many great programs that are not being written----some of them would be programs that help smoothe the way for everyone else. Many people who would help spread the functional programming gospel are getting their brains fried in Python and Java----and teaching them will be that much harder when they eventually come around (as people have pointed out here). Now all of the rough edges are perfectly understandable for a new language, and they continue to get better----and the more you are willing to Google around and read blogs and so forth, the more solutions you find. But what bothers Steve Yegge and many other people, I suspect, is that fixing this fragmented user experience and the gaps in the language doesn't really seem to be a priority----when in fact it should be a prime mission. People actually make the argument that these difficulties are good "weed outs" for the "joe developers" who would (presumably) get in here and muck everything up. I have actually heard people say here that people who don't have the wherewithal to configure emacs and classpaths will never learn functional programming, and therefore good riddance to them. This is nonsense. There are different skill sets, and system administration is a somewhat different one from programming. Functional programming is a timeless skill, whereas learning the intricacies of Emacs and Classpaths only gives you knowledge of a very particular insanity (even though the patience to deal with it is of course a good attribute). And some people who might become great Clojurians simply don't have the \time to deal with all of these things when doing them does not yield an immediate payoff, as I said. Moreover this time- cost is spent by \everyone, to one extent or another. It's the result of a slightly disconnected attitude. A few people could spend a few tens of hours making things easier for everyone else, thereby saving thousands of man-hours (isn't this supposed to be what programming is about in the first place?), and yet it doesn't happen. One might speculate why this is so. Returning to the car example, it might be that it's much more rewarding to spend your time rebuilding the engine and making it that much more performant. But the number of people who will benefit from this zippy engine is greatly reduced when you still require hand-cranking, manual ignition timing, and after- market auto bodies. At some point, you will have to roll up your sleeves and admit that although making automatic starters is not terribly interesting, the time has come to do the job----and it is going to make things a lot better. Programming languages at some point have to face that kind of transition. Clojure has already faced one such transtition: Rich Hickey decided to release it. On that day, it became more than his personal project. Other people by their investment of time developed a stake in it----what Steve Yegge is saying, I think, is that this stake has to be recognized; and the culture of the language has to evolve towards respecting and integrating these stakeholders as a reflex response, rather than the reflex response being "that's the way the cookie crumbles...." Now people will say: There are problems, and people who see these problems should try to create a library or a contrib. But this only goes so far. You can't reorganize the documentation that way, and you cannot provide a smoothe, approved path to building real-world applications---in fact, initially, by releasing a library you are only creating more noise. Meanwhile, although this list \does seem genuinely open to answering people's questions, when it comes to accepting more substantive contributions, there seems to be a barrier. For instance, a little while ago I was corresponding with someone who had released a patch to Clojure. (This was Alyssa Kwan, in case you want to look up the thread.) Her patch made refs persistent to disk----something that seemed very much in the spirit of Clojure. Dealing with disk persistence in a production-ready way may be its own discipline, but in a language that wishes to "reduce ceremony", there is no reason that you should have to worry about which database to use when you merely want to write a program that remembers data when you re-start it. The interface needed to do this is \almost there.... It seemed an eminently useful thing, but it got posted to this list and sank without a trace. Nobody from Core ever contacted her. (She admitted it was a "hack", but isn't that how all patches start out?) Clojure patches are not released every day. How much trouble would it be to make it a custom for one of the core developers to at least \look at patches and acknowledge their existence? I'm not sure of why she didn't submit the patch through official channels as shown on the website----she probably thought that someone from the team would be following this group enough to contact her, and she wanted to see if this would happen before getting too deep into the process. It doesn't seem like too much to ask for some proactive outreach from the core contributors. It would help develop a culture that welcomes contributions and suggestions for improvements, rather than appears to reflexively reject them. At any rate, this particular contributor has been lost to Clojure---- after seeing the lack of interest, and seeing certain deficiencies in the language for her purposes (I am not sure which ones), she moved on to Erlang. This is but a single example, but there are surely others if one took the time to look; and moreover it's an example of precisely what happens when a language fails to grow----I mean to say, that when it fails to grow, it must be that there will be many little stories like this one. A user sees deficiencies. The user happens to be one of those rare ones who is capable of fixing things. After trying to fix a little thing within the community, he decides it isn't going to work and moves on to a language that either has the feature in question, or is one that has better prospects for him developing it and actually getting it accepted. I am not sure I am saying Clojure should therefore become a "yes" language in the sense that one would expect if one were setting up a straw-man argument----a kitchen sink language without any core or soul. But I'm not sure that is what Yegge means (you might have to read behind the lines of his brash style), and there are possibilities of somewhat more open languages that still have a core and a soul. Especially when the language is well-documented, adding convenience features for newer users who are not fully into the gospel doesn't really hurt things for everyone else. Clojure is a Lisp. Lisp is not really a language, it is a maker of languages. It therefore doesn't make sense to run it in the spirit of a prescriptive grammarian. Everyone has the ability to add features anyway (and to an even greater extent once safe reader macros are figured out----which I hope they will be), so rejecting simple and basic features such as loops is ultimately counterproductive, since it will only lead to a lot of different incompatible third-party versions being made. (I really don't think the sky would fall in if they were added----with a general transient feature, such as will probably be added, they would be perfectly harmless; they could come with as many warning labels as necessary that they are Not the Clojure Way. New Lispers have to get used to prefix syntax anyway, and it may be that one paradigm shift at a time is enough for most people, even many smart ones; getting them hooked into the language starting by writing awful programs is, I think, still better than not having them here at all.) Making analogies to natural language is always a little dangerous, because nobody would program in natural language even if the option were available. Nevertheless: imagine how frustrating it would be if in learning to speak English, it became at some point along the way \impossible to speak bad English----especially if you came from another dialect or language. Suppose you are newly arrived in an England or America; you want to get around and start living life in this new country from day one; but people tell you: Wait. I have five books here that you should read. There are many screencasts, and myriad blog posts, that need to be read. You can only speak this language if you are a really, really smart person. Go away and read all these, and \\don't talk to me until you are through\\. Nobody manages to learn English this way. They only manage to learn it because even in its most bastardized form, it is still useful. You can look at a phrasebook and get useful information for day one, even when your accent and grammar are horrible. What happens is that you start talking. If you are a socially apt person, \and you happen to have friends who are a little indulgent, you start to pick it up. At some point you may indeed want to sequester yourself and read some of the great authors and even read a few textbooks to get a feel for proper English style, but if you are constantly worried about making a bad impression, even doing this will not make you able to learn----you will stay in your room and talk to no-one. The greatest killer to ad-hoc learning would be if you inhabited circles where one-upsmanship was common; where you constantly felt you were being judged by what came out of your mouth, rather than by what you really meant; where there was a kind of xenophobia that considered new entrants a threat rather than an opportunity. Some of the dismissive things that are being said about Steve Yegge and Joe Programmer here have quite a similar tenor. Mr. Yegge is right: this kind of etiquette is not helpful. He is also right that it only takes a few people to make the environment unpleasant. We need to develop an etiquette that is helpful and welcoming, and (though people do come in many levels of abilities) does not disparage people for having at a given time \less ability than you do. As you have no doubt found, people really do learn programming languages in an ad-hoc way. They learn to build programs by making useful programs from day one, in any way they know how; they will never acquire the art if they are required to stay in an ivory tower. If Clojure ends up becoming yet another Lisp that nobody uses, then I really don't see the point of it. There are already plenty of Lisps that nobody uses; why go to the trouble of making another? If the cost of having extra users ends up being spending a few more seconds filtering out "noise" in the group or on the IRC channel, then this cost is well worth it. If the cost is a little more humility, then humility is a good thing anyway. And all those extra users are going to bring improvements (and if you don't like a particular 'improvement' they bring, then you are welcome to ignore it; but many of these improvements will be things that \you use, too). They have bosses who won't use the language if it can't be set up in a few minutes, but who have the ability to direct vast resources towards helping any language they \can get to like; they have friends who are well-skilled but wedded to an existing paradigm, and aren't quite adventurous enough to try something new unless it gives them some immediate traction. All of these people, taken in aggregate, are going to bring beneficial changes. It still requires a strong hand at the helm----but that hand is now going to be able to steer many more people in the right direction. At some point this language is going to have to fix up its ecosystem; the only question in my mind is whether it is ready to do so \now----I don't see why not. Meanwhile, the idea that Clojure should aim to stay small, or that it is simply too difficult for most people to pick up, is a counsel of despair and arrogance. You don't know this. As Steve Yegge wrote in an earlier essay, there \was no acceptable Lisp----the road petered out to a dirt track and led to the same godawful swamp we've been mucking around in all these years. Lisp never really had a chance. Clojure may in fact give Lisp a chance, but it is going to have to be a little more responsive. I think you are going to end up being surprised at how smart people really are when they are given the right tools. There were many more smart people in existence than were willing to program machine code; there are still more smart people in existence that will not program Java. I was drawn to Clojure because I felt it was another evolutionary step in programming. I hope I am not wrong. I think Mr. Yegge is trying to help us. He hasn't written his blog post yet, after all----though if he reads this thread, I am afraid it is simply going to confirm his worries. . I once had an English teacher----a prescriptive grammarian par excellence----who posted a bumper sticker in his room: "Hopefully is an adverb". He may have been right that the usage of "hopefully" he deplored was a little tacky-sounding, but that it was totally useless----this I could not accept. I later learned (shoutout to J.C. Smith, in case you are listening!) that this "hopefully" is in fact a \sentential adverb. Sadly, some people have problems using sentential adverbs. I have no such qualms: Hopefully Clojure will turn out to help large numbers of people write useful, comprehensible programs. Hopefully it will change the mainstream and actually make programming a more joyful and endurable activity for all. At this it may or may not fail, but we won't really know without trying to step beyond a niche. I think making a welcoming culture that can nurture and build such a language is a noble goal, and well worth pursuing. On Jul 6, 9:42 am, Carlos Ungil <carlos.un...@gmail.com> wrote: > On Tuesday, July 5, 2011 8:08:51 PM UTC+2, Sean Corfield wrote: > > > It might be an interesting community exercise to examine the 23 GoF > > patterns and discuss whether they are applicable in an FP world and, > > if a pattern _is_ still applicable, what it would look like? > > > > Hi Sean, > > take a look athttp://norvig.com/design-patterns/index.htm > > I think it corresponds to what you're suggesting. > > Cheers, > > Carlos -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en