50 points par GN⁺ 2025-03-26 | 5 commentaires | Partager sur WhatsApp
  • Leslie Lamport est l’un des premiers développeurs de LaTeX et un pionnier des systèmes distribués. Lauréat du prix Turing en 2013
  • Dans sa keynote à SCaLE 22x, il a insisté sur l’importance de l’abstraction, en soulignant que la plupart des programmeurs se focalisent sur le code et les langages, alors que la pensée abstraite et la conception en amont du code sont essentielles

Résumé de la présentation

  • Vous pourriez vous attendre à ce que je parle de concurrence (Concurrency), mais je n’ai rien de nouveau à en dire
  • En revanche, les enseignements sur la « rédaction de programmes concurrents » s’appliquent aussi à toute la programmation en général
  • Cette présentation porte sur la programmation dans son ensemble

Algorithme vs. programme

  • Algorithme : une idée abstraite indépendante du langage. Un concept plus abstrait et de plus haut niveau qu’un programme
  • Programme : la forme concrète d’un algorithme implémenté dans un langage donné. Les langages de programmation sont trop complexes pour bien exprimer les algorithmes
  • Un algorithme ne s’exécute pas et il est en général court et simple
  • En particulier pour le code lié à la concurrence, il faut d’abord définir un algorithme correct avant de l’implémenter

L’abstraction à travers l’exemple du maximum d’un tableau

  • Même pour un problème simple, il faut définir clairement “ce qu’on veut faire” (What)
  • Exemple : « retourner le maximum d’un tableau d’entiers » → « retourner le plus petit nombre supérieur ou égal à tous les éléments »
  • Il faut aussi définir à l’avance le cas d’un tableau vide (par ex. -∞)
  • Une définition claire permet ensuite de dériver un algorithme (How) plus simple et plus robuste

L’exécution d’un programme est un flux d’états

  • L’exécution d’un programme n’est pas juste une suite d’instructions, mais une succession d’états (state)
  • Chaque transition d’état correspond à l’exécution d’une partie du code
  • Cette façon de voir est importante pour prouver la correction d’un algorithme (usage d’invariants, etc.)

Un outil pour les systèmes complexes : TLA+

  • Pour exprimer précisément l’abstraction, il faut un langage exact
  • TLA+ est un outil conçu dans ce but
  • Amazon Web Services a utilisé TLA+ pour détecter à l’avance de graves défauts de conception
  • Virtuoso, l’OS de la sonde Rosetta, a lui aussi été conçu sur la base de TLA+, avec un code concis et stable

Le rôle de l’abstraction même avec des spécifications incomplètes

  • Exemple : pour un pretty printer, les critères d’alignement peuvent être subjectifs
  • Malgré cela, définir un ensemble de règles abstraites reste important pour le débogage et la maintenance

La relation entre écriture et pensée

  • Mettre ses idées par écrit aide à clarifier la pensée
  • L’abstraction ne se fait pas seulement dans la tête : elle est plus efficace lorsqu’elle est formulée par écrit
  • Lamport a mentionné que sa formation en mathématiques avait développé sa capacité d’abstraction
  • Les mathématiciens peuvent enseigner l’abstraction aux programmeurs

Le regard porté sur les bibliothèques et les bugs

  • Dans la seconde partie, « pourquoi les programmes doivent-ils avoir des bugs ? », il aborde le problème de la complexité
  • Les logiciels modernes dépendent de nombreuses bibliothèques, mais celles-ci manquent souvent de descriptions précises et indépendantes du langage
  • Cela provoque des bugs inattendus lors de l’intégration
  • Exemple : son expérience de débogage JavaScript sur le site de son cours TLA+
  • La vision fondée sur les états aide à comprendre cette complexité

Sujets abordés dans les questions-réponses

  • L’impact de l’IA sur l’abstraction
  • Le fossé entre l’open source et le monde académique
  • La réalité dans laquelle les développeurs négligent les définitions formelles (formal definition)
  • Ce qui reste le plus important, c’est toujours « réfléchir avant de coder »

Conclusion : l’essence de la programmation, c’est la pensée

  • Lamport soutient qu’il faut donner la priorité à la pensée abstraite et aux spécifications formelles plutôt qu’au simple codage
  • L’effort initial est important, mais il mène au final à des logiciels plus robustes et plus faciles à maintenir
  • Coder n’est qu’une partie de la programmation ; la vraie programmation commence avec des algorithmes précis et l’abstraction
  • Dans un monde moderne où la complexité des systèmes et la concurrence augmentent, l’abstraction est une compétence essentielle, et les programmeurs doivent s’entraîner à penser et à abstraire

5 commentaires

 
softer 2025-03-27

Je suis moi aussi d’accord avec cet article.
Je pense que définir les problèmes à partir de valeurs d’état abstraites est utile pour identifier les problèmes, et j’essaie de créer des outils de gestion d’état visuels, explicites et clairs, comme la visualisation des états avec des diagrammes, Unreal Blueprint ou des workflows.

Je devrais sans doute m’intéresser d’abord au langage.

 
felizgeek 2025-03-27

C’est un texte qui me rappelle mes cours de spécialisation en théorie de la calculabilité ! Je le recommande à celles et ceux qui programment pour approfondir le sujet.

 
aer0700 2025-03-26

Je me demande ce que signifie TLA
Je vais chercher

 
GN⁺ 2025-03-26
Avis Hacker News
  • Les « codeurs » de la demoscene se désignent ainsi avec fierté, et ce sont souvent aussi d’excellents « programmeurs » et « ingénieurs logiciel ». Quel que soit le terme employé — codeur, programmeur, ingénieur logiciel — l’important est de faire en sorte que l’ordinateur fonctionne comme on le veut

  • Le keynote de l’an prochain sera sans doute « le vibing n’est pas du code, ni de la programmation, mais… parfois une pyramide de déchets qui fonctionne un peu ». Heureusement que Dijkstra n’a pas vu ça. Il était déjà agacé dans le salon de ses parents dans les années 80. Impossible d’imaginer sa réaction face au « vibe coding »

  • Keynote de Leslie Lamport à SCaLE 22x : réfléchir, abstraire, puis coder. Lamport défend un changement fondamental dans l’approche de la programmation, en mettant l’accent sur la réflexion et l’abstraction avant l’écriture du code, et cela s’applique à tout code non trivial

    • L’abstraction d’abord : définir une vue abstraite du programme avant d’écrire du code. Cette conception de haut niveau clarifie la logique et permet de détecter les erreurs tôt. On se concentre sur les idées, pas sur un langage particulier
    • Algorithme != programme : un algorithme est un concept abstrait, un programme est une implémentation concrète
    • L’exécution comme suite d’états : modéliser l’exécution d’un programme comme une succession d’états, où l’avenir de chaque état ne dépend que du présent. Cela simplifie particulièrement le raisonnement sur la concurrence
    • L’importance des invariants : identifier les propriétés vraies pour tous les états d’exécution. Leur compréhension est essentielle à la correction
    • L’importance de spécifications claires : beaucoup de bibliothèques logicielles manquent de spécifications claires, ce qui empêche leur bonne utilisation. Il faut des descriptions claires et indépendantes du langage, surtout pour la concurrence
    • Écrire, c’est penser : écrire impose la clarté et révèle les raisonnements négligents. Penser améliore l’écriture. C’est un cercle vertueux
    • Apprendre l’abstraction : l’abstraction est une compétence centrale en mathématiques, et les programmeurs doivent la développer
    • L’abstraction via l’IA ? La question est posée de savoir si les modèles d’IA peuvent être utilisés pour le processus de pensée abstraite en programmation
  • La programmation devrait être un processus intentionnel, où l’implémentation (le code) suit une conception réfléchie (l’abstraction), avec un accent mis sur des spécifications claires et sur la compréhension du comportement du programme à travers les suites d’états et les invariants. Il vaut toujours mieux réfléchir

  • Mon professeur de mathématiques appelait codage tout acte consistant à transformer un concept dans une forme plus précise et lisible par machine. Cela inclut non seulement écrire dans un langage de programmation ce que l’on veut que l’ordinateur fasse, mais aussi encoder des données. Le mot « encoder » le rend clair. Il nous avait donné un devoir consistant à définir une manière de coder un arbre binaire en nombre naturel. Le mot codage est trop ambigu, donc je l’utilise peu

  • Lamport soutient qu’il faut séparer le « quoi » du « comment ». Mais je me demande si, dans la plupart des problèmes, le « quoi » et le « comment » d’un programme ne sont pas en partie fusionnés. Par exemple, les considérations de performance font-elles partie du « quoi » ou du « comment » ?

  • Résumé intéressant : un algorithme n’est pas un programme, il ne devrait pas être écrit dans un langage de programmation et il devrait être simple. En revanche, un programme doit s’exécuter rapidement sur des ensembles de données potentiellement volumineux, donc il doit être complexe. Cela est particulièrement discuté pour les programmes concurrents exécutés sur plusieurs CPU, car leur ordre d’exécution varie

  • Je définis la programmation comme du code qui exige de réfléchir avant d’écrire, et du code destiné à être utilisé par quelqu’un qui n’a pas envie de lire ce code. Cette conférence existe depuis longtemps. L’exemple qui simplifie la recherche du plus petit élément correspond exactement à « Define Errors Out of Existence » dans le livre de John Ousterhout

  • J’apprécie l’ironie de voir la section commentaires principalement remplie de gens qui n’ont pas compris le message. L’idée centrale de Leslie Lamport est que développer la capacité de pensée abstraite mène à de meilleurs programmes. L’abstraction, au sens mathématique et logique, permet d’éliminer tous les détails non pertinents. Il en va de même pour le développement logiciel guidé par l’IA

  • Comme on peut s’y attendre dès qu’il est question de rigueur, beaucoup ont lu seulement le titre et ont réagi négativement. Sur Hacker News, un hacker peut être un programmeur compétent capable de résoudre des problèmes. Aujourd’hui, cela peut aussi vouloir dire « You’re a Hack », c’est-à-dire quelqu’un d’incompétent qui produit des résultats de mauvaise qualité

  • Cette conférence et cette discussion sont excessivement pointilleuses

  • Il y a actuellement un bon article dans l’ACM qui explique qu’on n’est pas d’accord sur ce qu’est l’abstraction, mais qu’elle reste malgré tout très utile. Je suis globalement d’accord sur l’endroit où se situe l’essentiel. Je ne suis pas d’accord sur ce que c’est exactement ni sur pourquoi c’est important. On peut en tirer beaucoup d’inspiration, ce qui a en soi de la valeur

  • Le hacking n’est pas du codage, ni de la programmation, ni du développement logiciel, ni de l’ingénierie logicielle. Mais au final, beaucoup de gens utilisent ces termes presque de manière interchangeable, et souligner les différences entre ses définitions personnelles n’est presque jamais un usage productif de son temps