Un Electron Libre...

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

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 ?)

mercredi 7 février 2007

Devez-vous innover ou vous contenter de suivre la tendance générale ?

Billet publié originellement sur le blog de Clever Age : Devez-vous innover ou vous contenter de suivre la tendance générale ?. Pour la petite histoire, ça m'a permis de gagner un Ipod Nano ;-)

Tel est le paradoxe quotidien de l’informatique (mais pas uniquement). A l’heure du web 2.0 subsistent des applications client/serveur et AS/400 à plus ou moins juste titre. Avec le web 2.0 est arrivé le buzz autour de la société 37signals et de ses applications Basecamp ou encore Ta-da list basé sur le framework Ruby on rails. A contrario, dans les grandes sociétés françaises et internationales, les seules technologies présentes sont J2EE, .Net et dans une moindre mesure PHP (ce dernier a su acquérir ses lettres de noblesse ces dernières années). En dehors de ces technologies, point de salut. Nous pourrions nous dire que toute société de services se doit alors de maîtriser ces technologies pour pouvoir accompagner des grands comptes dans leurs projets. Pour autant, ces mêmes sociétés de services doivent-elle se priver de ces nouveaux outils qui ont fait et font leurs preuves au jour le jour ?

Il y aura toujours des partisans du "ma société fera uniquement du Java/PHP/.Net". Ce positionnement peut paraître raisonnable et raisonné pour une société s’adressant à des grands comptes :

  • Les grands comptes lancent des projets quasi uniquement sur ces technologies,
  • les compétences python (utilisé dans les frameworks Django, Turbogears, etc) ou ruby (utilisé dans le framework Rails) sont assez peu présentes en France et lorsqu’elles existent, elles sont concentrées dans un petit nombre d’entreprises (dans le cas de python). Pour ruby, cela est encore plus vrai. Dès lors, il pourrait paraître risqué pour une entreprise de se lancer dans un projet utilisant un de ces deux langages.
  • Ce manque de compétences s’explique par un manque de formation à ces langages. Les technologies les plus demandées étant Java, PHP et .Net, les développeurs et les établissements de formation ont donc naturellement privilégié ces langages. Nous pourrions donc tout à fait voir des changements d’ici quelques années avec le succès actuel que connait ruby/rails notamment mais aussi python dans cette ère du web 2.0.
  • Le langage python a en outre été mis à mal lorsqu’un de ses promotteurs, Nuxeo, a finalement décidé de passer sa solution CPS sous Java en lieu et place de Python/Zope.

Pour autant, et sans pour autant céder aux sirènes du web 2.0 ou au coté "hype" de ces frameworks, je pense que toute société de services se doit d’évaluer ces frameworks et langages et le cas échéant investir dedans. Je ne dis pas pour autant qu’il faille abandonner des technologies comme Java, PHP ou .Net, loin de là. Ces nouveaux langages et frameworks peuvent répondre à certains besoins non couverts par les autres ou bien de façon plus rapide. Ce serait quand même bête de s’en priver, non ?

Dès lors, malgré ces faiblesses conjoncturelles (manque de compétences ruby / python), il peut être opportun pour une société de services d’investir dans ces langages. Il lui reste ensuite à adapter son langage commercial pour prendre en compte ces nouvelles possibilités. C’est à la société de services de bousculer alors un peu les choses et de convaincre son client (sous réserve que ce dernier n’ait pas de contraintes technologiques à respecter) que son projet peut tout à fait être fait avec ces nouveaux frameworks, non pas pour des raisons de mode mais parce que ceux-ci sont fiables, répondent totalement au besoin du client, permettent de réaliser le projet dans un délai plus réduit que tel autre framework Java/PHP/.Net, etc.

Si la société de services n’apporte pas l’innovation source de valeur pour son client, qui le fera ?

vendredi 19 janvier 2007

Atome : petite pause

C'est encore la faute à Niko qui me demandait pourquoi je n'étais pas parti sur un framework PHP ou sur (Ruby on) Rails pour le projet Atome.

Mes raisons sont assez simples :

  • C'est en lisant "Apprendre à programmer en python" que j'ai découvert python et compris le fonctionnement de la programmation orienté objet et les notions de classes, méthodes, etc.
  • Python est un langage universel dans le sens où on peut aussi bien faire des scripts batch, que des applications graphiques ou du développement web (contrairement à PHP, même s'il y a un php-cli et php-gtk)
  • David m'avait bien vendu python lors d'échanges par mail,
  • le modèle objet de PHP reste obscure pour moi avec ces -> et ces $this

Maintenant que j'ai un début de blog qui tourne sous django (comprendre je peux créer/modifier/supprimer des billets, les assigner à des catégories et/ou tags, lister les catégories/tags et lister les billets d'une catégorie ou d'un tag), je me demande si je ne vais pas m'occtroyer une petite pause dans mon développement (pourtant, ce matin dans le train, je me suis noté 25 tâches à faire pour terminer ce projet ;-) ).

Cette pause consisterait à recréer ce que j'ai fait pour le moment sous Django sous d'autres frameworks pour voir ce que j'en pense en vrai :-)

La liste des prétendants pourrait être la suivante :

  • Framework PHP : Symfony, mais c'est peut être sortir un tank pour pas grand chose...
  • Framework Ruby : Rails

Brièvement, le projet Atome a pour objectif de permettre d'avoir en un seul et unique endroit, un espace "blog" et un espace "tutoriel" avec tout ce qui va bien (commentaire threadé, tags, catégories, flux rss/atom, trackbacks, pings, coloration syntaxique, éditeur riche (pas forcément wysiwyg...), urls propres, etc).

et toi cher lecteur, qu'en penses-tu de cette idée ? que ferais-tu à ma place ?