Developpez.com

Le Club des Développeurs et IT Pro

La règle "zéro, un ou infini" serait omniprésente en génie logiciel,

êtes-vous d'accord ? Et comment la percevez-vous ?

Le 2010-11-19 15:21:23, par Idelways, Expert éminent sénior
Dans la conception logicielle, une règle de base serait omniprésente. Elle s'appelle "Zéro, un ou l'infini" et stipule que toute architecture logicielle destinée à un nombre limité d'instances (supérieure à 1) doit être prohibée.

Pour mémoire, cette règle a été énoncée pour la première fois par Willem Louis van der Poel, pionnier hollandais des sciences informatiques.

Un système de fichiers, par exemple, est conçu suivant cette règle : le dossier racine '/' n'a aucun parent. Tous les autres dossiers n'ont qu'un seul parent et peuvent contenir une infinité de fichiers et de dossiers (sauf limitations à 65536 inhérente à l'architecture globale, mais le principe reste le même).

Concevoir un système pour un nombre arbitraire serait donc tout simplement une erreur de conception.

La logique derrière ce postulat est qu'il existe de nombreuses situations où un système doit être conçu pour répondre à un besoin unique et spécifique (dans ce cas il s'agit d'une exception), mais en aucun cas pour deux (sinon pourquoi pas 2+1, 3+1, N+1... ?)

Et vous ?

Êtes-vous d'accord avec l'énoncé de cette règle ?
Avez-vous déjà été confrontés à des cas où il vous a fallu concevoir un système pour un nombre précis (>1) d'instances ? Lequel ?
  Discussion forum
100 commentaires
  • ctxnop
    Membre expérimenté
    Pour le moment tous les exemples que vous donnez sont relativement mauvais
    Avant de s'offusquer, revenons au sujet de base qui parle de conception, pas d'implémentation ou de réalité physique.

    Un jour est limité à 24h ? Oui, sur Terre, pas sur Mars, Jupiter ou je ne sais quelle autre planète, et encore, c'est sujet à variation dans le temps.
    Rien ne nous assure non plus que cette règle internationale ne va pas changer dans un temps futur. Et de toute façon, ce n'est qu'une unité de temps, 48h c'est possible, ca veut juste dire 2 jours.

    65 cases sur un jeu de l'oie ? Qu'est-ce qui m'empêche d'inventer un nouveau jeu avec un plateau à 52 cases ? ou 138 ? Si je le fait il faudra à nouveau tout re-concevoir ?

    La très grande majorité des "constantes" ne sont absolument pas des constantes, ce sont des règles établies par les hommes selon l'avancement de leurs connaissance.

    Alors oui, la réalité physique est bien la, l'infinité n'existe pas réellement, mettre 2 574 294 349 roues à une petite voiture n'est pas physiquement possible.

    Par contre, conceptuellement, que la voiture soit équipée 4 ou 2 000 000 000 de roues, ca change rien.

    La limitation physique et/ou technique est un autre soucis, qu'il ne faut pas perdre de vu.
    Mais le fait est qu'on ne peut pas deviner de quoi demain sera fait, les limites physiques/techniques évolueront peut être, il est plus logique de gérer un "infini", ainsi, si la limitation physique/technique change, on a rien à changer dans la conception.
  • pseudocode
    Rédacteur
    Envoyé par ctxnop
    Pour le moment tous les exemples que vous donnez sont relativement mauvais
    Avant de s'offusquer, revenons au sujet de base qui parle de conception, pas d'implémentation ou de réalité physique.
    Conception certes. Mais Conception Logicielle. Dans le but au final d'être implémenté dans un logiciel. Logiciel codé dans un langage informatique... limité (binaire, octet, ...)

    Je fais partie de ceux qui aiment bien conceptualiser un problème, mais il ne faut pas perdre de vue l'objectif final. Une solution universelle c'est bien. Une solution optimale, c'est pas mal non plus.
  • Karth
    Membre à l'essai
    C'est clairement un problème de technique pure vs métier.

    Je suis entièrement d'accord avec la règle énoncée. D'un point de vue purement conceptuel, elle est correcte, et je préfère m'y conformer le plus souvent possible.

    Maintenant, l'informatique doit s'adapter au métier:

    - Nous avons des machines aux capacités finies: les objectifs de performances obligent à limiter le nombre maximal d'éléments traités.
    - Les règles de gestion établies par le métier limitent souvent les ensembles à des quantités finies (et ça apparaît dans les specs). Il n'est pas toujours possible d'aller outre.
  • pseudocode
    Rédacteur
    Envoyé par LPaul
    Et qui dit que dans 20 ans on utilisera pas des voitures avec 1 000 (mini)roues ?
    Rien, donc permettre de la modéliser dans ton application sans avoir à modifier le code source est un plus.
    Oui, j'étais aussi de cette avis dans mes jeunes années.

    Je pensais que la meilleure solution était la plus générale, la plus extensible, la plus réutilisable, la plus paramétrable, etc. Avec le temps, je me suis rendu compte que la meilleure solution était souvent la plus simple.
  • pseudocode
    Rédacteur
    Envoyé par Trois Sangs Onze
    Du coup, je dirais que pour moi, la loi du 0,1,n reste une loi théorique. Et comme chacun sait, la pratique est parfois différente de la théorie
    Pour moi, c'est surtout une "rule of thumb" (principe général) de conception.

    Dans la pratique ca signifie que lorsque je modélise une association avec une multiplicité 2, 3, ... (ou n'importe quelle valeur finie > 2), je pose mon crayon et je me demande s'il y a une bonne raison pour mettre une valeur "en dur" au lieu de mettre "*".
  • ctxnop
    Membre expérimenté
    Envoyé par pseudocode
    Conception certes. Mais Conception Logicielle. Dans le but au final d'être implémenté dans un logiciel. Logiciel codé dans un langage informatique... limité (binaire, octet, ...)
    Une conception "sans limite" ne veut pas dire une implémentation sans prise en compte des contraintes techniques.

    Simplement, a la conception on considère l'infini, à l'implémentation on pose une limite à cet infini, une limite souvent déclarée en tant que constante, qu'énumération, etc...

    Ainsi, on a un calendrier à 7j dont 5 travaillé, si demain ca change, on a juste à changer la valeur de la constante dans le code pour faire évoluer la limite à travers tout le logiciel et hop, ca fonctionne.

    Tout ce qui est dit ici, c'est qu'en phase de conception on fait on ne dit pas "un jeu de l'oie à 65 cases", on dit "un jeu de l'oie à NB_CASES".
    Après, à l'implémentation du écrit "NB_CASES = 65", pas de problème, si demain ca change, il n'y a qu'a faire évoluer cette constante, le reste ne change pas. Puisque tout le reste à été conçut pour un nombre inconnu de cases, alors si ca marche pour un nombre inconnus ca veut dire que ca marche quelque soit le nombre.

    Par contre si à la conception tu te dis "il y a 65 cases", tu conserveras ce nombre en tête pour tous les autres choix de conceptions et du coup tu va amener des limitations là où il n'y en avait pas, sans même te rendre compte. Par exemple, pour la conception du format de sauvegarde d'une partie, tu va te dire que tu as besoin uniquement de 65 entiers pour représenter les 65 cases. Si demain ca devient 52, ton format de fichier de sauvegarde devient inutilisable, incompatible, etc... Alors que si tu avait pris un nombre inconnu, tu aurai pensé au fait d'indiquer dans le fichier le nombre de cases et donc conserver un code compatible quelque soit le nombre de cases.
    Tu va te poser le même problème à l'implémentation, car en lisant ton cahier des charges tu va lire "65 cases" et du coup tu va écrire en dur "65" dans ton code partout où tu en as besoin. Résultat, si demain ce nombre change, il faut repasser partout dans le code et tu t'expose à un risque de changement profond.
  • ctxnop
    Membre expérimenté
    Oui, plutôt d'accord avec toi, cependant il y a bel et bien une différence entre infini et inconnu. Celle évoquée par pseudocode.

    Gérer une quantité infinie signifie que tu prend en compte qu'il n'y a pas de fin. Tu ne peux donc pas référencer la fin d'une collection puisqu'elle est infinie.
    Tu ne peux pas non plus la parcourir bêtement car il n'y a pas de fin à ce parcourt.

    C'est donc tout de même assez différent d'une quantité finie mais non connue au moment de la conception, car même si elle n'est pas connue elle est comptable. Il y aura donc une fin référençable à ta collection, un milieu dans ta liste, etc...

    Donc oui, faire un algo gérant une infinité permettra aussi de gérer un ensemble fini. Cependant il ne sera probablement pas modélisé de la même façon qu'un algo qui gère une quantité finie mais inconnue.

    A mon avis il y a une différence de vocabulaire comme il y en as entre la physique et les mathématiques. L'infini n'existe qu'en mathématique pure. En conception on parle "d'infini" quand on quantifie par "*". Mais comme il a été dit un peu plus haut, le "*" signifie plutôt "plusieurs" et non pas infini.
  • pseudocode
    Rédacteur
    Envoyé par ctxnop
    En conception on parle "d'infini" quand on quantifie par "*". Mais comme il a été dit un peu plus haut, le "*" signifie plutôt "plusieurs" et non pas infini.
    C'est vrai que la règle "Zéro, Un ou Plusieurs" me plait déjà plus.

    Mais pour reprendre mon post #3, les solutions à un problèmes de "Job Shop" sont plus faciles à concevoir en fixant précisément le nombre des entités. Si on garde cette valeur en inconnue, on arrive a des algorithmes généraux horriblement complexes et surtout difficilement prouvables. Alors qu'avec un nombre connu, on peut lister exhaustivement tous les cas possibles et prouver que ca marchera tout le temps.

    Cela dit il est vrai que c'est un cas particulier, mais c'est celui que je rencontre en ce moment. Et puis, comme le dit wikipedia, c'est une "rule of thumb" et pas une vérité absolue.
  • ctxnop
    Membre expérimenté
    Envoyé par TNT89
    Pour la forme : l'infini existe aussi en physique et est assez courant (optique / électromagnétique, calcul infinitésimal...).
    Je n'ai pas dis le contraire. Je ne me souviens pas avoir écrit qu'en physique l'infini n'existe pas.J'ai juste évoqué les différence de vocabulaire entre les physiciens et les mathématiciens car les réalités d'un domaine ne sont pas celle d'un autre. Je me souviens des débats animés que ca provoquait entre mon prof de physique appliqué (électronique) et mon prof de maths quand j'étais au lycée (bien que j'en ai complètement oublié le sujet exacte).

    Envoyé par bugsan
    La réponse qu'il faut donner à ce que l'on peut désigner comme de l'over-engineering, c'est : YAGNI (you aint gonna need it)
    C'est surement en grande partie à cause de cette réflexion qu'on se retrouve si souvent face à des problèmes tels que la pénurie d'IPv4, la limitation de taille de fichier à 4Go sur le FAT32, etc...
    Des limitations pour lesquelles on s'est surement dit qu'on atteindrait jamais ces limites...
    Et puis c'est un coup dur pour l'innovation si on part du principe qu'on inventera jamais dérivé des échec sur une grille de taille différente.
  • bugsan
    Membre confirmé
    Envoyé par ctxnop
    C'est surement en grande partie à cause de cette réflexion qu'on se retrouve si souvent face à des problèmes tels que la pénurie d'IPv4, la limitation de taille de fichier à 4Go sur le FAT32, etc...
    Des limitations pour lesquelles on s'est surement dit qu'on atteindrait jamais ces limites...
    Nan les gens qui ont fait ses limitations savaient qu'elles seraient à revoir un jour. Ils se sont juste dit "on verra le jour venu". Ce qui pour moi n'est pas la même chose.
    Ex: Les successeurs à FAT32 ne se contentent pas d'augmenter la taille des fichiers, loin de là. Idem pour ipv4. C'est une erreur de faire croire que si on met au point de nouveau standard ce n'est que pour une question de taille ou quantité limitée.

    La re-conception est inévitable et permanente. Il faut l'accepter. Il faut accepter le changement ...

    Envoyé par suntsu
    Actuellement, la quantité de mémoire dont nous disposons rend obsolète le fait de limité à 7 (3bits de données) le nombre de jours dans une semaine... Autant prévoir directement 8,16,32 ou même 64bit d'espace ! J'exagère un peu ici mais je veux juste illustré que vouloir être trop "radin" peux entrainer à plus ou moins longue échéance de gros problèmes...
    Si on se remet dans le contexte de l'époque, avec ses limitations techniques etc... on comprend qu'ils aient choisi de faire comme ça. Alors c'est un peu facile à dire maintenant que l'on n'a plus aucun problème d'espace mémoire. Quel développeur aurait mis des variables comme ça sur 64bit en 1970 ? Selon toi il aurait du aller voir le responsable des achats pour lui dire qu'il était trop "radin" ?
    D'ailleurs, ces contraintes matérielles ont longuement influencées aussi la philosophie / morale des développeurs. Le développeur qui aurait mis tout sur 64bit aurait été la risée de ses collègues. Les honneurs ultimes étant décernées à celui qui aura "optimisé" au maximum l'espace mémoire. Rendant impossible toute évolution, mais ça, ce n'était pas dans l'air du temps.