Мы используем файлы cookie, чтобы сайт работал и становился удобнее. Продолжая пользоваться «Думайте», вы соглашаетесь с Политикой конфиденциальности.

Показать все результаты

Ничего не найдено

Доступна новая версия приложения

Версия

Скачать

Код стал мусором

1 нед. назад источник
179 19 9 мин

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

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

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

Лёд, который никто больше не пилит

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

С кодом уже случалось подобное, только помельче. Когда появились компиляторы, ассемблерный листинг превратился из ремесленного изделия в промежуточный продукт — то, что существует между намерением и результатом, но само по себе никого не интересует. Никто сегодня не хранит ассемблерный вывод компилятора в архиве, не проводит по нему код-ревью и не считает его интеллектуальной собственностью. Он генерируется заново каждую сборку, и это никого не тревожит.

Здесь важно не спутать дорогое с ценным. Лёд был дорогим, потому что его добыча требовала труда, а не потому, что в нём было что-то незаменимое. Ровно так же строка кода была дорогой из-за стоимости её производства. Уберите стоимость производства — и цена схлопнется, обнажив вопрос, который раньше был закрыт этой ценой: а что, собственно, мы хотели получить?

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

Что на самом деле лежит в вашем репозитории

Откройте любой зрелый проект и посмотрите честно, что там хранится. Там лежит не капитал, а окаменевшая последовательность решений, половину из которых уже никто не может объяснить. Там лежат обходные пути вокруг ошибок в библиотеках, которые давно исправлены. Там лежат допущения о бизнес-процессе, отменённом три реорганизации назад, и три несовместимых способа делать одно и то же, потому что каждый писал свой.

Индустрия придумала для этого честное слово — технический долг, — а потом сделала вид, что это метафора для оправданий перед менеджментом. Но слово точное, бухгалтерски точное. Долг — это то, что стоит в пассиве, а не в активе. Каждая строка требует обслуживания, обновления зависимостей, реакции на уязвимости и внимания живого человека, который держит её в голове.

Забавно, что legacy-код мы называем наследством, хотя ведём себя с ним как с проклятым домом: боимся заходить в подвал, не трогаем несущие стены и надеемся, что оно продержится ещё год. Настоящее наследство не вызывает страха при попытке им воспользоваться. Если ваш главный аргумент против переписывания системы — «мы вложили в неё десять лет», вы описываете не актив, а невозвратные издержки.

При этом кое-что в репозитории всё-таки ценно, только это не сам код. Это знание, вплавленное в него нечаянно: сотни микрорешений о граничных случаях, найденных потом и кровью на реальных пользователях. Беда в том, что оно записано в самой неудобной форме из возможных — в виде условий и заплаток, без объяснения, зачем они там. Мы годами хранили ответы, старательно выбрасывая вопросы, и теперь удивляемся, что ответы обесценились первыми.

Спецификация: скучное слово, за которым пряталась вся работа

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

Слово спецификация звучит как что-то из советского НИИ, поэтому его старательно избегают. Зря. Когда генерация артефакта становится бесплатной, спецификация остаётся единственным местом, где вообще происходит мышление. Всё остальное — механический перенос.

И тут вылезает неприятная правда: почти все реальные задачи страдают недоспецифицированностью. Заказчик говорит «сделайте удобный поиск» и искренне считает, что сказал достаточно. Он не назвал, что делать с опечатками, как ранжировать, что показывать при нуле результатов, сколько ждать до таймаута и кому что видно по правам доступа. Раньше эти дыры молча затыкал программист — по дороге, между делом, часто неудачно, но затыкал.

Теперь дыры затыкает генератор, и делает это правдоподобно. Он не остановится, не спросит, не скажет «вы противоречите сами себе» — он выдаст рабочий результат на основании собственной догадки. Это и есть настоящий сдвиг: функциональные требования перестали быть бумажкой для галочки и стали главным входом системы. Мусор на входе теперь превращается в очень аккуратный, отлично оформленный, полностью работоспособный мусор на выходе.

Проверка: единственное место, где живёт правда

Если код одноразовый, то что отличает удачную генерацию от катастрофической? Только проверка. И вот здесь начинается самое интересное, потому что проверка дешевеет гораздо медленнее, чем производство.

Тест — это не приложение к коду, а исполняемая спецификация: единственная форма, в которой требование записано так, что его невозможно понять двусмысленно. Хороший набор тестов переживает пять переписываний реализации и остаётся ценным, потому что описывает не как сделано, а что должно быть верно. Именно поэтому регрессионное тестирование внезапно перестало быть занудной гигиеной и стало страховкой от галлюцинирующего соавтора, который переписывает вам модуль за девяносто секунд.

Но у проверки есть фундаментальный предел, о котором в эйфории не любят говорить. Он называется проблема оракула: чтобы проверить ответ, нужно откуда-то знать правильный. Верификация доказывает соответствие спецификации, а не соответствие реальности — если спецификация ошибочна, доказательство будет безупречным и бесполезным.

Оракула нельзя сгенерировать из того же источника, что и решение. Иначе получается замкнутый круг: система пишет код, сама придумывает критерий успеха и сама себя хвалит. Это не инженерия, это самогипноз. Человек, который умеет сформулировать критерий независимо от решения, становится редчайшим ресурсом.

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

Вкус — слово, от которого инженерам неловко

Есть третья вещь, которую генерировать не получается, и её стесняются называть вслух, потому что она звучит несерьёзно. Вкус. Способность отличить хорошее решение от просто работающего.

Работающих решений теперь бесконечно много, и в этом вся проблема. Когда варианты стоили дорого, выбирать почти не приходилось — брали тот, который успели написать. Когда за час можно получить восемь рабочих реализаций, единственный дефицитный навык — понять, какая из них не превратится в тот самый проклятый подвал через два года.

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

Вкус нельзя объяснить в промпте, потому что он не сформулирован даже у его носителя. Он вырастает из шрамов — из систем, которые ты сам довёл до состояния, когда их страшно трогать.

Юристы, аналитики и учёные почувствуют то же самое

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

Договор на сорок страниц перестанет быть результатом дорогой работы и станет тем, что генерируется за пять минут. Ценность юриста переедет туда, где она, честно говоря, всегда и была: в понимание, какие риски вы вообще хотите закрыть, и в способность увидеть в идеально выглядящем документе пункт, который через год похоронит компанию. Финансовая модель на двести формул превратится в расходник, а вопрос, какие допущения в неё заложены, останется единственным содержательным.

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

Здесь же прячется главная опасность. Критерий тоже можно подделать, причём гораздо изящнее, чем результат, и заметить это будет некому.

Что стоит хранить

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

Из этого следует практический вывод, неудобный для привычек индустрии. Хранить надо не код. Хранить надо спецификации, тесты, записи о принятых решениях и причинах отказа от альтернатив — то есть ровно то, что мы всегда выбрасывали первым, потому что оно не компилируется и не показывается заказчику.

Есть, впрочем, вопрос, на который у меня нет ответа. Вкус вырастает из опыта ручной работы: из тех самых лет, когда ты писал плохо, отлаживал ночами и научился заранее чуять, где рванёт. Если следующее поколение никогда не будет писать руками, откуда у него возьмётся то, за что мы предлагаем ему платить?

87 %
88 %

Комментарии 20

Войдите, чтобы оставить комментарий.

уровень 1 в 1 неделя
Не представляю, как можно написать на входе исчерпывающую спецификацию сложной заказной системы, чтобы по ней автоматически сгенерировать требуемый функционал. Система рождается постепенно, в творческих муках, по мере написания и стыковки собственно программного кода (будь то UI или бэкэнд) на основе первоначального приблизительного наброска. Всё меняется, клиент передумывает, программист переделывает. Какие-то решения утверждаются, какие-то отбрасываются, какие-то переосмысливаются, какие-то возникают по ходу процесса. Это тяжелое коллективное творчество. Как можно создавать сложные программные продукты (а не сортировку пузырьком) автоматически, я не понимаю. По-моему, это иллюзия. Приятная, но несбыточная. Пресловутая "большая красная кнопка". Опять же, хороший системный аналитик - это бывший или действующий программист. А не журналист, не писатель, не собачий парикмахер. Да, спецификации и тестирование - это всегда слабое место индустрии. Написание и поддержание в кондиции годных юнит-тестов с хорошим покрытием автоматом умножает время разработки раза в два. И не отменяет живую QA-команду. Грамотное ведение SRS - отдельная песня. Минимум пара спецов на большой проект должна заниматься этим постоянно. Актуализировать, выдавать в реализацию, контролировать соблюдение. И всё равно это будет далеко не исчерпывающая документация. А тут еще и ии, который пишет вообще не пойми чего, и нужны постоянные живые код-ревью, пока не стало слишком поздно. Можно не ревьюить живого опытного спеца - носителя концепции, понимающего архитектуру, цели и задачи в настоящем и в будущем. А ии нужно ревьюить, по-моему, всегда. Он ничего не понимает, и невозможно поверить гармонию алгеброй. И, конечно, главный вопрос здесь в том, как выращивать профессиональных бойцов, никогда не нюхающих пороха.
Полезно
Уместно
уровень 2 в 1 неделя
Павел, согласна с вами, опыт программирования важен для хорошего аналитика. И, на мой взгляд, самое главное в нем - это умение мыслить алгоритмически. Это к вопросу о том, как выращивать бойцов (аналитиков), не нюхавших пороха (не работавших с кодом). Надо развивать способность мыслить алгоритмически во всем - даже в повседневной жизни. Вы верно сказали - система рождается постепенно, в творческих муках. Даже наш биологический код, созданный самой природой, Творцом, содержит в себе груз ошибок и вечных недоработок. Но он работает, мы им пользуемся! Конечно, хотелось бы, чтобы он был сразу идеальным, но здесь, видимо, важен не столько результат, сколько процесс - вернее, то мастерство, которое в процессе приобретается.
Полезно
Уместно
уровень 2 в 1 неделя
Павел, а как Вы представляете себе программирование в будущем? Как будет выглядеть симбиоз человека и ИИ при создании/совершенствовании программного кода?
Полезно
—
Уместно
—
уровень 1 в 1 неделя
Гульмира, если говорить в общем, не вдаваясь в детали, я вижу ИИ как полезный вспомогательный инструмент. Только его нужно еще хорошо наточить. Действительно, в IT встречается большое количество однотипных задач. На них тратится много живого времени, которого откровенно жалко. Есть даже целые однотипные программные продукты. Например, интернет-магазины. Вся проблематика там известна заранее и отработана тысячи раз. Но часто приходится изобретать велосипед, чтобы обеспечить незначительную кастомизацию под конкретного клиента. Тут ИИ будет очень кстати. Я вижу ИИ как еще один язык, еще более высокого уровня, нежели существующие. Следующую ступень эволюции, начавшейся с ассемблера и приведшей через C и CРР к современному managed code (Java, .NET и т.п.). Но у всего есть своя цена. Мы перестали заглядывать в ассемблер. И в результате код неимоверно распух в плане потребления машинных ресурсов. Одна только кнопка теперь может ресурсно весить столько же, сколько раньше весило целое приложение в каком-нибудь DOS. При этом функционально она остается все той же кнопкой. Такова цена скорости разработки и непонимания основ. Но мы пока готовы ее платить. Про полезность при обработке и анализе больших массивов данных я не говорю. Тут всё понятно. Можно еще поговорить о том, откуда взялось заблуждение, будто ИИ может заменить программиста, но это, наверное, другая история.
Полезно
Уместно
уровень 2 в 1 неделя
Павел, а можно ли научить ИИ писать на ассемблере?
Полезно
—
Уместно
—
уровень 1 в 1 неделя
Гульмира, разумеется. Я уверен, что он и может писать на ассемблере. Вопрос, скорее, не в самом умении писать, а в том, что именно он будет писать и _зачем_. У ИИ есть огромный энергетический ресурс для создания алгоритмов, но нет понимания, зачем. У программиста - наоборот: понимание есть (ибо он - Человек, а не алгоритм), а личной энергии несравнимо меньше. Отсюда проистекает его "технический долг". Как состыковать энергию ИИ (как алгоритма алгоритмов) с пониманием Человека, чтобы на выходе получить развитие, а не деградацию - в этом и есть вопрос.
Полезно
Уместно
—
уровень 2 в 1 неделя
Павел, ой, ну вы льстите человеку! Мне кажется, только единицы понимают ЗАЧЕМ, особенно при решении трудных, глобальных задач. А локальные "зачем" уже достаточно хорошо сформулированы, чтобы их понимал и ИИ.
Полезно
—
Уместно
—
уровень 1 в 1 неделя
Гульмира, я, наверное, подспудно подразумеваю осознанного программиста, а не студента на подработке. Я тридцать с чем-то лет этим занимаюсь. Может, поэтому чисто субъективно поднимаю планку. Но нужно же к чему-то стремиться. Человек хотя бы _может_ понять, зачем. В него заложена такая возможность. А алгоритм не может этого в принципе. Тот же ИИ - по определению просто набор мертвых условий "если-то". Переусложненная таблица Брадиса. А человек - живой. Он чувствует, желает, мечтает. Хотя, конечно, его желания могут быть и кривыми. И очень опасно давать такому в подмогу супералгоритм, который реализует его кривые желания с быстротой и эффективностью водородной бомбы. Хорошо ли сформулированы все локальные "зачем" - не знаю, не уверен. Как я уже говорил, это мучительный творческий процесс в каждом конкретном случае. Программы пишутся для людей, а не для алгоритмов.
Полезно
—
Уместно
—
уровень 2 в 1 неделя
Павел, я тоже считаю, что ИИ в принципе не может понять зачем, т.е. обладать сознанием. Хотя всякие там Альтманы и Гейтсы считают иначе. Вы как считаете, они действительно в это верят, или просто скармливают это народу, чтобы набивать цену своему продукту?
Полезно
—
Уместно
—
уровень 1 в 1 неделя
Гульмира, думаю, они действительно в это верят. Потому что они материалисты. Они искренне не видят, чем живой человек отличается от алгоритма. Что такое дух, душа, чувство, они не понимают. Полагают, что это тоже какой-то алгоритм, который можно забить в машину и он будет там жить. В результате всё сводится к чистому иллюзионизму. Алгоритм имитирует внешние признаки жизни всё более правдоподобно. А самой сути жизни за этим нет. Но многие покупаются на внешнее сходство.
Полезно
Уместно
—
уровень 5 в 1 неделя
Павел, а почему разработка сложной заказной системы обязательно должна начинаться с написания кода? )))) Можно пойти обратным путём, используя метод обратного инжиниринга от конечного результата. Сначала определяем, что заказчик хочет получить на выходе, в какой среде система должна работать и какие задачи решать. Затем от результата движемся назад: определяем необходимые функции, архитектуру, модули, их взаимодействия и зависимости. После этого начинается пошаговая разработка. Каждый шаг сопровождается анализом, тестированием, проверкой связей с уже созданными компонентами и немедленным исправлением обнаруженных ошибок. Только после принятия результата переходим к следующему шагу. При этом архитектура не высечена в камне. Если заказчик меняет требования, сначала анализируем, какие части системы затронут изменения, и корректируем проект. Именно над такой инженерной ИИ-системой мы работаем в нашей лаборатории. В ней LLM не просто генерирует программный код, а взаимодействует с отдельными модулями архитектуры, анализа, разработки, тестирования и исправления ошибок. Конечно, это не волшебная красная кнопка, которая гарантирует безошибочный результат. Но это уже другой подход к автоматизации разработки сложных систем. Не от приблизительного наброска через бесконечные переделки к неизвестному результату, а от заданной цели через управляемую и проверяемую разработку к работающему продукту. И самое интересное, что такой подход не отменяет инженерного творчества. Он позволяет автоматизировать значительную часть его технической реализации.
Полезно
Уместно
уровень 1 в 1 неделя
Bozhya, я и не говорил, что "разработка сложной заказной системы обязательно должна начинаться с написания кода". Я сказал дословно следующее: "Система рождается постепенно, в творческих муках, по мере написания и стыковки собственно программного кода (будь то UI или бэкэнд) НА ОСНОВЕ ПЕРВОНАЧАЛЬНОГО ПРИБЛИЗИТЕЛЬНОГО НАБРОСКА". Под приблизительным наброском я и подразумевал, то, о чем Вы говорите. Просто я не трактую URS и SRS на этапе, предваряющем initial development, как исчерпывающие требования к системе, из которых можно автоматически сгенерировать готовый продукт силами ИИ. Исходные спецификации - это именно набросок, предположение. А дальше начинается творчество. В частности, выясняется, что заказчик при виде промежуточных результатов понимает, что хотел не совсем то, и т.д., и т.п. Можно, конечно, упирать на профессионализм аналитиков, их способность заранее досконально вникнуть в предметно-проблемную область, вытянуть из клиента всё, что можно, еще на этапе подготовки к разработке. Но мы живем не в идеальном мире.
Полезно
Уместно
уровень 5 в 1 неделя
Павел, вот здесь, на мой взгляд, и начинается главная проблема традиционной разработки. )))) Когда в основе лежит приблизительный набросок, а дальше начинается свободное творчество, проект постепенно обрастает решениями, согласованиями, переделками и противоречиями. Но разработка заказного программного продукта начинается не со слов клиента «хочу сайт с красной кнопкой». Она начинается с определения конечной цели, условий эксплуатации, требований к результату, договорных обязательств, сроков и ответственности сторон. При этом я не утверждаю, что заказчик способен заранее описать каждую кнопку и каждое действие системы. Конечная цель и исчерпывающая техническая спецификация это не одно и то же. Именно поэтому мы используем обратный инженерный подход: сначала определяем требуемый результат и среду его работы, затем проектируем архитектуру, необходимые функции и связи между компонентами. Разработка идёт последовательными проверяемыми этапами. Каждый этап анализируется, тестируется и принимается перед переходом к следующему. Если заказчик меняет требования, мы сначала определяем, как это изменение влияет на конечную цель, архитектуру, сроки и стоимость, а уже потом корректируем реализацию. Творчество никуда не исчезает. Но оно должно работать на достижение поставленной цели, а не превращать разработку в бесконечный круг споров, согласований и переписывания кода. Инженерия отличается от свободного творчества тем, что у неё есть конкретная цель, ограничения и ответственность за результат. И именно этот процесс мы пытаемся автоматизировать с помощью ИИ, а не просто научить нейросеть быстрее печатать программный код. А постоянное изменение пожеланий конечных заказчиков стало одной из причин, по которым мы решили уйти от разработки программ на заказ в другое направление. Мы создали собственную систему безопасности серверов и сайтов, работающую в автоматическом режиме, и переориентировались с заказной разработки на предоставление услуг. Теперь наше главное условие — полный технический контроль серверной части и собственного программного обеспечения. Заказчик управляет своим ресурсом и бизнесом, а мы отвечаем за техническую инфраструктуру и защиту в пределах договора. Таким образом, мы ушли от бесконечных согласований чужих желаний к развитию собственной технологии, за качество и работу которой готовы нести ответственность.
Полезно
Уместно
уровень 1 в 1 неделя
Bozhya, прекрасно понимаю проблему. Я сам давно уже работаю в R&D. Там мы сами себе хозяева. Но на это нужны хорошие подъемные деньги. Которые обычно приходится зарабатывать на сторонних заказных проектах.
Полезно
Уместно
уровень 5 в 1 неделя
Код — это прежде всего ответственность тех, кто создаёт и внедряет программный продукт. А ИИ, как известно, никакой ответственности не несёт. Теперь подумайте: станет ли предприятие или корпорация перекладывать ответственность с инженера на ИИ? И главное — сможет ли? Цена ошибки никуда не исчезла. Да, люди тоже ошибаются. Да, часть программистов действительно выполняла преимущественно шаблонную работу, которую сегодня способен делать ИИ. Но инженерия и архитектура никуда не делись. Предприятию нужен не человек, который просто пишет код. Ему нужен специалист, который понимает конечную цель, знает, как её достичь, способен спроектировать систему, оптимизировать процессы, разработать новые технологии и обеспечить работоспособность результата. И при этом умеет профессионально использовать ИИ как инженерный инструмент — работать с архитектурой, контекстом, ограничениями и проверкой результатов, а не просто составлять красивые промпты. Такие специалисты сегодня особенно ценны. Поэтому ИИ не уничтожил программную инженерию. Он существенно удешевил написание типового кода и стал мощным инструментом для создания сложнейших систем. Написать код стало проще. Создать надёжную технологию и отвечать за её работу — нет.
Полезно
Уместно
уровень 4 в 1 неделя
"Мусор на входе теперь превращается в очень аккуратный, отлично оформленный, полностью работоспособный мусор на выходе." Согласен с этим тезисом абсолютно! И так во всём, взять ту же ИИ музыку.
Полезно
—
Уместно

Код стал мусором

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

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

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

Лёд, который никто больше не пилит

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

С кодом уже случалось подобное, только помельче. Когда появились компиляторы, ассемблерный листинг превратился из ремесленного изделия в промежуточный продукт — то, что существует между намерением и результатом, но само по себе никого не интересует. Никто сегодня не хранит ассемблерный вывод компилятора в архиве, не проводит по нему код-ревью и не считает его интеллектуальной собственностью. Он генерируется заново каждую сборку, и это никого не тревожит.

Здесь важно не спутать дорогое с ценным. Лёд был дорогим, потому что его добыча требовала труда, а не потому, что в нём было что-то незаменимое. Ровно так же строка кода была дорогой из-за стоимости её производства. Уберите стоимость производства — и цена схлопнется, обнажив вопрос, который раньше был закрыт этой ценой: а что, собственно, мы хотели получить?

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

Что на самом деле лежит в вашем репозитории

Откройте любой зрелый проект и посмотрите честно, что там хранится. Там лежит не капитал, а окаменевшая последовательность решений, половину из которых уже никто не может объяснить. Там лежат обходные пути вокруг ошибок в библиотеках, которые давно исправлены. Там лежат допущения о бизнес-процессе, отменённом три реорганизации назад, и три несовместимых способа делать одно и то же, потому что каждый писал свой.

Индустрия придумала для этого честное слово — технический долг, — а потом сделала вид, что это метафора для оправданий перед менеджментом. Но слово точное, бухгалтерски точное. Долг — это то, что стоит в пассиве, а не в активе. Каждая строка требует обслуживания, обновления зависимостей, реакции на уязвимости и внимания живого человека, который держит её в голове.

Забавно, что legacy-код мы называем наследством, хотя ведём себя с ним как с проклятым домом: боимся заходить в подвал, не трогаем несущие стены и надеемся, что оно продержится ещё год. Настоящее наследство не вызывает страха при попытке им воспользоваться. Если ваш главный аргумент против переписывания системы — «мы вложили в неё десять лет», вы описываете не актив, а невозвратные издержки.

При этом кое-что в репозитории всё-таки ценно, только это не сам код. Это знание, вплавленное в него нечаянно: сотни микрорешений о граничных случаях, найденных потом и кровью на реальных пользователях. Беда в том, что оно записано в самой неудобной форме из возможных — в виде условий и заплаток, без объяснения, зачем они там. Мы годами хранили ответы, старательно выбрасывая вопросы, и теперь удивляемся, что ответы обесценились первыми.

Спецификация: скучное слово, за которым пряталась вся работа

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

Слово спецификация звучит как что-то из советского НИИ, поэтому его старательно избегают. Зря. Когда генерация артефакта становится бесплатной, спецификация остаётся единственным местом, где вообще происходит мышление. Всё остальное — механический перенос.

И тут вылезает неприятная правда: почти все реальные задачи страдают недоспецифицированностью. Заказчик говорит «сделайте удобный поиск» и искренне считает, что сказал достаточно. Он не назвал, что делать с опечатками, как ранжировать, что показывать при нуле результатов, сколько ждать до таймаута и кому что видно по правам доступа. Раньше эти дыры молча затыкал программист — по дороге, между делом, часто неудачно, но затыкал.

Теперь дыры затыкает генератор, и делает это правдоподобно. Он не остановится, не спросит, не скажет «вы противоречите сами себе» — он выдаст рабочий результат на основании собственной догадки. Это и есть настоящий сдвиг: функциональные требования перестали быть бумажкой для галочки и стали главным входом системы. Мусор на входе теперь превращается в очень аккуратный, отлично оформленный, полностью работоспособный мусор на выходе.

Проверка: единственное место, где живёт правда

Если код одноразовый, то что отличает удачную генерацию от катастрофической? Только проверка. И вот здесь начинается самое интересное, потому что проверка дешевеет гораздо медленнее, чем производство.

Тест — это не приложение к коду, а исполняемая спецификация: единственная форма, в которой требование записано так, что его невозможно понять двусмысленно. Хороший набор тестов переживает пять переписываний реализации и остаётся ценным, потому что описывает не как сделано, а что должно быть верно. Именно поэтому регрессионное тестирование внезапно перестало быть занудной гигиеной и стало страховкой от галлюцинирующего соавтора, который переписывает вам модуль за девяносто секунд.

Но у проверки есть фундаментальный предел, о котором в эйфории не любят говорить. Он называется проблема оракула: чтобы проверить ответ, нужно откуда-то знать правильный. Верификация доказывает соответствие спецификации, а не соответствие реальности — если спецификация ошибочна, доказательство будет безупречным и бесполезным.

Оракула нельзя сгенерировать из того же источника, что и решение. Иначе получается замкнутый круг: система пишет код, сама придумывает критерий успеха и сама себя хвалит. Это не инженерия, это самогипноз. Человек, который умеет сформулировать критерий независимо от решения, становится редчайшим ресурсом.

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

Вкус — слово, от которого инженерам неловко

Есть третья вещь, которую генерировать не получается, и её стесняются называть вслух, потому что она звучит несерьёзно. Вкус. Способность отличить хорошее решение от просто работающего.

Работающих решений теперь бесконечно много, и в этом вся проблема. Когда варианты стоили дорого, выбирать почти не приходилось — брали тот, который успели написать. Когда за час можно получить восемь рабочих реализаций, единственный дефицитный навык — понять, какая из них не превратится в тот самый проклятый подвал через два года.

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

Вкус нельзя объяснить в промпте, потому что он не сформулирован даже у его носителя. Он вырастает из шрамов — из систем, которые ты сам довёл до состояния, когда их страшно трогать.

Юристы, аналитики и учёные почувствуют то же самое

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

Договор на сорок страниц перестанет быть результатом дорогой работы и станет тем, что генерируется за пять минут. Ценность юриста переедет туда, где она, честно говоря, всегда и была: в понимание, какие риски вы вообще хотите закрыть, и в способность увидеть в идеально выглядящем документе пункт, который через год похоронит компанию. Финансовая модель на двести формул превратится в расходник, а вопрос, какие допущения в неё заложены, останется единственным содержательным.

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

Здесь же прячется главная опасность. Критерий тоже можно подделать, причём гораздо изящнее, чем результат, и заметить это будет некому.

Что стоит хранить

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

Из этого следует практический вывод, неудобный для привычек индустрии. Хранить надо не код. Хранить надо спецификации, тесты, записи о принятых решениях и причинах отказа от альтернатив — то есть ровно то, что мы всегда выбрасывали первым, потому что оно не компилируется и не показывается заказчику.

Есть, впрочем, вопрос, на который у меня нет ответа. Вкус вырастает из опыта ручной работы: из тех самых лет, когда ты писал плохо, отлаживал ночами и научился заранее чуять, где рванёт. Если следующее поколение никогда не будет писать руками, откуда у него возьмётся то, за что мы предлагаем ему платить?

  ПРОГРАММИРОВАНИЕ

Оценить запись

87 %
88 %
Категория
100 %

Категория записи указана верно?
Наука и Технологии

Тематики
75 %

Оцените качество выбора тематик

Содержание

Поделиться