Наливайте кофе, насыпайте попкорн - будет познавательно и полезно.

Итак, начнем с самого начала: с основ программирования и с того, что в нем еще не удалось решить современному человечеству, и мы поймем, как нам тут поможет AI и поможет ли в принципе.

Halting problem - баги с нами до конца времен

Мы пишем программы для компьютеров, которые являются той самой "машиной Тьюринга", для которой Алан Тьюринг еще в 1936 году строго доказал, что, простыми словами, "полностью проверить на наличие ошибок программу нельзя".

Можно тут еще напомнить про теорему Курта Геделя о неполноте, которая "примерно" про то же самое, про рекурсии и которой была "взломана" и так и не оправилась математика.

В общем, все понимаем, проверять код чем-то на наличие ошибок и найти их все - нельзя. Возможно, в далеком будущем, настоящий, а не тот, что им сейчас называют, "AI", поможет человечеству с преодолением halting problem... Но пока нам нужно искать другие способы и техники минимизации ошибок в разработке и использовать их все вместе, если это рентабельно. Какие?

Автоматизированные тесты

На самом деле, тесты могут быть и неавтоматизированными, но тогда их придется выполнять вручную несколько часов (а иногда дней и даже недель) после любого изменения в программе :-)

Суть проста - пока ты пишешь код, ты в контексте (тут я говорю еще про наш, человеческий контекст, а не то, что Вы подумали) и у тебя в голове вращается алгоритм. Вообще понятие "пока у тебя в голове" невероятно мощное, на нем, в том числе, основан мой любимый Python, пытающийся максимально снизить когнитивную нагрузку на человеческое внимание и сознание при написании кода. Так вот, пока разработчик в контексте, он сразу пишет и автоматические тесты к своему коду, заодно "выбрасывая" из кода то, что нельзя или трудно и дорого автоматически протестировать другим кодом (да, тут я намекаю на то, что код становится проще, архитектура прозрачнее и резко снижается число степеней свободы до уровня, который можно достаточно надежно проверить другим кодом).

Когда кода становится много, ты пишешь уже не только простые, модульные тесты, но и более "сложные" - интеграционные, которые начинают тестировать твое приложение или его модули как единое целое. Например, ты поднимаешь локальную копию AWS в виде Localstack, создаешь там s3-файлы и SQS-очереди, таблицы DynamoDB и проверяешь целиком от начала и до конца работу твоего приложения "как будто мы в продакшн". Получается, у тебя примерно половина написанного кода занимается тестированием, а другая половина это код самого приложения, с той особенностью, что тестирующий код пишется обычно гораздо проще и быстрее.

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

Некоторые энтузиасты еще измеряют тестовое покрытие программного проекта в разных единицах (на самом деле не особо важно в каких, хоть в мидихлорианах), но важно понимать, что 100% покрытие не гарантирует отсутствие ошибок, а только может показать их присутствие. Но польза, безусловно, есть, и при наличии циферки можно ее повышать, не понижать и даже, останься в страшном сне, прикрутить к ней KPI.

Тут главное помнить, что есть в мире самая популярная по числу инсталляций базка данных, и да, это не MySQL. И вот в ней 100% тестовое покрытие и давно и ... баги все равно находят и исправляют.

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

И да, это, увы, не математика, это классические инженерные практики, которые работают.

Система типов - может заметно помочь снизить число ошибок в коде

Если для разработки программного проекта "сразу выбрать" (пишу, а из глаз слезы капают, особенно из левого, который подергиваться стал) язык с "хорошей" поддержкой типов и компилятором, то технических ошибок в коде будет значительно меньше. Компилятор будет помогать разработчику, и это не пустые слова - проект на Java, скажем, действительно проще поддерживать и сопровождать, чем на JavaScript. Также код после компиляции будет, как правило, работать еще и быстрее. Единственный минус тут - нужно учить людей пользоваться системой типов и читать официальную документацию к языку программирования и потратить на это несколько десятков часов.

Поэтому, если пишете на JavaScript, рассмотрите постепенный переход на TypeScript или используйте фреймворки с поддержкой типизации типа Angular. Если пишите на Python, начинайте добавлять аннотации типов и прогоняйте код через валидатор типов MyPy. Для новых проектов постарайтесь рассмотреть современные языки программирования с качественной поддержкой типов, как, например, Rust или хотя бы Kotlin.

Важно помнить, что поддержка типизации в скриптовых языках, как правило, к сожалению, "дырявая": что MyPy, что TypeScript, оставляют многочисленные лазейки, и не трудно сделать так, чтобы код в рантайме упал с ошибкой, пропущенной "анализатором типов". Но в любом случае наличие компилятора и/или анализатора типов и вообще любой более-менее разумной системы типов - действительно, по моему опыту, резко снижает число ошибок в программном коде (остаются, как правило, логические ошибки и совсем немного технических).

Читаемость кода - важна для развития и поддержки

Многие, думаю, видели код, который "от высокоумия" плохо читается и после созерцания его в течении получаса так и непонятно, работает он или нет, даже при наличии базовых тестов к коду. Особенно это касается реализации алгоритмов и математики, придуманной разработчиком "на ходу" и без доказательства (а что это такое, доказательство, что-то из школы?). Но самый простой пример, это когда есть сложное выражение с кучей операторов - но без скобок :-)

Так же важно тщательно продумывать названия переменных, модулей, файлов, функций, названий таблиц и колонок в БД - иногда это сложнее и строже призывает к ответственности, чем писать код. Зато в поддержке и понимании будет значительно легче в ближайшие годы.

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

Фреймворки

Меня очень смущает современная тенденция тянуть в программные проекты сразу несколько фреймворков, для каждого из которых нужно прочитать 500-1000 страниц убористой документации. Особенно, когда задачу можно качественно и понятно решить в 50-100 строк кода. Особенно, когда чтобы набраться опыта даже в одном фреймворке нужны, иногда, месяцы, если не годы. Да, запуститься можно быстрее, но потом где вы найдете разработчиков, которые одновременно знают 5 больших фреймворков (и тут перед глазами внезапно появляется Claude Code, который рвется помогать, но поймешь ли ты то, что он предложит!), а еще проект нужно будет регулярно обновлять - в общем, чем больше затянуто фреймворков, тем больше становится особо сложный технический долг и усложняется поддержка.

Документация - частичка души разработчика

Всегда считал и считаю, что в документацию к программному проекту нужно вкладывать душу и сердце. Реализована смелая идея, идея на практике доказала свою жизнеспособность и помогает другим людям решать задачи - как же не похвастаться этим в подробных примерах? Документацию нужно писать людям.

Но, к сожалению, все больше и больше документации, как "говорят знакомые", пишут уже не люди - я начал ощущать это не сразу, но ощущение совершенно четкое - читаешь, читаешь, проходят часы, дни, а внутри пустота от обилия "воды" и становится еще непонятней и запутанней, и хочется сразу открыть исходники (с искренней надеждой, что хоть там был кто-то с включенным сознанием).

AI-ассистенты - изнутри

Простой тест на адекватность - спросите у коллег, как расшифровывается аббревиатура GPT, а затем, что значит каждый термин на уровне умножения матриц и векторов и поймете, в каком буйном пире "во время чумы" находится мир. Magic forever.

Если серьезно, архитектура больших языковых моделей (LLM) - довольно примитивная: K, V, Q матрички для ускорения параллельного обучения на GPU, нелинейные преобразования, несколько слоев "этого" и много, много, МНОГО железа и электроэнергии. И да, масштабное обучение на доступной и большой бигдате.

С точки зрения последовательности шагов и окупаемости бизнес-идей и железа - все ожидаемо и разумно. А с наносимой пользой продолжим разбираться дальше. И осадочек остался-с.

Ключевой момент превращения LLM в полезный продукт

Раньше, еще лет 5-10 назад, приходилось обучать новую модель для решения новой задачи - дни, недели. И самое трудное было - достать датасет с размеченными данными для обучения (хотя бы несколько тысяч примеров), остальное решалось почти автоматически и без особых рисков.

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

Но, будем честны, для большинства рутинных задач можно написать prompt руками, "как для умного человека", и это будет работать, не идеально, но рентабельно для бизнеса. И в этом как раз и случился прорыв - LLM стала отчуждаемым универсальным продуктом.

Prompt для задач программирования

Кто когда-нибудь интересовался темой создания профессиональных prompts, то видел, какие они сложные и запутанные на самом деле, и понятно, что их пишут уже не люди. И как ты докажешь, что твой prompt лучше prompt у коллеги? Да никак, ведь нужно создать датасет (дни, недели), прогнать его через ваши prompts, включить мозги, напрячь память, посчитать метрики accuracy, recall, precision, а возможно и semantic similarity и только тогда можно получить истинный ответ на вопрос, чей prompt лучше. Понятно, что этим сейчас никто в быту не утруждает себя - просто мой prompt лучше, чем у Васи.

Возникает вопрос, а не проще ли сразу написать программу на более строгом языке программирования, чем сначала писать огромный prompt на человеческом противоречивом языке, созданном не для передачи информации, а для выражения эмоций, а потом общаться с AI-ассистентом в чате, пытаясь объяснить ему, что нужно получить в итоге? Искренне считаю, что, программируя, мы сразу и создаем четкие и непротиворечивые инструкции для компьютера и не нужно делать лишнюю работу по переводу логики и математики сначала в prompt, а затем из него с потерями снова в код и еще обхаживать AI-ассистента в чате несколько часов/дней.

Но для не очень сложных задач программирования, связанных с перетасовкой форматов данных, скучным и ненавистным CRUD и работой с БД, несложной версткой, AI-ассистент работает, будем честны, достаточно хорошо (и даже лучше и быстрее многих сотрудников в офисе). По моим наблюдениям:

  1. "Если попросить", AI-ассистент пишет код заметно лучше и чище начинающего разработчика. Внимательно проверял это в Google Antigravity, Claude Code и Yandex Code Assistant с языками PHP, Python, Java Script, Type Script, Rust.

  2. "Если попросить", AI-ассистент может писать код значительно строже, с проверками и валидацией входных значений методов и функций. Это важно для улучшения качества кода.

  3. "Если попросить", AI-ассистент может перевести код на нетипизированном языке на язык с более строгой типизацией или, как минимум, добавить аннотации типов. Это важно для улучшения качества кода.

  4. AI-ассистент работает значительно быстрее разработчика (на порядки). Это значит, что можно проверять одновременно несколько гипотез и выбрать самую лучшую в условиях дедлайнов. Это важно для снижения проектных рисков.

  5. "Если попросить", AI-ассистент может быстро написать unit и даже интеграционные тесты для вашего кода. А это очень важно для обеспечения качества.

  6. AI-ассистент не бесплатный, нужно платить за токены (Yandex Code Assistant пока бесплатный), но если сравнить стоимость времени разработчика и стоимость AI-ассистента, то есть ощущение, что многие рутинные задачи AI-ассистент может делать сильно дешевле. А еще - стоимость токенов постоянно снижается.

  7. AI-ассистент регулярно ошибается. Иногда ошибки легко увидеть при ревью, а иногда они спрятаны в глубине алгоритма. А чего удивляться то? В его память помещается всего 20-40 тысяч строк кода, а размер ядра Linux, позвольте напомнить, вмещает 40 миллионов строк. Поэтому до действительно больших и сложных проектов AI-ассистентам еще как до Луны. Но если разрабатывать систему модулями, то риски минимальны. Питер Штайнбергер даже признался, что держит размер OpenClaw таким, чтобы весь его проект помещался в "мозг" AI-ассистента - так проще и быстрее его разрабатывать.

Вы посчитали, сколько раз встретилось фраза "если попросить"? Но есть и хорошая новость, все "если попросить", выраженные на языке "для умного человека", можно собрать в один текстовый файл и давать на вход AI-ассистенту при разработке каждой новой программы.

Не знаю как вас, но меня не покидает мысль, что AI-ассистенты для программирования это те же самые LLM, которые в течении многих лет преподносились обществу как инструменты для обучения программированию, но только теперь стали чуточку получше. Ничего плохого в этой идее, конечно, нет - дать возможность искусственному преподавателю программирования сделать что-то более полезное, чем безуспешно объяснять "вайб-кодеру" как работает пузырьковая сортировка :-)

Надежный процесс разработки с AI-ассистентом: от начала и до конца

Итак, осознавая все, что выше, сформируем чеклист надежного и прозрачного процесса разработки с AI-ассистентом:

  1. Выбираем, при возможности, язык с типизацией, такой как TypeScript, Python с аннотациями типов, PHP с аннотациями типов, Java/Kotlin/Swift, Go и, если есть возможность, язык с лучшей в отрасли строгой типизацией - Rust. И сразу планируем запускать валидатор типов после каждого изменения кода проекта. Это на порядки снизит число технических ошибок даже в коде, созданном AI-ассистентом. Не зря Claude Code пишут нейросетью на Type Script, а Codex - на Rust.

  2. Устанавливаем в AI-ассистента, при необходимости, плагин для улучшенной поддержки языка программирования. Это ускорит его работу, понизит число затрачиваемых токенов и резко снизит число проб и ошибок, совершаемых AI-ассистентом (они сначала ошибаются, потом пытаются исправить свои ошибки и так по кругу, иногда бесконечному).

  3. Выбираем надежные библиотеки или фреймворки для проекта, желательно с хорошим тестовым покрытием (больше 50-60%, выше - лучше) и адекватным (желательно более 1000, но иногда хорошие решения имеют и меньшее число звезд) числом звезд на GitHub. Желательно, чтобы библиотеки были на типизированных языках (см. п.1). Важно, чтобы Вы и Ваши коллеги знали эти фреймворки и библиотеки, прочитали документацию от корки до корки минимум один раз с примерами, иначе все будут делать вид, что понимают код, созданный AI-ассистентом, а на самом деле не понимать и лепить "горбатого к стенке". Запомните негласное правило: "чем серьезнее лицо разработчика, смотрящего в код, созданный AI-ассистентом, тем меньше он его понимает". Поэтому тестируйте знания разработчиков на знание библиотеки и фреймворка путем очного собеседования с вопросами по официальной документации.

  4. Пишем unit и, если можно это сделать дешево, интеграционные тесты с помощью AI-ассистента. Обязательно делайте это - сначала разработчик пишет тест, который падает, а потом код.. К сожалению, сейчас все чаще и чаще встречаются разработчики, которые искренне, от души, не понимают, зачем нужно писать к коду автоматизированные тесты. А дальше, с развитием AI и появлением действительно полезных квантовых компьютеров (пока они экспериментальные, но активно развиваются в разных странах с активной поддержкой государств), людей с развитыми мыслительными способностями и критическим мышлением, думаю, будет, к большому сожалению и если сейчас не предпринять меры, все меньше и меньше. Люди будут, если не остановить это сейчас, постепенно превращаться в не думающие растения и внезапно придут роботы с серпами.

  5. Постоянно и системно, регулярно измеряем тестовое покрытие кода. Важно понимать, что ваши тесты проверяют как минимум 60-70% кода (больше - лучше).

  6. Всегда, запомните, всегда, ВСЕГДА, перед каждым коммитом, тщательно проверяем созданный AI-ассистентом код с включенным человеческим сознанием. Крутим код в голове, пока не поймем, что там нет ошибок, или глупостей, или дырок в безопасности. За код отвечает разработчик, добавляющий его в репозиторий, а не AI-ассистент. Тщательный аудит кода должен делать сначала разработчик, использующий AI-ассистента, а затем тимлид, сливающий ветку разработчика в вышестоящую ветку.

  7. Если Вам лень разбираться с инструментами работы с репозиторием кода и сборки контейнеров, делегируйте это AI-ассистенту. Но я настоятельно рекомендую предварительно внимательно разобраться в этих инструментах, сначала прочитав документацию по инструменту, а потом ВО ВСЕХ КЛЮЧАХ, которые используются при работе с этими инструментами, так Вы внесете вклад в Ваш личный профессиональный уровень, а вклад в популяризацию и капитализацию Anthropic пусть сделает в этот раз кто-то другой.

  8. Постарайтесь написать документацию к проекту вручную, вложив в нее душу и сердце, как и делали всегда раньше. Но в этом Вам поможет AI-ассистент, который может суммаризировать описание проекта и выделить самое главное. Тут они помогут, сомнений нет.

Искренне убежден, что ВСЕ пункты в чеклисте важны и необходимы для работающего прозрачного и надежного для бизнеса процесса разработки с AI-ассистентом. Если что-то вычеркнуть, появляются большие риски как в отношении качества, безопасности, так и читаемости кода и роста технического долга. Но, в целом, грамотно и системно выстроенный процесс выглядит вполне жизнеспособным.

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

Другие полезные сценарии применения AI-ассистента

Вот есть у меня хобби - я изучаю английский язык много лет с преподавателями. Но нет у меня склонности к языкам, поэтому мне это дается с большим трудом и приходится потеть. Но у меня есть склонность к математике и мне гораздо проще код писать, чем не писать. А кто-то говорит на 5 языках и дико тупит при осознании логики умножения вектора на матрицу или алгоритма Merge Search. Все люди разные и у каждого свои таланты.

Давайте теперь посмотрим на возможности AI-ассистента. Он довольно неплохо, хотя с ошибками, говорит на десятке языков и также неплохо, хотя с ошибками, программирует на десятке языков программирования. Аналогичные люди встречаются или крайне редко, или уже вымерли. И стоит AI-помощник недорого. Грех не воспользоваться ситуацией и не окружить себя армией виртуальных помощников (их называют "агентами"), или хотя бы одним, не правда ли, и попробовать с его помощью решать рутинные задачки в разработке, в которых ошибка не приведет к катастрофе?

По моему личному опыту, AI-ассистент может помочь и в быстром сканировании сотен сайтов и выжимке из них ключевой информации по запросу, даже с учетом того, что он может иногда ошибаться (как и люди). Я в последнее время увлекся запуском исследований с Алисой-Плюс с запросами вида: "чем отличаются иридиевые свечи Champion от NGK", "через сколько километров или моточасов менять машинное масло в Haval H6 и какое масло лучше лить" и мне искренне нравится качество ответов. LLM очищает найденную информацию от маркетинга и пиара, другой воды, и дает чистые, упорядоченные факты. Первое время я скрупулезно проверял первоисточники, но постепенно доверие к агентскому поиску стало возрастать, и теперь инструмент вошел в мою жизнь, и я проверяю первоисточники, тратя на это часто часы, только в высокорисковых и исключительных случаях, когда вероятность ошибки должна быть исключена. Реальная польза от AI-ассистента в поиске информации и выжимке фактов - очевидна.

Выводы

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

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

К сожалению, "переусложненного фреймворками" кода "непонятного уровня качества" и "непонятно как, кем, с кем и под чем написанного" станет гораздо больше и существенно вырастет нагрузка не только на тестировщиков и специалистов по QA, но и на безопасников и девопсов. Предпосылок улучшения качества кода от помощи AI, к сожалению, пока нет, а вот предпосылок появления тонн чего-то вроде работающего уже, к сожалению, море.

И мы совсем забыли про вайб-кодинг - это когда продукт создает не программист, а, скажем, продакт-менеджер или маркетолог. И когда никто не заглядывает, что там "написалось внутри". Понятно, что про halting problem "тут ваще не слышали". Скажу так - возможность получить работающий прототип идеи за короткое время, а еще лучше - несколько работающих прототипов за дни, а не месяцы - это очень важно для развития отрасли разработки программного обеспечения, т.к. позволяет резко снизить риски развития продуктов, заглянуть в будущее и быстрее обсудить, пощупать идею и собрать объективную обратную связь. Но тут и зарыта собака - чтобы что-то попросить стоящее сделать у AI-ассистента, нужно научиться логически выстраивать собственные мысли, от простого к сложному, уметь говорить связно больше 2-3 предложений, не прерываясь на мат, не смешивая кислое с красным, а для этого придется, хотим мы этого или не хотим, продолжать еще активнее развивать собственные мозги - благо возможностей для этого сейчас предостаточно!

Всем удачи!

Комментарии (16)


  1. propell-ant
    20.04.2026 08:37

    Тема плинтуса не раскрыта.

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


    1. AlekseyPraskovin
      20.04.2026 08:37

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

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


  1. MAXH0
    20.04.2026 08:37

    Спасибо за мнение. Вопрос в другом. Мы только что открыли очередную коробочку любопытной девушки Пандоры и не знаем что из неё вылезет... Валидацию кода биологическими нейросетями пока это не отменяет, но...

    Самое лучшее что я заметил в режиме AI-кодирования. Переход от режима программиста в режим менеджера. Это непросто смена позиции - это другие требования к концентрации. Прервавшись не нужны 15 минут для погружения в поток и не нужно время на выход из потока. Это хорошо и удобно (если тебя отвлекли, нет шансов, что код будет исправлен только частично, например...), но именно способность к глубокой концентрации и отличает ИМХО хорошего программиста от посредственного.


  1. j4niwzis
    20.04.2026 08:37

    Мы пишем программы для компьютеров, которые являются той самой "машиной Тьюринга", для которой Алан Тьюринг еще в 1936 году строго доказал, что, простыми словами, "полностью проверить на наличие ошибок программу нельзя".

    Сильное заявление. Вполне существует формальная верификация. Из примеров с такой верификацией есть seL4

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

    Rust и точный язык программирования? Про cve-rs уже все забыли?


  1. OlegMax
    20.04.2026 08:37

    Кто когда-нибудь интересовался темой создания профессиональных prompts, то видел, какие они сложные и запутанные на самом деле, и понятно, что их пишут уже не люди

    Вы по ссылке-то ходили? Что там сложного и запутанного? Где признаки, что их писали не люди?


    1. AlexSerbul Автор
      20.04.2026 08:37

      1. OlegMax
        20.04.2026 08:37

        Дайте догадаюсь, по этой ссылке вы тоже не ходили?


  1. Filipp42
    20.04.2026 08:37

    Приветствую!
    Доказать, что в коде нет багов мешает не только проблема останова, но и Теорема Гробовой Крышки. Она же Теорема Райса.
    Она утверждает, что если какое-то свойство встречается у одних программ, и не встречается у других, мы не можем для любой из программ доказать, что она обладает этим свойством.
    Но тут ключевое слово "для любой". Есть куча программ, для которых мы можем доказать очень многие свойства!

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

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

    Тотальные языки - это очень интересная тема. О ней я выпущу отдельную статью.


  1. Granulex
    20.04.2026 08:37

    Особенно понравился практичный чеклист процесса разработки с ассистентом — после него сложно продолжать относиться к AI как к магии, а не к инструменту, который усиливает сильных, но не спасает от отсутствия инженерной культуры.


    1. AlexSerbul Автор
      20.04.2026 08:37

      Спасибо!


  1. passimx
    20.04.2026 08:37

    Спасибо за пост. Интересно как в целом поменяется мнение автора спустя год, два


  1. devoln
    20.04.2026 08:37

    Я как раз из тех, кто за 16 лет разработки, из которых 8 лет профессионально, почти никогда не писал тесты, искренне не понимая, зачем они, так как на отладку тратил всегда мало времени и без них.

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

    За всё время получилась только пара smoke/fuzz тестов с кастомным сетевым протоколом и ещё одном месте, где ловил много багов, но я изначально ожидал их там встретить.

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

    Если писать юнит-тесты, то при каждой итерации рефакторинга их придётся переписывать, а на это всегда было лень тратить время с учётом того, как мало его уходило на отладку и много на продумывание архитектуры.

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


    1. AlexSerbul Автор
      20.04.2026 08:37

      Я тоже много проектов сам, искренне каюсь, писал без тестов и они работают до сих пор как часы годами. Проблемы начались, когда к проектам стали подключать разработчиков, которые не читали взрослых книг по разработке типа "Effective Java" Джошуа Блоха и стали безответственно комитить безумные вещи. Еще я подсмотрел, что почти во всех развивающихся opensource проектах на github тоже пишут тесты, т.к. работает сразу много людей над кодом. И да, согласен полностью, пусть AI-ассистент теперь пишет тесты, он, кстати, умеет делать это неплохо и это прекрасно!


      1. alexac
        20.04.2026 08:37

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

        Недавний пример — делал хотфикс для серьезного инцидента в проде. Сложились вместе дырки в сыре и выстрелило одно место, где несколько лет назад забыли вставить проверку на ошибку. Я насчитал 6-7 разных слоев абстракции, где можно было бы это поймать, если дополнительно обработать граничный случай, который в целом и так обрабатывался общей логикой. Фикс потребовал пять минут и меньше пятнадцати строк, добавляющий дополнительные проверки в нескольких местах. Написать тест, который воспроизводит проблему (при известных и очень простых шагах для воспроизведения), ломается, если откатить фикс, проходит если наложить фикс, не имеет ложных срабатываний ни в одну сторону, и написан так, что ясно, что именно он проверяет, занял около сотни строк и три с половиной часа.

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

        Хорошие тесты — это правда сложно.

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


  1. UFO_01
    20.04.2026 08:37

    Меня вот кстати всегда забавляла одна деталь в вайбкодерских сайтах, упомянутого agents.md тоже касается. Ни разу не фронтендер, но насколько я понимаю, чтобы ассеты нормально грузили везде, для них надо настроить адресацию, а не использовать артефакты next/static. Иначе сайт выглядит как месиво если не отключить кэш, и летит ошибка 304 в корпоративной сети.


  1. FixicusMaximus
    20.04.2026 08:37

    Очарование от бямов сходит на нет, за ним идет обычная бытовуха.