Výzkum

Odvaha jít tam, kam nikdo nešel

Každá linie směřuje k artefaktu, který si kdokoli stáhne, spustí a změří; u většiny už dnes existuje, u experimentálních je to zatím cíl. Společné pravidlo je jediné: tvrzení bez měření není výsledek, jen slib. A rozdíl mezi domněnkou a výsledkem bývá přesně ten krok, který se vynechat nedá.

Systémový kód v Go

C samo kdysi nahradilo assembler. Dnes existuje celá doména softwaru, kterou nikdo nezpochybní jen proto, že v ní C sedí už padesát let.

Jádrové síťové protokoly, numerika, jazykové toolchainy: padesát let se to píše v C a dnes to už nikdo nebere jako rozhodnutí, ale jako stav přírody. Hypotéza zní, že rozhodnout jde i jinak. Čistý Go s moderním runtime a standardní knihovnou má v těchto doménách podat stejnou spolehlivost, bez cgo, bez balíku závislostí a bez třetiny chyb, které přicházejí z ruční správy paměti.

Důkazů už je několik. NFS je server i klient NFSv4.2, tedy protokol, který linuxové jádro implementuje v C, postavený v čistém Go jen se standardní knihovnou a ověřený proti tomu jádru. Tensor dává Go numeriku, kterou dosud psal svět Fortranu a C, bez jediného řádku cgo. A GAsm SDK nahrazuje C toolchain přesně tam, kde se vývojář setkává s assemblerem.

NFSv4.2 v čistém Go, který si rozumí s linuxovým jádrem; numerika bez jediného řádku C.

NFS · Tensor · GAsm SDK

Deterministické a distribuované výpočty

Stejný vstup dá totéž číslo na každém stroji. Zní to jako samozřejmost a v numerice to samozřejmost není.

Výpočet, který se chová na dvou strojích jinak, kazí vědu: laboratoř nedokáže říct, který výsledek je správný, a o reprodukovatelnost přichází. Determinismus proto u mě není vlastnost na přání: je to smlouva, psaná v dokumentaci a testovaná napříč platformami.

To je ale jen první krok. Cílem je výpočet rozdělený na více strojů, který zůstane reprodukovatelný i po rozdělení, takže každý uzel dojde k témuž výsledku. Bez deterministického jádra z toho není výpočetní model, ale loterie.

Dnes determinismus napříč platformami drží Tensor, bez cgo. Dál: deterministické rozdělení výpočtu mezi stroje.

Víc o projektu Tensor

Přenositelný Plan 9 assembler

Oddělit assembler od Go toolchainu a udělat z něj samostatný, přenositelný nástroj.

Plan 9 assembler je uvězněný uvnitř Go toolchainu: nedá se spustit bez celého toolchainu, nemá formátovač, linter ani debugger a o kódu vloženém do runtime se člověk často dozvídá až z pádu. Přitom je to podlaha, na které stojí každý běžící Go program.

Tato linie ho odděluje. Výsledkem je GAsm SDK: lexer, parser, formátovač, linter, standalone assembler, disassembler, debugger a jazykový server v jednom self-contained binárním souboru, čistě v Go, bez externích toolchain. Přenositelnost se tady nedeklaruje: přesnost parseru i formátovače ověřuje diferenciální test proti samotnému Go toolchainu na čtyřech architekturách a dvě nezávislé implementace musí na stejném vstupu souhlasit bit po bitu.

Bit po bitu stejný výstup jako Go toolchain na amd64, arm64, riscv64 i loong64, v jednom binárním souboru.

Víc o projektu GAsm SDK

Web bez závislostí

Webový vývoj se naučil stavět přes toolchain: bundler, transpiler, stovky balíků. Hypotéza: platforma dnes stačí sama.

Moderní web se skoro nikdy nepíše v HTML, CSS a JavaScriptu; píše se v něčem, co se na něj přeloží pomocí stovky závislostí. Hypotéza této linie zní, že platforma mezitím dospěla tak daleko, že pro drtivou většinu webů celý ten stroj není potřeba: popover bez JavaScriptu, dva barevné režimy bez duplikace CSS, nativní validace formulářů, formátování dat přes Intl.

Co z toho vzešlo: JSbox, vlastní toolchain v jednom binárním souboru. Server s live reloadem, formátovač HTML, CSS i JavaScriptu přes skutečné parsování, statický check a testy v reálném prohlížeči. Žádný Node, žádný npm, žádný build. Dokladem je tento web: dvě jazykové verze, dva barevné režimy, formulář s vlastním backendem a nula závislostí.

Důkazem je tento web sám: nula závislostí, nula buildu.

Víc o projektu JSbox

Metoda, podle které pracuji

Všechny linie běží ve stejném cyklu a všechny v jedné tradici: teoretik u téhož stroje jako provozovatel, papír vznikající ze systému, nikoli naopak. Základem je dialektický materialismus: materiál má vždy pravdu a rozpor je místo, kde návrh začíná.

Cyklus práce

  1. Hypotéza

    Návrh se zapíše tak, aby se dal vyvrátit: co má platit, za jakých podmínek a co by ho popřelo. Návrh, který se nedá vyvrátit, není návrh, ale přání.

  2. Měření

    Benchmark, test, protokol. K číslu patří i postup, jak k němu dojít, a ten musí zvládnout zopakovat kdokoli, nejen jeho autor.

  3. Revize

    Řešení platí, dokud drží. Přijde lepší, a staré jde pryč bez sentimentu; loajalita k vlastnímu dřívějšímu rozhodnutí není argument.

Čtyři pravidla

Měřím, neodhaduji

Čísla, která tu uvádím, mají vždy za sebou konkrétní sadu: celý toml-test, diferenciální test proti Go toolchainu, interoperabilita s linuxovým jádrem. Tvrzení bez měření raději nenapíšu.

Standardní knihovna jako základ

Většina mých go.mod souborů nemá v require ani řádek a provozní skripty v Perlu berou jen to, co umí samotný interpret. Závislost, která se přece jen objeví, musí své místo obhájit číslem.

Kód je artefakt

Repozitář bez dokumentace a testů beru jako rozepsaný, ne hotový. Dokumentace, testy i naměřená čísla patří do stejné změny jako kód, který popisují; artefakt, který se za deset let nedá přečíst, je dluh.

Zastaralé odchází

Když JSbox dostal vlastní sitegen, původní generátor tohoto webu v Go jsem smazal celý, přestože fungoval. Udržovat dvě řešení téhož úkolu je horší než jedno přepsat; lepší řešení ruší to staré.

Týká se některá linie problému, který řešíte?

Když ano, napište mi. Rád si na něj posvítím z obou stran: z výzkumu i z produkce.

Napsat mi