I. Introduction▲
PHP est un langage à qui on peut faire beaucoup de reproches. Cependant, sa grande popularité a permis de doter son univers d'un large panel d'outils et de pratiques permettant de l'utiliser avec efficacité.
Contrôler sa dette technique, ses temps de développement ou plus simplement maintenir une qualité logicielle suffisante exigent de respecter certains processus et bonnes pratiques que nous allons aborder ici. Chaque thème sera accompagné d'une brève description, de ses intérêts et d'une liste d'outils non exhaustive permettant son utilisation.
I-A. Pourquoi améliorer ses processus ?▲
Un projet dont les différents processus sont bien maîtrisés permet d'augmenter la part du temps consacré à la création de valeur comme l'ajout de fonctionnalités, de l'optimisation, etc. Au contraire, lorsqu'ils le sont mal, cette part diminue à la faveur des tâches non rentables comme le débogage, du rattrapage d'instabilités, de support, etc.
I-B. Avant de commencer▲
Notez que la plupart des éléments de cette liste sont valables pour n'importe quel langage dès lors qu'il ne s'agit pas d'un outil spécifique à PHP.
II. Les différents aspects▲
II-A. Gestionnaire de versions▲
Que le développement soit effectué par une équipe ou un développeur unique, la gestion de votre code source est essentielle.
II-A-1. Intérêts ▲
- Historisation de l'évolution du code.
- Identification des modifications apportées au code.
- Parallélisation des évolutions.
- Simplification de la gestion des versions de développement, de préproduction, etc.
II-A-2. Outils▲
II-B. Tests automatisés▲
Rédiger des tests automatisés est l'unique garantie de maîtriser les régressions de nos applications. C'est aussi maintenant une stratégie de rédaction de spécifications fonctionnelles.
II-B-1. Intérêts▲
- Réduire grandement les régressions.
- Piloter la rédaction du code (si le développement est piloté par les tests).
- Débusquer des malfaçons (si la rédaction des tests est faite après le développement).
- Être au plus proche des spécifications exprimées par le client (si utilisation des tests de spécifications).
II-B-2. Stratégies▲
II-B-3. Outils▲
II-C. Audits▲
Analyser le code source permet de repérer ses points faibles : morceaux de code complexes, non respectueux des standards, ouvrant des trous de sécurités…
II-C-1. Intérêts▲
- Travailler des portions de code avant d'y être confronté dans un contexte moins propice.
- Connaître l'état de santé du code de son projet.
II-C-2. Il est possible d'auditer▲
- La qualité du code (code complexe, variables inutilisées, code mort, duplications, etc.).
- La sécurité (injections SQL, pratiques à risques, etc.).
- Le respect des standards.
II-C-3. Outils▲
- PHP Code Sniffer : standards.
- PHPCpd : duplications.
- PHPDepend : complexité cyclomatique.
- PHP Mess Detector : complexité, code mort, code non optimisé, etc.
- Sonar : plate-forme d'audit et de suivi.
- RATS : sécurité.
- Nikto2 : sécurité.
- PhpMetrics: complexité, maintenabilité et taille d'un projet.
II-D. Monitoring▲
Suivre l'évolution des différentes métriques mises en place durant la vie du code source comme la réussite des tests automatisés, les différents audits , etc.
II-D-1. Intérêts▲
- Visualiser immédiatement lorsqu'un aspect se dégrade.
II-D-2. Outils▲
- Sonar : plate-forme d'audit et de suivi.
- Hudson : suivi de la réussite des tests.
- Travis-ci : suivi de la réussite des tests.
- Scrutinizer : suivi de la qualité du code.
- Siege : temps de réponse.
- Apache Bench : temps de réponse.
- qualiboo.com : suivi de la qualité du code.
- gatling.io : suivi des performances.
II-E. Profilage▲
Décortiquer l'exécution du programme et repérer les goulots d'étranglement.
II-E-1. Intérêts▲
- Repérer les goulots d'étranglement, les fonctions à optimiser.
II-E-2. Outils▲
- xDebug: profilage (phase de développement).
- KcacheGrind : visualisation des profilages de xDebug.
- Xhprof : (phase de production).
II-F. Documentation▲
Réduction du temps nécessaire aux développeurs pour s'approprier l'existant, maintien d'une connaissance sur la nature et l'usage du code. La documentation est une part essentielle de la conception logicielle.
II-F-1. Intérêts▲
- Permettre d'exploiter tout le potentiel du code (souvent du code non documenté est peu utilisé).
- Ne plus consommer le temps des développeurs (qui auront déjà dû passer du temps à comprendre le rôle du code concerné s'ils n'en sont pas l'auteur).
II-F-2. Outils▲
II-G. Gestion des dépendances▲
Gérer ses dépendances manuellement expose à différentes problématiques telles que le maintien des mises à jour, l'inclusion des fichiers, etc.
II-G-1. Intérêts▲
- Simplification de la gestion/installation de celles-ci.
- Simplification du déploiement.
II-G-2. Outils▲
II-H. Déploiement▲
Déployer rapidement votre application/bibliothèque, c'est gagner du temps souvent, mais aussi normaliser un processus supplémentaire. Au-delà des « scripts maison », il vous est également possible d'utiliser composer afin de créer un paquet gérable comme une dépendance.
II-H-1. Intérêts▲
- Normalisation.
- Simplification.
II-H-2. Outils▲
II-I. Gestionnaire de tâches▲
Un planning de développement est mieux maîtrisé lorsque les différentes évolutions et rapports de bogues sont listés, attribués et versionnés.
II-I-1. Intérêts▲
- Avoir une vision d'ensemble du planning.
- Historiser l'avancement.
- Faciliter l'estimation de charge.
- Disposer de données pour optimiser ses processus.
II-I-2. Outils▲
II-J. Standards▲
S'entendre sur des standards, c'est maintenir un code plus lisible dans lequel se cacheront moins de petites erreurs.
II-J-1. Intérêts▲
- Éviter de se réadapter systématiquement aux différents styles de code.
- Normalisation des espaces de noms, de l'inclusion automatique, etc.
II-J-2. Outils▲
II-K. Performance▲
La lecture et compilation du code à chaque exécution de script, où le calcul d'une réponse identique à la précédente coûte cher en ressources et temps d'exécution. Il existe naturellement des solutions pour pallier ces problématiques.
II-K-1. Intérêts▲
- Améliorer les temps de réponse.
- Réduire la charge serveur.
II-K-2. Outils▲
II-L. Architecture▲
Les conséquences d'une mauvaise architecture se font souvent ressentir tardivement. Lorsque le code source est suffisamment avancé pour que la restructuration ait un coût trop élevé. Il est donc important de bien s'attarder sur ce sujet au commencement du projet.
Les frameworks sont d'une aide extrêmement précieuse concernant ce point.
II-L-1. Intérêts▲
- Réduire la charge que représente l'introduction de développeurs à votre projet.
- Adopter une architecture projet mature.
- Utiliser des patrons de conception déjà implémentés.
- Former vos développeurs à de bonnes pratiques.
II-L-2. Frameworks▲
II-M. Qualité du code▲
Cet aspect souvent mis de côté au profit d'une réduction du temps de développement peut s'avérer très chronophage par la suite. Délaisser la qualité engendre irrémédiablement de la dette technique. S'attarder sur la rédaction du code, respecter des paradigmes et méthodologies s'avéreront être bénéfiques sur différents aspects.
II-M-1. Intérêts▲
- Lisibilité du code : le code peut être assimilé et utilisé plus rapidement par les développeurs.
- Extension et évolution du code : le code pourra être étendu et modifié simplement.
- Stabilité : un code « propre » est plus stable.
II-M-2. Outils▲
- SOLID : les principes incontournables d'un code orienté objet.
- KISS : simplifiez votre code. Mieux vaut plusieurs fonctions compréhensibles qu'une seule difficile à décrypter.
- L'abstraction : concevez votre code comme des boites noires dont les points d'entrée et de sortie sont l'interface publique.
- DRY : éviter la redondance facilitera le test, le débogage, les évolutions et la maintenance.
II-M-3. Lectures▲
- Coder proprement, de Robert C.Martin : la bible des méthodes de rédaction d'un code « propre ».
III. Conclusion▲
Sachez qu'il existe également un mémento dédié à ce sujet : Mémento - PHP 5 Industrialisation Outils et bonnes pratiques, dans lequel vous pourrez trouver des exemples pratiques. Ainsi qu'un site regroupant quelques outils sur phpqatools.org.
Tous nos remerciements à Jean-François Lépine pour sa relecture technique, et à ClaudeLeloup pour sa relecture orthographique.