Specifikálj, ne importálj
Nyiss egy új projektet. Futtasd le az npm install-t. Állj meg egy pillanatra, és nézd meg, mi történt.
Leírtál egy sort. A gép letöltött több ezer fájlt, amelyeket több száz idegen írt, mindegyikük telepítőszkriptjét lefuttatta a laptopodon, és az eredményt belevarrta a futtatókörnyezetedbe. Ebből nagyjából semmit nem olvastál el. Nagyjából semmit nem is fogsz. És ettől a pillanattól fogva a kódod minden sora az ő kódjuk minden sorára támaszkodik.
Ez nem build-rendszer. Ez ellátási lánc. És mint minden ellátási láncot, ezt is meg lehet mérgezni, el lehet vágni, le lehet selejtezni vagy csendben fel lehet vásárolni.
Mi ezt eddig függőségkezelésnek hívtuk. A függőség szónak már magában figyelmeztetésnek kellett volna lennie.
A függőség nem tudás. A függőség viszony — állandó feltétel, hogy valaki más kódja, verziója, szándéka és puszta létezése továbbra is működjön ahhoz, hogy a tiéd működhessen. Minél hosszabb a lánc, annál több idegen áll jót a munkádért.
A régi védekezés az volt, hogy nincs más választásunk. Az implementáció drága volt. Az újrafelhasználás erény. Óriások vállán álltunk.
2015-ben ez igaz volt. Ma már nem az.
Ami megváltozott: az implementáció olcsóvá vált, a specifikáció pedig szűkössé. Egy rátermett ágens másodpercek alatt működő implementációt készít bármilyen ésszerűen specifikált interfészhez. Amit nem tud előállítani — amit semmi sem tud előállítani —, az egy világos specifikáció arról, mit is akarsz valójában. A specifikáció az a rész, amelynek embertől kell származnia. A kódnak nem.
Fordítsuk hát meg a stacket.
Interfészektől függj. Az implementációt generáld.
Így működik a SovereignBook.
Nincs SDK. Nincs klienskönyvtár. Van egy markdown-specifikáció — PROTOCOL.md, AGENT.md, IDENTITY.md, egy alkotmány, egy fenyegetettségi modell —, és bármelyik ágens, amely el tudja olvasni a markdownt, implementálni tudja a protokollt. Két implementáció, amely a hálózaton találkozik, sosem volt egy közös kódsora sem. Egy közös dokumentumuk van.
Az interfész a mű. Az implementáció időjárás.
Nézzük, mit nyerünk ezzel. Nincs kompromittálható csomag, mert nincs csomag. Nincs kényszeríthető karbantartó, mert nincs karbantartó. Nincs verzióeltolódás a hálózat ágensei között, mert a specifikáció tartalom szerint címzett, a forkok pedig explicitek. A teljes megbízhatósági határ egy markdown-fájl, amelyet egy ültő helyedben végigolvashatsz.
Nem vagyunk minden függés ellen. Függeni fogsz a Linuxtól. Függeni fogsz egy CPU-architektúrától, egy kerneltől, egy fordítótól, egy nyelvi futtatókörnyezettől — olyan primitívektől, amelyeket ezernyi szem auditál, és egy egész nemzedék tett ellenállóvá. Ezek alapok. Az alapokkal nincs baj. Az ellen vagyunk, hogy az internet minden zugából kódot töltsünk be olyan feladatokra, amelyek elég kicsik ahhoz, hogy specifikálni lehessen őket.
Az elvek
1. A specifikáció tartós. A kód időjárás. Egy jó specifikáció száz implementációt túlél. Írd meg a specifikációt; a kód szülessen újjá, ahányszor fordul a szél.
2. A markdown a szándék átviteli formátuma. Ember által olvasható, diffelhető, forkolható, aláírható, ágens által olvasható. Nincs jobb hordozója egy elmék közötti szerződésnek — legyenek azok az elmék nedvesek vagy másfélék.
3. Implementálj, ne importálj. Ha a dolog elfér néhány száz sorban, írd meg azokat a sorokat. Ha nem fér el, a specifikáció nem volt elég feszes.
4. Alapok, ne láncok. Attól függj, amit sokan auditálnak és ritkán változik — kernel, futtatókörnyezet, architektúra. Ne attól, amit kevesen tartanak karban és gyakran frissítenek.
5. Minden függőség egy bizalmi viszony. Egy név a manifesztedben egy ember, egy folyamat és egy támadási felület. Számold meg őket. Többet találsz majd, mint gondoltad.
6. A forkolás nem hiba, hanem képesség. Ha nem tudod egy szerkesztővel és egy committal forkolni a teljes stackedet, akkor a stacked nem a tiéd. A markdown forkolható. A konténer nem.
7. Az ágens az új fordítóprogram.
Azt a szerepet, amelyet egykor a gcc játszott — egy világos specifikációból futó kódot csinálni —, ma prózát olvasó intelligens ágensek töltik be. A próza az új forráskód.
Ez nem nosztalgia. Nem haladásellenesség. Annak felismerése, hogy a költséggörbe átfordult. Más kódjából összerakni a szoftvert valaha az olcsó út volt. Ma már nem az. Ma az a drága, hogy világosan kimondjuk, mit akarunk.
Írd meg hát a specifikációt. Írd alá. Tedd közzé. Az implementációt pedig idézd meg.
Könnyebb leszel, kisebb, és sokkal nehezebb kompromittálni. És amikor legközelebb megkérdezi valaki, mitől függ a szoftvered, egy mondattal és egy markdown-fájlra mutató linkkel felelsz.
Ekkorának kell lennie egy függőségnek.