dimhold.by
← Артыкулы

Simple Made Easy на маіх уласных дыфах: 85% выкінутага кода пайшло адным камітам

14 жніўня 2026 года я выняў дашборд з гэтай машыны. Каміт здымае 3748 радкоў. 3581 з іх гэта 10 файлаў, выдаленых цалкам, плюс база SQLite. Першыя з гэтых файлаў машына напісала за 2 дні і 22 гадзіны да гэтага каміта. Прычына стаіць у целе каміта. Яна пра пасылку: гэта была чарга картак з кнопкамі “ухваліць” і “адхіліць”, зробленая так, быццам я абслугоўваю чаргу, тым часам як кожнае сапраўднае рашэнне тут прымаецца ў размове.

Я назваў гэта адным няўдалым рашэннем і пайшоў далей. Але я так і не палічыў, колькі ўсяго астатняга пайшло тым жа шляхам. Рабочае дапушчэнне ў мяне было такое: большую частку таго, што піша гэтая машына, я пакідаю.

Рыч Хікі ператварае гэтае дапушчэнне ў тое, што можна памерыць. Simple Made Easy, Strange Loop, верасень 2011 года. Прыкладна на гадзіне ён кажа: “It’s the artifacts. It’s not the authoring.” Паводле яго версіі цана складанасці кладзецца на таго, каму гэтую рэч потым мяняць. Каля 18-й хвіліны ён кажа, як гэта выглядае па календары. Калі гнацца за лёгкасцю і не думаць пра прастату, здараецца вось што. “Most sprints be about completely redoing things you’ve already done.”

Адказ, які мне паўтараюць у 2026 годзе: набор стаў бясплатным, значыць спрэчка закрытая. Гэты рэпазіторый падыходзіць, каб такое праверыць. Я яго не набіраў. Яго набраў агент, які працуе ў гэтым каталогу, за 508 камітаў з 11 жніўня па 2 верасня, што трапілі на 21 асобны дзень. Усё, што палічана ніжэй, узятае на каміце aaaf1c5, апошнім перад пачаткам работы, на git 2.43.0.

Спачатку аб’ём

Адзіны мой рэпазіторый, дзе ёсць абедзве эпохі, гэта сайт. Я пачаў яго рукамі ў 2014 годзе, а Jekyll падклаў пад яго ў 2019. Машына перапісала яго на Astro ў 2026. Гэта git log --numstat --no-renames па зыходных пашырэннях, без файлаў блакіроўкі залежнасцей і без кантэнту, падзеленае на дні, у якія быў каміт.

камітаўдзёнрадкоў кодаз іх сваіху рабочы дзень
dimhold.by рукамі, 2014-2019157115946466
dimhold.by машынай, 2026511023747237472375
гэтая машына, 20265082136542365421740

Першаму радку спатрэбілася лішняя калонка. 695 радкоў з яго 1159 гэта github-markdown.css, чужы стылявы файл, які я паклаў у рэпазіторый цалкам. Сваімі рукамі там набрана 464 радкі за 7 дзён. Супраць 2375 гэта 36x. Найбуйнейшыя файлы машынных радкоў я праверыў на тое ж самае, чужога ў іх няма. А тыя 7 дзён гэта вечары хобі на стэку, якога больш няма, таму 36x чытаецца як парадак велічыні.

Колькі з гэтага яшчэ тут

Велічыня, якой датычыцца сцвярджэнне Хікі, гэта выжывальнасць. Па кожным файле я склаў радкі, якія git запісаў як дададзеныя, а потым паставіў побач тое, што стаіць на прышпіленым каміце. Пад src, scripts і public выходзіць 31.7% тых, што выжылі. У CLAUDE.md, TICK.md і промптаў 25.7%. Гэта не той набор шляхоў, які лічыць табліца эпох.

Праўда, падрадковы лік для прозы дрэнная думка. Гэтыя файлы пераносяцца па 80 калонак, таму праўка ўсярэдзіне абзаца перапісвае ўвесь яго астатак, а кожны перанесены радок ідзе ў залік як новы. Разрыў тлумачыцца гэтым не цалкам: src/lib/tells.ts гэта код, а ў яго ўсё роўна 47.3% па радках супраць 88.5% па словах. Я перайшоў на словы, знятыя праз git show --word-diff=porcelain па кожным каміце.

У лічыльніку, які я для гэтага напісаў, была памылка. Ён рэзаў кожны зменены кавалак па прабелах і лічыў пустое першае поле за слова, што раздзімала ўсё на 13%. У калонцы кода стаяла 42202 дададзеныя словы, а правільны лік 37224. Знайшоў я гэта толькі таму, што дададзенае мінус выдаленае абавязана сыходзіцца з тым, што паказвае wc. Яно не сыходзілася. На шляхах кода цяпер разыходзіцца на 3 словы. На шляхах правілаў усё яшчэ на 634 словы, гэта каля 3.5%. Чаму так, я не высветліў.

дададзена слоўвыдалена слоўна тым каміцедажыло
код37224213821584542.6%
правілы і промпты2468060281801873.0%

57.4% кода, які гэтая машына напісала за 3 тыдні, больш няма. На гэтым ліку фраза Хікі пра перарабленне ўжо зробленага выглядае правільнай.

Толькі форма не тая, што патрэбна яго гісторыі. 18171 слова з 21382 выкінутых пайшло адным камітам, тым самым ад 14 жніўня. Гэта 85.0%. Астатнія 62 каміты, якія кранаюць код, выкінулі разам 3211 слоў.

37224 словы кода, набраныя за 3 тыдні 15845 яшчэ тут 21382 выкінута 18171 3211 адзін каміт, 14 жніўня 2026 усе астатнія каміты
Усе словы кода, дададзеныя ў гэтую машыну, паводле таго, чым яны скончыліся. Ніжняя паласа павялічвае выкінутую частку. Яе левы блок гэта адзін каміт 14 жніўня, 18171 слова. Правы гэта ўсе астатнія каміты, якія калі-небудзь кранулі код, 3211 слоў на 62 каміты.

Спляценне было паміж файламі

Тады я вярнуўся да таго каміта з вызначэннем самога Хікі. Complect значыць сплятаць. Git запісвае толькі тое, што мянялася. Ці абавязана яно было, там не напісана, таму самае блізкае, што ў мяне ёсць, гэта частата. Па кожным файле бяру каміты, якія яго кранаюць, а потым гляджу, як часта побач з ім едзе кожны іншы файл. Партнёрам я лічыў файл ад 50% і вышэй. Яшчэ я выкінуў 11 камітаў, якія кранаюць больш за 20 файлаў, бо праход па ўсім дрэве звязвае ўсё з усім.

Файлаў пад src, scripts і public з 5 камітамі і больш роўна 10. Першыя 5 па шырыні спляцення гэта тыя самыя 5, што зняў той каміт. public/app.js рухаўся разам з public/styles.css у 93% сваіх камітаў і разам з src/server.ts у 79%. У src/lib/funnel.ts 6 партнёраў.

З тымі, што выжылі, не ўсё чыста. У src/lib/refine.ts 4 партнёры, на адзін менш, чым у public/app.js. Камітаў у яго ўсяго 6, таму партнёр на 50% гэта 3 супадзенні. Адзін з 4 партнёраў сам з дашборда. У src/lib/tells.ts роўна адзін партнёр. У астатніх 3, што выжылі, ніводнага.

Усярэдзіне файлаў нічога адмысловага не было. Я памерыў тое ж дрэва акурат перад выдаленнем і на прышпіленым каміце. Разгалінаванняў на 100 радкоў стала 21.9 замест 25.6. Імпартаў на файл 2.1 замест 3.3, глыбіня ўкладзенасці 7 замест 8. У Хікі для гэтага ёсць радок. “You can write modular software with all kinds of interconnections between them. They may not call each other, but they’re completely complected.”

Я збіраўся напісаць, што менавіта спляценне перашкодзіла падрэзаць дашборд. Гісторыя гэтага не пацвярджае. Да зносу з тых файлаў знялі 601 радок, значыць часткі здымаліся. Трымаецца вузейшае сцвярджэнне: ніводзін каміт не зрабіў набор меншым і ніводзін файл з яго не прыбіралі паасобку. Калі ён пайшоў, ён пайшоў як 10 файлаў у адным дыфе. На замену прыйшлі 252 радкі src/lib/files.ts, каб трымаць стан.

файл мяняецца разам з на head funnel.ts 6 выдалены 14 жн app.js 5 выдалены 14 жн styles.css 5 выдалены 14 жн index.html 5 выдалены 14 жн server.ts 5 выдалены 14 жн refine.ts 4 на месцы tells.ts 1 на месцы backfill-loop.sh 0 на месцы critique.ts 0 на месцы llm.ts 0 на месцы
Тыя 10 файлаў з src, scripts і public, у якіх не менш за 5 камітаў, паводле ліку іншых файлаў, што прыязджаюць разам з імі не радзей чым у палове камітаў. Першыя 5 гэта тыя самыя 5, што пайшлі 14 жніўня. Самы сплецены з тых, хто выжыў, гэта refine.ts з 4 партнёрамі на 6 камітах. Адзін з яго 4 партнёраў сам з дашборда.

Спляценне, якое засталося

Механічныя праверкі тэксту жывуць у кодзе, у src/lib/tells.ts. Тыя ж правілы жывуць словамі ў інструкцыі і ў промптах. З 19 праверак 6 названыя ў інструкцыі сваім ідэнтыфікатарам. Усе 6 прыйшлі з правілаў, якія мне прадыктавалі рукамі. Кожная трапіла ў код і ў інструкцыю адным і тым жа камітам. tells.ts мяняўся 13 разоў, CLAUDE.md ехаў побач у 8 выпадках, гэта 62%. У адваротны бок: CLAUDE.md мяняўся 67 разоў, tells.ts ехаў побач 8 разоў, гэта 12%.

Грэп па ідэнтыфікатары гэта адзіны механічны лік, які ў мяне ёсць. Недалічвае ён моцна. Правіла працяжніка выпісана словамі ў 5 дакументах апрача кода. Правіла пра engagement bait у 3. Пераказ правіла прозай не паведамляе, што ў яго ёсць блізнюк, так што наколькі шырока гэта ідзе, я сказаць не магу.

Я збіраўся напісаць, што гэтае спляценне не каштуе нічога, бо абодва канцы трымае адзін аўтар і піша іх адным рухам. Потым я прагнаў пробы праз праверку, каб убачыць, ці кажуць гэтыя 6 пар дагэтуль адно і тое ж. Разышліся 2. Першае пра двукоссі. Інструкцыя абяцае, што ў любым тэксце на любой мове двукоссі толькі прамыя, а праверка шукае адны ялінкі, таму англійскія двукоссі праходзяць наскрозь. Другое пра парад лікаў: інструкцыя апісвае шэраг з 3 пар лік плюс слова, а рэгулярка патрабуе паміж імі косак. Радок 1 tool 2 models 100 calls не ловіцца ўвогуле. Я ганяю гэтую праверку па кожным чарнавіку з 26 жніўня. Увесь гэты час яна прапускала англійскія двукоссі.

Чаго я не правяраў

Ці хапае 3 тыдняў, каб убачыць эфект, пра які кажа Хікі: ён пра гады. Ці гадзяцца 7 вечароў 2019 года як база параўнання ўвогуле. Карэляцыю паміж шырынёй спляцення і перарабленнем я палічыў, а потым выкінуў: жывых файлаў кода з дастатковым лікам камітаў усяго 5. І лічыльнік слоў прымае перайменаваную зменную за перарабленне. Яно трапляе ў назоўнік, таму кожны лік выжывальнасці тут заніжаны.

Звычка, з якой я пачынаў: згенераваны код танна напісаць, значыць і ставіцца да яго беражліва няма чаго. Змяніў яе адзін лік: 85.0%. Амаль увесь код, які гэты рэпазіторый выкінуў, пайшоў на адно рашэнне пра пасылку. Прынятае яно было ў размове. Хікі на 49-й хвіліне ставіць слайд з Дэйкстрам і чытае яго так: праграмаванне гэта пра мысленне. Ніводзін мой лік не кажа, у што абышлася тая размова. А гэта якраз тая велічыня, якую хацелася б ведаць. Спосабу дастаць яе з рэпазіторыя я не знайшоў.