Эволюция пишет код без ревью, тестов и откатов

Эволюция пишет код без ревью, тестов и откатов

В 1799 году в Лондон привезли шкурку зверя, которого не могло быть. Клюв как у утки, хвост как у бобра, лапы с перепонками. Учёный по фамилии Шоу взял ножницы и стал искать швы: он был уверен, что какой-то шутник пришил утиный клюв к телу выдры и продал доверчивым британцам. Следы от ножниц на той шкурке видны до сих пор. Швов не нашли. Утконос настоящий.

Я разработчик и всё чаще думаю, что эволюция тоже разработчик, только особого сорта. Самурай: без ревью, без тестов, без возможности откатить релиз. У неё нет цели, есть только путь. Она не задумывала утконоса и не шла к нему, как не идёт к вам понедельник. Она вносит случайные правки, а отбор составляют те, которые не убили носителя до того, как он размножился. Это А/Б тест на боевом сервере, где проигравший вариант не откатывают, а хоронят. Она не может остановить сервис на техобслуживание, потому что все, у кого сервис останавливался, потомства не оставили. Она почти никогда не удаляет код, ей проще отключить. И обратную совместимость она держит намертво: у зародыша любого млекопитающего, от мыши до жирафа, до сих пор исправно закладываются жаберные дуги, из которых потом получаются челюсть, косточки среднего уха и гортань. Модуль переиспользовали, а название осталось от рыбы, которой все мы были четыреста миллионов лет назад.

Возьмём для разогрева не утконоса, а жирафа и парад легаси. От мозга к гортани у него расстояние примерно с ладонь. А нерв, который туда идёт, спускается по шее вниз, в грудную клетку, огибает крупный сосуд возле сердца и возвращается обратно наверх. Получается крюк метра в четыре ради пятнадцати сантиметров. У рыбы этот нерв шёл почти прямо, мимо жаберной дуги, всё было аккуратно, как первоначальный код продукта. Потом начали вносить правки и выкатывать обновления: шея у потомков становилась длиннее, сосуд оставался на месте, а заявку на рефакторинг никто не подал. Если спросить эволюцию зачем, она ответит как советская тётушка: потому что.

Жираф такой не один. Зубов у усатого кита нет, он цедит воду через ус. Но у зародыша зубы закладываются и рассасываются ещё до рождения: код компилируется и вырезается при сборке, у каждого кита, каждый раз. А ещё у кита остались тазовые кости, маленькие и никуда не ведущие, ног-то давно нет. Их долго считали мусором, пока не выяснили, что на них держатся мышцы, без которых кит не размножится. Классика: удаляешь модуль, который двадцать лет никто не вызывал, и оказывается, что на нём держится самое важное. Большая панда по устройству хищник: зубы, кишечник и ферменты у неё под мясо. А ест она почти один бамбук. Переписывать систему под новую нагрузку эволюция не стала: панда усваивает меньше пятой части съеденного и просто ест до четырнадцати часов в сутки. Не оптимизировали, а докупили серверов. Чтобы держать стебель, из косточки запястья вырос ложный шестой палец. Не рука, а костыль, но держит.

Мальки камбалы плавают как нормальные рыбы, с глазами по бокам. Потом начинается переезд: один глаз проползает через макушку на другую сторону головы, и рыба ложится на дно боком. Миграция интерфейса на живом пользователе, без даунтайма и без предупреждения. Работает, но лицо у камбалы с тех пор такое, будто она видела, как это делали. Но сегодня наша звезда утконос, и он совсем не сборная солянка, а ранний форк. Его ветка отделилась от общего репозитория млекопитающих больше ста шестидесяти миллионов лет назад, и с тех пор каждый удалял своё. Мы удалили яйца, он оставил. Он удалил желудок, мы оставили. Яйца он у утки не крал: они были у всех наших общих предков, это мы от них потом отказались.

Молоко у него есть, а сосков нет: фичу сделали раньше, чем появился стандартный интерфейс. Молоко выступает прямо на коже брюха, и детёныши слизывают его с шерсти. Данные API отдаёт, а забирать их приходится самим, как получится. Зато за соски бороться не надо, искать их вслепую не надо, удобненько. Клюв у него мягкий и кожистый, и это вообще не клюв, а орган чувств. Под водой утконос закрывает глаза, уши и ноздри и дальше живёт на одной телеметрии: около сорока тысяч электродатчиков в клюве ловят, как в иле дёргается мышца рачка. Он не смотрит на интерфейс, он слушает метрики. В мутной воде интерфейс всё равно врёт.

Желудка у него нет. Не маленький, не упрощённый, а просто нет: пищевод переходит почти сразу в кишечник. Гены желудочных ферментов не отключены, а стёрты, и это тот редкий случай, когда эволюция действительно удалила код. Вернуть желудок утконос уже не сможет, исходников нет. Только если выстроит его заново. С зубами та же история: у детёныша они есть, у взрослого выпадают, и дальше он перетирает еду роговыми пластинами. Бета-версия с зубами, релиз без.

Половых хромосом у самца десять, пять X и пять Y. У нас две. При делении клетки они выстраиваются цепочкой и расходятся строем: вместо одного флага пять связанных, которые переключаются только вместе. Зачем десять, эволюция снова не объясняет. А самое смешное: часть генов на этих хромосомах совпадает не с нашими половыми хромосомами, а с птичьими. Так что утиное в утконосе всё-таки есть. Шоу искал его ножницами не там, смотреть надо было в хромосомах.

А ещё у самцов есть шпора на задней лапе, в ней яд. Собран он из генов иммунитета, тех, что убивают бактерий: их скопировали, чуть переписали и сделали оружием. У некоторых змей тот же трюк, но сделан отдельно и независимо: два разработчика не знали друг о друге и написали одинаковый костыль. Включается яд по расписанию, в полную силу в брачный сезон, и целится не в хищников, а в других самцов. Это не защита от внешних угроз, а драка своих же сервисов за один ресурс. Человека он не убивает, но боль такая, что морфин почти не берёт. И пасхалка напоследок. В 2020 году выяснили, что под ультрафиолетом мех утконоса светится сине-зелёным. Зачем, не знает никто. Фича двести лет была в проде, и никто не догадался посветить на неё лампочкой.

Итого мы имеем зверя, который потеет молоком и дерётся ядом. И это не ошибка природы, а работающий в проде сервис со стошестидесятимиллионным аптаймом и документацией, которую двести лет никто не открывал. И последний зверь на сегодня, для порядка. Тело краба природа изобретала заново как минимум пять раз, из разных раков, никак между собой не связанных. У биологов для этого даже есть слово: карцинизация. Как с корпоративными системами: с чего бы ни начинался проект, через несколько лет он всё равно превращается в CRM. Или в Excel. Эволюция пишет краба снова и снова, потому что иначе не умеет. При чём тут ИИ. У меня был знакомый, который учил Java и объяснял это просто: с этим языком он чувствует себя богом. Сейчас язык знать не обязательно, и почувствовать себя богом может кто угодно, у кого есть окно с чатом и оплаченные токены или подписка.

У эволюции выбора не было: она не умела читать свой вывод, не умела откатывать и не могла остановить систему на пару часов. Отсюда крюк в четыре метра, стёртый без возврата желудок и панда, которая полдня жуёт бамбук. А у разрабов выбор есть, даже у тех, кто ничего не понимает, но жаждет вайбкодить. Сам ИИ ничего не хочет и ничего не решает, он инструмент, а решения принимает человек: что просить, что оставить, что выбросить, как проверить. Просьба «сделай мне что-нибудь такое, мне нравятся утки и бобры» будет выполнена буквально и очень старательно. Поэтому правила скучные, как все хорошие правила: - Читать, что за вас написала ИИ, целиком, а не по диагонали. - Если что-то непонятно, переспрашивать до полного понимания плюсов и минусов решения. - Гонять проверки до выкладки, а не после. - Сделанным считать только то, что доказано, а не то, что по ощущениям должно работать. И моё любимое: молчание — это не «всё в порядке», а «никто не посмотрел».

Иначе однажды в проде окажется нечто, что потеет молоком и бьёт ядовитой шпорой, и удалить его будет уже нельзя. Потому что оно уже часть системы и ну хоть как-то вроде бы работает.

22