Comment je code
lundi 2 décembre 2013 à 00:00À force de travailler sur différents projets Web, que ce soit en JavaScript, en PHP ou autre, j'ai perdu pas mal de temps parce que je n'avais pas de méthode, parce que je voulais aller le plus vite possible, mais forcément après j'étais bloqué. Peu à peu, j'ai donc développé une méthode qui au final me permet d'aller encore plus vite parce que je réutilise toujours mieux ce que j'ai fait précédemment. Je n'exclue pas de la préciser encore et la faire évoluer, mais dans ce cas je prendrai le temps de faire également évoluer mes anciens projets personnels. (c'est ma méthode personnelle, je ne prétends pas qu'elle est originale ou meilleure que les autres)
- Avant tout, j'écris précisément ce que je veux faire.
- Je vérifie si ça existe et :
- Si ça n'existe pas, je continue
- Si ça existe mais que je pense pouvoir faire mieux ou plus simple, je m'y mets, en profitant des autres exemples pour améliorer mon idée
- Je trouve un nom sympa pour le projet et je crée un nouveau dossier qui porte ce nom (pour moi c'est quand je crée ce dossier que le projet démarre vraiment)
- Je regarde dans mes autres projets quelles parties je peux réutiliser pour ce nouveau projet (souvent j'ai déjà fait 80% du travail)
- Tous les fichiers utilisés par ce projet seront dans ce même dossier.
- Tous mes projets personnels sont contenus dans un même répertoire.
- Tous mes projets contiennent :
- un fichier de présentation (README) qui :
- décrit le projet en une courte phrase
- liste quels sont les pré-requis du projet (système, version de logiciels, librairies utilisées)
- contient un lien vers une démo et/ou le site officiel
- contient un lien vers la documentation
- contient un lien vers le fichier de licence
- d'information sur la licence (LICENSE)
- une icone (favicon.ico au minimum, mais on a le droit d'être exhaustif)
- La documentation (/doc)
- Un fichier pour les moteurs de recherche (ROBOTS.txt)
- Un plan du site (sitemap.xml)
- Un fichier d'accès pour (.htaccess)
- Un filtre d'exclusion pour Git (.gitignore)
- J'ai fait un script qui me permet de vérifier que tous mes projets contiennent au minimum ces fichiers.
- un fichier de présentation (README) qui :
- Mes projets sont en même temps :
- Sur mon ordinateur (http://localhost/~talenka/projets/nom-du-projet/)
- Sur le serveur (https://nom-du-projet.boudah.pl)
- Sur GitHub (https://github.com/Talenka/nom-du-projet/)
- Sur un disque dur externe (sauvegarde mensuelle)
- J'utilise rigoureusement le même nom pour tous ces supports, raison pour laquelle mes noms de projets ne contiennent que des minuscules et des tirets.
- Pour les projets utilisant PHP :
- J'utilise une structure Modèle-Vue-Controlleur avec un répertoire pour chaque contexte.
- J'utilise un script bash pour vérifier que mon programme :
- suit au plus près les recommandations PSR-0 à PSR-2 (avec php-cs-fixer),
- n'est ni bordélique ni redondant ni excessivement compliqué (avec phpmd),
- a toujours sa documentation accessible et à jour (avec phpDocumentor).
- Je n'utilise Javascript que si c'est absolument nécessaire.
- Pour les projets utilisant Javascript :
- Google Closure Linter : permet de rester conforme aux standards de programmation et donc d'avoir un code toujours lisible, par soi et par les autres.
- Google Closure Compiler : combine tous les fichiers javascript en un seul, retire le code inutile, optimise à fond et minifie le code. Un vrai bijou ! Cependant le code produit n'est pas lisible par l'utilisateur, donc pas vraiment libre : c'est pourquoi j'indique toujours un lien vers la vraie source, lisible et documentée, et je donne les instructions de compilation. On peut penser ce qu'on veut de Google, mais ils font de bons outils, à nous d'en faire de bonnes choses.
- JSDoc : documente le code
- Quand j'ai fini une fonctionnalité, je relis le code, de préférence en utilisant des outils automatisés.
- À chaque fois que je souhaite rajouter une fonctionnalité, je me pose d'abord la question de son utilité (principe KISS), et si elle est indispensable, je me demande dans quelle mesure je peux utiliser le code actuel de mon projet pour la réaliser (principe DRY).
- Je garde à l'esprit que je veux rendre un service à des utilisateurs qui veulent quelque chose d'intuitif et de rapide, et qui ne sont en général pas des geeks. Viser la simplicité.
- J'essaie de toujours écrire mon code et sa documentation en anglais. Je suis un défenseur de la diversité culturelle et en particulier de ma langue, le français ; mais l'anglais est sur le web, encore plus dans le monde réel, la langue universelle.
- J'utilise exclusivement les standards ouverts (ceux qui sont déjà bien répandu, voire un peu les suivant) : HTML5, CSS3, ECMAScript6, flux rss/atom, micro-formats, ... Et dès que c'est possible, je préfére les ressources réellement libre (sous GNU/GPL, CC-BY-SA ou dans le domaine public).
- J'utilise des noms de fichiers, de classes, de fonctions, qui décrivent précisément ce que ça fait (code auto-documenté), jamais une variable qui s'apelle $trucTemporaire par exemple.
- Je m'arrange pour que les URLs du projet soient intuitives mais avant tout stables.
- La rapidité est souvent la fonctionnalité la plus importante d'un projet. Donc dès que c'est possible :
- je mets les ressources en cache
- j'utilise des fichiers statiques
- j'utilise du texte ou du CSS plutôt que des images
- je minifie et compresse un maximum (avec gClosure, tinypng, et des petites fonctions faites moi-même, pas très souples mais très légères et efficaces)
- je limite le nombre de fichiers de chaque page web
- Je ne peux pas le recommander parce que ce n'est pas un logiciel libre, mais j'utilise et j'adore Sublime text, car il rend vraiment très agréable de programmer.
- Pour surveiller les performances d'un projet, j'utilise les outils webmasters de Firefox (Firebug), mais également PageSpeed.
- Je m'arrange pour que mes pages Web soient agréablement lisibles qu'on les voient avec un téléphone ou un écran HD.
- Lorsque j'ai un doute sur une classe/fonction PHP ou javascript, ou si j'entends parler d'une nouvelle fonctionnalité HTML par exemple, je consulte les ressources communautaire (php.net, MDN ou alsacreations.com)