№ —La tensionThe tension1 min
Refuser de demander le type — et payer ce refus à un seul endroit.Refusing to ask the type — and paying for that refusal in one place.
Ce frontispice n'enseigne pas un mécanisme : il dit le fil qui relie les trois numéros du volume. Là où un langage statique demande « quel type es-tu ? » et le prouve à la compilation, Ruby refuse la question et fait confiance au message. Cette confiance achète la souplesse et la testabilité ; elle se paie en une garantie perdue — l'erreur glisse à l'exécution, le NoMethodError tardif. Tout le volume est une seule discipline qui se déplie : on adopte la confiance, on voit ce qu'elle suppose en silence, puis on en nomme le prix pour le borner.This frontispiece teaches no mechanism: it states the thread linking the volume's three issues. Where a static language asks 'what type are you?' and proves it at compile time, Ruby refuses the question and trusts the message. That trust buys flexibility and testability; it costs a lost guarantee — the error slips to runtime, the late NoMethodError. The whole volume is one discipline unfolding: you adopt trust, see what it silently assumes, then name its price to bound it.
Le réflexe du volume : je ne demande pas quel type tu es — je demande si tu réponds à ce message.The volume's reflex: I don't ask what type you are — I ask whether you answer this message.
№ —Le filThe thread1 min
Une seule discipline en trois temps : confiance → présupposés → prix.One discipline in three beats: trust → assumptions → price.
Les trois numéros ne sont pas trois sujets : c'est une discipline qui se déplie. Le № 1 pose la confiance — réponds au message, peu importe ta classe : c'est la liberté. Le № 2 révèle ce que cette confiance suppose en silence : des contrats tacites — to_s, <=>, each, to_proc — les « interfaces » que Ruby attend sans les nommer ; les connaître, c'est honorer la confiance. Le № 3 en nomme le prix : l'erreur tardive, loin de sa cause — et la parade n'est pas de tout vérifier mais de regagner une garantie à la frontière. La confiance est le défaut ; la vérification, une exception qu'on place avec soin.The three issues aren't three subjects: they're a discipline unfolding. № 1 lays down trust — answer the message, whatever your class: that's the freedom. № 2 reveals what that trust silently assumes: tacit contracts — to_s, <=>, each, to_proc — the 'interfaces' Ruby expects without naming them; knowing them honors the trust. № 3 names its price: the late error, far from its cause — and the remedy isn't checking everything but regaining a guarantee at the boundary. Trust is the default; checking is an exception placed with care.
La confiance, et où la bornerTrust, and where to bound it
№ 1
ConfianceTrust
réponds-tu au message ?do you answer the message?
la libertéthe freedom
→
№ 2
PrésupposésAssumptions
to_s, <=>, each…to_s, <=>, each…
les contrats tacitesthe tacit contracts
→
№ 3
Prix & paradePrice & remedy
l'erreur tardivethe late error
regagnée à la frontièreregained at the boundary
On ne renforce pas la confiance en la doublant partout : on la borne à un seul endroit, là où la donnée externe entre. Confiance par défaut, vérification à la frontière.You don't strengthen trust by doubling it everywhere: you bound it in one place, where external data enters. Trust by default, checking at the boundary.
№ —Les numéros du volumeThe volume's issues1 min
Réponds, nomme le contrat, borne le prix — et le contre-exemple à chaque fois.Answer, name the contract, bound the price — and the counter-example each time.
| № | Le mécanismeThe mechanism | Ce qu'il installeWhat it installs |
|---|
| 1 | Le duck typing — la confianceDuck typing — the trust | Le polymorphisme sans interface : code contre un protocole, pas contre une classe. Ne teste pas le type, envoie le message.Polymorphism without interfaces: code against a protocol, not a class. Don't test the type, send the message. |
| 2 | Les protocoles implicites — les présupposésImplicit protocols — the assumptions | Les « interfaces » tacites que la confiance suppose : to_s, <=>+Comparable, each+Enumerable, coercition.The tacit 'interfaces' trust assumes: to_s, <=>+Comparable, each+Enumerable, coercion. |
| 3 | Quand le canard trahit — le prixWhen the duck betrays — the price | L'erreur tardive, et où regagner une garantie : au runtime (dry-struct) ou à l'analyse (Steep/RBS) — à la frontière, jamais partout.The late error, and where to regain a guarantee: at runtime (dry-struct) or at analysis (Steep/RBS) — at the boundary, never everywhere. |
Le duck typing n'a pas de filet — alors tends-en un là où la donnée entre, et nulle part ailleurs.Duck typing has no net — so stretch one where the data enters, and nowhere else.