SQLite et les types de données

Pour le meilleur et pour le pire, SQLite est l’unique sgbd embarqué sur les principales plateformes mobiles du marché – au moins, il est présent sur toutes, c’est déjà ça.

Pour quelqu’un d’habitué à un sgbdr comme Oracle ou Postgresql, le système de typage de SQLite peut être très déroutant et entraîner des bogues très difficiles à débusquer. Cet article va vous donner quelques trucs pour éviter les plus vicieux.

La documentation ne vous prend pas en traître : les colonnes en SQLite ne sont pas typées statiquement (cf https://www.sqlite.org/datatype3.html). Eux ont l’air de trouver ça génial, vous allez voir que ce n’est pas vraiment mon avis.

Concrètement, qu’est-ce-que ça change ? Quand vous insérez une valeur dans une colonne SQLite, SQLite décide de lui-même d’une « classe de stockage » (storage class) qui peut être NULL, INTEGER, REAL (en virgule flottante), TEXT et BLOB suivant les caractéristiques qu’il perçoit de la donnée que vous lui transmettez.

Mais alors, si SQLite décide du stockage lui-même, à quoi servent les types qui sont données dans les instructions CREATE TABLE ? La réponse est que ce ne sont pas des types, mais des « affinités de types » (type affinities), une sorte de préférence pour le stockage. Pour les exemples ci-dessous, j’emploierai la table suivante :

CREATE TABLE TEST_CRAPPY_TYPING_SYSTEM(
  t text,
  not_quite_float float
);

La première conséquence est que de ligne en ligne, la classe de stockage pour une même colonne peut varier ; par exemple :

INSERT INTO TEST_CRAPPY_TYPING_SYSTEM VALUES('test',500); -- 500 est stocké en INTEGER
INSERT INTO TEST_CRAPPY_TYPING_SYSTEM VALUES('test 2',500.5); -- 500.5 est stocké en REAL

La deuxième conséquence, encore plus rigolote, est que contrairement à l’exemple ci-dessus, la classe peut sembler complètement incompatible :

INSERT INTO TEST_CRAPPY_TYPING_SYSTEM VALUES('test 3','tralala'); -- ne fait pas d'erreur et est stocké en TEXT

Ce qui peut amener si on ne fait pas attention à des cas très vicieux :

INSERT INTO TEST_CRAPPY_TYPING_SYSTEM VALUES('test 4','4,567'); -- stocké sous forme de chaîne, car SQLite ne reconnait pas 4,567 comme un REAL !

Cas particulièrement vicieux car si vous faites :

SELECT not_quite_float * 100 FROM TEST_CRAPPY_TYPING_SYSTEM WHERE t='test 4';

Vous recevez un joli 400 – car SQLite fait un gros effort pour tenter de faire de votre chaîne un nombre, qui s’arrête lamentablement à la virgule ; du coup, vous avez l’impression qu’il y a bien quelque chose comme un nombre dans votre valeur, sauf que non. Ca fait un peu penser à MySQL et son absence d’erreurs sur les débordements numériques, sauf que SQLite a l’excuse de le faire exprès et de le documenter.

Maintenant, si vous exécutez le code C# suivant (j’omets la création de la connexion et toutes les fermetures propres de ressources) :

IDdCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT not_quite_float FROM TEST_CRAPPY_TYPING_SYSTEM";
IDataReader rs = cmd.ExecuteReader();
while(rs.Read()) {
  Console.WriteLine(rs.GetValue(0).GetType().FullName);
}

Vous récupérez Int32, Decimal, String, String. C’est un peu mieux que le driver OleDb Excel qui devine le type sur les premières lignes, puis renvoie NULL si il rencontre une valeur qui ne se conforme pas au type qu’il a décidé, mais il vaut mieux être prévenu.

Conclusion : si vous voulez de la cohérence de typage avec SQLite, do it yourself, et si vous avez des résultats étranges avec les types numériques, vérifiez bien ce que vous avez donné à manger à SQLite en insertion.

Faut-il avoir peur des intelligences artificielles ?

Plusieurs figures éminentes de la technologie et de la science ont récemment exprimé des inquiétudes vis-à-vis du développement des intelligences artificielles : Elon Musk, cofondateur de Paypal et fondateur de Tesla Motors et SpaceX, a été le plus théâtral en parlant « d’invoquer le démon » et que les intelligences artificielles seraient « plus dangereuses que les armes nucléaires », suivi de près par l’astrophysicien Stephen Hawking qui a déclaré qu’elles pourraient « sonner le glas de l’humanité » car elles évolueraient plus rapidement que les êtres biologiques, et d’une certaine manière, Bill Gates, fondateur de Microsoft, plus mesuré, qui a estimé que « dans quelques dizaines d’années, elles pourraient devenir un problème ». Cette poussée de fièvre subite me semble très prématurée, et probablement assise sur une incompréhension de ce qu’est une intelligence artificielle et de l’état de l’art en la matière, ce que je vais tenter de démontrer ici.

Définition

Il n’est pas aisé de définir ce qu’est une intelligence artificielle ; pour preuve, dans sa déclaration, Bill Gates parle des problèmes que pourraient poser une « superintelligence » par opposition aux intelligences dont nous disposerions aujourd’hui. De plus, le terme est une locution qui conjugue deux mots ayant eux-mêmes des sens ambigus. Commençons par la notion d’artificialité.

Fidèle à moi-même, je ne relie pas l’artificialité au fait que l’entité concernée soit un ordinateur dans son acception commune, mais à l’origine de cette entité : dans la suite de cet article, par artificiel, j’entendrai construit par l’homme. Ce choix est moins anodin et évident qu’il n’y parait : en effet, ainsi défini, un être biologique – au sens de forme de vie basée sur la chimie du carbone – créé par des humains et accédant à l’intelligence serait aussi artificiel qu’un calculateur. Pourquoi se restreindre au silicium et au cuivre dans notre ambition démiurgique ? Une objection valide à ma définition est qu’il n’y aurait pas de différence fondamentale entre un être biologique créé en laboratoire et un être biologique nés de processus naturels.

Le terme d’intelligence est encore plus difficile à définir. Pour ce faire, je vais considérer la notion d’intelligence tel qu’un humain l’entend, c’est-à-dire une entité capable de comportements d’une certaine complexité.

Bien qu’une définition négative ne puisse être totalement satisfaisante, je commencerai par des exemples de ce qui n’est pas, pour moi, une intelligence. Les systèmes d’informatique d’entreprise que nous construisons chez Yoocan, qui appliquent à des données pour la plupart structurées des règles fixes définies par des humains, suivant des processus modélisables mathématiquement sous forme d’algorithme, ne sont pas une forme d’intelligence. De même, une machine industrielle comme un robot soudeur répétant inlassablement les mêmes actions suivant un rythme fixe n’est pas une forme d’intelligence.

De ces deux exemples, je peux tirer une première caractéristique d’une entité intelligente : son comportement ne doit pas être fixe ; elle doit donc être capable de modifier celui-ci en fonction des circonstances qu’elle rencontre, en d’autres termes, elle doit être capable d’apprendre.

La capacité à apprendre est au cœur de nombreux systèmes informatiques cherchant à rapprocher les machines des humains : pour prendre un exemple que je connais bien de par mon stage ingénieur au Japon chez ATR, les systèmes de reconnaissance de la parole apprennent des exemples de correspondance onde sonore / phonème qu’on leur fournit en usine ; ils sont ensuite capables de raffiner leur approche une fois mis en production par les corrections par des êtres humains des erreurs qu’ils commettraient. Cela rend-il pour autant un ordinateur muni d’un logiciel de reconnaissance de la parole intelligent ? Je ne sais pas pour vous, mais certainement pas pour moi ; il ne remplit qu’une seule tâche que l’on pourrait qualifier d’intelligente, et cette tâche ne lui permet que de nous restituer ce que nous lui avons donné comme information.

De cette limitation, je peux tirer une deuxième caractéristique d’une entité intelligente : elle doit créer du sens de ce qui l’entoure ; pour être plus précis, elle doit être capable, à partir de ses capacités sensorielles, de se construire une vision de ce qui n’est pas elle afin d’interagir avec.

Un bon exemple de cette caractéristique est le fonctionnement des robots aspirateurs ; afin de traiter toute la pièce où ils se trouvent, ils s’en construisent un plan mental avec ses bordures et ses zones déjà visitées. Je ne l’ai volontairement pas précisé pour les systèmes de reconnaissance de la parole, mais ils ne se limitent pas à l’analyse des ondes sonores ; ils tentent de découper les mots, d’en déduire les phrases, y compris leur sens et la fonction des mots, afin de valider la reconnaissance audio par la probabilité que la suite de phonèmes veuille vraiment dire quelque chose dans la langue cible. Cela fait-il d’un robot aspirateur une entité intelligente ? Pour moi, toujours pas ; il lui manque la capacité à affirmer et partager sa vision de ce qui l’entoure et de faire des choix.

De cette objection, je peux tirer la troisième et plus fuyante caractéristique d’une entité intelligente : elle doit pouvoir dire « je » ; en d’autres termes, avoir conscience d’elle-même, de son unicité et de sa capacité à analyser et agir sur son environnement, en affirmant son identité et une forme de volonté.

Autant que nous sachions, nous n’avons pas encore créé d’entité artificielle qui possède cette caractéristique ; pire, malgré plusieurs milliers d’années de réflexion philosophique et scientifique sur la question, nous ne savons pas d’où vient cette capacité que nous prêtons aux êtres biologiques.

Pour cet article, je définirai donc une intelligence artificielle comme une entité créée par l’homme capable d’apprendre, de se créer une vision de son environnement, de partager cette vision et de choisir par elle-même comment elle va agir.

Un peu d’histoire

Si on admet mon acception de l’intelligence artificielle, l’idée n’est pas née avec l’informatique au XXème siècle ; de nombreux mythes antiques y font référence – les automates d’Héphaïstos par exemple – de grands intellectuels de la Renaissance et de l’époque classique ont travaillé dessus – comme Léonard de Vinci ou Descartes – et des œuvres littéraires majeures en ont fait un thème majeur – comme Frankenstein ou le Prométhée moderne de Mary Shelley.

Au XXème siècle, l’idée d’une intelligence artificielle a préoccupé les informaticiens dès les prémices de la discipline ; Alan Turing lui-même, dès 1950, s’intéressait déjà à la question. Il a défini le célèbre « test de Turing », dans lequel on caractérise une intelligence comme une entité capable de communiquer avec un être humain sans que celui-ci puisse deviner qu’il ne parle pas avec un autre être humain. Tout en n’étant pas complètement satisfaisant pour détecter une intelligence, ce test reste non résolu à ce jour.

Aujourd’hui, brique par brique, nous construisons des outils capables d’appréhender leur environnement – comme les robots dont j’ai déjà parlé – de raisonner sur des problèmes précis et de communiquer naturellement avec des êtres humains.

Où en sommes-nous ?

Pour revenir à la déclaration de Bill Gates, on distingue classiquement deux niveaux d’intelligence : l’intelligence faible, qui correspond à celle des robots à spectre limité comme les robots aspirateurs, des systèmes expert ou des analyseurs big data et l’intelligence forte, qui correspond à ma définition.

Nous avons bien progressé sur l’intelligence faible : de nombreuses tâches unitaires ont atteint une bonne qualité de traitement – la reconnaissance de la parole, la vocalisation, l’appréhension et la création de modèle de l’environnement physique – et des applications avancées comme grand public réellement intéressantes sont disponibles. En particulier, de plus en plus de tâches répétitives, qui généralement rebutent les humains, peuvent être laissées à des machines. D’ailleurs, la mécanisation de ces tâches me paraît une des grandes victoires de l’informatique, j’y reviendrai certainement dans un autre article.

Un autre cas où les intelligences artificielles pourraient apporter beaucoup est l’intervention en milieu hostile – sous-entendu hostile pour l’être humain : irradiation, environnement extraterrestre ou absence d’air respirable, hautes pressions comme dans les hauts fonds marins, etc. Ces cas sont particulièrement intéressants car plus que de décharger les humains de tâches ingrates, ils correspondent à des situations où l’être humain ne peut pas intervenir du tout. Force est de constater que les systèmes actuellement en production ont une intelligence très limitée – en particulier une intelligence adaptative proche de zéro – et ont des périmètres d’intervention très restreints. Deux exemples concrets :

  • la sonde Rosetta : en simplifiant son fonctionnement, on lui demande de se placer sur telle ou telle orbite autour de la comète 67P pour procéder à des analyses ; afin de s’assurer que sa course est toujours correcte, elle calcule régulièrement sa position dans l’espace par triangulation avec trois étoiles lointaines ayant des spectres lumineux bien définis. Récemment, un incident est survenu, car la comète se rapprochant du soleil, elle a commencé à perdre de la matière que la sonde a prise pour une de ses étoiles de guidage ; conçue très robustement, la sonde s’est éloignée de la comète en se basant sur la position calculée antérieurement, et a passé la main aux ingénieurs au sol pour déterminer la suite. Bravo aux ingénieurs ayant conçu la sonde, mais on est loin des capacités d’un pilote humain
  • la centrale de Fukushima : un robot a été lancé mi-avril pour évaluer certains dégâts en zone fortement irradiée ; il n’avait cependant que peu d’indépendance de manipulateurs humains, s’est coincé dans un conduit, n’a pas réussi à se débloquer, et a donc fini par cesser de fonctionner à cause des radiations qui, comme on le sait, attaquent également les circuits électroniques.

Enfin, beaucoup de fantasmes entourent les systèmes d’analyse de données des géants du web comme Google ou Facebook qui seraient capables de modéliser les comportements humains. Il suffit pour se rasséréner de voir les applications concrètes qui en sont faites :

  • les publicités supposément ciblées mais qui manquent régulièrement leur cible, que ce soit par manque d’information – on vous propose pendant des mois des ventes de portable hybride car on a détecté une recherche sur un site partenaire, mais on a raté votre acte d’achat sur un site qui n’est pas partenaire – ou par manque de finesse d’analyse – sous prétexte que vous passez par hasard sur une page de vente de parapluie en vous trompant de lien, on vous propose à nouveau pendant des mois des parapluies
  • les propositions d’articles liés : au mieux – en terme d’intelligence artificielle, la présence de vocables proches déclenche l’affichage, mais le résultat est rarement pertinent ; au pire, les titres sont uniquement construits par des humains de façon à attirer le chaland, comme les « tops n », les photos bien choisies ou les citations croustillantes sorties de leur contexte, ce qui n’a rien d’artificiel, et pas grand chose d’intelligent !

Le point commun de tous ces exemples d’intelligence limitée ? Ces outils sont créés à l’aide d’algorithmes « classiques » dont le cheminement est entièrement décidé par un être humain, avec une capacité d’apprentissage – ou dans ce cas plus précisément d’auto-paramétrage – limitée. Les pistes les plus prometteuses en terme d’acquisition d’une forme d’intelligence par une machine se trouvent plutôt dans la construction de simili cerveaux génériques capables d’apprendre d’eux-mêmes, mais c’est un domaine encore balbutiant (voir les liens en fin d’article pour des détails sur la question).

Alors, à quand Skynet, Puppet Master et autre Omnius ?

Quand on remarque que l’intelligence artificielle est un objet de recherche constant depuis près de soixante dix ans, et que malgré cela, nous n’avons que des résultats très partiels et aucune perspective proche d’unification de ces résultats dans une entité complète, je pense qu’on peut affirmer que la création d’une intelligence artificielle est encore très lointaine et incertaine.

Par ailleurs, je rejoins Bill Gates sur le fait que l’intelligence que nous exploitons actuellement, l’intelligence faible, ne pose aucun problème même à long terme ; le domaine d’intervention de la machine est limité par nos choix, ainsi que sa capacité d’apprentissage, d’appréhension du réel et d’action sur le réel.

Une autre idée, dont je n’ai pas parlé car elle se situe à la frontière de l’artificialité, et qui apparaît dans l’excellent film Ghost in the shell, est la possibilité que l’intelligence apparaisse d’elle-même par combinaison d’entités simples que nous aurions créées. Elle me semble extrêmement peu probable, car d’une part elle suppose que nous ayons doté ces entités disparates de capacités de communication qui leur permette de constituer une entité supérieure par agrégation, et d’autre part, je ne vois pas quel processus amènerait un œil, une oreille, un nez, une bouche, etc. à se rassembler pour donner un être humain synthétique.

Enfin, la piste sérieuse d’apparition d’une intelligence artificielle, la création d’une copie d’un cerveau biologique couplée à un ensemble de dispositifs mécaniques et sensoriels, est d’une part une perspective très lointaine – comme vous pouvez le voir dans la première vidéo ci-dessous – et d’autre part me paraît contradictoire avec l’argument a priori valide apporté par Stephen Hawking que l’évolution d’une machine à base d’ordinateur se ferait à une vitesse nettement supérieure à celle d’un être biologique ; en effet, les mécanismes d’apprentissage sont les mêmes que ceux d’un être humain, et bien que les ordinateurs personnels actuellement à notre disposition possèdent grosso modo la même capacité de traitement théorique que notre cerveau (cf http://fr.wikipedia.org/wiki/Intelligence_artificielle#Estimation_de_faisabilit.C3.A9), on constate que la phase d’apprentissage n’est pas sensiblement plus rapide. Il se pourrait bien que nous soyons un dispositif particulièrement performants pour l’intelligence. Darwin 1 – Turing 0 ?

Le danger

Quand bien même nous serions à deux doigts sans le savoir de créer une intelligence artificielle forte, serait-elle réellement un danger pour l’humanité ? Si on se fie à l’art, on serait tenté de répondre un oui tonitruant : Frankenstein, 2001 odyssée de l’espace, Blade Runner, Terminator, le cycle de Dune, rares sont les exemples imaginaires de conséquences positives, et même la saga des robots d’Asimov qui institue des règles supposées protéger l’humanité, imposées Dieu seul sait comment aux robots, donne des exemples de contournement de ces règles. Dans une certaine mesure, la planète des singes offre un autre exemple de l’apparition d’une intelligence du même niveau que la nôtre et ayant des conséquences funestes, même si cette intelligence n’est pas artificielle.

Il est vrai que l’évolution darwinienne et la biologie nous enseignent que toute vie n’a pour but que de se multiplier, et que seules les circonstances et les limites des outils à sa disposition l’en empêchent ; l’homme, qui avec son intelligence a des moyens inégalables dans le monde animal pour soumettre son environnement à ses besoins, ne voit guère sa croissance menacée que par lui-même. Mais cette éventuelle intelligence – artificielle et née dans des circonstances différentes de la nôtre – aurait-elle nécessairement cette pulsion incontrôlable à l’expansion et à la domination ? Ces peurs ne seraient-elles pas qu’un énième avatar du récent détournement occidental des valeurs du siècle des lumières, progrès scientifique entraînant progrès technique entraînant progrès social, qui nous fait douter que le moindre progrès technologique puisse être positif ? Ne diraient-elles pas plus de choses sur nous-mêmes que sur les machines pensantes elles-mêmes ?

Pour aller plus loin

Deux conférences passionnantes sur les robots, à regarder dans l’ordre ci-dessous :

  • https://www.youtube.com/watch?v=giqEnlM8D_U : vidéo des rencontres sciences et humanisme 2014, traitant de façon générale la robotique et l’intelligence artificielle, avec des démonstrations de robots faisant de l’auto-apprentissage
  • https://www.youtube.com/watch?v=a6-9n-K2LYc : vidéo de l’espace des sciences de Rennes sur la robotique non humanoïde

Quelques livres :

  • de manière générale, l’oeuvre de Philip K. Dick, qui a passé sa vie à s’interroger ce qui nous pouvait différencier un humain d’une intelligence artificielle
  • le cycle de Dune de Franck Herbert, avec ses mentats et Omnius
  • La cité des permutants de Greg Egan : je trouve l’écriture de Greg Egan parfois indigeste, mais ses idées sont toujours dérangeantes ; dans ce livre, il imagine un système de simulation d’êtres humains physiquement morts, et pour éviter la stagnation et l’ennui dans cette vie éternelle, il embarque des extraterrestres évoluant indépendamment des humains simulés
  • La bionique – Quand la science imite la nature d’Agnès Guillot et Jean-Arcady Meyer, ou quand l’artificiel s’inspire de la nature

  • La conscience a-t-elle une origine ? Des neurosciences à la pleine conscience : une nouvelle approche de l’esprit de Michel Bitbol, qui aborde la question de la formation de la conscience

L’informatique est-elle une science ?

Quelques définitions

Par science, on entend domaine de la connaissance, à différencier de la technologie, qui traite des outils et des techniques ; je parlerai donc ici de l’informatique comme domaine de connaissance, pas comme ensemble de pratiques et de techniques.

Pour caractériser une science, il faut déterminer son objet d’étude, sa méthodologie et la façon dont elle prouve ses résultats. Aussi ancienne que soit la science, répondre à cette question n’est jamais trivial. La physique est supposée comprendre et modéliser les phénomènes naturels, mais cette définition est tellement large qu’elle pourrait englober la chimie et la biologie ; cette dernière est supposée étudier le vivant, mais nous n’avons pas aujourd’hui de définition satisfaisante de ce qu’est la vie, et ainsi de suite. Y répondre pour l’informatique est tout aussi difficile.

L’objet d’étude

Trois objets sont susceptibles d’être l’objet de l’informatique : les algorithmes, les ordinateurs et les informations.

Le terme d’algorithme a gagné en popularité dans le grand public ces dernières années : il représente symboliquement la puissance de Google, les risques réels ou supposés des réseaux sociaux et du big data, voire plus récemment de l’intrusion de l’Etat dans les communications électroniques. Il possède une certaine charge magique qui ferait de nous informaticiens des égaux de Newton ou Einstein avec leurs lois universelles, génies aux pouvoirs mystérieux et absolus. Plus prosaïquement, un algorithme n’est guère plus qu’une recette de cuisine pour transformer un jeu de données entrant en un jeu de données sortant ; en tant que tel, son étude peut être passionnante, et d’une incroyable difficulté technique et conceptuelle – ceux qui auront tenté de démontrer qu’il n’existe pas d’algorithme de tri plus rapide que le quick sort sauront de quoi je parle. Mais aussi fondamentaux qu’ils soient en informatique, les algorithmes sont nés bien avant elle, et sont étudiés depuis bien longtemps par une branche des mathématiques, l’algorithmique ; leur formalisme et leur étude en empruntent toutes les caractéristiques. Ils ne peuvent être l’objet unique de la science informatique.

L’objet ordinateur a l’avantage d’être apparu peu ou prou en même temps que l’informatique. Celle-ci serait dans ce cas la science étudiant l’ordinateur en tant que dispositif de traitement automatisé des données – notez l’utilisation du terme données et pas du terme information, on va y venir – pour résumer, l’étude des machines de Turing. Comme l’indique le sous-titre de ce blog, je ne suis pas partisan de définir l’informatique par l’outil ordinateur : d’une part, cela tend à la réduire à un ensemble de technologies, or nous essayons de la définir en tant que science, et d’autre part, en elle-même, sans algorithme, sans les données introduites et les données attendues en sortie, la machine est inerte.

L’information est à différencier de la donnée en ce qu’elle regroupe deux réalités : les données proprement dites, et leur mise en forme. La donnée est objective, c’est elle que traite la machine ordinateur ; l’information est subjective en ce que la mise en forme des données est interprétée humainement. Pour comprendre la différence, il suffit de penser par exemple aux sondages : le nombre de personnes choisissant une réponse à une question est une donnée ; ce que ce nombre dit de la réalité de la population sondée est une information, sujette à l’interprétation du sens de la question, du sens de la réponse dans le cadre de la question, de la situation du répondant quand on lui pose la question, etc. Telle que définie ici, elle est un objet d’étude original qu’aucune autre science n’aborde centralement : la linguistique étudie les messages exprimés dans les langues humaines, mais par définition tend à ignorer l’objectivité de la donnée sous-jacente qui dans son domaine est une illusion ; les mathématiques jouent avec les données, mais ne s’intéressent pas au sens subjectif que les humains leur affectent. De plus, la dualité donnée objective – interprétation humaine subjective représente bien la problématique rencontrée en permanence par les informaticiens qui est d’optimiser un processus existant à l’aide des ordinateurs – voire sans parfois.

C’est pourquoi, si je devais définir un objet unique d’étude de l’informatique, ce serait l’information ; raison également pour laquelle j’apprécie particulièrement le mot français informatique, quand les américains parlent plutôt de computer science  – un reflet de leur culture utilitariste ?

Méthodologie et preuve

Malgré les bons arguments que l’on peut donner pour affirmer que l’objet de l’informatique est l’étude des informations, dès qu’on se penche sur la méthodologie informatique et sa façon de prouver la pertinence de ses résultats, les algorithmes et les machines reviennent en force.

En effet, il s’agit ici de démontrer qu’un traitement de l’information est conforme formellement aux demandes exprimées initialement par des humains. Ces demandes peuvent revêtir plusieurs formes : que les informations en sortie correspondent bien aux entrées et aux traitements demandés, ce qui fait appel à l’algorithmique ; que les traitements respectent des impératifs de rapidité, ce qui fait appel à l’expérimentation sur les machines. La qualité des traitements ne peut pas toujours se passer de l’interprétation humaine – d’aucuns dirait rarement – or si on savait modéliser correctement un humain, ça se saurait ; on peut prendre l’exemple de la vallée de l’étrange pour les robots où le ressenti humain est le cœur de la recherche. Dans ces cas, l’expérimentation sur des machines physiques est indispensable et l’ingrédient humain rend la preuve formelle difficile voire impossible.

La spécificité de la méthodologie informatique est de combiner les outils algorithmiques et les preuves empiriques par déploiement des traitements sur des machines physiques en une approche commune.

En conclusion, je pense que l’informatique traite un sujet original avec une approche elle aussi fondamentalement originale ; les objections légitimes à ce fait sont applicables à toutes les sciences du réel – la Physique moderne n’existerait pas sans les mathématiques, la Biologie s’appuie sur la Chimie, la Chimie sur la Physique, etc. Gageons qu’en mûrissant – 70 ans est très jeune pour une science, la plupart des concepts scientifiques mettent plus d’un siècle à percer dans la société civile – son objet et ses méthodes se cristalliseront de façon incontestable.

Des outils et des hommes

Ma première rencontre avec un outil automatisé d’aide au développement logiciel remonte à ma troisième année d’école d’ingénieur en option ingénierie du logiciel. L’outil en question, dont j’ai oublié le nom, évaluait la qualité du code par le calcul d’un lot de métriques et leur comparaison avec des seuils prédéfinis. Parmi ces métriques se trouvaient le nombre de lignes de code par fonction, le nombre de lignes de commentaires par ligne de code et la présence de commentaires en cartouche d’une méthode, le nombre d’utilisations d’une fonction ou méthode, etc. Une fonction trop longue – de mémoire, plus d’une centaine de lignes, une fonction non commentée – aussi triviale soit-elle, ou une fonction trop utilisée, déclenchaient des torrents d’insultes de la part de l’outil qui se montrait assez à cheval sur ses principes. Appliqué sans discernement, comme dans les travaux pratiques de ce cours, ce genre d’approche kafkaïenne amène à des sommets de la littérature informatique tels que :

/* Sets the threshold (no shit, it really does) */
public void setThreshold(int threshold) {
  this.threshold = threshold;
}

voire à des abominations du genre :

public void thisMethodIsReallyTooLong() {
  /* does lots of interesting things, and then, when the metric is about to be exceeded... */
  thisMethodIsReallyTooLongPart2();
}

public void thisMethodIsReallyTooLongPart2() {
  /* Now, where were we? */
}

Non seulement la règle a dégradé la lisibilité du code, mais qui pis en fonction de la bonne volonté du compilateur, elle peut même avoir réduit les performances. J’ai appliqué les règles comme on me le demandait et je suis passé à autre chose.

Une fois en situation d’organiser la réalisation de projets pour mes clients, la question des outils s’est posée à nouveau. Editeur de texte, IDE, contrôle de source, générateurs de code, tests unitaires automatisés, intégration continue, déploiement, les outils sont nombreux, résolvent des problèmes très variés et ont des avocats véhéments prompts à l’anathème. En tant que décideur, quels critères appliquer dans ses choix ?

Fidèle à mes principes, je ne m’engage dans la mise en place d’un outil que si il répond à un problème identifié ; je ne pense pas qu’il existe un seul développeur professionnel qui n’ait été confronté à des régressions – « mais je l’avais corrigé ce bug, qui a écrasé mon code ? » – ou à la gestion de versions de ses développements : un système de contrôle de source s’impose donc à tous. A l’inverse, une équipe sortant une version publique tous les ans au plus a-t-elle besoin d’un système d’intégration continue, avec le coût de mis en oeuvre inhérent à ce type d’outil complexe ? Rien n’est moins sûr. Tester voire déployer systématiquement tous les derniers outils à la mode en évaluant mal leur pertinence dans le contexte local est un indicateur certain du mauvais décideur.

Par ailleurs, un outil n’est rien s’il n’est pas pris en main par l’équipe. Naturellement, le décideur aura tendance à se méfier des membres de l’équipe qui auront soutenu vocalement d’autres outils que celui de son choix. Le « fanboy »  d’un outil concurrent induit effectivement un risque, mais il est une quantité connue : il sera mécontent que sa préférence ait été mise de côté, mais ayant compris ce que pouvait apporter ce type d’outil, il sera probablement à même d’utiliser correctement le choix du décideur – à moins d’être une tête de cochon n’ayant pas très bien intégré les notions d’équipe et de compromis, auquel cas il serait sans doute mieux tout seul, mais c’est une autre histoire.

La passivité est bien plus pernicieuse, car elle est la marque soit d’un désintérêt total pour la question, soit d’une incompréhension des enjeux, et au pire d’une incapacité à intégrer correctement l’outil dans sa pratique quotidienne.

On l’a vu, appliquer à la serpe des métriques amène à des aberrations ; l’usage correct est donc d’utiliser les seuils comme des avertissements à traiter manuellement avec discernement. Mais encore faut-il comprendre l’avertissement, ne pas simplement le désactiver pour avoir la paix, et le traiter correctement – par exemple analyser une fonction longue pour déterminer si elle n’est pas découpable en unités signifiantes plus petites, mais ne pas la charcuter pour le plaisir. Utiliser des branches pour matérialiser des lignes de développement séparées – la version 1.0 en cours de maintenance, la version 1.1 contenant des évolutions mineures et la version 2.0 qui refond l’architecture du logiciel – est une très bonne chose, encore faut-il les créer à bon escient et savoir effectuer les merge en bout de ligne.

Par conséquent, de même qu’un outil résolvant un problème ne se posant pas est contre-productif, un outil que l’équipe n’est pas assez mature ou organisée pour utiliser correctement est plus dangereux que l’absence d’outil.

Pour paraphraser Jean Bodin, il n’est d’outil que d’homme.