Qu’est-ce qu’une solution élégante en programmation ?

Aujourd’hui, nous abordons la question de l’élégance d’un code informatique. Pour parler des coulisses d’un logiciel ou d’un site web, on utiliserait plutôt les expressions « mettre les mains dans le cambouis » ou « regarder sous le capot ». L’esthétique du sujet étant peu évidente de prime abord. Tentons de voir les lignes de code sous un autre jour.
Fractal vegetable
Fractal vegetable – Par Rum Bucolic Ape sur flickr – licence CC BY-ND 2.0

Pour commencer, un langage informatique a des similitudes avec celui d’une langue parlée. Il a des règles de syntaxe et d’orthographe très précises.
Ainsi, comme il y a de belles écritures manuscrites tant par leur forme que par leur style, il y a de gracieuses manières de disposer les caractères à l’écran, de choisir ses mots, appelés instructions.

Les développeurs inventent même des conventions dédiées à leurs logiciels. Drupal a par exemple des règles de codage qu’il est conseillé de suivre quand on est un de ses contributeurs.
La longueur des lignes, la taille des espacements, la disposition des instructions sont ainsi définies et utilisées par les « drupaliens ».

Il est alors plaisant visuellement d’avoir à parcourir un fichier bien structuré plutôt qu’un méli-mélo de sigles disparates. Il va de soi qu’un code bien présenté est aussi plus facile à comprendre et à modifier. Il existe différents styles de présentation associés ou non à un langage particulier.

Écrire de manière ramassée

À coté de cet aspect formel, le style de codage compte beaucoup dans l’appréciation d’un programme. Il y a souvent plusieurs façons de résoudre un problème et en règle générale, une solution courte est plus appréciée par un développeur soucieux de bien faire les choses.
Pour coder « joliment », l’informaticien dispose parfois de raccourcis syntaxiques permettant d’exprimer rapidement ce qui aurait nécessité un plus long développement en temps normal.

Mais attention, comme il peut-être inconvenant d’avoir à lire un texte écrit façon « sms », la concision en informatique n’est pas toujours gage d’un travail compréhensible.
Il y a un équilibre à trouver entre simplicité et lisibilité qui permet la reprise et la lecture du programme par d’autres personnes. Permettre le partage du code participe aussi à sa qualité.

Concevoir avec astuce et habileté

Un programme succinct sera souvent plus efficace en terme de temps d’exécution. Il est également plus satisfaisant intellectuellement de trouver une solution bien conçue et précise.
Faire preuve d’astuce et d’invention, éviter les répétitions inutiles, trouver un enchaînement logique des commandes, garder seulement les étapes indispensables comportent une certaine beauté à l’instar d’une démonstration mathématique ou d’un raisonnement argumenté.

Tout le monde connaît par exemple l’histoire de l’aiguille dans la botte de foin. Pour la résoudre vous pouvez, avec beaucoup de cœur à l’ouvrage, enlever les brindilles une à une. Il est plus aisé de mettre le feu à la meule et tamiser les cendres pour retrouver aisément le petit bout de métal.
C’est ce genre de résolution habile qui participe à l’élégance de la solution trouvée.

Du fractal au chou romanesco

Fractals
Fractals – Sur flickr par cowicide – licence CC BY-NC 2.0

Les informaticiens ont à leur service un autre outil que vous connaissez peut-être sans le savoir : la récursivité.
On la trouve dans la nature sous la forme de la structure harmonieuse et équilibrée d’un flocon de neige ou celle du chou romanesco.
L’image fractale ci-contre en est un autre exemple où l’on voit un motif se répéter à l’intérieur de lui-même. Cette notion existe en mathématique, en linguistique, en biologie, dans les arts, et en informatique…

Le principe est simple en apparence, un programme récursif est un programme qui s’appelle lui-même.

Si vous aviez à calculer la hauteur cumulée d’une poupée russe et de ses descendantes, vous pourriez les aligner les unes à coté des autres.
Puis les mesurer chacune à leur tour pour trouver la hauteur totale, mais ce n’est pas satisfaisant.

Si vous êtes plus inventif vous allez utiliser une boucle en ordonnant au programme de parcourir toute la série de poupées gigogne, de mesurer leur taille respective et calculer le résultat que l’on souhaite.

Mais il y a une solution plus astucieuse avec la récursivité.
Vous mesurerez la figurine la plus petite, le travail est minimal, et appellerez votre programme sur toute la collection en lui donnant l’instruction suivante : la hauteur d’une poupée russe est une fois et demi plus grande que sa première fille.

Avec cette relation générale, votre script commencera par la poupée la plus grande, puis continuera avec la suivante en enregistrant le rapport entre les deux. Et ainsi de suite, jusqu’à l’ultime poupée dont il connaît la taille exacte. Alors, il pourra remonter la file des relations entre matriochkas et donner un calcul juste à partir de cette valeur terminale.

En conclusion

Voilà pour cette tentative d’éclairer « l’écriture informatique » sous un angle différent. Il n’y a évidemment pas de réponse universelle à cette question. C’est une affaire largement subjective et la beauté d’une solution informatique n’est pas tant dans l’enchaînement des caractères numériques que dans l’intention du codeur de rendre les choses agréables.

Pour finir, vous trouverez sur le site « 99 bottles of beer« , les différentes versions d’un algorithme écrit dans 1500 langages et générant les paroles de cette chanson. Alors, quel est selon vous le langage le plus esthétique ?

Feriez-vous un bon développeur web ?

La frontière étant désormais bien floue entre savoirs des bibliothèques et monde numérique, vous envisagez peut-être d’élargir vos aptitudes à l’informatique. Afin de vous aider à répondre à la question du titre, voici une tentative subjective de décrire le métier du développement web.
Sans titre - Par Ricardo Machado - Sur Flickr - CC BY-NC-ND 2.0
Sans titre – Par Ricardo Machado – Sur Flickr – CC BY-NC-ND 2.0

Commençons par une définition. Si l’on en croit cette fiche du Gdt, le développeur intervient sur toute la chaîne de réalisation d’un logiciel. Pour faire simple, il s’occupe de traduire un problème en termes informatiques.
Laissons d’emblée de côté l’image usuelle de la personne absorbée derrière un écran parcouru par les lignes d’un code indéchiffrable. La totalité de ce processus implique de collaborer avec plusieurs personnes et pas forcément avec l’aide d’un ordinateur. Lors du travail préliminaire d’analyse et de conception vous serez amené à beaucoup échanger avec vos collègues.

Ceci étant dit vous aurez besoin de faire preuve d’une grande autonomie. La majeure partie de cette activité consiste à corriger des erreurs et résoudre des problèmes. La phase de réalisation et création n’est que la partie émergée de l’iceberg.
D’ailleurs, sans avoir fait de longues études de programmation vous en viendrez vite à penser que l’informatique n’est pas une science exacte. Les mauvaises langues diront même que ce constat est un euphémisme mais nous ne commenterons pas.

Trouver sa place

La définition précédente est un peu trop générale car la réalisation d’un site web moderne fait appel à toute une palette de savoirs. L’ergonome permet à l’utilisateur de naviguer de façon intuitive, le graphiste propose un habillage agréable à visiter et à regarder, l’expert accessibilité indique comment rendre les pages praticables par tout le monde quelque soit son support de navigation. N’oublions pas le webmestre qui vérifie la qualité des contenus, le chef de projet pour organiser tout ce beau monde, etc.

Las, abandonnez vos rêves de toute puissance, vous ne serez pas seul pour dire « c’est moi qui l’ai fait ! ». Réjouissez-vous plutôt qu’on ne vous demande pas de maîtriser tous ces domaines riches et inépuisables. Pourtant, il est fortement recommandé d’en connaître les principales fondations. Ne serait-ce que pour travailler de concert avec tous les professionnels impliqués.

Cela demandera du temps et pour compliquer la tâche les connaissances sont rarement figées. En guise d’exemple, vous avez peut-être déjà connu les longs débats pour savoir si il faut ouvrir un lien dans une nouvelle fenêtre du navigateur ou non… Il vous faudra alors lire, comparer, garder un esprit critique et trouver des solutions qui satisfont au mieux les multiples exigences rencontrées.

Rendre les choses belles

Cette petite introduction ne vous donnera sans doute pas l’envie de changer de carrière pour autant. En revanche, si vous aimez le travail bien fait et que pour vous la manière compte au moins autant que le résultat alors vous serez comblé par tout ce qu’offre cette activité.
Comme dans beaucoup de domaines, il y a des bonnes pratiques et, malheureusement, de nombreuses mauvaises manières de faire également. Libre à vous de choisir les autoroutes du  moins disant ou les sentiers escarpés des solutions plus élégantes.

Prenons le cas du langage HTML. Avec cette figure de proue  du WEB, il est possible de baliser de manière très incorrecte une page. On parle alors de « soupe de balise ». Un développeur averti respectera au mieux la sémantique du texte qui n’en sera que mieux référencé. Il aura plaisir à utiliser une balise de titre pour un titre ou une balise de paragraphe pour un paragraphe. Ne souriez pas à cette apparente évidence, on trouve parfois des syntaxes étranges lors de l’inspection d’un code source.

D’un code explicite à l’accessibilité pour tous

De manière générale, vous aurez à cœur de rendre votre code beau et soigné. Il sera alors plutôt concis et facile à lire. Personne ne vous y obligera mais imaginez-vous que vous ayez à offrir un code du travail ou une lettre sympathique à un ami. Tous deux sont des textes, mais l’un est un plus beau don que l’autre. C’est une affaire de goût aussi.
Il existe également de la poésie informatique mais restons lucides, elle n’est pas encore enseignée sur les bancs de la faculté.

Enfin, nostalgique des premières heures du web, vous voudrez rendre votre site ouvert et accessible à tous, en particulier aux personnes handicapées. Malheureusement, ce domaine est un peu le parent pauvre de la toile. Il vient souvent à la fin des discussions et ne dispose pas toujours du temps qu’il mériterait. Mais ne désespérons pas des grandes causes. Rien ne vous empêchera de souffler discrètement ce sujet fragile sur la table des discussions de temps à autre. À cœur vaillant rien d’impossible.

Il y aurait sans doute d’autres choses à dire mais peut-être en savez-vous suffisamment, et la réponse vous appartient. Alors, feriez-vous un bon développeur web ?

Script de sauvegarde pour MySQL

Nos serveurs étant installés selon la technologie RAID, le risque de perte de données provient essentiellement d’une erreur logicielle ou humaine. Ne disposant pas de solution de sauvegarde professionnelle pour nos sites web et documents numériques, nous ne pouvions cependant pas rester sans copie de secours des fichiers et des bases les plus importants. Concernant ces dernières, un simple script les enregistre dans des fichiers distincts à intervalles réguliers. L’alambic numérique étant peu pourvu en langage informatique — un comble pour le blog d’une bibliothèque numérique –, voyons plus en détail le fonctionnement de ces quelques lignes de code.

Screenshot of the famous GLMatrix screensaver Copyright © 1999-2003 by Jamie Zawinski
Screenshot of the famous GLMatrix screensaver Copyright © 1999-2003 by Jamie Zawinski

MySQL, le système de gestion de bases de données  que nous utilisons, dispose d’un certain nombre d’outils d’administration. L’un d’entre-eux, permet d’exporter les bases dans un format adapté à un éventuel ré-import (en SQL). Chaque nuit, le programme qui nous intéresse ici, exporte les données de nos sites principaux à l’aide de ces commandes de gestion. Les extractions de la veille sont écrasées systématiquement et même si nous archivons régulièrement ces fichiers il n’y a donc pas de gestion des versions précédentes. Nous disposons tout de même d’une copie de secours en cas d’une perte de données inattendue.

Voici ce script et un commentaire associé :

[sourcecode language= »bash » highlight= »15,31″]
#! /bin/bash
#fonction testant la presence d’un element dans un tableau de chaînes
function in_array(){
chaine=$1
trouve=$(echo ${exclude[*]} | grep « $chaine »)
if [ « $trouve » != «  » ]
then
return 1
else
return 0
fi
}

#récupération de la liste des bases
bases=($(mysqlshow -pmotdepasse | cut -d ‘|’ -f2 | sed ‘1,3d’ | sed ‘$d’))

#repertoire de sauvegarde ou sont copiés les exports
rep=’/sauvegardes’

#liste des bases a exclure
exclude=(base1 base2 base3)

#lancement de l’export
for i in ${!bases[*]}
do
$(in_array ${bases[$i]})
inarray=$(echo $?)
if [ $inarray -eq 0 ]
then
echo ${bases[$i]}
mysqldump -u root -pmotdepasse –opt ${bases[$i]} > $rep/${bases[$i]}.sql
fi
done
[/sourcecode]

Ces quelques lignes sont écrites pour BASH, l’interpréteur de la ligne de commande sous Linux. Son fonctionnement est simple, il récupère la liste des bases présentes dans le serveur MySQL puis les enregistre dans un répertoire indiqué dans le programme à la ligne 18 . Certaines bases peuvent être ignorées en indiquant leur nom dans la liste de la ligne 21.
Les lignes en surbrillance ont une syntaxe particulière. Il ne s’agit pas d’une faute de frappe mais le mot de passe doit être accolé à l’option « -p » passée aux commandes mysqlshow et mysqldump.

Il suffit ensuite d’attribuer les droits d’exécution à ce script et de le lancer avec les commandes suivantes :

[sourcecode language= »bash » gutter= »false »]
$ chmod a+x dump-mysql
$ ./dump-mysql
[/sourcecode]

D’APOGEE à STAR : Automatisation de l’export sous linux

I was in space !!! - Par *Katch - Flickr - CC BY-NC-ND 2.0
I was in space !!! – Par *Katch – Flickr – CC BY-NC-ND 2.0

À Clermont-Ferrand le dépôt des thèses numériques dans STAR est officiel depuis Septembre 2010 pour l’université Blaise Pascal et depuis Janvier  2011 pour l’université d’Auvergne. Pour faciliter le dépôt des nouvelles thèses, un lien a été établi entre APOGEE et STAR et éviter ainsi une double saisie des informations administratives. Les données d’APOGEE sont extraites, puis mises en forme afin d’être importées dans STAR.

Cette méthode n’a rien d’originale et est notamment utilisée  à l’université de Tours qui a généreusement transmis sa méthode d’export/import sur la liste des correspondants STAR. Cette procédure a été retranscrite à l’université de Metz également. Nous l’avons quelque peu modifiée afin de simplifier cette routine effectuée chaque semaine.

Quelques fichiers à adapter

Le script d’extraction

Ce programme a été affiné par un informaticien de notre centre de ressources informatiques. Seules les informations des nouveaux doctorants (depuis la dernière extraction) sont aspirées. L’étape de suppression des doctorants déjà présents dans STAR est ainsi évitée.

Les données issues de l’export

L’étape d’édition du fichier CSV est encore nécessaire. Ceci pourrait être automatisé en adaptant la feuille de style XSL mais pour l’instant le jeu n’en vaut pas la chandelle. En pratique, il arrive que le nom du président du jury ne soit pas saisi dans APOGEE ce qui empêche l’import dans STAR (ce champ étant requis dans la recommandation TEF).

La feuille de style XSL

En plus de l’adaptation du numéro d’autorité Sudoc, on a du changer l’en-tête XML et une balise XSL pour l’adapter à la version de saxon. Il faut donc remplacer la ligne :

<?xml version="1.0" encoding="UTF-8"?>

par

<?xml version="1.1" encoding="UTF-8"?>

puis la ligne

<?xsl:result-document href="out/{$ETABLISSEMENT}_{CODE_ETUDIANT}.xml"?>

par :

<?xsl:document href="resultats/{$ETABLISSEMENT}_{CODE_ETUDIANT}.xml"?>

Un script bash pour générer les thèses

Ces modifications faites, un petit script (disponible en bas de cette page) a été créé pour automatiser la transformation du fichier d’export en fichiers de thèses XML conformes à la recommandation TEF.
Sous linux, il n’y a pas de problème d’encodage entre l’ANSI et l’UTF-8 (ce dernier format étant natif), on peut alors lancer notre script qui créera les fichiers des thèses dans un répertoire dédié.
Ce petit programme utilise le logiciel ffe (flat file extractor) pour transformer le CSV en XML, puis saxon (comme à Tours) pour la transformation en TEF.

Pour l’utiliser sous Ubuntu, les paquets libsaxon-java et ffe doivent être installés. La suite des opérations se déroule en ligne de commande.

  •   on place le fichier CSV issu de l’extraction à la racine du répertoire du script.
  •   on place le fichier de transformation XSL dans le répertoire « scripts »
  •   on execute la ligne de commande suivante :
$ ./ star.sh theses.csv scripts/feuilleXSL.xsl

Les thèses seront alors disponibles dans le répertoire « résultats » et prêtes pour l’import par mail.

Vous pouvez télécharger  le script bash pour STAR au format zip.