All Unkept
Posted in: CCIW, Django, Python, Software development, Web development  —  19 June 2006

A Django website that took (a lot) more than 20 minutes.

These days you seem to hear a lot about building a web app in 20 minutes using framework X and language Y. The most exaggerated of these I read recently was (Re)writing Reddit in Lisp in 20 minutes and 100 lines. Here is a brief critique, without having watched the movie at all:

100 lines of code in 20 minutes is 300 lines an hour. Typically you would expect to be able to do 30-40 LOC/hour, so this is very good going. Here are a few explanations, all of which are possible, with varying degrees of plausibility (and I'm ignoring the possibility that the author was exaggerating in terms of time -- though he is clearly exaggerating with the use of the word 'rewrite', as other people have pointed out):

  1. The author is a super genius.
  2. He had half the code written in his head before he sat down to type.
  3. He knew the problem domain exceptionally well -- he wrote something similar in python (or lisp) the week before.
  4. He had a working installation of everything he needed, to which he could just add a few pages i.e. he had already done all the 'set up' phase.
  5. He was benefiting from the development honeymoon period (more below).

There are some other possibilities that probably don't apply to this case, but often contribute to the '20 minute web app' syndrome:

  1. Lots of copy and paste was involved
  2. You have a framework or piece of software that, out of the box, happens to provide a very large proportion of what you need.

The 'honeymoon' period of software development is the bit that comes after you have set your machine up etc, and you start coding from nothing. If you have nice frameworks or libraries, you can get fantastic levels of productivity at this point. There are various reasons, but I think you can summarise it by saying that you are doing zero 'maintainance' programming, and you have, at that point, a very small application that suffers from none of the problems of large applications.

For instance, achieving OAOO is very easy when you are writing the code for the first time. Even if you do produce duplication, it's very easy to keep track of, and you haven't yet suffered the pain of not obeying OAOO.

You also haven't had to worry about the finishing touches and tying up loose ends -- it makes no sense to do them yet, so you rightly ignore that for now -- but those finishing touches take time. Nor have you had to worry about deployment etc.

The problem is that none of the above will help the more normal programmer to maintain that kind of productivity on a larger application. The honeymoon period is soon over, and finding ways to remove duplication and write maintainable, flexible code with few defects becomes much harder. Even the techniques that may have made the initial development phase so easy and productive may turn out to be the bane of your life (such as copy-and-paste, and lots of the shortcuts and methodologies typically encouraged by PHP).

So, I'm going to present to you an account of an application that took a lot longer than 20 minutes to write. I intend to make it as balanced as possible.

What I've been doing for 10 months

Since September (September 2nd, to be exact, according to my Subversion logs), I've been working on a Django project in my spare time, and it's finally complete. I've kept a pretty complete log of my hours, split by activity, so I'm hoping it will be of some use to those trying to make realistic estimations of coding time.

The project is now live at www.cciw.co.uk. It is a website for a charity that runs outdoor Christian camps, which I've been involved in all my life (literally!). The website has all the details of the camps, camp sites, leaders etc, and a community of people who have been on the camps, based around a message board and photo gallery system.

Until a few days ago, the website was running under PHP with a flatfile database. The new website is mainly a re-implementation of the existing functionality, but I have added quite a few things and tidied quite a lot up, and I didn't bother trying to salvage any of the existing PHP code by porting it -- I wrote everything from scratch.

Aims

My main aims were:

  • to get rid of the ropey old PHP code (not to mention the flatfile database), and produce some clean, maintainable code.
  • to make it easy to moderate the message boards. The main users of the website are 11 - 17 year olds, and the camps are strongly Christian in ethos and aims, so it's very important that the camp website is always a safe and fun place for the campers to interact.
  • to make the website manageable by other people instead of just me, and hopefully write myself out of the picture.
  • to add some fun new features.
  • to generally increase usability.
  • to get a reliable database, and a proper SQL one that would enable things like the 'stats roundups' I occasionally do.
  • to do some test driven web-development.

Hours

I've spent a total of 240 hours on the project, or about 6 working weeks. That's quite a lot, and quite a bit more than you typically hear quoted for Django apps, but the project is probably fairly large compared to most of the ones you hear about:

It contains 22 database models, about 60 view functions (which vary massively in size -- a handful are straight generic views, some of the message board ones are moderately complex), 15 Atom feeds and a total of 56 template files. It also has 14 custom template tags and various other bits and pieces as you would expect in a project of that size.

Also, the figure given above totals all my activities, including:

  • learning Django (and Python to some extent)
  • data migration (a lot of it -- I was careful to ensure none of the old message boards were lost, and some of them go back 6 years to an even older system. I even managed to rewrite any embedded URLs in message board posts etc so that they are still correct)
  • design mockups (I'm not much of a designer, but I'm the only person who is working on this), and then the actual designs in XHTML 1.0 strict, the highest quality stuff I've done so far in terms of semantic HTML and clean CSS.
  • all the setup and deployment issues (setup was easy, but final deployment was harder because of another project I wrote that used the same database, and some of the same tables, but was deployed earlier, so I had to do a bit of a database merge).
  • a fair amount of content editing
  • oh, and writing the code (models, views and templates), testing and debugging, which accounted for about 75% of the time spent (perhaps a little less, it's not always easy to divide up the time correctly).

In terms of code there are about 2000 lines of template code, 6000 lines of Python, and 900 lines of migration scripts (done in Python). I know LOC aren't that accurate a measure of program size, but hopefully that's of some help.

Given those figures, it looks like I was reasonably productive -- averaging over the complete time that comes to about 37 LOC/hour, which is reasonable. I also have been careful to avoid cut-and-paste, which can be an easy way to get stuff done, (and add LOC), but also an easy way to leave an unmaintainable mess behind! The great design of Django, including things like template inheritance, and the power of the Python language makes it possible to really keep duplication to a minimum.

Some of the things that added to the development time were:

  • trying to handle my existing data properly (which added a fair amount of special casing etc)
  • changing Django APIs -- which meant sometimes I had to rewrite, and sometimes I avoided features that I knew were not stable, and went for something that might not have been optimal just to crack on.
  • lack of ability in the design area
  • deciding to change to Postgres part way through (though that was fairly trouble free)
  • and probably a bit of perfectionism.

I should also point out that the framework is more mature than when I started! In fact, some of the things I coded have become part of Django -- the hours where I was consciously hacking on Django itself I was careful to log separately, but nevertheless some of the code I wrote for CCIW ended being generic and has made it's way into the core framework -- so that's code you won't have to write if you start with Django now.

On the other hand, there are some things which would increase a realistic estimate of the coding time. The main one is that for at least half of the code I was writing, especially the message board code, I had a very good idea of what I was doing, having implemented it once already, even if it was several years ago. It's very difficult to measure the effect of this -- although the python code I wrote bears very little resemblance superficially to the original PHP code, it is very likely that my subconscious knowledge of how it would work in general helped me a lot.

Analysis

I'm quite pleased with my results! I'm not sure if I can really give a less biased view. I normally find with programming that by the time I've finished a project, I'm already quite unhappy with the quality of the code, and I have a list of 'cleanup' TODOs, or even 'rewrite this large chunk of it' TODOs, which usually never get done. By the time a few years have passed, I'm downright ashamed. So far I don't feel this way about any of the code -- let's see how long that lasts!

The quality of the HTML is pleasing - the Django validator app I wrote (development time not included) made creating the entire site using only XHTML 1.0 strict really very easy -- a task that I used to think was quite a challenge. The only part that proved tricky was writing a bbcode parser that would accept anything the users can throw at it and always produce valid XHTML that matched what the user would expect to get.

In terms of visual design, I'm reasonably pleased -- though there are quite a few places that could do with a designer's eye. And as for end user experience, I can't really say yet. I've tried to slim down the interface and make the pages a bit simpler than they were before, but some new features, especially 'tagging', have added more things back in.

In terms of making the website easy for other people to manage, Django's admin has solved pretty much all of that. For the main models that other people will have to administer (which are details of the camps we run, camp sites they run at and people who run them), it's astonishing how well the automatic admin functionality caters for it -- it does a lot more than I would have managed to create if I were writing a custom admin interface manually.

I've also made the website self-maintaining as much as possible -- for instance, every year each camp that has just finished gets a new forum, and this now creates itself on first access. The website also has a concept of the 'next year', which depends on when camps finish etc, and the 'clock' for this ticks over automatically.

For moderation, everything now has a feed, so it is very easy to aggregate message board posts for the entire website, or for an individual user, and be aware of new topics etc. I discovered some nice patterns while doing the Atom feed work -- detailed below.

On a downside, I did very little test driven development. I came to the conclusion that Django's view functions are very difficult to test. They take complex objects and return complex objects, and their output is highly dependent on what is in the database, so you have to do a lot of set up first. The view functions themselves often do very little -- in fact some were just generic views, so testing them would just have been testing Django. Some do quite a lot however, but what exactly they do will depend on the validity of input and data in the database etc. I realised that unit tests are pretty inappropriate, but functional tests, using a tool like twill, would be perfect.

Unfortunately, after installing and playing around with twill, I never got around to writing tests with it, partly because of the pain of having to write setup code. I know that other Djangoers have done good work here, but with time constraints this was the first thing to go. I did, however, write tests the parts of the system which could be decoupled easily from the view functions -- in particular most of the bbcode parser was developed in a test driven manner, which worked very well.

Feeds

I didn't use Django's 'high level' feed framework, as it didn't fit very well, but the lower level one was just perfect for what I wanted. Feeds are all available at URLs with '?format=atom' appended to the normal page. To handle this, I've got mini-framework involving a handle_feed_request() function and base CCIWFeed class that inherits from feeds.Feed.

With these in place (25 lines of code), my class for generating the feed for new message board posts, for example, looks like this:

class PostFeed(CCIWFeed):
    template_name = 'posts'
    title = "CCIW message boards posts"

    ## This is called by CCIWFeed.items()
    def modify_query(self, query_set):
        return query_set.order_by('-posted_at')[:POST_FEED_MAX_ITEMS]

    def item_author_name(self, post):
        return post.posted_by_id

    def item_author_link(self, post):
        return add_domain(get_member_href(post.posted_by_id))

    def item_pubdate(self, post):
        return post.posted_at

(Plus there are two templates to support this).

However, you can also get a PostFeed for a specific member -- i.e. all posts that were created by that member. The only thing that needs to change is the title, so the implementation is just the following:

def member_post_feed(member):
    """Returns a Feed class suitable for the posts
    of a specific member."""
    class MemberPostFeed(PostFeed):
        title = "CCIW - Posts by %s" % member.user_name
    return MemberPostFeed

The view code has to call member_post_feed() with a specific member, and passes the generated class to the feed handling code. It doesn't require a special view -- it just requires two lines in the existing HTML view for a specific member's posts.

This pattern is repeated quite a number of times, and I think it is wonderfully elegant -- it's so easy to see what it is supposed to do, and using a class in the same way you use closures is so expressive.

Conclusion

I've enjoyed this project, and I'm very pleased with the result, but I am also happy to get it over with, as it has been dragging on in my spare time since September. The launch of the new website has been a bit of a non-event. The amount of traffic on the site varies enormously -- after the camps in the summer when everyone has just met up again, there is a massive surge in activity -- last August and September the very small active user base managed to create up to 280 posts a day. But right now, there is almost no activity and it's been like that for months. I have to tell myself that it hasn't been a wasted effort :-).

If anyone wants to play with it, you can use the forum at http://www.cciw.co.uk/website/forum/8/ and log in using user name and password 'guest'. I'll probably clear out everything that 'guest' creates every week or so, so create whatever you like.

Finally, if anyone is interested in any of the code, I'd be happy to make it available. Most of it is probably quite specific to CCIW, and not very re-usable, but I made the tagging functionality very generic (I posted to django-devs about this already), and there may be other bits people would want to glean.

Postscript

For the language partisans: my reference to the Lisp article wasn't meant to imply that using Lisp for web development would't scale or would be worse than Django -- I have no idea, as I have never used Lisp. (By contrast, my references to PHP did come from experience and were meant to imply that Django is much better than PHP :-). My main point was that a small project really doesn't give you much idea about a bigger project -- the techniques used for a prototype or small project may or may not scale. I do know that Django was written by experienced developers who knew the pitfalls of web development, and wrote the framework specifically to avoid them, and to make the common things very easy, and I think they have succeeded admirably.

Comments §

§ On 20 June 2006, Tim wrote: 68
Hi Luke,

Awesome post. I enjoyed the story and your analysis. I'm in the middle of a similar sized project and I've found the same sort of issues with Django. I'd really like to see some more tutorials out there based on specific development patterns and a little less on how to set up your database for example.

If you're able, I'd love to get a copy of the code. In particular, I'd love to just see how you did a few things. If it's not a trouble could you send it to my email.

Tim

§ On 21 June 2006, luke wrote: 69
The code is now here:

http://files.lukeplant.fastmail.fm/public/cciw_django_public.zip

§ On 22 June 2006, Alan Green wrote: 70
I've noticed that my own spare-time projects end up taking less hours than full-time projects, which I attribute to having additional conscious and subconscious think time. Was that your experience? Do you think you could have put together the site in five, normal, 40-hour weeks?

Thanks for sharing.

§ On 22 June 2006, Jiri wrote: 71
I liked your article so much that I'm tempted to write a similar one about my experience with django. I particularly loved your coding time estimates - I doubted the speed of 20 minutes/website was real.

My project is an online booking system for hostels. It does not publish anything in the usual way - it is not a blog, a CMS, a forum or similar. It lets you manage rooms and beds and lets guests select and book them.

It has took me half a year to write this in my free time. I almost thought I would never finish; what a relief to hear several months is not slow.

I have not created a project site nor online demo for it unfortunately - yet. But I will! Thank you for sharing your experience!

Jiri

§ On 22 June 2006, luke wrote: 72
Alan:

I think that you are right -- I find the same thing with my spare time projects, and I don't think I would have managed to build the site in 5 normal weeks.

One explanation I have is that I'm a lot more motivated -- every hour I spend in front of the computer is an hour I could be using in other ways in the evening. But at work, I'm going to be there for 7.5 hours a day whatever, so it is easy to be lazy!

I agree about your thinking time point, but I'm not sure how much this had an effect on me this time -- I've had lots of other things on my mind, including my day job and work for my church over this period.

I think also I get rather tired after 7-8 straight hours at work, and become pretty inefficient. A few hours in the evening or at the weekend, with breaks when I want them etc, is quite a bit more efficient. I guess I also use the breaks (e.g. going to the supermarket in the middle of a Saturday) to think about the problems -- more thinking time, as you say.

A massive difference, for me, is getting to choose your own tools and methods. At work I never get to do this, and all the ones we use suck very badly IMO (Windows, ASP.NET, hand-written stored procs, GUI only tools etc). And we carry on using the same hammer, because we know how to use that hammer, and it's our standard, even if it's not appropriate. (e.g. -- I think ASP.NET is excellent for a relatively small subset of web apps, but when you stray away from that subset and throw a few other constraints in, it quickly becomes awful. But we use it for everything, just because we do, and to some extent you have to standardise in a company).

But in my spare time I get to use whatever I want -- Subversion, KDE, Linux, good GUI and command line tools, Python, Django etc. I'll often learn some new technology -- it's usually well worth it. In this case Django and Python made a huge difference to coding time. When I go back to work I'm constantly appalled at the sheer quantity of code I have to write to get anything done, and frustrated at having to hand compile the Python in my head into the C# I need.

Finally, there is also the fact that I write my own spec! If something is too hard, or I don't know how to do it, I don't do it, or simplify it. Sometimes this means I'll later discover a nice way of doing it, which means I don't waste much time on it. These things often aren't possible when someone else is calling the shots.


Jiri:

Glad you liked the article, I'd be interested in hearing your experiences!

§ On 22 June 2006, Jacob Kaplan-Moss wrote: 73
Great article, Luke, and a nice site too :)

One thing to point out is that the average programmer produces a measly 6000 LOC per *year*, or somewhere around 3 LOC/hr, so at 37 you're over ten times more productive than the average. I'd like to think that Django contributed to that increase somewhat...

Thanks again for the article -- and (of course) for your wonderful contributions to Django.

§ On 23 June 2006, Jeff Croft wrote: 74
Yeah, and Jacob produces somewhere around .8 LOC/hr, for about 32 LOC per week. And you should see his paycheck.

Totally not fair.

§ On 23 June 2006, luke wrote: 75
Jacob:

Yes, Django certainly helped a lot in terms of productivity. It's astonishing how many things work first time with Django (and Python), and when they don't the lovely javascript debug template usually makes it pretty obvious where you've gone wrong.

§ On 23 June 2006, Pete Crosier wrote: 76
Luke - I'm definitely with you on appreciating how many things Just Work in Python, and if they don't the friction of fixing them is low. I'm seriously getting into Django because it seems like a natural extension of the Python way to do things, it keeps that friction low!

Thanks for posting your code, I'm looking forward to seeing how you implemented a BB-code system - hopefully it'll give me some pointers :)

§ On 23 June 2006, luke wrote: 78
Oops: Even Python would do better than 240/40 == 5 !
(And I don't tend to work more than 40 hours a week). Corrected to *6* weeks!

§ On 24 June 2006, Peter Bowyer wrote: 79
Alan Green: I find thinking time is the key. I'm most productive after a few day's holiday. Why? Because I've been thinking about the problem while doing something else without the pressure that goes with it when sat at my desk. Thinking time, subconscious or conscious, is the most precious thing I have.

I currently work for myself so am able to take afternoons for thinking time, which I really appreciate :)

§ On 27 July 2006, JOhn wrote: 80
WoW, great write-up.

I'm glad to finally see a real-world example of Django project.

I have not embarked on mine yet, but look forward to working on it soon.

John

§ On 7 August 2006, Scott Johnson of FuzzyBlog wrote: 86
Hey there,

Thank you very much for blogging this. Its really appreciated; I blogged a pointer to it on my blog. Hopefully it brings you some traffic.

§ On 7 August 2006, Tiago Serafim wrote: 87
Nice post! Thanks for sharing your expirience.

I´m about to start an small project here too, but with rails. The little fear I feel that the django api might change with 1.0, made me choose rails. Even that I had played with Python, but never with Ruby...

§ On 7 August 2006, Wayne Stidolph wrote: 88
Excellent "case study" - shows you're an unusually mature software engineer (but at 37 SLOC/hr, you're pretty unusual anyway). Anyway, sounds like an honest accounting demonstrating a very productive environment; you're motivating me to go learn about Django ... and the "20 minutes" stuff never motivates me at all!

§ On 13 September 2006, Darrin wrote: 125
i just read this article for the 2nd time. i first read it right after you'd posted it. I've been threatening to restart dev of my own site with Django and this article really gets me juiced on it.

congrats on completing such an arduous task, and nice job on the write up.

§ On 17 September 2006, Ibon wrote: 126
Hi, very interesting.
Thank you for sharing your experience and code.
After I wasted to much time triying to reinvent the wheel I am starting with django. I regreet I didn't start earlier.

So if someone who read the article is having doubts, don't easitate. Do it!

If you don't like or believe in framework don't worry. You can only use the bits that you like but with some time, you will use much more than you expected (that's my sperience).

I find very insteresting the comments about productivit at work and in personal project. How many years we'll have to wait to have compentent manager who understand 'hacking' ?

I will pay to be able to use
Python+Linux+postgres at work...







§ On 12 October 2006, Darshan Ishaya wrote: 153
Just wanted to say thanks for writing this.

I've been doing things the hard way in PHP for some time. Right now I need to add internationalization to my site. The code is pretty good, but I've become a better programmer since I started the project, and there's a lot of code mixed with HTML more than necessary, so I decided to re-write the site (still in PHP) while I added internationalization support.

But after a toying with different ideas for a few days, I started to see some limitations in PHP. So I started looking into Ruby and RoR. I played with Ruby for a day and liked the concept but something didn't quite sit right with me, so I kept looking around, taking advantage of my free time to see what direction I want to take myself as a programmer right now.

I found out about django, and I like their site so much better than the rails one. Rails seems like the only thing it wants to do is promote itself and get popular. So I played with Python today and a bit with django. I love the automatic admin interface; I need one for my online magazine (trying to write myself out of the picture, too) and didn't know when I would ever get around to making one. Looks like I won't have to bother.

I see a lot of things done really well in Ruby, and it makes a lot of programming tasks simple, but I have the same vague dislike for it I have for Perl. Python sits better with me, just seems cleaner somehow. Also seems to have better libraries and internationalization support. Of course this is just from a couple hours playing with each, but that's better than just listening to hype to decide where I want to go.

Anyway, I really enjoyed your article and plan to look at your code to help get started with Python and Django.

§ On 6 October 2008, coderb wrote: 361
Hi Luke,

thanks for the great info and I esp appreciate you releasing your code. I am just learning python and django and this really has helped a lot.

Your CCIW site looks great too, although the all black theme doesn't feel quite right for the content. ;-)

§ On 3 March 2009, Guilherme wrote: 411
Thanks for source will help me A LOT to learn Django and Python.

 Thanks.

§ On 24 May 2009, colin wrote: 434
Not much more I can add except to say that it was great to check out a live site written in Django.

Like many of the other comments I have played with other framesworks partly seduced by the "20 minute" this or that, which leaves you thinking "that was good, but...".

One downside of Django (and most other frameworks) is that being open-source they evolve quickly and both on-line and printed material sometimes lags behind the current stable version.

Cheers Colin

§ On 28 August 2009, Derek wrote: 473
Two thumbs for a great article and taking the time (a) to write up what you've done and (b) make the code available.

To Colin (24/5/09) - one upside of Django is that the documentation is superb and up-to-date. I've been working with software for over 25 years, and with open-source for about 10, and I can tell you that it does not come any better than this.

§ On 4 September 2009, calvin wrote: 476
like your project and the whole analysis.
i am actually new to django and python.
i am really looking froward to this experience.
i had doubts but seeing your post has helped alleviate so many worries. now i look forward to coding, creating templates, debugging and deploying.
will also appreciate if i can get pointers from time to time.

§ On 6 September 2009, Dmitry wrote: 477
"Django is much better than PHP" — it is not correct to compare a framework with a programming language. This way you could say that TV is better than water.

§ On 7 September 2009, luke wrote: 478
@Dmitry: PHP includes a templating language (it's called PHP), a dispatch/routing mechanism (it's deliberately designed to use the files-in-directories method provided by most web servers) and lots of other automatic HTTP handling baked right in (e.g. $_GET etc) -- lots of the things that you normally have in a web framework in other languages. PHP is definitely more than a language in this respect.

So it makes far more sense to compare PHP to Django than to Python. To use Microsoft technologies, for example, "PHP" is equivalent to "ASP + Visual Basic", and not just "Visual Basic".

§ On 12 January 2011, julz wrote: 985
re your @Dmitry comment: Gosh, I'd never thought of it that way before, good point. Additionally, the easy including of php into html pages: that's very framework-like too.

§ On 25 January 2011, Luke wrote: 989
Absolutely fantastic article - well written and extremely informative; something that is seemingly hard to come by on the web these days!

However, I too would say that your comparison of PHP and Django is a little unfair. Certainly, PHP (by its very nature) offers a lot more than Python does in the way of 'web/framework technologies', but I'd argue that a truly fair comparison would be between Django and the likes of CodeIgniter (or CakePHP etc).

I've recently been working on my first solo 'Powered by CodeIgniter' site (http://xerxes.winnipeg.8networks.co.uk/), and as you've touched on in your article, the great leaps in productivity that come as part of employing a comprehensive framework are indeed 'game changing'.

You've now got me intrigued enough to download and give Django a go, for which I may be very thankful :) Though I have to admit I find there's something slightly irksome about the Python syntax that means I've never really got on with (similar to Darshan's experience of Ruby/Perl).

Keep up the good work, and if you need any help with the graphic/design side of things don't hesitate to get in touch (all the graphics/typography etc from the aforementioned site were created from scratch by myself - though you may not think that's something to boast about!).

Cheers,
Luke.

PS. I also tend to disregard all the 'build something quite complex in an impossible amount of time' videos that seem to be in fashion of late; apart from anything else they make me feel dumb when I don't manage to do it in the allotted time!

§ On 2 February 2011, Paul wrote: 992
Excellent article! I'm in the same boat at the moment having picked up Django after hearing about it at a meeting.

I'm creating a listing site for open source iOS (iphone, ipad) resources, so hopefully expect a slow but steady stream of users if the community picks up on it.

I've found that Django is flexible enough that can pretty much type some code in and expect it to work in the way I expect (coming from a .Net/autocomplete environment that's pretty good going!), and I like the fact they've added in common 'helper methods' in the template language.

Downsides have been the lack of documentation in some areas, usually alleviated by the fact that someone else will have had the same dubious error message and posted on the user group... and of course the fun process of deployment!

If I've learned anything I can offer up as a 'Django top tip'.... don't use google app engine for hosting! You may think it's great because it's free, but you'll soon give up and pay that £12 a month for some VPS hosting!

Ta,

Paul

§ On 4 April 2011, arthur wrote: 1021
I know that this article has been up for a while, but I am just wrapping up a few projects of my own that I started on several months ago. I just wanted to thank the owner of this blog for the inspiration that prompted me to get started using django for serious projects.

§ On 11 April 2011, gopal wrote: 1022
Good Article. Good coding involves good coding practice, testing etc, which things are not involve usually in those 20-minutes software. but those smart genius does exist. -> git was created by linus in 3 days flat in c ( supposedly slow at development time ) beating all the competitor at once.

§ On 3 October 2011, Mark wrote: 1300
Nice article, thanks for your time and trouble writing it :)

§ On 27 October 2011, Cássio Nandi wrote: 1303
Hi Luke.

This is one of my favorites posts about django ever. It is the fourty time I read it and never saw that you is the writer. You help me with the django html validator app that you maintain. I was surpresed to see you name here on a old post. It seems that you continued in the django road =)

Thank you for the article.

Add comment

Format:

  • Javascript has to be on to get past my spam protection, and cookies, and there is a delay, sorry for any inconvenience!
  • I reserve the right to moderate comments.