Archive for décembre, 2013

Arrêtez d’écrire des classes !

lundi, décembre 30th, 2013

En créant les nouvelles fonctionnalités ASCII art de txt2tags, j’ai été amené à développer un certain nombre de fonctions spécifiques que j’ai donc logiquement fini par extraire dans une librairie autonome nommée aa.py. Pour des raisons historiques, d’habitude des utilisateurs et de facilité de diffusion, Aurélio Jargas – le BDFL de txt2tags – m’a demandé de réintégrer ces fonctions dans le fichier principal, ce à quoi il a ajouté :

Aurélio: move them back to global functions or creating a aa class in txt2tags?
option 2 would be cool

J’ai réfléchi, puis j’ai réintégré mes fonctions, telles quelles, sans créer de classe aa. Créer une classe dans ce cas ne me semblait pas adapté, complexifiant le code sans raison théorique valable ni contrepartie pratique positive.

Peu de temps après, je suis tombé sur une présentation intitulée Stop Writing Classes faite par le core developer Python Jack Diederich lors du PyCon 2012. J’y ai retrouvé beaucoup de choses que je pensais et d’autres que je n’avais pas encore clairement formalisées. Elle est particulièrement intéressante car elle utilise de vrais exemples de code, dont une horreur produite par des ingénieurs de chez Google !

On pourrait résumer cette réflexion avec les deux principes les plus importants de la programmation selon moi : KISS (Keep It Simple, Stupid) et DRY (Don’t Repeat Yourself). On peut remarquer que ce qui est pertinemment décrit comme une mauvaise utilisation des classes, correspond globalement à un style de programmation à la Java. Pour ceux qui ne comprendraient pas l’anglais et pour les gens pressés, voici donc les principales recommandations à retenir :

  • Diminuer le nombre de classes en refactorisant le code ;
  • Ne pas écrire de classes vides, qui pourraient être utiles plus tard, en utilisant pass, les écrire plus tard si besoin ;
  • Si une classe n’a que deux méthodes, et que l’une d’elle est __init__, c’est que ce ne devrait pas être une classe ;
  • Quand un dictionnaire suffit, ne pas le camoufler dans une classe ;
  • Ne pas créer de nouvelles exceptions, utiliser celles de la librairie standard, qui sont connues et comprises de tous ;
  • Les espaces de noms existent pour éviter les collisions, pas pour faire de la taxinomie, il faut donc qu’ils restent le plus plat possible.

Je finis en donnant la parole à la défense, avec cet article technique d’Armin Ronacher intitulé Start Writing More Classes.

Post-PC, le nouveau sens de multiplateforme

jeudi, décembre 26th, 2013

Un développeur de logiciels propriétaires se pose rarement la question des plateformes supportées par son logiciel. Il développe souvent exclusivement pour un système d’exploitation, avec les outils propriétaires fournis avec son système et ne fonctionnant que sur ce dernier.

Un développeur de logiciels libres est lui naturellement obligé de se poser la question, car il a le choix de ses technologies, et que son système d’exploitation est peut-être minoritaire et donc peu supporté. De plus, il souhaite logiquement toucher le plus large public possible, car ce serait dommage de s’en priver quand on produit du code libre d’être diffusé !

Concernant le poste client, la problématique du multiplatforme s’est posée pendant des années en ces termes :

Est-ce que mon programme fonctionne sous Windows, Mac OS X et GNU/Linux ?

Les parts de marché étaient réparties selon un classique et très stable :

95% Windows
4% OS X
1% Linux

Qui après une décennie de numéros marketing de Steve Jobs autour de l’iPod et du côté hype d’être équipé d’ordinateurs Apple avait abouti à un finalement presque équivalent :

90% Windows
9% OS X
1% Linux

Mais les choses ont vraiment changé sous l’impulsion d’Apple rapidement suivi par Google, avec l’arrivé de l’iPhone en 2007 :

smartphone

Celle de l’iPad en 2010 :

tablet

Et la déferlante de smartphones et tablettes Android qui s’en est suivie. Un changement radical et extrêmement rapide :

multiplateforme

Apple et Google nous ont fait rentrer dans l’ère post-PC des smartphones et des tablettes. Ces trois slides, extraits de la présentation faite par Lars Knoll au cours des Qt Developer Days 2012, ont déjà plus d’un an, et la situation s’est encore accentuée depuis.

Bien sûr, on peut légitimement se réjouir de voir Android, un système d’exploitation libre basé sur Linux, dominer aussi outrageusement les systèmes d’exploitation propriétaires, donnant ainsi au libre l’éclatante victoire qu’il n’avait jamais obtenue sur le poste utilisateur classique.

Cependant, c’est bien un cri d’alarme que je souhaite lancer, car j’ai l’impression que pendant que des milliers (millions ?) d’applications propriétaires sans intérêt sont produites pour ces nouvelles plateformes, les logiciels libres de type applicatif n’y sont que très peu représentés, pour ne pas dire totalement absents.

Cette situation n’est pas complètement absurde, car un développeur de logiciels libres est un utilisateur productif. Un ordinateur dépourvu de clavier ne lui permettant pas de programmer, il n’en fera jamais sa machine principale, et il aura une vision des usages informatiques construite sur cette réalité, qui est la sienne.

À titre personnel, j’ai une utilisation assez limitée de mon smartphone, qui n’est qu’un téléphone me permettant de lire mes mails et m’indiquant ma position sur une carte, et je ne suis pas près d’avoir une tablette.

Mais il faut prendre conscience que certaines personnes ont rangé leur ordinateur portable dans une armoire, et qu’elles n’utilisent plus que leur tablette et leur smartphone, et ce de manière intensive.

On peut aussi voir cela comme une opportunité à saisir, car s’intéresser à ces nouvelles plateformes mobiles c’est aussi penser à de nouvelles fonctionnalités ou à de nouveaux types d’utilisation qui n’avaient pas lieu d’être jusqu’à présent.

Pour que la situation des applications libres évolue dans le bon sens, il faut d’urgence repenser la problématique du multiplatforme ainsi :

Est-ce que mon programme fonctionne sous Windows, Mac OS X, GNU/Linux, iOS et Android ?