Affichage des articles dont le libellé est ada. Afficher tous les articles
Affichage des articles dont le libellé est ada. Afficher tous les articles

vendredi 10 juillet 2009

Fin de projet SCADE

La fin d'une mission, ou d'un projet, c'est toujours une bonne occasion de faire le point. Je viens de terminer tout récemment une mission de quelques mois en tant que développeur logiciel, en SCADE, pour un système embarqué sur avion. Cette mission a été plutôt enrichissante sur plusieurs points.



SCADE

SCADE est un environnement de développement propriétaire édité par Esterel, et basé sur le langage Lustre. Il cible principalement les applications dites "critiques", dans des domaines divers comme le ferroviaire, le nucléaire, le spatial... et bien sûr l'aéronautique.
Ce que les gens du milieu appellent un peu pompeusement de la "spécification formelle", j'aurais tendance à l'appeler du "codage graphique" (pour un certain nombre de raisons, les ingénieurs systèmes apprécient peu le terme "code"...). En effet il s'agit ici non pas de coder avec des fichiers textes, mais directement avec une représentation graphique (c'est cette représentation, qui se veut le pendant visuel de la spécification textuelle, que d'aucun nomme la "spécification formelle"). Par la suite, cette représentation graphique est convertie en langage Lustre (langage de programmation textuel, "classique"), celui-ci étant à son tour interprété afin de générer le code C (ou Ada, au choix) qui sera finalement executé sur cible.

Alors en pratique, à quoi ça ressemble ? Pour des raisons évidentes de confidentialité, je n'ai pas d'images de mon projet sous la main, mais en gros c'est un espèce d'hybride entre des représentations de fonctions logiques (notation américaine), de machines à état, et de certains schémas UML. Un exemple de chez Esterel ici (machine à état en haut,"workflow" en bas).

N'ayant jamais utilisé ce type d'outil avant, j'avoue que l'adaptation se fait assez rapidement, même si certains aspects restent déroutants (la représentation des machines à états est à mon avis assez peu intuitive par exemple), et si certains côtés sont un peu frustrants (gestion des types...).
Par contre, clairement l'outil possède des avantages sur du codage manuel normal :
  • Tout l'aspect concurrent et synchrone est épargné au développeur, évitant de nombreuses erreurs
  • Abstraction également de la gestion de la mémoire (ce qui n'est bien sûr pas le cas en C ou en Ada - de longues heures de debug gagnées...)
  • Représentation du code sous une forme lisible par quelqu'un ne sachant pas coder (un ingénieur système par exemple)
  • Annulation du besoin de vérification manuelle sur de nombreux points (revue du code généré notamment)

DO-178B

C'est mon second projet dans ce que les commerciaux aiment appeler "un contexte de DO-178B". En pratique, la DO-178B, est une norme aéronautique pour le développement d'applications critiques (le plus souvent embarquées sur avion). C'est une norme très sévère qui imposent de nombreuses règles pour la conception et le développement logiciel. Notamment :

  • La gestion de configuration obligatoire
  • La traçabilité "parfaite" entre les spécification et le code
  • Les différents aspects de la validation et vérification (revue de code, indépendance entre le codeur et le testeur, couverture des tests...)
Bizarrement, on s'habitue... Quand j'ai découvert cette norme, j'ai plus eu l'impression de la subir que d'en profiter, mais là, ayant participé à la mise en place du process de validation (l'ensemble des règles et documents pour les tests, entre autres), je dois avouer que travailler dans un cadre très strict a ses avantages. De bonnes pratiques sont obligatoires au niveau de la traçabilité par exemple : "Quel bout de code correspond à une spec donnée ?". Ou encore : "Jusqu'à quel point dois-je tester mes fonctions ?", etc...


Au niveau dev...

C'est la première fois que je me retrouvais seul, en milieu pro, à prendre en charge le développement complet d'un soft. C'est un peu flippant au début, surtout quand on a été habitué à avoir des gars très bons techniquement à côté de soi, mais c'est aussi extrêmement enrichissant.
En particulier, le fait de devoir faire soi-même des choix au niveau de l'architecture du logiciel, des conventions techniques, du design, etc... c'est l'une des parties les plus intéressantes du développement (l'implémentation est sympa aussi, hein !).

Sans trop rentrer dans les détails techniques (qui seraient de toute façon une redite de pas mal de principes de base de conception logicielle), voici ce que j'en ai retenu :
  • Les spécifications, quand elles sont écrites par quelqu'un d'autre qu'un codeur, sont forcément en décalage par rapport aux réels besoins, et par rapport à leur mise en oeuvre. Ce qui veut dire que celui qui code doit participer, et influencer au maximum cette phase de spécification. En gros : participer à cette expression des besoins plutôt que la subir ensuite.
  • Avant même de réfléchir à la façon d'implémenter les fonctions demandées, identifier les problèmes à venir, d'un point de vue software (pas d'un point de vue système, ou métier), qui se posent et proposer une solution. Par exemple dans mon cas : grand nombre de variables en entrée et en sortie => création de façades ; uniquement des variables booléennes => créations de types structurés utilisés dans les interfaces de chaque fonction ; besoin temporaire de certains modes de fonctionnement => design pattern Strategy (non, il n'y a pas de POO dans SCADE, pour autant ça reste applicable) et séggrégation des fonctions par mode ; etc...
  • Essayer de piquer les bonnes pratiques des langages modernes et/ou fonctionnels : pas de variables globales, éviter tant que possible les effets de bord, composer ses fonctions, etc...
  • Le typage, c'est la vie.
  • Communiquer au maximum : "Mon code est dans tel état là, maintenant.", "Telle partie sera disponible le tant.", "On va avoir des problèmes à tel niveau sur telle spec.", "Je suis en retard par rapport au planning à cause de tel problème.", etc... et de façon systématique et quotidienne. Cela permet d'éviter bien des mauvaises surprises.
  • Séparer ce qui change de ce qui ne change pas (formulation honteusement pompé à Russ Olsen)
  • Et les classiques : KISS, DRY, YAGNI, etc...

credits : photo de nacelle par Eric E Johnson

mardi 8 juillet 2008

Règles de codage, mes amours

Il n'est pas rare d'avoir quelques règles de codage dictées lors du développement d'un programme dans une entreprise, ou dans un projet en général. En soi, c'est plutôt bien, ça rend souvent le code plus homogène, lisible ou maintenable. Certaines règles se justifient pour les besoins de performances, de documentation ou de fiabilité. Mais parfois...


  • Pas de ligne de plus de 131 caractères. Moral, mais pourquoi pas 132 ou 130 ?
  • Minimiser les boucles, mais maximiser leur portée. Hein ?
  • Pas d'identifieur (nom de classe, variable ou package) de plus de 31 caractères. Si ça parait évident, attendez de voir la suivante... (et celle d'après !)
  • Les noms des identifieurs doivent être clairs et représenter l'objet identifié. Par exemple, "Initialize_Space_Craft_With_One_Pilot" et non pas "Init_SC_with1_pilot". Hahahaha !!!
  • Interdiction d'utiliser use. RHAHahahaha... BANG!
  • Pas d'appel récursif. Boom.
  • Pas de condition IF sans ELSE. Peut se justifier par des raisons de fiabilité (le codeur a effectivement envisagé le cas contraire et écrit exlicitement null, avec commentaires dans le ELSE).
  • Dans les CASE-WHEN, interdiction d'utiliser when others. Moral pour la fiabilité (Ada95 plante si l'on omet un cas possible), parfois très pénible en pratique (heureusement que l'Ada admet les OR dans les CASE, parce qu'avec des litéraux de 15 à 20 entrées...).
  • Les variables doivent être déclarées dans l'ordre d'apparition dans le code. Dumbest rule ever.
J'en passe et des meilleures. L'important est surtout de mettre au point ces normes avant de commencer l'implémentation... Dommage pour certains, pas vrai ?

Mais quelles sont les règles de codage indispensables en réalité ? Celles qui apportent effectivement la lisibilité, la fiabilité et la maintenabilité ?

jeudi 13 mars 2008

Un générateur de MIDI en Ruby

Giles Bowkett est un étonnant programmeur Californien qui a développé un générateur de MIDI, en Ruby : Archaeopterix. Pour rappel, le MIDI est une interface audio électronique. Manifestement, il utilise pour cela le logiciel Reason, bien connu dans ce domaine...


Des liens en vrac sur le sujet :


Voilà, c'est fait, j'ai parlé musique... Et au passage, c'est une application originale et relativement inattendue pour un langage de programmation, et le Ruby en particulier.

Relativement, car Ada Lovelace, scientifique du XIXème ayant donné son nom au langage Ada avait avancé, aux alentours de 1840, que, je cite : "La machine [- son anticipation de l'ordinateur, de fait -] pourrait composer de manière scientifique et élaborée des morceaux de musique de n'importe quels longueur ou degré de complexité.". Etonnant, non ? Qu'on ne vienne plus me parler de SF après ça... et pour ceux qui veulent un de vrai musique, c'est par là, chez un escroc notoire.

mardi 11 mars 2008

Débutons en Ada

En Ada 95 plus précisément... Deux docs et un livre :


Les deux premiers docs sont idéaux (et non pas "idéals"...) pour attaquer Ada en ayant déjà des connaissances en programmation, mais ne creusent pas nécessairement certains aspects très particuliers ou avancés du langage... Le livre de Barnes est en revanche très complet, et part du (tout) début : plutôt clair en général.
Une bonne base pour attaquer.

dimanche 2 mars 2008

Travail, travail...

Dans la vie, on fait pas toujours ce qu'on veut : Scheme va devoir un peu attendre... j'ai trouvé du taf :
Du coup, la fréquence de publication sur ce blog devrait baisser sensiblement dans les prochaines semaines. Je n'abandonne cependant pas ni ce blog, ni les petits langages que j'aime : en cas de disette, je posterai des vieux codes rigolos sortis des placards, en Fortran ou Ruby notamment. Je reste à l'affut sur le SDZ également.

Pour parler prog', j'avais cité Ada l'autre jour, et je l'attaque donc pour le boulot. Je ne suis pas persuadé de pouvoir "blogger" là-dessus tout de suite : il s'agit d'un langage assez particulier. OO dans sa version 95, mais avec de grosses séquelles de son origine procédurale. Il est souvent préféré au C dans le cadre d'applications critiques (pour systèmes embarqués notamment) pour sa rigueur imposée, sa meilleure (à priori) gestion des tableaux (et des problèmes d'indices), et sa capacité à ajouter des "règles" (contraintes) supplémentaires au compilateur : le tout dans un soucis permanent de fiabilité de l'exécutable. Exécutable plus volumineux qu'en C en revanche, mais (selon certaines sources) d'une vitesse (notion importante en temps réel) comparable au C++. Correct donc. Que dire d'autre, sinon qu'Ada possède un compilateur libre du projet GNU : GNAT (la référence, existant en version "pro" avec IDE et services associés) et que ce langage gère "nativement" la programmation concurrente ?

J'espère pouvoir vous en donner quelques exemples bientôt...