With apologies to John Gruber

For a little while now I’ve been trying to stay out of Python framework debates, partly because I just haven’t had the time and partly because things seem to be taking a turn for the nasty again. But recently it’s been harder and harder to keep away, especially with the hard work of a new entrant into the arena: Noah Gift, whose blog posts at O’Reilly have, in the last month or so, put him into serious contention for Jackass of the Year honors in this little niche of the web-dev world.

Noah first appeared on my radar last month when he posted an article in which he argued against Django on the following grounds:

Additionally, web frameworks, like Django, can lock you into a specific set of “tightly coupled” components, in which your ability to use other components, like SQLAlchemy, is not possible.

Yes, you read that right. It’s not just that Django’s default ORM isn’t SQLAlchemy, it’s that Django outright forbids the use of another ORM. Or of any component not in the default stack. I was wondering how we managed this feat, until I saw Noah trot out an analogy which, all things considered, is perhaps the most vicious piece of lying, stinking FUD I’ve yet seen in the Python framework debates (and that’s saying something, believe you me):

Clearly the better solution, is a loose set of components that work together in a unified fashion under one specification, much like how the standard library of Python itself works. I suppose, to further illustrate the point, can you imagine how irritating it would be if you used, say, the tarfile module, and that meant that you could not use the zip module?

Yup, that’s a great summary of how Django works, except what we really do is much more insidious: instead, Django reaches out into its users’ brains and removes their knowledge of Python’s import statement. At least, that’s what seems to have happened to Noah; maybe I should look through the reStructuredText sources for the Django documentation sometime and see if I can spot the fnord directives.

Or maybe Noah’s just making things up as he goes along, piling on a little extra bullshit whenever he’s really not sure what to do next. But it’s OK, because he added a followup saying that

I want to make it clear that I am not slamming any web framework, including Django

I like that trick so much I’m going to appropriate it:

I want to make it clear that, up above, when I said Noah was in the running for Jackass of the Year, and that he was spewing vicious, lying, stinking FUD, I wasn’t slamming any person, including Noah.

What a great rhetorical device.

Anyway, the alleged point of Noah’s various ramblings on Python frameworks has been that “code re-use” and, especially, “component-based architectures” are the way forward. Now, it so happens that I’ve been meditating recently on the many possible meanings of that phrase, “code re-use”, because it seems to mean something different every time I hear someone else use it. So naturally I was interested to find out what Noah’s idea of “code re-use” was; I’ve been collecting my thoughts on the subject into an article I plan to post in the not-too-distant future, and so any input he had would be greatly appreciated.

Today my long wait ended, as he posted some more thoughts on framework comparisons. He started out reasonably enough, arguing that documentation and marketing are ultimately the key factors to a framework’s success or failure. That much I can agree with; poorly-documented software is much more susceptible to failure, and Java taught the world that you can sell literal piles of feces to Fortune 500 companies if you wrap the package up in enough buzzwords.

But that was merely an appetizer, building up to the main course: Noah’s real definition of “code re-use”. You might want to sit down before reading this one, because it’s a doozy:

I suppose I should probably bring up that fact that Plone 3 is one of the most kick* Content Management Systems on planet earth, see PyATL. If you want a blog, install Plone, if you want a wiki, install MoinMoin, or Plone. Unless you want to learn about writing a CMS or Wiki, you are essentially, self-gratifying yourself, to put it diplomatically, by recoding a solution to a problem that has already been solved.

Yes, folks, that’s right: “code re-use” means “use the software I tell you to use”. Anything else would be extremely uncivilized, apparently.

Still, it’s nice to know that the CMS problem has been solved once and for all. If everybody would just shut up and use the software Noah says to use, the world would be such a nicer place, without all these pesky flame wars about whose penis is bigger whose software is better.

And although there are still about thirteen hours left in 2007 in my time zone, I think I can already safely predict — based on his impressive work down the home stretch, and during the ever-busy holiday season, to boot — who’s going to get my vote for Python Framework Jackass of the Year.

Comments

eliott
December 31, 2007
#

I got a kick out of your article.

I had read Noah’s… umm… ‘piece’ earlier this morning, and chalked it up to wasted time. Having read this rebuttal though, and the mirth it brought to my day, I consider my time recaptured.

Thanks. :P

bubbles 2.0
December 31, 2007
#

hihi, yeah he is a good choice for jackass 2007. happy new year!

Mark Ramm
December 31, 2007
#

Sure Noah may have said some unpleasant things about Django, and sure he may have gone overboard with his analogies. But you gotta admit you are the one who made it personal.

Given this, and this year’s previous framework blow-out which I seem to recall you being involved in, I have one piece of 80’s style advice.

Take a chill pill dude.

I see a lot of real philosophical, procedural, and practical differences between the way centrally developed frameworks like Django, Zope2, and to some extent Plone work and the way that frameworks that develop from via independent components like TurboGears/Zope3/Pylons work.

And exploring the pros and cons, of these two ways of working is very important to the python wcommunity as a whole and all of us web framework guys in particular.

But all these stupid flame-wars keep us at the level of personal-attack, personal-opinion, and only serve to distract us from actually learning anything from one another.

Sure, Noah is wrong to use the analogy he did, and I would congratulate you if you called him out on that. But, I think you are out of line in this post, and your behavior reflects badly on Django and the python community as a whole.

Heck, you even mention in your own comments policy that you will remove or edit a comment if it; “contains profanity or personal attacks…” So, I’d suggest re-reading your policy and applying it to this post, and see what you get.

Adrian Holovaty
December 31, 2007
#

James, yeah, personal attacks aren’t necessary.

At the end of the day, what really matters is the sites people create with these tools, not the tools themselves. If you’re going to judge someone, judge the sites that person makes, instead of the tools that person uses.

James Bennett
December 31, 2007
#

@Mark: Believe it or not, I toned this down quite a bit from the initial draft. I have nothing but respect for you and all the other folks who are constructively doing good work on and with frameworks. I’m quite happy to accept and respond to constructive criticism, and in the past couple weeks I’ve had a couple of very productive conversations with various people on the merits of different approaches to framework design.

But the sort of stuff Noah’s been posting at the O’Reilly blog, frankly, is neither constructive nor good, and neither receives nor should receive respect. I don’t tolerate unabashed FUD hiding behind the “oh, I’m not slamming any particular framework” ruse, not when it most certainly is slamming on the hard work of people I know and like.

@Adrian: it’s not personal, it’s an application of duck typing. If it sounds like FUD and it smells like FUD, I’m going to call it FUD and I’m going to call out the person who wrote it.

James Bennett
December 31, 2007
#

And if anybody can find a point in this article where I’ve misquoted Noah, quoted him out of context or otherwise misrepresented what he was saying, do let me know. There’s not a lot of wiggle room in interpreting what he’s written in those last couple frameworks posts, but if there is any I’ll break out the principle of charity.

cynic
December 31, 2007
#

I can understand why you’d be cheesed off when someone comes across as arrogantly dismissive as Mr Gift does in his blog; and, clearly, people created the plethora of current web frameworks for python because they didn’t like what was out there…and I’ve seen it stated bluntly that in many cases it was easier to build yet another framework from scratch than try to LEARN something as monolithic as Zope.

At the same time you shouldn’t throw the baby out with the bath water: what he says in that post about marketing and (esp) documentation is easily observable in the wild: Ruby on Rails is it’s own cottage industry thanks to marketing and the flood of books; tutorials; and screencasts aimed at teaching beginners how to get simple stuff done painlessly.

I other words: take that anger and channel it into making ‘Practical Django Projects’ the best introductory book on any web framework in the history of ever; because he’s not just wrong, he’s EXACTLY wrong: there is a hunger for exactly the sort of book that shows you the ‘how’ and ‘why’ and ‘what’ to do in order to build your own blog, wiki, CMS, whatever. I want to know what I’m doing and how all the parts work so I’ll be able to fiddle with it until it does exactly what I want for whatever the given project is. If Mr Gift likes ‘turn key solutions’ and black boxes he’s welcome to just plug and play with Zope, Druple, Rails or whatever (and more power to him).

Me? I’m drumming my fingers already waiting on that book you’re writing.

So: less angry blogging, more documentation book writing; pretty please?

david dahl
December 31, 2007
#

No need to take a chill pill, Noah is full of it on this topic. We are writing a CMS for a specialized niche industry. Plone would not work in any way shape or form. Django’s flexibility and the fact that it is an amazing framework makes our job easier than trying to customize Plone or some other thankless task.

Thanks for calling bs on this piece of jackassery.

david

redditor
December 31, 2007
#

He’s even less eloquent in his criticism of Perl. And he doesn’t seem to be taking his own advice, as his personal blog is published with Blogger.

aaloy
December 31, 2007
#

I agree with James. The article is a FUD and somebody has to say it.

Why Noah does not compare learning curve, for example? He could also compare the ammount of time you need to create an small site, and the hardware you need to run each system.

One of the things I like best from Django is that you can use any Python component and code you like. Sometime you will be breaking som Django “best practices” but this is up to you, the coder.

I have worked with Zope, Plone and Django and I can compare, and I prefer Django as is easy for me to adapt the web to the client.

Ian Bicking
December 31, 2007
#

This post is out of line, and the way you are reacting to Noah is inappropriate.

I take this personally because I think there is a Python web community larger than one framework, that both you and I and Noah belong to, and this kind of language is destructive to the building of that community. The form of your rebuttal was hurtful, and that’s not the kind of community we’ve been forming, and it’s not the kind of community I want to be part of. Hurtful language like this is inappropriate, even in response to similar language (though nothing Noah said took that form at all, and I hope he does not respond in kind).

Adam
December 31, 2007
#

Adding on the “it’s FUD” bandwagon, in the comments, after Jacob calls him out, Gift says, “I will gladly correct anything that is wrong in my post, if you point it out.”

Well, Jacob pointed it out pretty clearly that he’s totally off base with his comment about Django and SQLAlchemy. He makes the point again in a following comment (less rudely ;), and then Simon makes the same point, even pointing out that he’s personally built a large Django site using SQLAlchemy. So where’s the correction? Nowhere that I see.

If this were just some random guy posting on his own little site, it wouldn’t matter so much, but he’s writing a blog published on O’Reilly’s site. In my mind, that means he has a responsibility to at least attempt to present accurate information and correct mistakes, not to spout off on topics he admits he doesn’t know much about.

The stakes are made clear by “anonymous coward” in the comments:

I’m kinda new to Python and I’ve been advocating to be able to use Django at my job for a long time, and have met up with a lot of “but it’s not PHP and everybody has to use PHP for the web” crap. When my manager finally agrees to check it out, she googles Python and Django and finds a bunch of silly arguments like this, and I have to do damage control on that.”

When his manager sees this little remark on an O’Reilly blog, she’s going to take it seriously, and she’s not going to read the comments to get the full story. That is why this is a problem.

Jefferson
December 31, 2007
#

+1 to Ian.

Please keep your emotional issues away from Django—it’s not something I as a Django developer want to be identified with.

Ben Tremblay
December 31, 2007
#

Cornering a sophist is like nailing jello to a wall … no 80/20 rule here; having any effect is frustratingly slow even when you’re pains-taking in your efforts. (Which, seems to me, you’ve been … pretty well modulated “trash talk” here. BTW: you could have included “vapid” and “specious”. But that’s the thing; really addressing the matter becomes a workshop on applied logic. Who has time/energy?!)

Sophistry isn’t just making things up or talking non-sense; it’s the fine art of using substantial truth to package a baseless agenda or personal fiction.

[D]ocumentation and marketing are ultimately the key factors to _‘s success or failure” … sure thing … like distribution Gack Ptui! in the music biz. There you’ll find me doing sound / lights. Here? I’m sticking to “compulsively tech_doc”. I hope this doesn’t skew your activity for another moment.

best of ‘08 to y’all

—bentrem

— When you look to see how the system works Likely you will find that it doesn’t.

Mark Ramm
December 31, 2007
#

First, I’m not here to defend Noah, he seemed a bit brash and condescending towards Django, and I’m not defending that at all.

In fact, I recently set out to learn Django because I think there’s some valuable stuff in there which is being discounted by some people because they think django is bad on ideological grounds. It didn’t hurt that I had a project that I think is very well suited to Django, and that I had help from some more experienced Django developers…

Hopefully I’ll be able to get my thoughts on all of that written up over the next week or two. Ultimately, I’d like Django and TurboGears to work together as well as TurboGears and Pylons — if not as closely.

But since you asked where you might be taking his words out of context….

I also think Noah’s secont post has very little negative to say about django. He mentions django only to say that they have good docs, and perhaps to say that “conceptual integrity” isn’t the issue, it’s documentation.

As far as your direct quite, I don’t think Noah’s comment on that has anything to do with Django per-say people are building wiki’s blogs, and CMS’s in TurboGears as well, and he is (or at least should be) giving equal weight to those people in his critique. So to interpret his attack — in that post — as being against Django is unfair. He’s critiquing everybody who’s does web development and isn’t willing to look at and learn from other people.

And Zope is the grand-daddy of python web development, so he is right that we ought not to ignore the things that the Zope community learned the hard way.

And, in spite of some of the other abrasive, rhetorically overblown, and condescending stuff he says along the way, I think that’s actually a good point.

I think both Django and TurboGears are examples of how the python community learned from Zope2’s problems. But to be fair, I think Zope 3 demonstrated the result of a lot of that self-critical insight before either of our frameworks saw the light of day.

So, I think it’s pretty clear that Zope has also done some things right, and we need to do learn from that as well. On the topic of web-frameworks and componentization, I think breaking the zope2 monolith up into components in Zope3 was the right thing to do, TG is moving the same direction for the same reasons.

Perhaps we’re wrong, but I think this is a discussion worth having. It’s that this whole discussion is now in danger of getting tied up in too much rhetoric, and too much crazy stupid name calling to be taken seriously and I think that’s a shame.

Mark Ramm
December 31, 2007
#

James: You said “it’s not personal, it’s an application of duck typing. If it sounds like FUD and it smells like FUD, I’m going to call it FUD and I’m going to call out the person who wrote it.”

Calling FUD FUD is one thing, calling someone jackass of the year is another. That’s the point I was making, and Adrian was agreeing with. Attack the FUD, but treat people even those with whom you vehemently disagree with some basic respect.

Adam: The stakes are clear, if your boss was reading up on Django on the web, and this post here is the first thing he found, what would he think of Django and Python? I think both Noah’s post, and this one have issues, but I draw a line at personal attacks. As does James (at least that’s his comment policy).

James Bennett
December 31, 2007
#

Mark, Ian, everyone: I understand and respect where you’re coming from, more than I’m able to articulate. I’ve tried, in a followup, to explain why I wrote this rant; I don’t know that it’ll be a satisfying explanation, but it’s the only one I’ve got right now. And now I’m going to take my own advice and shut up.

Jeff Croft
December 31, 2007
#

James: I think what Mark is trying to say is, “Don’t hate the playa, hate the game!”

Sorry, I couldn’t resist trying to lighten the mood. :)

Ville Säävuori
December 31, 2007
#

Oh come on dudes! Don’t take it so seriously. This is, hands down, the best (Python) rant of 2007! :D

I agree with James 100%, especially about the fact that whatever he writes here are his opinnions, not anyone elses. I would hate it if nobody would respond to the kind of FUD that we’ve been reading from the O’reilly blog. There is nothing destructive in this post, which unfortunately cannot be said from some of the writings by mr. Gift.

I find it odd that people take this kind of rant personally. Its just a rant. And a pretty damn good one, IMHO :)

PS. Happy (and peacefull) New Year, everyone!

Foo
January 1, 2008
#

This guy Gift doesnt seem to be…. very gifted… “use plone” jeez….

Anyway James, never forget how thankful me and i bet tons of others are for your dedication to the djangocommunity.

Fredrik
January 1, 2008
#

I take this personally because I think there is a Python web community larger than one framework, that both you and I and Noah belong to, and this kind of language is destructive to the building of that community.”

Having done Python advocacy for well over a decade, I take the barrage of FUD, not to mention the obligatory passive-aggressive “now you’ve hurt our feelings and you’re ruining our community” nonsense followups from the usual anything-but-Django advocates, personally as well. It’s you guys who are an embarrassment to Python, not Django — which isn’t just a damn good piece of highly Pythonic engineering with a killer community, but is also, right now, doing more to sell Python than any other Python library or application ever released.

If your boss was reading up on Django on the web, and this post here is the first thing he found, what would he think of Django and Python?”

That’s about as close as “won’t somebody please think of the children?” you can get without actually saying that. And the answer is, of course, that she’d congratulate the team for picking the winning technology. Because it sure is easy to spot the losers here.

mike bayer
January 2, 2008
#

Well whatever I can do to shed this “known django haters” label that you’ve just coined would be just great (and the condescension isn’t necessary either)- I have no problem with Django at all. I’ve publically stated that Django is great to have, attracts a tremendous number of people to Python (including, quite valuably, frustrated Rails users), is easy to use for those who are looking for a fast up-and-running experience (and therefore they aren’t banging their heads over our tools when they’re not the appropriate choice) and I’m very happy it’s around and is as popular as it is. I also have no issue that it doesn’t use SQLAlchemy or Mako or anything else like that; rewriting Django’s ORM to be based on SA would be pretty impractical, and I don’t even consider it to be much of a “competitor” to SA since our use cases and target applications are quite different.

Also you might want to fact check on Mark Ramm as well, as he just blogged about his new project that he’s writing in Django. As far as why you think Ian is a “Django hater”, I’ve not the slightest clue - for Ian to utter a “hateful” comment about anything would be pretty much a momentous event.

My actual issue with Django lasted for only a few months, years ago, and was exactly limited towards the singular notion that Guido would proclaim Django as “the one web framework for Python”, thus killing off everyone else’s projects overnight and turning Python into another Ruby scenario where theres pretty much no choice on how to build web applications. Back on that single blog thread, which is the only place you could have gotten the idea that I’m a “known Django hater”, at least a few people were calling for this action. My particular nastiness on that single post has long since been apologized for (like, the day after), and there was a lot of apologizing going around after that thread in general. Fortunately Guido soon after was quoted as calling the idea of “one framework” “silly”, and the Python web framework community has flowered very nicely ever since.

So you and any other Django fan who thinks I or Mark or Ian have some kind of problem with you can drop the adversarial tone, please (except of course for Fredrik…he clearly enjoys it too much). The “why isn’t there only one web framework” ridiculousness is long over, all of our projects are doing great, and nobody hates you or Django or has any problem with the current state of affairs.

Mark Ramm
January 2, 2008
#

I too am no Django hater, I’m using Django in a major project right now. I happen to work on other technologies because I don’t believe Django is our should be the only way to do web development in python. The fact that I want to explore some different approaches doesn’t lessen my respect for the fantastic work that’s gone into Django.

I honestly hope Django becomes more popular, not less, and I’ve tried to make people calm down on the Django bashing in the past.

Ultimately, I think both Django, and TurboGears are continuing to grow by bringing new people to Python, which is a good thing.

If you want to label me as a “Django Hater,” there’s nothing I can do to stop you. And really I don’t mind, but I will point out that all I ever objected to was name-calling and personal attacks, and I’ve never bashed Django or any of the Django people.

chrism
January 2, 2008
#

I really don’t want to fan the flames here, but I’ll note that I’ve met Noah and he’s one of the “good guys” as far as I’m concerned.

I’ll also note that Zope gets mischaracterized, crapped upon, verbally sullied, etc, pretty much daily (see above for examples). However, those of us who have an investment in it continue to use it more or less happily and without returning fire, because it’s pretty much pointless.

The more popular a platform becomes, the wider the range and the louder the volume of critics. It’s probably wise to get used to a bit of criticism, even if it’s not as accurate as you’d like, because otherwise you’re going to drive yourself mad and look silly doing so.

Fredrik
January 3, 2008
#

I’m taking the pro-Python position here. Always have, always will. I suggest you guys read up on how Python has been marketed and positioned over the years; there are plenty of lessons for you to learn.

Fredrik
January 3, 2008
#

I’ll also note that Zope gets mischaracterized, crapped upon, verbally sullied, etc, pretty much daily (see above for examples).”

Just for the record, and slightly off-topic, Zope/Plone are excellent tools in themselves, and the obviously quite healthy ecosystems that has grown up around them are a clear proof of that. I’m not sure they’ve done much to sell Python, though…

James Bennett
January 3, 2008
#

OK, gonna close the comments here since they’re getting worse rather than better.