Jacob Kaplan-Moss


I wrote this post in 2006, more than 17 years ago. It may be very out of date, partially or totally incorrect. I may even no longer agree with this, or might approach things differently if I wrote this post today. I rarely edit posts after writing them, but if I have there'll be a note at the bottom about what I changed and why. If something in this post is actively harmful or dangerous please get in touch and I'll fix it.

So it seems the BDFL Pronounced that Django is the Python web framework.

Obviously this makes me pretty damn happy. I’m sure this will help people trying to choose a web framework come to Django, and I think they’ll like what they find. Personally, I think Django’s the best tool to develop web sites – but of course I think that.

However, I want to make sure everyone has read Kevin Dangoor’s thoughts on the announcement. Kevin’s an awesome guy, a great programmer, and although I disagree with a few details here and there [1], the general gist is spot on.

Probably the worst thing about tech communities are the holy wars. Emacs vs. vi is the Father of All Holy Wars, of course, but then there’s the operating system thing, the programming langauge thing, and now (it seems), the web framework thing.

I once asked a carpenter if he and his construction buddies sit around and argue about what brand of hammer they use. He looked at me like I was crazy – “you mean you guys do?”

As I see it, there’s two types of evangelism that happen in tech communities:

The first involves helping people who are using old or broken tools upgrade to something more productive. For example, helping someone switch from generating RSS with print statements to using a dedicated RSS/XML generator, or helping someone writing sites in plain old PHP switch to an enlightened framework like Django or RoR. This is the “good” evangelism – it’s like helping a budding carpenter switch from a hammer to nail gun.

But there’s a second, insidious form of evangelism which tries to convince people that the tools they’re using are somehow “wrong” and that they ought to switch to using the “right” tools. These arguments inevitably involve vague statements that Option A is intangibly “better” than Option B: “You’re using Ruby on Rails? Dude, you suck – Django’s totally better!”

These types of arguments are essentially moral, and that’s why they fill me with disgust. They imply that you’re somehow morally inferior for choosing some tool over another.

At lunch yesterday I talked with some coworkers about all this stuff. Jeff pointed out that open source marketing often revolves around these types of moral arguments. He specifically noted that some of RoR’s success can be attributed to its community’s willingness to make these kind of moral arguments – “Java bad, Rails good” is how RoR (successfully) sells itself to the “enterprise”. There’s plenty of other examples, of course – Firefox, Linux, and dozens of other open source projects have benefited highly from moral marketing.

But that’s just not a place I’m willing to go. Inevitably, moral marketing comes across as arrogant and self-centered; many former Rails hackers coming to Django cite the arrogance of the Rails community as the primary reason for leaving. Indeed, I came to love Python specifically because the community was usually friendly and nearly always at least civil. If there are holy wars within the Python community, they’ve been small enough that I’ve missed ’em.

If it’s a choice between being the most popular web framework or the one known for the nicest community? I’ll take the later.

Although this Pronouncement is good for Django – and especially good for newbies confused by the rich tableau of Python web development options – I fervently hope it doesn’t kick off a holy war.

Right, if Guido gets to Pronounce, I do, too: Use the right tool for the job. TurboGears and Django (and Pylons, Quixote, web.py, etc.) fill different niches in the Python web dev landscape, and there’s no reason – or need – for there to be One True Framework.


In particular, Kevin's assertion that Django somehow will refuse to benefit from future developments in the larger Python community seems disingenuously naive. Kevin's been around long enough to know that there are many ways open source cross-pollinates besides the bundles and glue code approach of a super-framework like TG. Just because Django doesn't use SQLObject as-is does not mean we're somehow willfully ignoring improvements.

Again, there are benefits to straight-forward bundling, and there are others to letting influence be more piecemeal. It's tradeoffs all the way down.