Isn't the idea of doing things just your way a great one?
It sure sounds great, but it's too simplistic a view.
Chapter 4 of my copy of The Mythical Man-Month has a permanant bookmark now: it is the chapter about conceptual integrity, and after rereading it this weekend, I've finally figured out that conceptual integrity is exactly what continues to frustrate me about Pylons. When there is no conceptual integrity, a product is unusable as the basis of further programming, and a product with no conceptual integrity is fundamentally incomparable to one that does. Brooks says as much in the very first chapter - in fact, on the first page:
One occasionally reads newspaper accounts of how two programmers in a remodeled garage have built an important program that surpasses the best efforts of large teams. And every programmer is prepared to believe such tales.... Why then have not all industrial programming teams been replaced by dedicated garage duos? One must look at what is being produced.
A lot of things have changed since Brooks wrote those words, but I'm continually amazed at how accurate they remain. Today, the URL mapper, the template engine, the request object - these are things where a garage-group project will more than suffice. And their work will quickly converge to similar, swappable components.
But these things are, as trivializing as it sounds to say it, commodities. They take time and effort to make, but that is all.
Brooks says that moving something from being a program to a programming product takes three times as much effort as writing the program itself. This effort is put into documentation, maintenance, refactoring, and stability. This effort has not been put into Pylons.
It manifests itself in everything from the font size (too small) to the section header (mislabeled) to the content itself (which is out of date in claiming that the other documentation is out of date) 1.
And, of course, there is the sheer incredulity of the reader that authentication cannot be handled by the framework, but must be home-grown. As if merely there to puntuate my point, the "solution" for authorization:
These are not trivial issues. If a project lacks conceptual integrity, you will forever be plagued by changing interfaces, continually deprecating APIs, and most importantly, you will always lack consistency in how things are done.
There are a million excuses that can be told a million ways: the libraries and the framework are not 1.0. They are in development. They are improving. "Patches welcome." I don't buy these arguments, for one simple reason:
The bazaar is not a catch-all. If you are going to release software with the intent of other people using it, take the time to document it, take the time to test it, to use it, so that other programmers aren't left out in the cold:
(I first noticed the message on the 21st of November. I pointed it out to my Pylons-content2 coworkers later that week, and they weren't worried - it hadn't even been a week since the notice was put up! Well, it's almost a month later, and I, at least, am not surprised to still find it there. I just hope no one tried using it, only to now find themselves stranded.)
I wish I could say that what I have written so far is unfair. I wish it were overly harsh, or even in bad faith. But it's not: projects which are not documented are not useful for anyone other than the authors, and Pylons lacks useful documentation. It gets old, fast, for everyone else.
How To Have Conceptual Integrity
Every once in a while, programming system products - as Brooks calls them - are made which are joys to program for and in. Django is not a complete product: it is just one piece of an ecosystem which must include databases, webservers, operating systems, and even, to some extent, client-side browsers. But it is Django that fills a rather large piece, spanning from persisting data - the mechanics of which are dealt with by databases - to generating markup for users, at which point webservers take over. And Django fits this difficult role splendidly.
The root cause of this (so far as I can tell, as an outsider) is that Django was made for an already-existing need. As such, the programmers who made it had a very clear sense of what needed to be accomplished, and in this way, they acheived conceptual integrity. Pylons, in contrast, has been made and marketed as a Rails for Python. Unfortunately, even Rails has conceptual integrity where Pylons lacks it. Rails was the first in its domain, and as such mostly had to be written from scratch; the same was true of Django. Pylons, on the other hand, tried and tries to use preexisting modules wherever possible, without regard to how well they fit within the framework.
Worse, it was developed in expectation of, rather than in tandem with, applications. Surely, someone writing applications would have realized how awkward it was to use a class with a __before__ method instead of a function with a decorator, but somehow, Pylons has missed this, and now it's too late to break backward compatibility in such a dramatic way.
Unfortunately, that's not a very useful observation. What's done is done.
Fortunately, I think there are a few other things to point out that can be done to improve the conceptual integrity of a project.
Opinionation is Not Bad
E.B. White's The Elements of Style is chock-full of writing gems. In most situations, what he writes isn't very controversial, but on issues where English leaves some ambiguity - and there are a lot of those - White does something refreshing and extremely effective: he takes a side.
Singular possessive with an ending s? Doesn't matter, the trailing S should not be removed (Charles's objects, etc). There is no particular reason to follow that convention; it is, largely, a matter of preference. In the long run, it is as insignificant as your choice of text editor, templating engine, login shell or intentation style. There is only one important thing: that you decide. And then you must be consistent.
Reuse is Not an End
Software reuse is a programming holy grail - or, perhaps, a siren song. I think it's far more useful to say that we should not reimplement without reason, than to say that we should avoid reimplementation. The latter is certainly in line with conventional thinking, but it's missing the point. It's the same thinking behind calling the request argument to each Django view repetitive. Well, is it not repeated for every controller? Yes - as it should be. The exact wrong "solution" is to therefore make the request object a global variable, as Pylons does. The goal here is not to avoid typing "request" many times - the point is to say exactly what you mean. And in a controller, you mean to accept a request and return a response, and that is exactly what Django makes clear, and what Pylons obscures behind multiple global singletons.
The misguided quest for reuse at all costs can be seen in how Pylons approaches libraries. A choice of multiple ORMs, templating languages, URL dispatchers? Why? So that every programmer's Pylons installation will be just different enough to be unmaintainable by other Pylons programmers? Or perhaps so that any attempt to keep your app generic results in going directly to the lowest common denominator?
I have no idea what the theory behind making everything a plugin layer was. I only know what happens in practice. What happens in practice is that development time which should be spent on writing solutions that work was instead spent porting Myghty - which was used because it was once the default - to Mako (the new default), and then yet more development time spent wrangling over whether to use Genshi or Mako. And in the end, other merits aside, we ended up using Mako because it was the default, and in most situations, that will be the case: the default will be used for maintainability purposes (and quite rightly so). The "best tool for the job" almost always consists of "the most easily maintained tool for the job," which itself correlates strongly with "what comes out the box." The fewer pluggable, add-on, additional-setup-required components there are, the better. Two templating languages is not a feature, it's a mistake. Four? That's a nightmare.
But Pylons seems to have missed this point. They hold reusability on too high of a pedestal. This is the same misguided attitude that brought us Java and Zope; wrapping everything in endless wrappers does not bring code reuse. Making all templating languages work through Buffet does not mean that suddenly templating languages are interoperable; it just means that templating language implementers have yet another entry point to code for.
Buffet deserves special mention. Unlike, say, a JSON decoder and encoder, you are never - quite literally, never - going to change templating engines without also changing the templates themselves. You are going to go through all of your controllers to change the template filename. There's no way around that. So why, then, are the Pylons developers so intent on making the templating engine something that can be changed completely from a config file?
It's just plain missing the point, that's all.
Software reuse is not an end. Software reuse is a means, and if the available means don't meet your ends, then find other means - write it yourself, if need be. Touting software reuse as a feature is missing the point: it's like a database implementer touting that they use a particular parser. That's wonderful. Now how fast can you deal with my queries?
Make Decisions So Users Won't Have To
Don't Make Me Think is technically a book (and a good one!) about web usability. But the framework user is the programmer, so many of the same principles apply. One of the points that the author makes is that mindless decisions - usually about where next to click - are not nearly as "expensive", usability-wise, as difficult, conscious decisions. (My copy is at work, so I'm going from memory.) Likewise, asking your users to choose between multiple templating languages, ORMs, URL dispatchers and Javascript libraries is not doing them a favor.
When someone uses a framework - or, for that matter, a programming language - what they are really doing is delegating decision-making to someone who they think will have better judgement. Consider the disagreements over the decorator syntax in Python: people trusted GvR's judgement as to how to handle such a large project, even if they individually had different tastes. With Django, I have no problem putting the same trust in Django's authors. I don't like some pieces of their ORM, and I sometimes miss Mako, but I know that they're not going to introduce, barely document, and then deprecate something like SAContext. (This is one instance where I appreciate Ben Bangert's stance on Elixir, even if it's not the one I would have made. A decision is better than change.) And even then, quite often I find that, six months later, I can still edit my Django templates without a problem, but my Mako ones tend to have accumulated a fair amount of cruft, and I can't help but wonder if they weren't right after all. I can't analyze and agonize over every decision; instead, I leave those things to people who are better at it.
Pylons is not doing this for me. They ask the programmer to make too many decisons, and their components are disparate enough to make them lack a fundamental consistency.
What does Pylons value? What are its fundamental concepts? Where is its conceptual integrity?
I want to see Pylons take on these things, and I think it'll be better for it. Until then, I will be using Django, when the choice is mine.
-
It could, of course, be said that using this example is unfair, since the document is very out of date. Yet, when I click "Docs" on the Pylons homepage and search for "authorization", this is the first entry. I know, because I was bit by it. I don't care about what technical reasons there are behind it (it's Confluence's fault, you should search for "authkit" instead, etc etc) - just get it fixed, because there are people out there today who are struggling with this. ↩





Comments
14535 spam comments omitted.
I am no longer accepting new comments.
Will
#1253, 2007-12-16T21:29:56Z
Great essay.
One minor language nit: "a product with no conceptual integrity is fundamentally incomparable to one that does" should be "a product that has no conceptual integrity is fundamentally incomparable to one that does".
Feel free to delete this, if you'd like.
Daniel Andrlik
#1260, 2007-12-17T08:42:13Z
This is a great post, and pretty much sums up all the reasons I chose Django as well.
Longabow
#1262, 2007-12-17T09:54:01Z
Right on Dude!
I remember a quote from the Pylon's website, it says something like: "The Pylon developers are obsessed with re-usability"
... they should be obsessed with plain old "usability" instead, ...
heh
Jonathan LaCour
#1263, 2007-12-17T10:09:14Z
Great post Adam. For the second time today, you've inspired me to post on my blog in response to something you've written about. Keep up the insightful posts!
Nick
#1264, 2007-12-17T10:54:06Z
Your article answers well to my questions: why it's quite hard to start using pylons, why am I trying to start learning it third time and failed...
I was lacking the main concept: what kind of things I need to use on start.
Shino
#1281, 2007-12-18T04:47:41Z
Have you seen this?
http://mdp.cti.depaul.edu/
casseen
#1282, 2007-12-18T04:59:11Z
Pylons' dev-team has a much different philosophy than django's. And in my opinion there's nothing wrong with it. I really like the idea of bundling development effort by using allready existing components. Thats what made python so powerful after all. I also love django as it has this wide anticipated integrity and extenisive documentation. Its much more comfortable to build CMS-related sites with django, but for more advanced projects I prefer pylons or turbogears, as they are way more flexible. If documentation lacks(and this will change sooner or later), theres always the source to look into. Nick: You should definetly start learning pylons a 4th time, but this time try harder ;). Its worth it.
mike bayer
#1284, 2007-12-18T11:49:59Z
I dont understand the purpose of this post. Pylons doesnt miss any point at all. It is a terrific framework for projects that would like a loosely coupled framework with which to apply a wide variety of existing tools. And there are a lot of people who need that.
If you want an out of the box wizard/admin-tool-driven solution, then just don't use Pylons - it's not appropriate for you. I am thrilled that Django is out there, attracting tons of people to Python, and giving a place to those who are not in a position to be spending time experimenting or making finely-tuned choices about their application's construction - they'd be pretty impatient with our tools. Those that decide they need more control over things migrate to Pylons (where Django has already done the work of getting them involved in Python), where they're happy to dig in with the rest of us into all the details decisions that make very custom applications possible. This is all as it should be.
john
#1290, 2007-12-18T19:06:06Z
Sorry. Having used platforms with conceptually integrity and ones with that are stitched from best-of-breed or best-for-me components I'll take best-of-* every time. The problems arise in inflexible platforms when you get past simple and canned systems. Platforms with conceptual integrity tend to lose their effectiveness when the concepts reach their limits. Best-of-* platforms become infinitely more useful as the user platforms mature and code becomes more and more complicated. It's at this point that the developers are relieved that they weren't limited by conceptual integrity that was ultimately limiting.
Bob Ippolito
#1291, 2007-12-18T21:34:39Z
The Pylons approach works quite well if you already know what you're doing. There's a whole lot of brain damage in some of the choices Django and TurboGears have made and neither were tolerable for me so rather than building our own framework we could simply use Pylons and configure it with the pieces we needed. We've built a lot of homegrown stuff on top of it, but we'd have done that anyway because no framework ships with solutions that worked for some of our needs.
The people I've hired with previous Django experience much prefer working on our Pylons based architecture than hacking around Django's cruft. For us, the conceptual integrity is perfectly intact in how we do projects across our business and we don't need as big of a crutch as what you're used to.
If the Pylons project magically changed into what you suggest it should be, then we wouldn't use it. I don't want Mako or Django's templates. Our home-grown auth/authz, caching, and model systems (more than one db involved, though using SQLAlchemy for plumbing) serve our needs better than anything out of a box could.
Todd
#1292, 2007-12-18T21:49:39Z
Although I haven't had a need for python framework as of yet, I am VERY familiar with php frameworks...
I first went with Symfony, which was well documented and everything.. Problem is it added far too much complexity to even a mid-size project. I tried it for a year and still didn't fully understand it. I then looked into CodeIgniter for personal site and couldn't be happier. It does the things I want it to do without trying to force you to rethink everything and how best to "modularize" your code. It's best summed up as I want a "framework" that I can build on, not an application that I need to then customize to my needs.
Eric
#1300, 2007-12-19T09:53:10Z
In a way I see your frustration with the lack of obvious choices in Pylons. For some that can be a real deal breaker simply b/c they don't want to consider different components than the default. They say constraints set you free and this is definitely a great example.
On the other hand though, when you consider Pylons in light of all the web frameworks, it is more clear what the point is. It is not to provide something like rails, but rather it is meant to provide you the tools to make your own framework based on the tools you enjoy. You can pick your components and Pylons lets you not worry about the trivial details everyone has to do.
Personally, after trying way to many frameworks and eventually writing straight WSGI apps, I realized that Pylons is just glue for your own framework. True, it may not live up to your definition of a framework, but your critique doesn't reflect the variety of the python web development communities past.
steve_b
#1303, 2007-12-19T13:46:54Z
Adam Gomaa what is your aim in writing this? The issues you identify are real but this kind of rant ('mine is better than yours') and the responses it has generated here and in blogs elsewhere are reasons not to use any python web frameworks. Django, Turbogears and Pylons are all great and have different strengths and weaknesses. But instead of the generally positive, supportive vibe characteristic of Java world (where there are also several web frameworks), in python there is bickering. I'd rather debug XML config files than associate myself with the negative attitudes associated with python web frameworks.
sorry if this is a duplicate post, not sure it worked first time.
orcmid
#1305, 2007-12-19T14:16:19Z
I remember being drawn to your title and bookmarking my feed-reader for follow-up. I agree that one of the powers of a framework is to capture and convey conceptual integrity.
However, I leave you with your assertion about components and about where you start some sort of bake-off between Django and Pylons. I am completely ignorant of both, but I think there are two things evident without having to know anything. The reach of conceptual integrity and the importance of context for conceptual integrity with respect to what and for whom is being over-looked.
In promoting the conceptual integrity of something (as opposed to claiming its absence), I think one needs to characterize the level of abstraction at which conceptual integrity is being attempted, who is expected to operate with that level and for what, and how the guiding principles are reflected in the result.
I daresay that practically any framework, library, or interface I've seen could be claimed to be lacking in conceptual integrity by some yardstick it wasn't intended to satisfy.
Somehow, "works for me," "doesn't work for me," and such seem more useful than claiming some high-minded failure to achieve some unmeasured ideal of conceptual integrity.
Adam Gomaa
#1307, 2007-12-19T18:25:01Z
Sorry about this page being broken, I think I'm gonna be switching back to python-markdown for comments...
Adam Gomaa
#1308, 2007-12-19T18:37:39Z
Steve: My ideal outcome would be for the Pylons devs to be more opinionated. What it takes to be a framework that is useful to your users is to, first, say "My framework will be the best," and then, to make it so. The Django devs are doing both steps. The Pylons devs, capable though they may be of carrying out the second step, are waffling far too much, and I'd like them to actually save programmers who use their framework time and effort.
They need opinionation. Really. Look at Python Paste. It wasn't well-defined or opinionated; it gradually grew and morphed and now, it's practically a living entity, not completely understood by anyone other than Ian Bicking, and full of rather unrelated things. This isn't because Ian is lacking as a coder - not at all! - but because Paste has grown organically. And, well, code isn't organic. The same is happening with Pylons. It has had the same effect. Blindly lumping together everything under the sun, so long as it can somehow be wedged into WSGI, does not a framework make. It doesn't make your code maintainable or straightforward. In many cases, just the opposite happens.
I'd like to see more opinionation from the Paste/Pylons people, not less. It is, very simply, healthy.
I'd also like to see a concious, concerted effort to ask, for every change, "why is this good?" Take a look at the django-dev discussion over QuerySet slicing recently as an example. They spend a lot of time trying to figure out what will be best for Django programmers. Pylons seems to spend more time figuring out how to make every possible option available.
This is incorrect. It's not just a matter of opinion; it's not just a matter of taste. It's incorrect, period, to ask your programmers to make all decisions. Convention over configuration.
Adam Gomaa
#1309, 2007-12-19T18:42:49Z
Geez, and I forgot anyway that this isn't really about Pylons. It's about programming and about software development. Pylons is just one example. Software needs a philosophy of some sort - "we make it easy." "We do it correctly." "There is more than one way to do it." Again, what in particular you choose isn't as important as choosing, and then being consistent.
I don't see Pylons having made a choice or being consistent, but it's not nearly the only project. It's just the one that I work with every day.
Ian Bicking
#1313, 2007-12-20T00:52:15Z
A more opinionated successor to most of Paste (core, not Deploy or Script) is WebOb.
In its scope (which is admittedly fairly limited) it beats the pants off anything in Django: mapping HTTP, handling caching, handling conditional responses, testability, usability with middleware, compatibility with other frameworks, and symmetry of request, response, and both consuming and producing both requests and responses.
Observer
#1328, 2007-12-21T07:28:21Z
"A more opinionated successor to most of Paste (core, not Deploy or Script) is WebOb."
So what, pray tell, will WebOb be replaced with within a year, when you decide to start all over again?
Adam Gomaa
#1329, 2007-12-21T09:20:57Z
Obs: I think that's quite unfair. WebOb is a pretty nice piece of software - I looked at it a fair amount when rewriting this site. I'm unclear now on how much Yaro will be maintained in the future, so I may yet switch to WebOb.
foobar
#1332, 2007-12-22T01:36:54Z
Great post Adam. This is a new Python framework that you might like based on your comments. Its called Gluon: http://mdp.cti.depaul.edu/
Ian Bicking
#1410, 2007-12-31T16:17:20Z
Observer: I've only been extracting things from Paste when I feel confident that I know what they should look like.
Steve Bergman
#1419, 2008-01-01T21:34:39Z
Excellent summary of the situation. I checked out Pylons, but rejected it pretty quickly. After a year and a half of waiting for TurboGears to cough up the ever-promised complete documentation and stop compulsively reinventing themselves, I was not about to put up with even worse documentation and an even more severe identity crisis.
I knew I loved Django's quality documentation. But now I have a term for the other thing I so appreciate about it: Conceptual Integrity.
Thanks.
ynw
#1455, 2008-01-09T08:49:24Z
Great essay. Most of the frameworks just miss the point.
Sorry I am on Rails
#1459, 2008-01-09T22:06:09Z
Do you people realize all the "opinionated", "conceptual integrity", "don't make me think" stuff are already well implemented in Ruby on Rails?
I am surprised such a great and clever community like the Python's one haven't already forged a plain copycat of something that works.
With true and honest respect to you all.
Sorry I am on Rails
#1458, 2008-01-09T22:06:09Z
Do you people realize all the "opinionated", "conceptual integrity", "don't make me think" stuff are already well implemented in Ruby on Rails?
I am surprised such a great and clever community like the Python's one haven't already forged a plain copycat of something that works.
With true and honest respect to you all.
Adam Gomaa
#1502, 2008-01-19T23:30:58Z
That's actually a good point. Many Python frameworks take pains to point out that "we aren't a copy of Rails;" I wonder, what would happen if someone set out to be a copy of Rails?
Bruno
#1732, 2008-02-05T16:15:42Z
Mmm...
Reminds me of the first app we built with Django - was a version or two before the "magic-removal" (IOW: incompatible rewrite of the ORM part). Now we have newforms - IOW, incompatible rewrite of the form validation/rendering part. Can you say "opiniated" ?
As John points out, it looks quite like a MyFavouriteOS troll. And as far as I'm concerned, my own favourite is still Linux - anything but opiniated. I've had it too much with 'opinated' systems getting in the way. Not that MacOS (or Django) are bad BTW - they just don't fit my needs most of the times.
Lawrence Oluyede
#1876, 2008-02-12T08:16:21Z
One of the best post I've ever read. I second it in its entirety. As a pylons regular user at work I sometime struggle within its oddities. I also found WSGI being perfect on paper but troublesome because a lot of implementors didn't get it correctly.
kudos.
Isaac Csandl
#1878, 2008-02-12T09:18:45Z
I sort of agree with your point, but would like to share what I do. I play the role of "opinionated" for myself _within_ the Pylons framework. I wanted a simple to write but really powerful ORM with polymorphic multiple inheritance, so I opinionatedly chose Elixir + SQLAlchemy (regardless of anyone else's opinions). I needed my templates to be fast so I chose Mako. I don't need or want automatically generated forms or widgets, so I just use webhelpers and _design_ all my forms, rather than use something like django's admin or ToscaWidgets (which I might use if it ever gets properly documented, but in its current state, I found I can whip up all the forms I need faster by just writing them than trying to figure out widgets). One could argue that jQuery or Dojo is better/faster/smaller than Prototype. One might be right, but it works _enough_ and I'm getting my work done, so why rewrite everything?
Having made these decisions which suit the projects I'm working on just fine, I _ignore_ everything else. I'm very productive with these choices without being forced into them by the framework. Once you've established some techniques, you can really fly if you stick to them. Of course you have to question and improve them once in a while, but not every day, not when you're making progress on your work, not _every_ time something new comes along, not even new versions of what you already use.
Just because new stuff (let a thousand templating engines bloom!) is coming out all the time does not compel me to use whatever is new. Unless it's really... well, compelling.
Anyway, hope that helps the discussion.
Cliff Wells
#1925, 2008-02-14T01:25:50Z
You completely miss the point of Buffet. Badly designed as it is, the purpose was to make it easier to use the @expose decorator with various template engines from CherryPy. Later TurboGears (which was based around CherryPy) adopted Buffet, which prompted lots of template engine authors to standardize on it. Pylons chose to use it since it was now the standard and gave it instant access to a plethora of template engines. It isn't clear to me how this was a bad choice.
Also, I can't help but find it ironic that Pylons has a fraction of the documentation of Django and yet is still an order of magnitude easier to write applications with. I've yet to encounter a new Django user who didn't spend their first day swimming around in settings.py and urls.py trying to get things to work.
I think your points about Pylons' documentation is valid to a large degree, but it is also rapidly improving. On the other hand, a surprising number of people are able to become immediately productive in Pylons despite this shortcoming (the same can be said for TurboGears, btw).
Maybe Django has spent so much effort on documentation because it needs it? But what does that say about Django overall? If I had to (unwillingly) compare one of Pylons or Django to Zope, it'd be the latter, if only due to the relative complexity (Pylons is pretty dead-simple).
Overall I think comparing the two is pretty pointless. Pylons and Django, while both being "web frameworks", have a much different audience and different goals. Pylons is a step up from Paste but hardly meant to be a top-to-bottom development stack like Django or TurboGears. TurboGears 2 will be built on Pylons and be a much closer competitor to Django.
Some of us like a lightweight (i.e. easy to understand) framework that lets us make some choices. Remember, having an opinion might be a good thing, but it's also bound to incite a bit of disagreement. You can harp about how wrong everyone who disagrees with you is, but at the end of the day, you ought to just get used to it.
Moses Ting
#1992, 2008-02-21T17:29:27Z
I've a joyful user and a huge supporter of Django for the past two years. One of the main reasons I decided on Django from the beginning was because of their superb documentation practices.
ynw
#3408, 2008-04-29T20:19:17Z
This post applies to no-software products as well.
tom
#5338, 2008-07-19T15:53:41Z
I really think you're on the ball with regards to the overvaluing of code reuse in Pylons (which is reflected in a few other projects - notably Drupal), but I do object to your example of an auth layer as evidence that they stray too far towards modularity. Django is an exception in having an auth layer of its own: PHP frameworks, Pylons, and Ruby on Rails all do not typically have authorization code included. Part of the reason is that, they claim, user management is bound to be an individual concern; so no solution can fit all cases as well as, say, a templating layer can work for all cases. Another concern is that it would amplify the framework's role in security, which is already quite large due to SQL attacks.
Anyway, I use Django often (and for my personal site), and your insight is great.
James Urquhart
#5348, 2008-07-19T19:40:42Z
Great article, Adam. Kind of brings back those horrible memories of when i tried making an app using Pylons... confusing would be an understatement.
It also provides some useful insight into what i should be aiming for when developing applications. i.e. Conceptual Integrity, as opposed to going into "ad-hoc" mode and ending up with multiple naming schemes and designs for objects, variables, and functions which make no sense whatsoever.
guille
#5554, 2008-07-27T16:55:53Z
That's not fair at all. Some holes aren't filled by Django. Just compare Django's ORM versus SQLAlchemy (and yes, you could say me that I'm able to use it with Django, but then I'll loose a lot of features that do Django as nice). So say you need to develop an app which needs to be up a legacy db, or you need more than one database at once.
Andrew
#11006, 2008-12-31T23:36:02Z
Strunk and White get it _wrong_ very often. Actually they're more wrong than right, and they're most wrong when they're most convinced that their advice is infallible. If you actually follow your advice your writing will be not only ugly but ineffective. Strunk and White are opinionated and bad. If you read them at all (I would suggest that you don't), you will have to invest a lot of mental effort into figuring out which parts to ignore if you want to write well. Likewise if you use an "opinionated" framework like Rails or Django (I would suggest that you don't) you will have to spend significant effort writing code to work around their shortcomings. In fact, you'll spend more time doing that than you would if you wrote for a less-nosy framework that only exists to serve pluggability and reuse, and wrote (or downloaded) some code that does what you want in a non-sucky way in the first place.