10 septembre 2006

Initiation à la programmation

Qu'est-ce que la programmation ?

"La programmation est l'art d'écrire un programme !"

Malheureusement, force est de constater, que ce soit chez les étudiants ou même chez les professionnels, que parfois, les programmes sont mal conçus, mal écrits, peu robustes, ou qu'ils ne correspondent pas aux désirs du client.

Il est des domaines d'application où ce genre de comportement est inacceptable (avionique, médical, nucléaire). D'une façon générale, un programme instable ou peu performant est extrêmement mal perçu par le client, et l'image de l'entreprise ou la réputation de l'auteur s'en trouve largement ternie. Il faut donc prendre des mesures pour éviter ça.

"La bonne programmation est l'art d'écrire correctement un programme !"

Le secret de la réussite d'un projet informatique tient en trois points essentiels :
  • Une conception solide
  • Une réalisation impeccable
  • Une vérification profonde
Il s'agit donc de mettre en oeuvre, de la meilleure façon possible, la succession d'étapes qui permet de traduire une application en un langage compréhensible par une machine. Les étapes principales sont :
  • La définition du projet (que veux-t-on faire ?)
  • La conception du projet (comment allons-nous le faire ?)
  • La réalisation (transcription du comportement en algorithmes, automates, fonctions)
  • Le codage dans un langage de programmation (C, Ada, Pascal, PhP etc.)
  • La traduction en langage machine (assembleur, compilateur, interpréteur)
L'ensemble de ses opérations s'inscrit dans le schéma plus général de la gestion d'un projet qui se décompose en 5 phases principales :
  1. La définition
  2. La conception
  3. La réalisation
  4. L'intégration
  5. La validation
La programmation concerne principalement les phases 1 à 4 de la gestion d'un projet, avec une insistance particulière sur le point 3. Elle consiste donc à maitriser l'ensemble de ces phases.

1 - La définition
C'est l'étape initiale qui permet de définir le projet. Par définition, on entend :

  • La spécification des interfaces (IHM, autres machines, fichiers)
  • La spécification des comportements (Normal, Extrême, Hors limite)
  • La specification des performances minimales attendues
2 - La conception

Cette étape découle obligatoirement de la précédente. L'ensemble des caractéristiques spécifiées est regroupé en grandes entités appelées blocs fonctionnels (BF), puis, chaque BF est découpé en entités plus petites selon une hiérarchie de type arborescente.

Les comportements sont décrits en détail par des algorithmes ou des machines à états. Les interfaces sont pris en compte. Des choix technologiques peuvent être effectués (qui fait quoi, matériel, logiciel). Il peut être choisi de recourir à des technologies plus ou moins existantes ou innovantes. Ces choix sont importants et déterminent en grande partie la réussite du projet.

La phase de conception est difficile et nécessite une bonne expérience et une certaine intuition. A ma connaissance, il n'existe pas de recette miracle ni de méthode toute faite pour réaliser une bonne conception

3 - La réalisation

C'est ici qu'intervient tout l'art du programmeur. Les phases précédentes sont essentielles, mais n'ont fait que préparer le terrain. Il s'agit maintenant de passer au choses sérieuses, au concret, au réel.

La conception fixe le cadre du développement. Elle défini les sous ensembles, les blocs fonctionnels et les comportements détaillés.

Une bonne méthode de réalisation d'un composant logiciel quelconque consiste à écrire les tests unitaires qui vérifient la conformité du composant en terme d'interface, de comportement et de performances, puis d'écrire le composant lui-même, et de vérifier le comportement au fur et à mesure.

Une bonne réalisation est aussi basée sur une connaissance approfondie du langage que l'on utilise. En effet, il est absolument primordial de s'assurer qu'en aucun cas, il ne puisse se produire de comportement indéfini (Undefined Behaviour ou UB). Le UB est la plaie du programmeur. Il en suffit d'un pour semer le doute sur la fiabilité du programme en entier.

Il faut donc être absolument sûr que chaque ligne de code est écrite dans le respect absolu de la définition du langage. C'est particulièrement vrai avec des langages 'souples' et au typage faible comme le C.

Il est important de souligner que les conséquences d'un UB étant imprévisibles par définition, il est illusoire de compter sur les tests pour le révéler. Encore une fois, seule une excellente maitrise du langage, éventuellement confirmée par une lecture croisée (travail en binôme) est à même de garantir la qualité d'un code en terme d'absence de comportements indéfinis.

Ensuite, le test sert à vérifier la conformité du code aux spécifications (nominales, extrêmes, hors limites).

4 - Intégration

C'est l'assemblage des composants et vue de réaliser le produit final. Les composants étant testés et réputés fiables, seuls les comportements globaux sont testés.

5 - Validation

C'est tout simplement la vérification de la conformité du produit à ses spécifications.

12 commentaires:

Anonyme a dit…

Voila un post intéressant, il est bon je pense de s'interesser aux étapes permettant la création d'un projet de bonne taille.

Nous avons, il me semble, tendance à rentrer tête baissée dans des projets qui méritent réflexion préalable.

Mais tout ça m'amène à une question ? est-ce là le travail d'un ingénieur systemes embarqués ? Ou plutot chef de projet ? J'ai du mal de cerner les tâches qui vont m'être assignées plus tard en entreprise... (j'étudie en informatique embarquée et temps réel).

Alexandre H

Unknown a dit…

Bonne question. Le chef de projet, qui est en rapport direct avec le client, est effectivement censé fournir la spécification du projet et le cahier de validation qui en découle (étapes 1 et 5). Une partie de la conception globale (séparation hard/soft) est aussi généralement de son ressort.

Par contre, c'est à l'ingénieur de développement de (se) fournir les documents de spécification détaillée, d'établr la conception détaillée, de réaliser le codage, les tests unitaires et l'intégration. C'est déjà énorme !

La validation est généralement confiée à une équipe de valideurs (niv BAC à +2, BTS etc.).

Les valideurs ne touchent pas au code. Ils relèvent les non-conformités. c'est tout.

Anonyme a dit…

Le travail de codage n'est il pas 'délégué' aux equipes bac+2 dans certains cas ? Parceque l'ingénieur de développement à l'air d'avoir de quoi s'amuser un certains temps vu comme ça...

Unknown a dit…

Si ce sont des programmeurs chevronnées, pourquoi pas. Il y a souvent plusieurs ingénieurs de développement sur un projet.

Tout dépend de la taille du projet, du délai. Il faut savoir que la 'parraléllisation' a un côut...

Si il faut environ 100 hommes.mois, ça ne veut pas dire qu'en mettant 100 personnes, le projet sera terminé en un mois... Par contre, 10 mois pour 10 personnes, ou 12 mois pour 8, oui, ça semble plus raisonable...

Anonyme a dit…

Oui je vois, rien de très proportionel la dedans donc. Si je me posais cette question c'est parcqu'on nous dit (peu etre à tord) qu'en tant qu'ingénieurs nous allons devoir déleguer ce genre de travail.

Ce n'est surement pas vrai, a mon avis ça dépend aussi de la structure (taille de l'entreprise...).

Anonyme a dit…

Bonjour !

Je n'en suis pas sûr, mais si j'ai bien compris, c'est le chef de projet qui est en contact avec le client ; il prépare aussi le terrain pour le(s) développeur(s) qui, eux, s'occupent de la réalisation concrète du projet (création d'un algorithme, codage ... ; ce qui correspond aux étapes 2, 3 et 4).

Puis, une fois que les développeurs ont une proposition de produit, elle est soumise aux valideurs.

Je ne sais pas si j'ai bien résumé, c'est encore un peu flou pour moi.

Il y a aussi certains concepts que je ne comprend pas, tels que la "spécification des comportements". Que se cache-t-il derrière les termes "normal, extrême et hors limite" ?

Merci, et pardon de mon ignorance,

Bonne journée.

Unknown a dit…

Dans les grosses boites, c'est possible. Dans les petites, on fait tout...

Unknown a dit…

Le comportement, c'est la façon dont réagit le programme lorsqu'il est soumis à divers stimuli :
- données saisies par l'utilisateur
- données lues dans un fichier ou sur le réseau
- résultat d'un calcul
- erreurs diverses...
- etc.

Normal, extrême, hors limites concerne essentiellement les données en entrée.

Par exemple, si la spéec dit "le champ 'nom' fait 32 caractères", on doit tester

- normal : 10, 20 ...
- extrême : 0, 32
- hors limites : 33, 100, 10000 ...

Dans tous le cas, le comportement doit être stable.

Si la specification a prévu un message d'erreur, on doit vérifier que le message est bien là et qu'il est conforme.

Anonyme a dit…

D'accord, c'est maintenant plus clair.

Merci.

Je m'en vais lire le prochain post...

Au revoir.

Anonyme a dit…

Salut manu :)
Sympa ton blog, j'aime beaucoup ta vision par problème de la programmation même si le C n'est pas forcément le langage le plus adapté pour approfondir une abstraction ayant pour but la résolution correcte et "profonde" d'un problème.
L'autre jour je suis tombé sur un livre que je te conseille si tu as la tps, il s'appelle "How to solve it" de Polya auquel ce post m'a fait penser.
Un aperçu: http://www.math.utah.edu/~pa/math/polya.html
Voilà :)
PS: je n'arrive pas à m'inscrire via RSS à ton blog? Est ce normal?

Unknown a dit…

-> gnux

Merci de tes encouragements. je vais aller voir ce livre.

Pour le RSS, tout est activé. Mais le champ "entête" est vide. Je ne sais pas ce qu'il faut mettre. Ils parlent de Adsense, je ne sais pas ce que c'est.

J'ai un problème avec les paragraphes formattés (< pre>< /pre>, espaces intentionnels) A chaque publication, des espaces sont retirés et mon code ne ressemble plus à rien. Si tu sais comment on fait...

Il y a peut être des bloggers plus orientés 'code'...

A+
Emmanuel

Anonyme a dit…

Bien le blog (pour une fois que je tombe sur un blog utile).

Bonne continuation, ça va résoudre un paquet de problèmes (pourquoi ne pas continuer sur le site ?).

"(...)Ils parlent de Adsense, je ne sais pas ce que c'est."
Adsense est un service de publicités ciblées by google.