Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

article.md 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. title: ★ Conférences Django pour PyCon fr
  2. slug: conferences-django-pour-pycon-fr
  3. date: 2008-05-21 02:57:53
  4. type: post
  5. vignette: images/logos/django.png
  6. contextual_title1: ★ L'élitisme de la curiosité
  7. contextual_url1: 20090313-lelitisme-de-la-curiosite
  8. contextual_title2: Sortie de Django 1.0, une année de nouveautés
  9. contextual_url2: 20080902-sortie-de-django-10-une-annee-de-nouveautes
  10. contextual_title3: ★ Astuces et bonnes pratiques Django
  11. contextual_url3: 20080211-astuces-et-bonnes-pratiques-django
  12. J'ai eu le privilège de présenter Django lors des [journées](http://fr.pycon.org) organisées par l'[afpy](http://www.afpy.org). C'était vraiment un weekend exceptionnel, une organisation exemplaire, des conférences de qualité, des discussions de geek, que du bon. Je me suis enfin décidé à mettre les slides en ligne, en attendant les vidéos.
  13. ## Historique
  14. J'avais déjà [présenté Django l'année dernière](http://media.larlet.fr/david/conferences/django/) et j'avais vraiment eu l'impression de passer à côté de ma conf. Outre le fait que j'étais bien crevé [d'avoir mis en ligne django-fr](https://larlet.fr/david/biologeek/archives/200763-django-fr-enfin-en-ligne/), j'ai relevé 3 gros défauts :
  15. * je voulais que la présentation serve aussi pour les personnes souhaitant la consulter en ligne, au final c'est beaucoup trop verbeux et le code distrait à mon avis l'auditoire qui vient à une conférence pour s'enrichir d'une expérience et non pour une lecture de code ;
  16. * je voulais faire plaisir à tout le monde en partant de la base pour aller vers des techniques plus avancées et au final personne n'y trouve vraiment son compte ;
  17. * je voulais garder le public connecté et j'ai le sentiment d'avoir été plutôt ennuyeux : c'était long et ça manquait tout simplement de vitalité (sans compter quelques soucis avec S5).
  18. Partant de ce constat, j'ai essayé cette année de :
  19. * faire des slides minimaliste, l'objectif était qu'ils soient tout simplement inutiles sans moi (d'où le besoin de les enrichir pour vous les présenter maintenant, pas sûr que ce soit bon pour moi ça :p), c'est à mon avis le seul moyen de se focaliser sur l'expérience du présentateur et donc sur le message à faire passer ;
  20. * scinder en deux sessions débutant/avancé pour laisser le choix au visiteur de n'assister qu'à la conférence qui l'intéresse ;
  21. * trouver un moyen de rendre les confs plus vivantes (et utiliser Keynote).
  22. Alors pari réussi ? Mon retour personnel après chaque conférence ci-dessous. J'essaye de retrouver ce que j'ai dit de tête, ça sera forcément différent des vidéos qui devraient arriver plus tard : moins de stress, davantage de temps pour étoffer et des liens en bonus.
  23. ## Pourquoi Django ?
  24. Je n'ai jamais eu de cours de marketing et je hais les commerciaux donc c'est vraiment une épreuve pour moi de « vendre mon produit ». J'ai surtout voulu aller à l'essentiel pour pouvoir ensuite en débattre pendant les questions/réponses.
  25. <p>
  26. <img
  27. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.001.jpg"
  28. alt="Pourquoi Django"
  29. style="margin: 0pt auto; display: block;"/>
  30. </p>
  31. Avant de parler de Django, il est bon de rappeler les [intérêts d'un framework web](https://larlet.fr/david/biologeek/archives/20070117-definition-et-avantages-d-un-framework-web/) face à l'approche plus traditionnelle par applications fonctionnelles toutes prêtes. Qu'est-ce qui a pu suscité un tel engouement ?
  32. <p>
  33. <img
  34. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.002.jpg"
  35. alt="Pourquoi Django"
  36. style="margin: 0pt auto; display: block;"/>
  37. </p>
  38. On connaît tous des projets qui commencent avec un projet tout simple (je prends souvent l'exemple du blog car il est assez parlant). Il existe des trillions de moteurs de blog et il est donc aisé d'en prendre un tout fait :
  39. <p>
  40. <img
  41. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.003.jpg"
  42. alt="Pourquoi Django"
  43. style="margin: 0pt auto; display: block;"/>
  44. </p>
  45. Mais bien (trop) souvent, un projet évolue en cours de route et l'ajout de fonctionnalités (galerie de photos, paiement en ligne, inclusion de vidéos) aboutit finalement à un cahier des charges ressemblant plutôt à :
  46. <p>
  47. <img
  48. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.004.jpg"
  49. alt="Pourquoi Django"
  50. style="margin: 0pt auto; display: block;"/>
  51. </p>
  52. Si vous êtes parti d'un simple moteur de blog rafistolé, il est très probable que vous arriviez à un résultat de piètre qualité :
  53. <p>
  54. <img
  55. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.005.jpg"
  56. alt="Pourquoi Django"
  57. style="margin: 0pt auto; display: block;"/>
  58. </p>
  59. La solution est de partir d'une approche plus bas niveau : la caisse à outil qui va vous permettre de construire vos propres briques fonctionnelles et de réaliser un projet de manière cohérente et évolutive.
  60. <p>
  61. <img
  62. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.006.jpg"
  63. alt="Pourquoi Django"
  64. style="margin: 0pt auto; display: block;"/>
  65. </p>
  66. De cette façon, vous allez énormément gagner en agilité, la clé de voûte de la qualité (du projet), de la sérénité (du développeur) et de la satisfaction (du client).
  67. <p>
  68. <img
  69. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.007.jpg"
  70. alt="Pourquoi Django"
  71. style="margin: 0pt auto; display: block;"/>
  72. </p>
  73. Maintenant que vous êtes convaincu du bien fondé des frameworks web, il est temps de passer au plat de résistance : pourquoi Django ?
  74. <p>
  75. <img
  76. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.008.jpg"
  77. alt="Pourquoi Django"
  78. style="margin: 0pt auto; display: block;"/>
  79. </p>
  80. Django est écrit en Python et vous permet d'écrire du Python, il n'y a pas de fichiers de configuration en xml (ai-je besoin de rappeler que ce format est fait pour les machines ?).
  81. <p>
  82. <img
  83. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.009.jpg"
  84. alt="Pourquoi Django"
  85. style="margin: 0pt auto; display: block;"/>
  86. </p>
  87. Django est très facile à prendre en main, il suffit de quelques heures (même sans connaître initialement Python) pour avoir une première application qui tourne et en comprendre les principaux concepts.
  88. <p>
  89. <img
  90. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.010.jpg"
  91. alt="Pourquoi Django"
  92. style="margin: 0pt auto; display: block;"/>
  93. </p>
  94. Face aux deux approches : framework glue vs. réinvention de la roue, Django a choisi la seconde ce qui apporte une cohérence à tous les niveaux (documentation, code, aide, etc) au détriment de sa modularité intrinsèque.
  95. <p>
  96. <img
  97. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.011.jpg"
  98. alt="Pourquoi Django"
  99. style="margin: 0pt auto; display: block;"/>
  100. </p>
  101. La documentation est un réel atout, surtout lorsqu'on débute. C'est l'une des meilleures documentation technique que je connaisse et elle est en train d'être encore améliorée !
  102. <p>
  103. <img
  104. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.012.jpg"
  105. alt="Pourquoi Django"
  106. style="margin: 0pt auto; display: block;"/>
  107. </p>
  108. Je suis assez mal placé pour parler de rapidité de développement avec la refonte de ce blog qui a pris... du temps. Néanmoins, pour l'utiliser quotidiennement, je peux affirmer que le développement avec ce framework permet de concrétiser plus rapidement des projets. L'un des atouts est par exemple de prototyper des applications en des temps records, après bien sûr les détails prennent plus de temps, comme partout.
  109. <p>
  110. <img
  111. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.013.jpg"
  112. alt="Pourquoi Django"
  113. style="margin: 0pt auto; display: block;"/>
  114. </p>
  115. L'interface d'administration auto-générée est vraiment utile et participe à l'« effet Wow !© » initial. Difficile de s'en priver ensuite.
  116. <p>
  117. <img
  118. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.014.jpg"
  119. alt="Pourquoi Django"
  120. style="margin: 0pt auto; display: block;"/>
  121. </p>
  122. L'échappement des caractères html par défaut peut être un élément important pour une personne débutant en développement web. Ce choix est une réelle sécurité si vous ne maîtrisez pas vraiment toutes les failles possibles d'un code (même s'il serait bon de [vous renseigner à ce sujet](http://www.djangobook.com/en/1.0/chapter19/) si c'est le cas !).
  123. <p>
  124. <img
  125. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.015.jpg"
  126. alt="Pourquoi Django"
  127. style="margin: 0pt auto; display: block;"/>
  128. </p>
  129. Django est simple, autant dans ses concepts que dans leurs mises en application, si vous connaissez Python, vous pouvez même sans peine plonger dans le code de Django et découvrir quelques pépites.
  130. <p>
  131. <img
  132. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.016.jpg"
  133. alt="Pourquoi Django"
  134. style="margin: 0pt auto; display: block;"/>
  135. </p>
  136. La maturité est souvent un facteur décisif d'un point de vue professionnel, après 5 ans de développement, le framework est devenu stable et à énormément gagné de son ouverture en Open-Source (pour ceux qui se demandent ce qu'une litière pour chat vient faire ici, c'est un jardin zen, j'ai pas trouvé mieux).
  137. <p>
  138. <img
  139. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.017.jpg"
  140. alt="Pourquoi Django"
  141. style="margin: 0pt auto; display: block;"/>
  142. </p>
  143. Quelques chiffres issus de la présentation de l'année précédente, on voit bien la progression en terme d'utilisateurs et donc de contributeurs potentiels.
  144. <p>
  145. <img
  146. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.018.jpg"
  147. alt="Pourquoi Django"
  148. style="margin: 0pt auto; display: block;"/>
  149. </p>
  150. Enfin, l'avantage d'avoir des outils à sa disposition est de pouvoir laisser s'exprimer sa créativité, le plus important est ce que l'on fait avec ses outils. Vous pouvez prendre le meilleur des frameworks, ça ne vous assurera pas une application à succès. Ça serait bien trop facile sinon ;-).
  151. <p>
  152. <img
  153. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.019.jpg"
  154. alt="Pourquoi Django"
  155. style="margin: 0pt auto; display: block;"/>
  156. </p>
  157. Après avoir vanté autant de qualités, voyons pour quels projets cette caisse à outils s'applique.
  158. <p>
  159. <img
  160. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.020.jpg"
  161. alt="Pourquoi Django"
  162. style="margin: 0pt auto; display: block;"/>
  163. </p>
  164. Il n'y a pas d'outil miracle, notre métier est un éternel compromis et il faut savoir faire avec. L'avantage de Django est qu'il permet de couvrir un très large périmètre d'applications mais si vous voulez construire un [gratte-ciel](http://stuffthathappens.com/blog/2008/03/31/the-right-tool-for-the-job/) il va peut-être falloir penser à autre chose.
  165. <p>
  166. <img
  167. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.021.jpg"
  168. alt="Pourquoi Django"
  169. style="margin: 0pt auto; display: block;"/>
  170. </p>
  171. Cela dit, il y a un très faible pourcentage de projets web qui doivent en arriver là et il sera toujours temps de changer certaines parties ou d'améliorer les performances le moment venu.
  172. <p>
  173. <img
  174. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.022.jpg"
  175. alt="Pourquoi Django"
  176. style="margin: 0pt auto; display: block;"/>
  177. </p>
  178. On termine avec un peu de teasing...
  179. <p>
  180. <img
  181. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.023.jpg"
  182. alt="Pourquoi Django"
  183. style="margin: 0pt auto; display: block;"/>
  184. </p>
  185. On ne l'attend plus mais Django 1.0 arrive ! (si si, je vous assure) La première branche importante ([queryset-refactor](http://jehaisleprintemps.net/blog/fr/2008/04/27/queryset-refactor/)) a été mergée au trunk.
  186. <p>
  187. <img
  188. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.024.jpg"
  189. alt="Pourquoi Django"
  190. style="margin: 0pt auto; display: block;"/>
  191. </p>
  192. Et la suivante (newforms-admin) est en cours de finitions actives. Ce n'est plus qu'une question de ... (mettez ce qui vous semble le plus crédible et votez sur whendjangowillreleaseonepointzero.com).
  193. <p>
  194. <img
  195. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.025.jpg"
  196. alt="Pourquoi Django"
  197. style="margin: 0pt auto; display: block;"/>
  198. </p>
  199. Des fois que le message n'ait pas été assez clair (j'adore les photos de gens qui sautent dans les présentations, je trouve ça kitsch au possible ;-)).
  200. <p>
  201. <img
  202. src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.026.jpg"
  203. alt="Pourquoi Django"
  204. style="margin: 0pt auto; display: block;"/>
  205. </p>
  206. ### Bilan personnel
  207. Difficile d'enchaîner une nuit trop <del>alcoolisée</del> courte (il faut croire que c'est une malédiction) et d'insuffler suffisamment de vitalité. Je suis néanmoins assez satisfait car je pense avoir bien fait passer le message qui était tout simple : essayez Django !
  208. L'exemple initial était assez fort pour capter directement l'attention, la liste des avantages était assez claire. Bon par contre je suis conscient qu'il y a du progrès à faire au niveau de la conclusion car je n'ai pas assez insisté à l'oral sur l'intérêt d'avoir une simple caisse à outils pour laisser s'exprimer sa créativité et je voulais insister là-dessus.
  209. Je me suis permis quelques trolls un peu douteux sur Zope 3 (un peu la chance d'avoir assisté à la conf dessus la veille, un peu car on en a parlé une bonne partie de la nuit), je suis pas vraiment sûr que ça avait sa place. Quoi qu'il en soit, les éléments de comparaison cités dans la discussion qui a suivie étaient intéressants.
  210. ## Django : performances et qualité
  211. J'ai eu beaucoup plus de mal à préparer cette présentation car elle était très dépendante du public. Je voulais éviter de ne m'adresser qu'à une poignée de personnes et j'ai donc choisi au final une approche plus généraliste sur les bonnes pratiques web, appliquées à Django.
  212. Un rapide sondage m'a montré que ce choix était pertinent et que me craintes étaient fondées. Moins d'un quart de la salle avait déjà essayé Django, et une poignée sur de gros projets. Adaptation à chaud : il valait mieux passer du temps sur les aspects pas trop pointus... quitte à décevoir ceux qui étaient venus pour l'intitulé de la conf !
  213. <p>
  214. <img
  215. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.027.jpg"
  216. alt="Django : qualité et performances"
  217. style="margin: 0pt auto; display: block;"/>
  218. </p>
  219. Un rappel préalable sur le coût de la qualité et des performances s'impose. C'est un investissement dans une logique qui s'inscrit dans la durée, ce n'est pas forcément adapté à tous les projets et ça doit être mis en place d'un commun accord entre les acteurs du projet (les tests sont très difficiles à facturer).
  220. <p>
  221. <img
  222. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.028.jpg"
  223. alt="Django : qualité et performances"
  224. style="margin: 0pt auto; display: block;"/>
  225. </p>
  226. Un titre qui claque, je suis sûr qu'en anglais ça rend encore mieux.
  227. <p>
  228. <img
  229. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.029.jpg"
  230. alt="Django : qualité et performances"
  231. style="margin: 0pt auto; display: block;"/>
  232. </p>
  233. Il existe de nombreux outils de détection, du simple module logging à ceux permettant de stresser votre application et votre architecture.
  234. <p>
  235. <img
  236. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.030.jpg"
  237. alt="Django : qualité et performances"
  238. style="margin: 0pt auto; display: block;"/>
  239. </p>
  240. Avant d'optimiser, il faut bien évaluer la situation, il ne sert à rien d'optimiser un site qui ne rencontre pas de problèmes de performances, privilégiez plutôt l'expérience utilisateur (ergonomie, etc). Si vous n'avez pas le temps d'optimiser, vous pouvez toujours avoir une expansion horizontale dans un premier temps (plus de serveurs) si vous disposez des fonds nécessaires. J'ai oublié de parler de l'évolution vers les clouds pour gérer ce type de problématiques.
  241. <p>
  242. <img
  243. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.031.jpg"
  244. alt="Django : qualité et performances"
  245. style="margin: 0pt auto; display: block;"/>
  246. </p>
  247. On entre dans le vif du sujet.
  248. <p>
  249. <img
  250. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.032.jpg"
  251. alt="Django : qualité et performances"
  252. style="margin: 0pt auto; display: block;"/>
  253. </p>
  254. Le cache est l'élément le plus simple à mettre en œuvre et il existe différents niveaux avec Django (page, fragment, vue, queryset, etc) qui permettent d'avoir la modularité nécessaire. Attention, il ne faut pas oublier d'avoir des mécanismes d'invalidation du cache ! (pas comme sur ce blog par exemple...)
  255. <p>
  256. <img
  257. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.033.jpg"
  258. alt="Django : qualité et performances"
  259. style="margin: 0pt auto; display: block;"/>
  260. </p>
  261. Le cache est bien pratique mais insuffisant parfois. Lorsqu'on arrive sur des gros projets, il est quasi illusoire de vouloir s'en tenir à des données normalisées. Ne serait-ce que pour le nombre d'items, il faut avoir recours à des champs dénormalisés. Django dispose de [signals](http://code.djangoproject.com/wiki/Signals) pour gérer ça de façon automatisée.
  262. <p>
  263. <img
  264. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.034.jpg"
  265. alt="Django : qualité et performances"
  266. style="margin: 0pt auto; display: block;"/>
  267. </p>
  268. De nombreuses choses peuvent être faites en asynchrone (envoi de mail, préchargements de widget coûteux, etc), AJAX peut ici prendre tout son sens.
  269. <p>
  270. <img
  271. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.035.jpg"
  272. alt="Django : qualité et performances"
  273. style="margin: 0pt auto; display: block;"/>
  274. </p>
  275. Il faut bien faire la différence entre ce qui est imputable à Django et ce qui concerne l'architecture de votre projet, un bon admin sys et/ou DBA peut faire des miracles. Il ne faut pas oublier non plus que les [performances css/js](http://performance.survol.fr/) jouent un rôle important à ce niveau...
  276. <p>
  277. <img
  278. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.036.jpg"
  279. alt="Django : qualité et performances"
  280. style="margin: 0pt auto; display: block;"/>
  281. </p>
  282. Une petite astuce propre à Django, l'utilisation du tag **{% with %}** pour créer des alias dans les templates lorsqu'une méthode coûteuse est évaluée dans une boucle par exemple.
  283. <p>
  284. <img
  285. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.037.jpg"
  286. alt="Django : qualité et performances"
  287. style="margin: 0pt auto; display: block;"/>
  288. </p>
  289. Le traitement des performances se fait de manière itérative, essayez de toujours identifier le facteur limitant de la réactivité de votre application.
  290. <p>
  291. <img
  292. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.038.jpg"
  293. alt="Django : qualité et performances"
  294. style="margin: 0pt auto; display: block;"/>
  295. </p>
  296. Un résultat est important, que ce soit un échec ou pas (le scientifique reprend le dessus), pensez à documenter vos essais, que ce soit pour votre équipe ou de manière publique (blog, [djangosnippets](http://www.djangosnippets.org/), etc).
  297. <p>
  298. <img
  299. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.039.jpg"
  300. alt="Django : qualité et performances"
  301. style="margin: 0pt auto; display: block;"/>
  302. </p>
  303. Un autre titre jemelapètegrave.
  304. <p>
  305. <img
  306. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.040.jpg"
  307. alt="Django : qualité et performances"
  308. style="margin: 0pt auto; display: block;"/>
  309. </p>
  310. La pérennité d'une application web est toute relative, l'évolution technologique est telle qu'il est difficile d'être pertinent à plus de 3 ans. Ça veut dire qu'il faut quand même rester évolutif jusque là !
  311. <p>
  312. <img
  313. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.041.jpg"
  314. alt="Django : qualité et performances"
  315. style="margin: 0pt auto; display: block;"/>
  316. </p>
  317. Les règles qui s'appliquent ici sont les mêmes que pour un projet Python, il est impératif de tester les différentes fonctionnalités grâce aux unittests et doctests. Django dispose d'[un module entier consacré à ça](http://www.djangoproject.com/documentation/testing/), il est temps de s'en servir. Un client spécifique aux tests permet même de tester les différentes vues et le résultats des appels (GET, POST, etc).
  318. <p>
  319. <img
  320. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.042.jpg"
  321. alt="Django : qualité et performances"
  322. style="margin: 0pt auto; display: block;"/>
  323. </p>
  324. En découplant les différentes applications de votre projet (lire à ce sujet l'[excellent post de James Bennett](http://www.b-list.org/weblog/2007/nov/09/projects/)), vous allez pouvoir vous constituer (ou [récupérer](http://code.google.com/hosting/search?q=label:django)) un bibliothèque d'applications web réutilisables dans plusieurs de vos projets.
  325. <p>
  326. <img
  327. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.043.jpg"
  328. alt="Django : qualité et performances"
  329. style="margin: 0pt auto; display: block;"/>
  330. </p>
  331. On ne mentionnera jamais assez à quel point la documentation d'un projet est importante. Normalement les doctests doivent permettre de « raconter une histoire », développez vos talents d'écrivain !
  332. <p>
  333. <img
  334. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.044.jpg"
  335. alt="Django : qualité et performances"
  336. style="margin: 0pt auto; display: block;"/>
  337. </p>
  338. Cerise sur le gâteau, Django vous permet de générer automatiquement la documentation à partir du code dans l'interface d'administration, ce qui s'avère très pratique si vous travaillez avec une équipe de plusieurs personnes dont certaines s'occupent exclusivement du html/css/js.
  339. <p>
  340. <img
  341. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.045.jpg"
  342. alt="Django : qualité et performances"
  343. style="margin: 0pt auto; display: block;"/>
  344. </p>
  345. Exemple d'itération sur l'implémentation des URL.
  346. <p>
  347. <img
  348. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.046.jpg"
  349. alt="Django : qualité et performances"
  350. style="margin: 0pt auto; display: block;"/>
  351. </p>
  352. Utilisation assez naïve avec la construction d'URL à la main, c'est une mauvaise pratique car vous devez modifier les URL à de nombreux endroits si vous décidez de changer votre schéma.
  353. <p>
  354. <img
  355. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.047.jpg"
  356. alt="Django : qualité et performances"
  357. style="margin: 0pt auto; display: block;"/>
  358. </p>
  359. La seconde méthode s'appuie sur une méthode du modèle (différente ici du bien connu **get\_absolute\_url** car on veut accéder au profil et non à l'utilisateur), c'est déjà mieux mais il faut encore modifier l'URL à deux endroits en cas de modification.
  360. <p>
  361. <img
  362. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.048.jpg"
  363. alt="Django : qualité et performances"
  364. style="margin: 0pt auto; display: block;"/>
  365. </p>
  366. Enfin la bonne méthode est d'utiliser [les URL nommées](http://www.djangoproject.com/documentation/url_dispatch/#naming-url-patterns), qui permettent de ne dupliquer la création des URL à aucun endroit, si vous modifiez celle dans **urls.py** ça va impacter sur l'ensemble des URL de votre site. Cela est permis grâce au décorateur **permalink**.
  367. <p>
  368. <img
  369. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.049.jpg"
  370. alt="Django : qualité et performances"
  371. style="margin: 0pt auto; display: block;"/>
  372. </p>
  373. Ces différentes pratiques vous permettent d'opérer des refactoring important de code tout en étant serein et de vous concentrer sur d'autres fonctionnalités.
  374. <p>
  375. <img
  376. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.050.jpg"
  377. alt="Django : qualité et performances"
  378. style="margin: 0pt auto; display: block;"/>
  379. </p>
  380. Je voulais terminer sur un point qui me semble capital pour améliorer la qualité d'une application (pas forcément Django).
  381. <p>
  382. <img
  383. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.051.jpg"
  384. alt="Django : qualité et performances"
  385. style="margin: 0pt auto; display: block;"/>
  386. </p>
  387. L'idée m'est venue en consultant la [présentation de Cameron Moll](http://www.cameronmoll.com/archives/001266.html) et plus spécifiquement le slide comparant le *bon designer* au *super designer*.
  388. <p>
  389. <img
  390. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.052.jpg"
  391. alt="Django : qualité et performances"
  392. style="margin: 0pt auto; display: block;"/>
  393. </p>
  394. J'en suis arrivé à la conclusion qu'un *bon développeur* est **consciencieux**, il connaît ses outils et sait parfaitement obtenir un résultat satisfaisant avec. Qu'est-ce qu'il lui manque alors ?
  395. <p>
  396. <img
  397. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.053.jpg"
  398. alt="Django : qualité et performances"
  399. style="margin: 0pt auto; display: block;"/>
  400. </p>
  401. Bien souvent **la curiosité**, celle de fureter pour finalement trouver une solution plus adaptée ou un module qui fait déjà ce qu'il a mis une semaine à coder, celle d'aller à des conférences, de lire des livres, d'essayer de comprendre pourquoi certaines choses ont été faites ainsi. Cette qualité vous permet de vous épanouir quotidiennement dans votre travail.
  402. <p>
  403. <img
  404. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.054.jpg"
  405. alt="Django : qualité et performances"
  406. style="margin: 0pt auto; display: block;"/>
  407. </p>
  408. Bon avec tous ces conseils, vous allez forcément faire une appli qui va conquérir le monde, faire chuter l'action Google et sauver la planète.
  409. <p>
  410. <img
  411. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.055.jpg"
  412. alt="Django : qualité et performances"
  413. style="margin: 0pt auto; display: block;"/>
  414. </p>
  415. Les crédits, merci ! (complètement illisibles, il faut que je trouve un moyen simple de formater ça)
  416. <p>
  417. <img
  418. src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.056.jpg"
  419. alt="Django : qualité et performances"
  420. style="margin: 0pt auto; display: block;"/>
  421. </p>
  422. ### Bilan personnel
  423. Je suis beaucoup moins satisfait de ma seconde prestation, j'ai remis en question chaque concept présenté au fur et à mesure, doutant de l'intérêt pour quelqu'un s'intéressant peu à Django. Du coup j'étais un peu hésitant et je pense que ça s'est ressenti.
  424. Au final, j'ai un peu le sentiment que ceux qui connaissaient pas trop ces problématiques se sont ennuyés et ceux qui y étaient confrontés aussi car je ne suis pas allé assez loin...
  425. Concernant Keynote (ça vaut pour les deux confs) : aucun problème au niveau des images, par contre je n'ai pas pris le temps de configurer l'écran pour voir le slide suivant + le temps sur l'écran et c'était un tort car ça aide beaucoup.
  426. ## Conclusion
  427. Il y a probablement des formats plus appropriés pour aborder les problématiques de performances/qualités comme des tables rondes ou des séances de questions/réponses comme me le suggérait [Fabien](http://fabien.schwob.org) par mail. Pour montrer la rapidité de développement de Django et donner envie d'essayer, rien ne vaut un atelier avec un petit projet de mise en bouche. Autant de pistes qu'il faudra explorer lors des journées 2009 !
  428. ### Vous y étiez ?
  429. **Votre avis m'intéresse énormément**. J'aimerais vraiment pouvoir progresser à ce niveau et vous êtes le mieux placé pour m'aider. J'ai déjà eu des retours par blog (merci [Sunny](http://sunfox.org/blog/2008/05/19/pycon/)), par email et sur irc mais si vous avez un peu de temps, n'hésitez pas, je prends le bon mais aussi et surtout le mauvais. N'ayez pas peur d'y aller trop fort, j'encaisse derrière :-).
  430. **[Edit]** : [les vidéos sont en ligne](http://dl.afpy.org/pycon-fr-08/videos/) ! Merci l'AFPy.