Portail / Sujets autour de la programmation(Sommaire)

Choix techniques de PiApplications.

Nous réalisons des logiciels depuis 1984, cela fait un bout de chemin...

Une histoire brève et riche.

A cette époque, l'informatique était encore le monde réservé des "docteurs" et des ingénieurs en blouse blanche. Ainsi nous avons vécu l'arrivée des premières machines "grand public" , ZX81 (16 ko de RAM) avec son assembleur Z80 puis son grand frère le ZX spectrum (48 ko de RAM et périphérique de stockage minibande). Les langages étaient alors les "Basic" et l'assembleur. En 1986, nous avons acquis le premier PC avec l'Amstrad 1512 avec 512 ko de RAM et deux lecteurs de disquettes 5"1/4. Apple développait ses première machines dont le fameux Apple II... Le langage Pascal commençait alors à s'imposer face au langage C plus rustique. Les années 90 ont vu l'informatique prendre un nouvel essor sous l'action de plusieurs facteurs :

  1. l'accroissement rapide, continu et d'importance des performances matérielles tant pour les microprocesseurs que pour les mémoires ou les disques durs ;
  2. l'extension capacités des réseaux publics et locaux accompagnée de la chute des coûts de communication liée à leur privatisation ;
  3. l'arrivée des Ateliers de Génie Logiciel (AGL) visant à augmenter la productivité des développements ;
  4. la disponibilité de nombreux systèmes d'exploitation concurrents sur PC dont les UNIX (System V et Solaris en particulier), Windows 3.1 et NT 3, OS2, Linux, etc. ;
  5. l'essor du commerce électronique sur Internet avec le navigateur qui commence à s'imposerr comme "client universel".

Cette époque pourrait être qualifiée aujourd'hui de "grande pagaille" tant elle a été riche d'innovations et d'espoirs. Un marché immense (planétaire même) se découvrait et chacun y allait de son projet inovant certains aussi brillants et éphémères que les papillons.

Les années 2000 sont marquées par deux évolutions majeures :

  1.  l'explosion de la téléphonie mobile et de sa conséquence : les smartphones ;
  2. l'arrivée d'un nouveau concept ou plutôt la reprise d'un concept initial : la plate-forme virtuelle (ou encore plate-forme "logique").

Vers quel avenir ?

L'explosion de la téléphonie mobile entraîne la révision complète du concept d'ordinateur. Les smartphones ont des capacités limitées dans tous les domaines et ne peuvent pas exécuter un des système d'exploitation existants. Aussi existe-t-il aujourd'hui 3 grands acteurs majeurs dans ce domaine :

Il est probable que la politique commerciale de coût et de captivité fera qu'Apple retournera rapidement à son marché de niche une fois son avance technique consommée (ce qui est quasiment le cas en 2015). Microsoft ayant déjà une mauvaise réputation de système propriétaire et n'affichant rien de vraiment original devrait végéter sur ce segment d'autant que sa politique de rachat de Nokia ne semble pas conduire à des périphériques bon marché. Il est d'ailleurs assez ironique de constater que Nokia très innovateur dans les années 2000 et qui avait fait le choix de Java sur ces téléphones (ancêtre d'Android) soit désormais contraint de concevoir des smartphones Windows en raison de son rachat par Microsoft. Ainsi va la dure loi du marché...

C'est donc Google avec Android qui équipera le maximum de smartphones dans les prochaines années. En effet, en dehors d'Apple et Microsoft, tous les constructeurs ne disposent que d'Android pour équiper leurs appareils. Ceux qui ont fait le pari de concevoir et déployer leur propre système n'ont pas récoltés le fruit de leurs efforts et il est peu probable que des constructeurs se lancent aujourd'hui dans cette course.

L'autre avancée majeure des années 2000 est la plate-forme logique. Cette plate-forme est un pseudo système d'exploitation "logique" qui se substitue au système d'exploitation "physique" en offrant une interface de communication avec le monde extérieur "normalisée" au travers d'une API. Ce concept était déjà peu ou prou celui offert dès les débuts par le langage Basic. dont l'interpréteur venait s'intercaler entre le code source et l'exécution du code machine. De plus, cette nouvelle plate-forme n'est pas née de la volonté de s'intégrer aux PC ou aux ordinateurs existants mais celle d'équiper des systèmes électroniques intelligents disposant de faibles ressources (l'avènement des smartphones saura se souvenir de ces débuts). Ce fut la société Sun (Oracle désormais) avec sa plate-forme Java (ou JVM pourJava Virtual Machine) qui lança cette innovation majeure. Très vite Sun et d'autres sociétés telle IBM ont vu l'intérêt de porter ce concept au monde du développement sur PC. Cela permettait d'abstraire le système d'exploitation et donc le matériel à condition de détenir une JVM pour la plate-forme ciblée. Leur slogan reflète assez bien l'intérêt de la JVM : Write once, run everywhere (écrit une seule fois, exécuté partout). Linux fut l'un des premiers système cible de la JVM en raison des gains fabuleux liés à l'absence de coût sur les licences. De plus le concept orienté objet du langage, s'il est plus difficile à appréhender, tend naturellement vers la factorisation du code et donc facilite la réutilisation (vaste sujet encre incomplètement résolu).

Notons que Java a su évoluer de belle manière malgré les péripéties commerciales de Sun, chaque nouvelle version enrichissant la plate-forme de concepts majeurs. Cela est sans doute lié pour une part à l'excellence du concept initial et pour une autre part au recueil planétaire des besoins d'évolution via le JCP. S'ajoute également à ceci, que Java est plus exigeant en matière de compétences que ses rivaux. Si cela présente quelques inconvénients sur le coût en ressource humaine, il est plus "pro" et donc moins sujet à la pollution issus des débats stériles. La version 1.8 des spécifications de la plate-forme enrichi la programmation impérative de la capacité de programmation fonctionnelle (expressions lambda et flux d'opérations [stream]). Cette programmation fonctionnelle permet en outre l'exécution des traitements en parallèle (multithreading) en s'appuyant de manière transparente sur le modèle fork-join de la version 1.7.

Microsoft, alors leader incontesté du monde "grand public" en a très vite compris les enjeux au plan de la productivité et lançait quelques années après son initiative .Net basé sur son Common Language Runtime (CLR) qui n'est autre que le pendant de la JVM. Le projet Go-Mono a par ailleurs montré la capacité de portage du CLR sur LINUX avec le frein naturel lié aux applications graphiques puisque le CLR tire avantage des plates-formes Windows qui intègrent le graphisme au système d'exploitation (même si WPF tend à s'écarter de cette capacité).

Le moins que l'on puisse dire c'est que quand IBM, Oracle et Microsoft convergent, il y a intérêt à suivre le débat autour de cette convergence. Si de plus, le choix de Google pour son système Android repose sur Java on peut légitimement penser que l'avenir se situe autour de ces plates-formes "logiques". Nous les appelons logiques pour éviter la confusion avec les machines virtuelles. Une machine virtuelle est un système d'exploitation "invité" qui s'exécute sur un système d'exploitation "hôte" qui lui "prête" ses ressources. Le système d'exploitation hôte peut bien évidemment exécuter plusieurs machines virtuelles "invité". Comme on peut en avoir l'intuition immédiate, les machines "logiques" sont particulièrement bien adaptées pour s'exécuter sur des machines virtuelles.

Ce que nous écrivions ici au début des années 2000 à dores et déjà evolué. Hélas pour Java, son rachat par Oracle et son abandon dès la sortie de la version 9 des licences "ouvertes" lui porte un coup fatal. On observe donc depuis 2017 un abandon progressif des systèmes développés pour et sous Java puisque l'usage professionnel prévoit désormais de rétribuer Oracle. Quelles sont les logiciels et les langages qui profitent de l'espace ainsi créé ? Ce sont les navigateurs web et les applications Android qui profitent le plus de cet espace. En effet, on constate dans le monde du développement que s'opère une séparation de plus en plus nette ente celui des applications "serveur" (backend) et ceux de l'interface graphique à destination de l'utilisateur final. Le coût se porte principalement sur le backend tant la ressource en développeurs côté interface graphique est importante. Cette séparation fait la part belle aux développeurs d'interfaces graphiques et à travers eux aux langages de script (PHP, Perl, Python, JavaScript, etc.). Là encore, on pressent un effet de mode car malgré les efforts du W3C ce type d'interface est encore assez brouillon et empirique (essayer de maitriser le CSS par exemple !) La spécification des navigateurs devra nécessairement évoluer vers plus de rigueur afin de faciliter la réutilisation. Aujourd'hui, les pages web base des interfaces sont considéres comme "jetables" et ont dans les faits une durée de vie assez courte (s'y ajoute les effets de mode "ergonomiques").

La question est alors : par quoi devons nous remplacer le langage Java ? Or il y a en informatique, pour celui qui sait observer dans la durée, des invariants. Par exemple les échanges inter-système de données en format texte sont les plus robustes car ils sont indépendants des technologies. De même, il y a un langage qui s'impose dès que la notion de performance ou de codage de bas niveau s'impose : le langage C et son grand frère C++. Ces langages écartés un temps en raison de leur complexité (pointeurs notamment) qui entrainait des bugs difficiles parfois à isoler reviennent en force pour plusieurs raisons. Parmis celles-ci on trouve l'évolution de la spécification C++ et la mise en oeuvre de la librairie STL qui couvre l'essentiel des algorithmes de base (dont structures de données et entrées/sorties). Ces langages ont cependant deux écueils : ils exigent un certain niveau de compétence et leur productivité et loin d'être au niveau des langages de script.

Notons toutefois que là aussi les choses évoluent car ces langages sont à la base même du développement des systèmes d'exploitation. Après le code assembleur, ils offrent le premier niveau d'abstraction pour pouvoir interagir avec le matériel. Leur remplacement passe par l'écriture d'un langage de haut niveau d'abstraction intégré aux circuits électronique eux-mêmes, voire permettant leur conception en lieu et place du code assembleur actuel. Bien entendu cela passe aussi par une normalisation de ce langage et son adoption par les acteurs majeurs avec une réelle équité commerciale (c'est ce dernier point qui a condamné Java). Face à ces contraintes nombreuses et qui ne vont pas dans le sens de ce que nous pouvons observer, on peut prédire sans trop de risque que le langage C/C++ sera encore présents dans quelques décennies.

L'emploi du C/C++ imposait il y a encore peu un développement à base de scripts tant la procédure qui conduit du code source à l'image binaire peut être longue et fastidieuse. En outre, proche du matériel et s'appuyant sur les primitives du système d'exploitation, leur portage d'une plate-forme à une autre est parfois une véritable gageure.

Or des produits viennent désormais limiter ces contraintes. Tout d'abord il existe maintenant de très bons IDE de développement C/C++. Citons NetBeans, Eclipse ou CodeBlock par exemple. Avec ces outils, les étapes de génération sont masquées et la mise au point (débogage) redevient naturelle.

D'autre part, le projet Qt est une brillante tentative de développement C/C++ multi plate-forme. Cette infrastructure propose des jeux de librairies qui couvrent de nombreux domaines du développement. Toutefois, elle est limitée dans la mesure où sa version complète est propriétaire et plutôt coûteuse ce qui le réserve au monde professionnel du niveau de la moyenne entreprise. La version "communauté" permet cependant de faire déjà beaucoup de choses et on la trouve nativement distribuée avec les grandes distribution Linux comme Debian. A noter que l'IDE Qt nommé qtcreator permet de déveloopper facilement des applications C/C++ pures et dures (pas d'utilisation de l'infrastrcuture Qt). Il est ainsi possible avec cet IDE de créer des librairies C/C++ (dédiées ou non à une plate-forme) puis de les utiliser si besoin dans une application Qt.

Notion de modèle économique.

Derrière tout cela, il y a bien entendu un modèle économique qui touche surtout au coût de possession :

Ce modèle économique de back end se double d'une approche commerciale très discutable vis-à-vis du grand public : les "stores" (Apple Store, Windows Store, Google Play). En effet, dans ce modèle, le système qui s'exécute exige une connexion à un compte chez un de ces éditeurs. Ce compte de connexion est ni plus ni moins qu'un mécanisme d'espionnage très fin du client connecté (localisation, habitude d'achat, sociétés bancaires détenant ses comptes, sociétés de crédit auxquelles il fait appel, activité quotidiennes, etc.). Il n'est pas exagéré de prétendre que les systèmes experts d'analyse de ces éditeurs en savent plus sur un utilisateur non averti que lui-même.

Pour Apple, c'est presque excusable car cette démarche fait partie intégrante de leur modèle de captivité : une fois chez Apple, on ne peut qu'acheter chez Apple. Chez Microsoft, le Windows Store à débarqué avec Windows 8 et se poursuit de plus belle avec Windows 10 et désormais 11. Toutefois, le choix est encore laissé à l'utilisateur à condition de refuser les propositions de configuration par défaut de son système et d'être assez averti pour effectuer cette configuration soi-même. Avec Android, la seule certitude revient à couper téléphone et wi-fi !

Notre position.

L'observation depuis plus de 40 ans de ces batailles de chiffonniers (pour l'essentiel Nord Américaine) nous a conduit à une démarche pragmatique : faire robuste et évolutif. Pour cela, il convient d'analyser le modèle économique sous-jacent au produit pour en déterminer non seulement les capacités techniques mais aussi sa pérennité probable. Pour cela, nous intégrons plusieurs critères dont les principaux sont :

Ces exigences nous amènent à nous tourner majoritairement vers les produits "libres" et disposant de capacité multi plates-formes. Multi plates-formes signifie ici  intégrant au minimum Windows et Linux. Il se trouve que nos choix sont généralement compatibles également avec Mac OS qui ne souhaite visiblement pas trop s'isoler dans ce domaine.

ProduitChoixDepuis
Système d'exploitationLinux (Distribution Debian)1991
NavigateurFirefox, Chromium, icedtea2002
Langage de développementJava1995
Outil de développement (en voie d'obsolescence)NetBeans1996
Outil de développementEclipse2004
Client graphique localC++ Qt1994
Programme console (exécutable)C/C++ (Qt éventuel)1994
Programme console (script)Python1991
SGBDRPostgreSQL1986
Certification - chiffrementOpenSSL1998
 

Aucun de ces produits n'exige d'acheter une licence et ils permettent donc la distribution de logiciels dont le coût se limite à celui de son développement. Il est ainsi possible de faire du sur-mesure sans avoir à se ruiner au déploiement. Certains peuvent s'étonner de choix comme PostgreSQL plutôt que MySQL ou d'autres encore. Nous ne détaillons pas ici les raisons de ces choix mais ils ont tous leur justification technique ou non. De toute façon il n'existe pas dans ce domaine de "certitudes". La seule règle qui compte vraiment c'est d'utiliser le produit que l'on connaît et dont on sait qu'il convient pour ce qu'on lui demande.

Nous essayons de maintenir un choix limité d'outils et de familles de développement afin :

Adopter des choix techniques ne signifie pas d'être incapable de travailler avec d'autres langages, outils ou produits. Il faut pouvoir travailler avec les produits qui correspondent aux souhaits des demandeurs. Toutefois, se contraindre à cet éventail de choix c'est l'assurance :

Rédaction par Jean-Marie Piatte (1983-2021)