Le pire ennemi d'un bon système, c'est son propre succès. Plus un langage est adopté, plus le coût de le faire évoluer devient astronomique. C'est le paradoxe de la maturité : ce qui t'a rendu indispensable est exactement ce qui te rend difficile à améliorer. J'ai conçu CAKE avec cette tension en tête depuis le premier jour.
La rupture de compatibilité est la grande peur de tout architecte de langage. On en parle comme d'un accident technique — un bogue de conception, une erreur de jeunesse. Mais c'est rarement ça. La rupture de compatibilité est presque toujours le symptôme d'une absence de philosophie d'évolution. Un langage qui ne sait pas comment vieillir finit par se déchirer entre ce qu'il était et ce qu'il doit devenir.
CAKE a été conçu pour ne jamais se retrouver dans ce piège. Non pas parce que je suis meilleur architecte que les autres — mais parce que j'ai fait de l'évolutivité un principe premier, pas une fonctionnalité ajoutée plus tard.
Les systèmes logiciels ont une propriété étrange : ils vieillissent en sens inverse des organismes vivants. Un organisme vivant devient plus fragile avec le temps. Un système logiciel, lui, devient plus rigide — non pas parce qu'il s'affaiblit, mais parce qu'il accumule des dépendances, des hypothèses implicites, des comportements dont d'autres systèmes sont devenus tributaires.
Chaque ligne de code déployée en production est une promesse. Implicite, non signée, mais réelle. La promesse que ce comportement sera là demain, dans six mois, dans dix ans. Modifier ce comportement — même pour l'améliorer — c'est rompre une promesse. Et rompre des promesses a un coût. Dans les systèmes extensibles, ce coût peut être catastrophique si l'évolution n'a pas été pensée dès l'architecture initiale.
La stratégie que j'ai adoptée pour CAKE repose sur un principe simple à énoncer, difficile à tenir : on n'enlève jamais — on accompagne. Une ancienne syntaxe ne disparaît pas du jour au lendemain. Elle devient progressivement dépréciée, puis obsolète, puis retirée — avec à chaque étape des outils de migration, des avertissements explicites, une documentation de transition.
La nouvelle syntaxe est introduite en parallèle de l'ancienne. Les deux fonctionnent. Le système ne force aucune migration.
L'ancienne syntaxe émet des avertissements. La documentation pointe vers la nouvelle approche. Les outils de migration automatique sont disponibles.
L'ancienne syntaxe est maintenue dans une couche de compatibilité distincte. Elle ne bloque plus l'évolution du cœur du système.
L'ancienne syntaxe est retirée. Les systèmes qui ne se sont pas migrés ont eu le temps, les outils et la documentation pour le faire.
Ce processus peut sembler lent. Il l'est — délibérément. La vitesse d'évolution d'un système ne se mesure pas à la rapidité avec laquelle on peut casser les choses. Elle se mesure à la rapidité avec laquelle on peut faire adopter les améliorations sans forcer personne.
Dans CAKE, les couches de compatibilité ne sont pas une dette technique à rembourser un jour. Ce sont des couches de mémoire — des parties du système qui savent encore parler les anciens dialectes pour que rien ne soit abandonné brutalement.
Cette métaphore n'est pas anodine. Un traducteur humain qui maîtrise plusieurs langues n'est pas moins efficace parce qu'il connaît des langues mortes. Il est plus riche. Il peut lire des textes que les autres ne peuvent plus lire, établir des ponts que les autres ne peuvent plus établir. Les couches de compatibilité de CAKE jouent ce rôle : elles permettent au système de rester en conversation avec son propre passé tout en construisant son futur.
Un système qui efface son historique pour aller plus vite ne va pas plus vite. Il recommence. Et recommencer n'est pas du progrès — c'est de l'amnésie déguisée en agilité. — Sébastien Roy, CEO Unibool Inc.
La frontière la plus intéressante — et la plus risquée — de l'extensibilité est celle des systèmes qui peuvent modifier leur propre grammaire à l'exécution. Des langages dont la syntaxe n'est pas fixe mais négociable, selon le contexte, le domaine, les besoins du système hôte.
CAKE s'approche de cette frontière avec une précaution calculée. Les modules de syntaxe permettent d'introduire de nouveaux constructs sans toucher au cœur du parseur. Les moteurs spécialisés peuvent interpréter des dialectes entiers du C% sans que le runtime principal en soit conscient. C'est une forme d'évolution distribuée — le langage grandit à la périphérie sans que le centre soit déstabilisé.
La limite que je maintiens fermement est celle-ci : l'auto-évolution doit rester traçable. Un système qui se modifie lui-même sans laisser de traces est un système dont personne ne peut garantir le comportement. Et un comportement non garanti n'est pas de l'intelligence — c'est de l'aléatoire avec une bonne présentation.
Un langage durable est un langage qui a planifié son propre vieillissement. Non pas comme une défaite inévitable, mais comme une discipline architecturale — la capacité à évoluer sans trahir ceux qui vous font confiance.
Faire évoluer un langage sans briser les architectures existantes n'est pas une contrainte technique. C'est une promesse éthique envers les développeurs qui ont bâti sur vos fondations.