Archives par mot-clé : programmation

PHP : Industrialisation et bonnes pratiques

Note: Une version plus abouti de cet article est disponible ici.

PHP est un langage à qui on peut faire beaucoup de reproches. Cependant, sa grande popularité à 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 assurer une qualité logicielle suffisante exigent de respecter certains processus et bonne 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.

Notez que la plupart des éléments de cette liste sont valables pour n’importe quel langage dès lors que ce ne sont pas des outils spécifiques à PHP.

Gestionnaire de version

5488984404_4f693eec32_bQue le développement soit effectué par une équipe ou un développeur unique, la gestion de votre code source est essentielle.

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.

Outils :

Tests automatisés

iNKyhRédiger des tests automatisés est l’unique garantie de maîtriser les régressions. Cela peut aussi être  une stratégie de rédaction de spécifications fonctionnelles.

Intérêts :

  • empêcher 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)

Stratégies :

Outils :

Audits

Sonarqube-nemo-dashboardAnalyser le code source permet de repérer ses points faibles : Morceaux de code complexes, non respectueux des standards, ouvrant des trous de sécurité …

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

Il est possible d’auditer :

  • la qualité du code (code complexe, variables inutilisées, code mort, duplications, etc)
  • la sécurité (injections sql, pratiques à risque, etc)
  • le respects des standards

Outils :

Monitoring

travisSuivre 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.

Intérêts :

  • visualiser immédiatement une dégradation

Outils :

Profilage

django-runprofileserver-kcachegrind-fullDécortiquer l’exécution du programme et repérer les goulots d’étranglements.

Intérêts :

  • repérer les goulots d’étranglements, les fonctions à optimiser

Outils :

  • xDebug: Profilage (phase de développement)
  • KcacheGrind : Visualisation des profilages de xDebug
  • Xhprof : (phase de production)
  • Blackfire (phase et développement et de production)

Documentation

figure001Ré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.

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 de temps à comprendre le rôle du code concerné s’ils n’en sont pas l’auteur)

Outils :

Gestion des dépendances

successful-installationGérer ses dépendances manuellement expose à différentes problématiques telles telles que la maintenance des mises à jour, l’inclusion des fichiers, etc.

Intérêts :

  • simplification de la gestion/installation de celles-ci
  • simplification du déploiement

Outil :

Déploiement

Capture du 2015-09-08 22:15:27Déployer rapidement votre application/librairie c’est gagner du temps, 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.

Intérêt :

  • normalisation
  • simplification

Outils :

Gestionnaire de taches

Redmine_2_159858_i0Un planning de développement est mieux maîtrisé lorsque les différentes évolutions et rapports de bugs sont listés, attribués et versionnés.

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

Outils :

Standards

Capture du 2015-09-08 22:18:33S’entendre sur des standards c’est maintenir un code plus lisible dans lequel se cacheront moins de petites erreurs.

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.

Standards :

Performance

apc.php_La lecture et compilation du code à chaque exécution de scripts, ou 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.

Intérêts :

  • améliorer les temps de réponse
  • réduire la charge serveur

Outils :

Architecture

Bridge_design_patternLes conséquences d’une mauvaise architecture se font souvent ressentir tardivement. Lorsque le code source est suffisamment avancé pour que la restructuration représente alors 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 bien que l’on puisse nous-mêmes construire une architecture et implémenter des patrons de conceptions.

Intérêts :

  • réduire la charge que représente l’introduction de développeurs à votre projet
  • adopter une architecture c’est éviter d’en expérimenter une
  • forme vos développeurs à de bonne pratiques
  • gains de temps
  • robustesse
  • maintenabilité
  • sécurité

Frameworks :

Principes:

Exemple:

jConfirmAction: Quelques modifications

J’utilise pour un de mes projets le plugin jQuery jConfirmAction sous licence GPL version 2. J’y est effectué quelques modifications et les redistribuent donc sous cette même licence.

Le script, téléchargeable ici: jconfirmaction.jquery. Les différences avec le script de Hidayat Sagita sont les suivantes:

Exécution de fonctions

A l’origine le click sur « Oui » n’avait pour effet que de faire suivre le lien d’origine. L’ajout des trois paramètres « onYes », « onOpen » et « onClose » auxquels on transmet des fonctions nous permet de faire un peu plus de choses.

  • onYes est appelé lorsque le bouton « Oui » est cliqué.
  • onOpen est appelé lorsque la boite de confirmation apparaît.
  • onClose est appelé lorsque l’utilisateur

Ces fonctions reçoivent toujours comme argument le lien d’origine (sur lequel a été appliqué jConfirmAction).

$('a.remove').jConfirmAction({
  question : "Supprimer ?",
  yesAnswer : "Oui",
  cancelAnswer : "non",
  onYes: function(link){
    // [...]
    return false;
  },
  onOpen: function(link){
    // [...]
    return false;
  },
  onClose: function(link){
    // [...]
    return false;
  }
});

justOneAtTime

Le paramètre justOneAtTime (par défaut sur vrai) permet de détruire les autre boites de confirmations lorsqu’une s’ouvre. Cela permet donc simplement de d’en n’avoir qu’une a la fois.

Utilisation de ‘live’

J’ai préféré remplacer l’utilisation de bind par live. Décision prise par rapport a ce dont je parlais dans cet article.

Les modification apportés sont essentiellement pour rendre l’utilisation de ce plugin plus souple en particulier dans un contexte ou vous utilisez l’ajax.

Enjoy 😉

Une citation pour développeur d’applications

Je lis actuellement « La programmation orienté objet » de Huges Bersini. Au passage c’est un ouvrage très agréable a lire et simple a comprendre (surtout quand on maîtrise déjà la POO).

J’ai remarqué une phrase très sympathique qui m’a rappelé le temps ou je cherchais ma voie dans les langages de programmation:

« Plus l’application à réaliser est complexe et fait intervenir de multiples acteurs en interaction, plus il devient bénéfique de prendre ses distances par rapport aux contraintes imposés par le processeur, pour faire du monde qui nous entoure la principale source d’inspiration.«