184
Why I Hate Django Cal Henderson

Why I Hate Django

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Why I Hate Django

Why I Hate DjangoCal Henderson

Page 2: Why I Hate Django

DjangoCon 2008 2

O HAI

Page 3: Why I Hate Django

DjangoCon 2008 3

My happy face

Page 4: Why I Hate Django

DjangoCon 2008 4

Page 5: Why I Hate Django

DjangoCon 2008 5

2.8 billion photos

Page 6: Why I Hate Django

DjangoCon 2008 6

2.8 billion photos

1 per 2.3 people on earth

9.2 per US resident

Page 7: Why I Hate Django

DjangoCon 2008 7

35k photos/sec

>2m photos/min

Page 8: Why I Hate Django

DjangoCon 2008 8

Many thousand pages/sec

Page 9: Why I Hate Django

DjangoCon 2008 9

Scale nerd

Page 10: Why I Hate Django

DjangoCon 2008 10

Serious Language

Page 11: Why I Hate Django

DjangoCon 2008 11

Yahoo

FacebookMediawiki

Wordpress

Page 12: Why I Hate Django

DjangoCon 2008 12

Yahoo

FacebookMediawiki

Wordpress

DiggDelicious

Page 13: Why I Hate Django

DjangoCon 2008 13

Flamework

Serious Toolset

Page 14: Why I Hate Django

DjangoCon 2008 14

Flamework

Flint

Flinderbox

Flaux

Flag

Flink

Flotos

Flictionary

Flops

Fleng

Page 15: Why I Hate Django

DjangoCon 2008 15

Why hate Django?

Page 16: Why I Hate Django

DjangoCon 2008 16

What does he even know

about Django?

Page 17: Why I Hate Django

DjangoCon 2008 17

Pownce

Page 18: Why I Hate Django

DjangoCon 2008 18

A fucking blogging engine

Page 19: Why I Hate Django

DjangoCon 2008 19

Why all the hate?

Page 20: Why I Hate Django

DjangoCon 2008 20

Page 21: Why I Hate Django

DjangoCon 2008 21

Page 22: Why I Hate Django

DjangoCon 2008 22

Page 23: Why I Hate Django

DjangoCon 2008 23

Page 24: Why I Hate Django

DjangoCon 2008 24

An attack on several fronts

Page 25: Why I Hate Django

DjangoCon 2008 25

An attack on several fronts

The team

PythonFrameworks

Page 26: Why I Hate Django

DjangoCon 2008 26

Django itself

Performance

Scalability

Maintainability

Page 27: Why I Hate Django

DjangoCon 2008 27

The Team

Page 28: Why I Hate Django

DjangoCon 2008 28

Frameworks

Page 29: Why I Hate Django

DjangoCon 2008 29

Struts

Page 30: Why I Hate Django

DjangoCon 2008 30

Craig McClanahan

Page 31: Why I Hate Django

DjangoCon 2008 31

Page 32: Why I Hate Django

DjangoCon 2008 32

Exhibit A : Beard

Page 33: Why I Hate Django

DjangoCon 2008 33

But Struts is for suits!

Page 34: Why I Hate Django

DjangoCon 2008 34

The Hot Shit

Page 35: Why I Hate Django

DjangoCon 2008 35

Page 36: Why I Hate Django

DjangoCon 2008 36

Rails = Badass

Page 37: Why I Hate Django

DjangoCon 2008 37

Instead?

A boy band?

Page 38: Why I Hate Django

DjangoCon 2008 38

DjangoCoreThe Album

Page 39: Why I Hate Django

DjangoCon 2008 39

Page 40: Why I Hate Django

DjangoCon 2008 40

Simon “Stinky” Willison

Also, a wizard

Page 41: Why I Hate Django

DjangoCon 2008 41

Python

Page 42: Why I Hate Django

DjangoCon 2008 42

Trendy

Google!

Page 43: Why I Hate Django

DjangoCon 2008 43

But not that trendy

Page 44: Why I Hate Django

DjangoCon 2008 44

But not that trendy

It’s no ruby

Page 45: Why I Hate Django

DjangoCon 2008 45

But not that trendy

It’s no ruby

Or Haskell

Page 46: Why I Hate Django

DjangoCon 2008 46

But not that trendy

It’s no ruby

Or ErlangOr Haskell

Page 47: Why I Hate Django

DjangoCon 2008 47

But not that trendy

It’s no ruby

Or ErlangOr Scala

Or Haskell

Page 48: Why I Hate Django

DjangoCon 2008 48

Significant Whitespace

Page 49: Why I Hate Django

DjangoCon 2008 49

Page 50: Why I Hate Django

DjangoCon 2008 50

Salmon

Page 51: Why I Hate Django

DjangoCon 2008 51

Universe of marshy force. Field sense

shallows the hatchery saying Hello,. World!.

Hydro. Power spring sometimes; snowmelt

powers snowmelt always.

Page 52: Why I Hate Django

DjangoCon 2008 52

Page 53: Why I Hate Django

DjangoCon 2008 53

No quantum

superpositions

Page 54: Why I Hate Django

DjangoCon 2008 54

Page 55: Why I Hate Django

DjangoCon 2008 55

“-”.join(array)

Page 56: Why I Hate Django

DjangoCon 2008 56

Restarting the server?

WTF!?

Page 57: Why I Hate Django

DjangoCon 2008 57

WSGIReloadMechanism

Page 58: Why I Hate Django

DjangoCon 2008 58

“I buy my eggs at the cheese shop”- Aaron Straup Cope

Page 59: Why I Hate Django

DjangoCon 2008 59

“I buy my eggs at the cheese shop”- Aaron Straup Cope

[MOON L

ANGUAGE]

Page 60: Why I Hate Django

DjangoCon 2008 60

Page 61: Why I Hate Django

DjangoCon 2008 61

__import__()

from future import awesome

Page 62: Why I Hate Django

DjangoCon 2008 62

Basically, for hippies

OO languages

Scared of real

Page 63: Why I Hate Django

DjangoCon 2008 63

Frameworks

Page 64: Why I Hate Django

DjangoCon 2008 64

Flamework is a framework

But what does that mean?

Page 65: Why I Hate Django

DjangoCon 2008 65

Make common tasks:

faster

easier

error-free

Page 66: Why I Hate Django

DjangoCon 2008 66

Show a list of photos

Write an API method

Kill all humans

Page 67: Why I Hate Django

DjangoCon 2008 67

Front-tier frameworks

Act as glue

Page 68: Why I Hate Django

DjangoCon 2008 68

Data store

BusinessLogic

InteractionLogic

TemplatesRequest

Dispatcher

Users

OtherServices

Data Model

Framework

Page 69: Why I Hate Django

DjangoCon 2008 69

Great for getting started

Slows you down later?

What is it doing in there?

Page 70: Why I Hate Django

DjangoCon 2008 70

Page 71: Why I Hate Django

DjangoCon 2008 71

Page 72: Why I Hate Django

DjangoCon 2008 72

Page 73: Why I Hate Django

DjangoCon 2008 73

Fast

Flexible

Easy

Scalable

Page 74: Why I Hate Django

DjangoCon 2008 74

Large scale

is often not a good goal

Page 75: Why I Hate Django

DjangoCon 2008 75

Skyscrapers are special

Page 76: Why I Hate Django

DjangoCon 2008 76

Regular houses

Don’t need 10 story foundations

Page 77: Why I Hate Django

DjangoCon 2008 77

Just build!

Page 78: Why I Hate Django

DjangoCon 2008 78

Page 79: Why I Hate Django

DjangoCon 2008 79

Page 80: Why I Hate Django

DjangoCon 2008 80

Page 81: Why I Hate Django

DjangoCon 2008 81

Everything here is possible!

We care about easy

Page 82: Why I Hate Django

DjangoCon 2008 82

Large Scale

Page 83: Why I Hate Django

DjangoCon 2008 83

No multiple DB clusters

Page 84: Why I Hate Django

DjangoCon 2008 84

Manual partitioning

Page 85: Why I Hate Django

DjangoCon 2008 85

No multiple hosts per DB

Page 86: Why I Hate Django

DjangoCon 2008 86

Where do we read from?

Page 87: Why I Hate Django

DjangoCon 2008 87

How about now?

Page 88: Why I Hate Django

DjangoCon 2008 88

How about now ?

Page 89: Why I Hate Django

DjangoCon 2008 89

Read/write consistency

Page 90: Why I Hate Django

DjangoCon 2008 90

Read/write consistency

LAG!!1

Page 91: Why I Hate Django

DjangoCon 2008 91

Good for non-writing users

(logged out)

Page 92: Why I Hate Django

DjangoCon 2008 92

Non time-sensitive data

Feeds

Read-only APIs

Page 93: Why I Hate Django

DjangoCon 2008 93

Page 94: Why I Hate Django

DjangoCon 2008 94

Cool kids use

master/master pairs

Page 95: Why I Hate Django

DjangoCon 2008 95

Consistent read/write

1. Write to side A

2. Read from side B

3. Replication occurs

4. FAIL

Page 96: Why I Hate Django

DjangoCon 2008 96

Consistent read/write

1. Write to side A

2. Read from side A

3. ???

4. PROFIT!!

Page 97: Why I Hate Django

DjangoCon 2008 97

Then we can start to get fancy!

Page 98: Why I Hate Django

DjangoCon 2008 98

Where do we read/write?

Page 99: Why I Hate Django

DjangoCon 2008 99

Abstraction FTW

db_query($cluster_name, $sql)

Page 100: Why I Hate Django

DjangoCon 2008 100

No sharding

Page 101: Why I Hate Django

DjangoCon 2008 101

WTF is sharding?

All about books

Page 102: Why I Hate Django

DjangoCon 2008 102

Dewey Decimal

Page 103: Why I Hate Django

DjangoCon 2008 103

But it can’t do everything

Page 104: Why I Hate Django

DjangoCon 2008 104

Makes some things

‘impossible’

No shard walking

Page 105: Why I Hate Django

DjangoCon 2008 105

Page 106: Why I Hate Django

DjangoCon 2008 106

Django knows our models

It’s possible

Page 107: Why I Hate Django

DjangoCon 2008 107

If we accept constraints

Page 108: Why I Hate Django

DjangoCon 2008 108

No external sequences

Page 109: Why I Hate Django

DjangoCon 2008 109

Auto-incs can be bad

master/master

shards

Page 110: Why I Hate Django

DjangoCon 2008 110

No automatic denormalization

Page 111: Why I Hate Django

DjangoCon 2008 111

Counters would be easy!

Page 112: Why I Hate Django

DjangoCon 2008 112

And copied fields too

Page 113: Why I Hate Django

DjangoCon 2008 113

High

Performance

Page 114: Why I Hate Django

DjangoCon 2008 114

It’s slow!

Page 115: Why I Hate Django

DjangoCon 2008 115

Page 116: Why I Hate Django

DjangoCon 2008 116

Page 117: Why I Hate Django

DjangoCon 2008 117

There are limits

When being really silly

But they only apply

Page 118: Why I Hate Django

DjangoCon 2008 118

Sessions

Page 119: Why I Hate Django

DjangoCon 2008 119

OMG UR ON CRAK

Page 120: Why I Hate Django

DjangoCon 2008 120

Extra DB table

A read on every page

Page 121: Why I Hate Django

DjangoCon 2008 121

Lightweight = better

Page 122: Why I Hate Django

DjangoCon 2008 122

Signed cookies

Page 123: Why I Hate Django

DjangoCon 2008 123

No parallelization

Page 124: Why I Hate Django

DjangoCon 2008 124

Multiple cache-requests

Page 125: Why I Hate Django

DjangoCon 2008 125

Multiple multi-keyed reads

Page 126: Why I Hate Django

DjangoCon 2008 126

Slow HTTP requests while

we’re doing other stuff

Page 127: Why I Hate Django

DjangoCon 2008 127

Creates dumb SQL

Page 128: Why I Hate Django

DjangoCon 2008 128

foo.exclude(bar = true)

WHERE (NOT (bar = 1))

Page 129: Why I Hate Django

DjangoCon 2008 129

foo.exclude(bar = true)

WHERE bar != 1

Page 130: Why I Hate Django

DjangoCon 2008 130

foo.filter(bar = false)

WHERE bar = 0

Indexable!

Page 131: Why I Hate Django

DjangoCon 2008 131

Maintainability

Page 132: Why I Hate Django

DjangoCon 2008 132

Maintainability

Awesomeness

Page 133: Why I Hate Django

DjangoCon 2008 133

Verbose template syntax

<h1>{{ foo.bar }}</h1>

Page 134: Why I Hate Django

DjangoCon 2008 134

<h1>{{ foo.bar }}</h1>

<h1>{$foo.bar}</h1>

3 extra characters!

Page 135: Why I Hate Django

DjangoCon 2008 135

<h1>{{ foo.bar }}</h1>

<h1>{$foo.bar|e}</h1>

Well almost…

Page 136: Why I Hate Django

DjangoCon 2008 136

{if $edit_mode}woo

{/if}

{% if edit_mode %}woo

{% endif %}

9 extra!

Page 137: Why I Hate Django

DjangoCon 2008 137

Verbose template syntax

makes people cry

Page 138: Why I Hate Django

DjangoCon 2008 138

No query debugger

Page 139: Why I Hate Django

DjangoCon 2008 139

>>> from django.db import connection

>>> connection.queries

[{'sql': 'SELECT

polls_polls.id,polls_polls.question,polls_

polls.pub_date FROM polls_polls', 'time':

'0.002'}]

Page 140: Why I Hate Django

DjangoCon 2008 140

>>> from django.db import connection

>>> connection.queries

[{'sql': 'SELECT

polls_polls.id,polls_polls.question,polls_

polls.pub_date FROM polls_polls', 'time':

'0.002'}]

Not good enough!

Page 141: Why I Hate Django

DjangoCon 2008 141

Better, but not amazing

Page 142: Why I Hate Django

DjangoCon 2008 142

Page 143: Why I Hate Django

DjangoCon 2008 143

Page summary

Page 144: Why I Hate Django

DjangoCon 2008 144

Make it clickable…

Page 145: Why I Hate Django

DjangoCon 2008 145

EXPLAIN is AWESOME

Page 146: Why I Hate Django

DjangoCon 2008 146

And/or show the data

Page 147: Why I Hate Django

DjangoCon 2008 147

MySQL Query Profiler

Enough data to

choke a whale

Page 148: Why I Hate Django

DjangoCon 2008 148

Not smug enough

Page 149: Why I Hate Django

DjangoCon 2008 149

Page 150: Why I Hate Django

DjangoCon 2008 150

Page 151: Why I Hate Django

DjangoCon 2008 151

SELECT `app_userprofile`.`user_id`,`app_userprofile`.`account_status`,`app_userprofile`.`account_status_reason`,`app_userprofile`.`account_delete_type`,`app_userprofile`.`syndication_key`,`app_userprofile`.`blurb`,`app_userprofile`.`location`,`app_userprofile`.`country`,`app_userprofile`.`postal_code`,`app_userprofile`.`gender`,`app_userprofile`.`theme`,`app_userprofile`.`tiny_photo`,`app_userprofile`.`small_photo`,`app_userprofile`.`smedium_photo`,`app_userprofile`.`medium_photo`,`app_userprofile`.`large_photo`,`app_userprofile`.`orig_photo`,`app_userprofile`.`bday_month`,`app_userprofile`.`bday_day`,`app_userprofile`.`bday_year`,`app_userprofile`.`is_pro`,`app_userprofile`.`privacy_settings_id`,`app_userprofile`.`email_settings_id`,`app_userprofile`.`preference_settings_id`,`app_userprofile`.`ad_counter`,`app_userprofile`.`num_friends`,`app_userprofile`.`num_fans`,`app_userprofile`.`num_feeds`,`app_userprofile`.`num_blocked_fans`,`app_userprofile`.`num_friend_requests`,`app_userprofile`.`default_set_id`,`app_userprofile`.`invite_id`,`app_userprofile`.`invite_round`,`app_userprofile`.`avail_invites`,`app_userprofile`.`original_email` FROM `app_userprofile` WHERE (`app_userprofile`.`user_id` = 1)

Unreadable SQL

Page 152: Why I Hate Django

DjangoCon 2008 152

SELECT * FROM `app_userprofile` WHERE `user_id` = 1

Unreadable SQL

Page 153: Why I Hate Django

DjangoCon 2008 153

SELECT * is fast!

Faster over the wire

Faster to parse

Easier to debug

Page 154: Why I Hate Django

DjangoCon 2008 154

SELECT `app_note`.`id`,`app_note`.`type`,`app_note`.`body`,`app_note`.`sender_id`,`app_note`.`date_sent`,`app_note`.`num_recipients`,`app_note`.`recipient_type`,`app_note`.`set_id`,`app_note`.`direct_to_id`,`app_note`.`media_file_id`,`app_note`.`url`,`app_note`.`url_inline`,`app_note`.`url_clicks`,`app_note`.`embed_id`,`app_note`.`event_id`,`app_note`.`is_direct`,`app_note`.`is_public`,`app_note`.`is_deleted`,`app_note`.`is_ad`,`app_note`.`reply_to_id`,`app_note`.`forwarded_from_id`,`app_note`.`original_note_id`,`app_note`.`stars`,`app_note`.`rsvp` FROM `app_note` LEFT OUTER JOIN `app_userprofile_notes` AS `m2m_app_note__recipients` ON `app_note`.`id` = `m2m_app_note__recipients`.`note_id` WHERE ((NOT (`app_note`.`is_deleted` = True)) AND `m2m_app_note__recipients`.`userprofile_id` = 17573) ORDER BY `app_note`.`date_sent` DESC LIMIT 16

Unreadable SQL

Page 155: Why I Hate Django

DjangoCon 2008 155

SELECT

n.*

FROM

app_note AS n

LEFT OUTER JOIN app_userprofile_notes AS l

ON

n.id=l.note_id

WHERE

n.is_deleted = False AND l.userprofile_id=17573

ORDER BY

n.date_sent DESC

LIMIT 16

Unreadable SQL

Page 156: Why I Hate Django

DjangoCon 2008 156

Django makes me

scared of joins

Page 157: Why I Hate Django

DjangoCon 2008 157

JOINs are evil

Actually,

Page 158: Why I Hate Django

DjangoCon 2008 158

Page 159: Why I Hate Django

DjangoCon 2008 159

Low version number

Page 160: Why I Hate Django

DjangoCon 2008 160

Page 161: Why I Hate Django

DjangoCon 2008 161

Page 162: Why I Hate Django

DjangoCon 2008 162

Suspiciously small

Django: 105 klocs

Flamework: 260 klocs

Page 163: Why I Hate Django

DjangoCon 2008 163

Suspiciously small

Very long lines?

Page 164: Why I Hate Django

DjangoCon 2008 164

Can’t pluralize octopus

Page 165: Why I Hate Django

DjangoCon 2008 165

Commit all fields at once

Page 166: Why I Hate Django

DjangoCon 2008 166

Race conditions!

Page 167: Why I Hate Django

DjangoCon 2008 167

Dirty flags

Page 168: Why I Hate Django

DjangoCon 2008 168

Don’t make Malcolm cry

Page 169: Why I Hate Django

DjangoCon 2008 169

No simple way to inc/dec

Page 170: Why I Hate Django

DjangoCon 2008 170

Makes consistency hard!

UPDATE foo SET x=x+1

Page 171: Why I Hate Django

DjangoCon 2008 171

Character encoding

Input validation?

Page 172: Why I Hate Django

DjangoCon 2008 172

Character encoding

Input validation?

(Probably broken)

Page 173: Why I Hate Django

DjangoCon 2008 173

No mascot!?!

Page 174: Why I Hate Django

DjangoCon 2008 174

Echidna?

Page 175: Why I Hate Django

DjangoCon 2008 175

MAGICAL POWERS

Page 176: Why I Hate Django

DjangoCon 2008 176

No deployment system

Page 177: Why I Hate Django

DjangoCon 2008 177

Extending models

big enough

Tables are never

Page 178: Why I Hate Django

DjangoCon 2008 178

Model changes

manage.py reset appname

Page 179: Why I Hate Django

DjangoCon 2008 179

django-evolution

dmigrations

Page 180: Why I Hate Django

DjangoCon 2008 180

What’s django

done for you

lately?

Page 181: Why I Hate Django

thanks

(now go make it better)

Page 182: Why I Hate Django

DjangoCon 2008 182

Photo credits• flickr.com/photos/wilson/18685396/• flickr.com/photos/uhop/105063089/• flickr.com/photos/plasticbag/91453376/• flickr.com/photos/zenoc/1408162618/• flickr.com/photos/subinev/27810058/• flickr.com/photos/kaptainkobold/2531797176/• flickr.com/photos/esti/243781036/• flickr.com/photos/oneras/253617128/• flickr.com/photos/josefstuefer/72512671/• flickr.com/photos/pgoyette/168076182/• flickr.com/photos/paulhammond/2825869449/• flickr.com/photos/nez/378348754/• flickr.com/photos/calevans/2265863104/• flickr.com/photos/mbiddulph/416190643/• flickr.com/photos/obliterated/2249663391/• flickr.com/photos/salim/67753003/• flickr.com/photos/sosalem/2816909110/• flickr.com/photos/radiorover/324193883/• flickr.com/photos/nickwheeleroz/2773776799/• flickr.com/photos/rse/22972901/• flickr.com/photos/rougerouge/534615363/• flickr.com/photos/hawkexpress/386355092/• flickr.com/photos/escalla/438817719/• flickr.com/photos/mknightphoto/2295688304/• flickr.com/photos/petereed/138369750/

• flickr.com/photos/sharynmorrow/2571566304/• flickr.com/photos/florathexplora/286035943/• flickr.com/photos/webguru4god/2233500779/• flickr.com/photos/emdot/195189924/• flickr.com/photos/kayepants/391645870/• flickr.com/photos/ppowers/793939285/• flickr.com/photos/dinesh_valke/425540358/• flickr.com/photos/hawkexpress/306276212/• flickr.com/photos/cedric1981/383614033/• flickr.com/photos/macspite/1118042091/• flickr.com/photos/jpstanley/1440357613/• flickr.com/photos/ashclements/248887492/• flickr.com/photos/kecko/1876479840/• flickr.com/photos/difusa/131100622/• flickr.com/photos/amagill/378984660/• flickr.com/photos/bea_k63w-wa/2466009108/• flickr.com/photos/namullim/2096115820/• flickr.com/photos/lotterymonkey/175248733/• flickr.com/photos/13519089@N03/1380483002/• flickr.com/photos/gswj/10344097/• flickr.com/photos/deanj/67607256/• flickr.com/photos/malias/2218694639/• flickr.com/photos/clintjcl/120760767/• flickr.com/photos/grandpamikey/2228239585/• flickr.com/photos/lea/2829752510/• flickr.com/photos/superamit/196481424/

Page 183: Why I Hate Django

DjangoCon 2008 183

More photo credits• flickr.com/photos/simon999/2419051858/• flickr.com/photos/tonyjcase/2172060723/• flickr.com/photos/heypaul/1428681/• flickr.com/photos/swisscan/2308034084/• flickr.com/photos/apollonia666/310793656/• flickr.com/photos/bdorfman/15846725/• flickr.com/photos/wishymom/566394520/• flickr.com/photos/jgarber/121886004/• flickr.com/photos/eole/380316678/• flickr.com/photos/917press/1940509163/• flickr.com/photos/wallyg/476718069/• flickr.com/photos/biwook/390088839/• flickr.com/photos/bdjsb7/1674027307/• flickr.com/photos/naveenroy/314965221/• flickr.com/photos/wyldkyss/2757474674/• flickr.com/photos/orinrobertjohn/409812627/• flickr.com/photos/candiedwomanire/1651870/• flickr.com/photos/dalvenjah/408497650/• flickr.com/photos/krikit/2657457178/• flickr.com/photos/w5nyv/2370344/• flickr.com/photos/jordanfischer/72510316/• flickr.com/photos/tedsblog/91531710/• flickr.com/photos/celesterc/1069893367/• flickr.com/photos/spacematters/766372252/• flickr.com/photos/esti/147733640/• flickr.com/photos/rbp/2833593771/

• flickr.com/photos/jordanroher/228435564/• flickr.com/photos/tambako/2524829095/• flickr.com/photos/66132721@N00/2725908636/• flickr.com/photos/freeparking/1279927021/• flickr.com/photos/drurydrama/1352506223/• flickr.com/photos/mn_francis/397620193/• flickr.com/photos/dramaqueennorma/273371415/• flickr.com/photos/chasqui/2338990305/• flickr.com/photos/cityhunter12/2574288725/• flickr.com/photos/akbuthod/1508537255/• flickr.com/photos/nunoforos/2811186142/• flickr.com/photos/marcusjb/432600086/• flickr.com/photos/12495774@N02/2405297371/• flickr.com/photos/larimdame/572477975/• flickr.com/photos/harryharris/1525946537/• flickr.com/photos/davemorris/91808851/• flickr.com/photos/aplumb/121285138/• flickr.com/photos/peebot/825451566/• flickr.com/photos/reillyb/2216541900/• flickr.com/photos/steffe/423086866/• flickr.com/photos/ciordia/255983919/• flickr.com/photos/wwworks/2472230611/• flickr.com/photos/pnoid00/1909096140/• flickr.com/photos/jurvetson/2229899/• flickr.com/photos/foxypar4/766801643/• flickr.com/photos/wizardhere/2413404079/

Page 184: Why I Hate Django

DjangoCon 2008 184

these slides are online:

iamcal.com/talks