Un Electron Libre...

Aller au contenu | Aller au menu | Aller à la recherche

Tag - bonnes pratiques

Fil des billets - Fil des commentaires

lundi 8 septembre 2008

En 2008, ça se fait encore...

Besoin : afficher les 8 dernières actualités et mettre en place un système de pagination pour accéder aux actualités

Réponse obtenue et livrée d'un développeur d'une SSII :

  • Récupération de toutes les news (via l'équivalent d'un joli SELECT *) dans un tableau en PHP
  • Parcours du tableau pour conter le nombre d'éléments du tableau obtenu précédemment et gérer ainsi la pagination
  • Récupération en base des 8 dernières news en vue de leur affichage (ce serait trop bête d'utiliser le tableau obtenu précédemment)
  • Pas d'utilisation du mécanisme de cache fourni par le CMS (eZ Publish) - donc à chaque rechargement de page, on recommence...

Quand il y a une 20aine d'actualités, coté temps d'affichage ça va encore - lorsqu'il y en a >1000, ça le fait tout de suite moins.

Réponse attendue d'un développeur sensible aux bonnes pratiques du web et conscient des problématiques de charges :

  • Utilisation de COUNT (ou plutôt de son équivalent dans le langage du CMS utilisé)
  • Récupération en base des 8 dernières actualités en vue de leur affichage
  • Mise en cache du résultat obtenu

C'est dans ces cas aussi que l'on souhaite une professionnalisation des métiers du web. Certains diront que la qualité se vend mal. C'est sur que si les clients ont déchanté face aux promesses de qualité faites par les SSII/Editeurs, ils vont avoir du mal à acheter une telle qualité annoncée. Le problème tient au fait pour les SSII de prouver à leurs clients que la qualité annoncée sera au rendez-vous et de former le cas échéant ces collaborateurs. Pour le bien de tous (développeur, SSII, client), il est évident que cette professionnalisation se fasse mais faut-il encore le vouloir et le financer... Dans ce cadre, on ne peut pas demander à un collaborateur de se former sur son temps libre ou chez un client...

samedi 16 août 2008

Conventions de codage (si tant est que j'en ai...)

Quand j'ai vu cette chaine sur les conventions de codage se diffuser sur le web avant l'été (ici ou encore ), je me disais "enfin une qui va me passer à coté, je peux dormir tranquille", ne me considérant pas comme un développeur (ou alors un du dimanche ;-) ) et n'étant pas non plus développeur de formation... Et bien non, Nicolas Hoizey a décidé de me refiler cette chaine.

Pour les projets réalisés dans un cadre professionnel, pour tout ce qui a été en html/css/php et autres boucles SPIP, j'ai par le passé tenté de bêtement copier ce que faisaient mes petits camarades. Cela se justifiait principalement par le fait que j'intervenais ponctuellement sur le code et ne souhaitait pas les perturber plus que nécessaire.

Pour les projets réalisés dans un cadre professionnel et dont je suis à l'origine ou pour mes projets perso, je n'ai pas de règle précise, je vise surtout une logique de lisibilté.

Cela donnera par ex pour un script bash dont l'objectif est de packager des fichiers par ex :

#
## Get relevant information for the packaging
#
 
# Do we need to send file on the front server ?
... some code ...
 
# Do we need to send file on the database server ?
... some code ...
 
#
## Let's build the package
#
 
# Package files for front server
... some code ...
 
# Package files for database server
... some code ...

Je prends souvent ce schéma pour tout ce qui a trait à l'administration système et pour les CSS (en adaptant les caractères de commentaires bien sur...).

Pour continuer sur les CSS, mon ordre de fabrication de mon fichier va être le suivant :

  • Eléments globaux / génériques
  • Section des plus "grandes" vers les plus "petites" (body > left > sidebar)
  • Au sein de chaque section, en premier lieux les éléments de positionnement puis ceux de mise en forme (pour reprendre une logique du plus grand au plus petit)

L'idée étant de regrouper le code en des sous-ensemble logiques.

Cela pourrait donner qqc comme :

/********************************
*  Elements généraux/generiques
********************************/
 
body {
}
 
h1 {
}
 
a {
}
 
/********************************
* Zone gauche
********************************/
 
#left {
}
 
/* Menu gauche */
 
#left #menu {
}
 
#left #menu a{
}

Par contre, là où j'ai toujours eu un souci avec PHP par ex, c'est sur la convention à suivre sur la gestion des accolades (qui en plus suivant l'IDE, l'interpréation peut changer) :

Ex :

if ($toto == "toto")
    {
    ... some code ...
    }

ou

if ($toto == "toto")
{
    ... some code ...
}

ou :

if ($toto == "toto") {
    ... some code ...
    }

ou :

if ($toto == "toto") {
    ... some code ...
}

Ou surement encore plein d'autres choses faisant que mon code au final se trouvait mal indenté (ou pas toujours de la même façon, ne parvenant pas à décider de ce qui était le plus lisible), surtout si les choses avaient tendance à s'imbriquer.

Je pense d'ailleurs que c'est une des raisons pour lesquelles j'aime python. L'indentation que l'on doit respecter permet de donner une bonne lisibilité du code. En plus, la charte de bonne conduite est clairement définie, même si je ne la suis pas encore dans son intégralité...

"""
Profile
 
This object is used to provide some common information regarding the profile of a user.
"""
 
class Profile(models.Model):
    CIVILITY_CHOICES = (
         ('single', _('Single')),
         ('taken', _('Taken')),
    )
    who = models.ForeignKey(User, unique=True, verbose_name=_('Person'),)
    photo = models.ImageField(height_field="80", width_field="80", upload_to="photos", blank=True)
    street = models.CharField(_('Address 1'), max_length=100)
    street_bis = models.CharField(_('Address 2'), max_length=100, blank=True)
    zipcode = models.IntegerField(_('Zip code'), max_length=5)
    city = models.CharField(_('City'), max_length=100)
    country = models.CharField(_('Country'), max_length=100)
    phone = models.CharField(_('Phone'), max_length=20)
    mobile = models.CharField(_('Mobile'), max_length=20, blank=True)
    civility = models.CharField(_('Status'), max_length=20, choices=CIVILITY_CHOICES)
    birthdate = models.DateField(_('Birth date'))
    children = models.IntegerField(_('Children'), blank=True, null=True)
 
    def __unicode__(self):
        return self.who.get_full_name()
 
    class Admin:
        list_display = ('who',)
        list_filter = ['who',]
        search_fields = ['who',]
 
    class Meta:
        verbose_name = _('Civil state')
        verbose_name_plural = _('Civil states')

Pour le débat indentation vs espace, j'avoue avoir préféré les espaces. Etant feinéant, je profitais aussi de la fonction de nombreux IDE qui transforment la tabulation en 4 espaces (ce qui permettait de continuer à utiliser la touche tab pour indenter son code...)

En tous cas, si je devais donner une conclusion à cet essai, que pour adopter une convention de codage, il faut :

  • Regarder si une convention n'est pas définie au niveau du language, si oui, alors l'adopter.
  • Regarder si une convention n'est pas définie au niveau du programme que vous utilisez, si oui, alors l'adopter (et si elle entre en conflit avec celle du langue, tant pis pour le langage, il est plus logique d'avoir un code cohérent)
  • Si aucune des deux n'est définie, voir pour trouver une convention qui vous va bien à vous et le cas échéant à vos coéquipiers (à ce titre, mieux vaut en discuter avant le début du code qu'après, ça évitera de vous marcher dessus ensuite...)
  • Adopter une terminologie anglaise (penser que votre code et commentaires peuvent être lus/utilisés par un prestataire indien - que feriez vous si vous deviez reprendre un code dont les commentaires sont en chinois par ex ?)

mardi 9 octobre 2007

Comment assurer la pérénité de son projet ?

Etant en train de mettre à jour un site réalisé sous SPIP 1.7 vers SPIP 1.9.2c (soit un écart proche de *21* versions intermédiaires (majeures ou mineures), voici quelques retours :

  • Ne pas suivre la mise à jour de l'outil qu'on utilise, c'est très mal. Avoir en tête tous les changements qui ont eu lieu entre ces versions relèvent parfois du casse-tête. Bon en même temps, un bug sur le critère titre_mot a empêché une mise à jour de l'outil pendant longtemps (au moins la version 1.8.2e, soit déjà 10 versions d'écart).
  • Ne pas documenter le code (php ou les squelettes SPIP), c'est mal aussi.
  • Ne pas conserver les sources des animations flash, c'est mal aussi (pour le coup, cela m'a simplement obligé à utiliser un lien symbolique suite à la réorganisation du bazar)

Du coup, on peut raisonnablement se dire que pour assurer la pérénité de son projet, il faut :

  • Documenter le code de façon satisfaisante :
    • Utilisation de la javadoc, phpdoc, ...
    • Utilisation de la balise REM pour les squelettes SPIP expliquant chaque boucle ou bloc de boucle (notamment avec les boucles HIERARCHIES)
    • Documenter le fonctionnement du site, les règles de gestion, la raison d'être des différents articles, etc que ce soit dans un document externe ou au sein des squelettes par ex
  • Le code ne correspondant pas au code source de l'application doit être clairement identifiable.
    • Seul le code source spécifique au projet doit dès lors être dans le gestionnaire de source du projet
  • Suivre les mises à jour de l'outil au fur et à mesure en tirant parti des nouvelles fonctionnalités
    • Le nouveau compilateur (plus oblige a réécrire certaines boucles vu qu'il est moins laxiste que précédemment.
    • L'apparition de #DOSSIER_SQUELETTE puis de CHEMIN{} permet ainsi de centraliser tous les éléments de vos squelettes et vous donne une plus grande flexibilité (plus de chemin en dur par ex)
    • Le coût de la mise à jour est alors minime et réparti - plutôt qu'un gros coup prohibitif lors de la mise à jour 21 versions plus tard, risquant de plonger votre projet dans l'immobilisme total...
    • La transformation de certains bouts de code en plugins SPIP (notamment pour des éléments insérés dans la partie privée) est un réel plus et améliore la lisibilité de votre site/code.
  • Suivre les mises à jour pour bénéficier des correctifs de sécurité
  • Sans oublier que la mise en page par tableaux, c'est une horreur à maintenir, illisible, etc.

La liste n'est sans doute pas exhaustive mais déjà rien que pour ce projet, je peux mettre un zéro pointé partout. Alors certes, un bug SPIP corrigé en 1.8.2e empêchait toute mise à jour vers la version 1.8 de l'outil, mais depuis, cela aurait du être fait proprement.

En tous cas, ça vous donne plein de bonnes pratiques pour vos prochains projets perso / cahier des charges / mode de gestion de projet / ... ; si ça vous en donne pas, moi si !