Перейти к содержанию
Публикация AiManual

Как выращивать senior-разработчиков с AI-ассистентами

AI-ассистенты ускоряют написание кода, но меняют путь от junior к senior: инженерная зрелость теперь формируется через инварианты, негативные тесты, review и от

Коротко

Что будет в материале

  1. 01

    Короткий ответ: senior-разработчиков выращивают через сохранение учебного контура при работе с AI

  2. 02

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

  3. 03

    Почему junior, принимающий результат модели без проверки, не растет до senior

  4. 04

    Инженерное мышление: от «сделать фичу» к доказательству корректности

Короткий ответ: senior-разработчиков выращивают через сохранение учебного контура при работе с AI

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

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

Практический учебный контур команды должен включать шесть действий: сформулировать проверяемые требования, зафиксировать инварианты, определить trust boundary, проверить failure modes и негативные тесты, обсудить решение на review, проследить за поведением изменения в production. Если возникает инцидент, команда разбирает пропущенный инвариант и меняет процесс, тесты или код.

  • AI-ассистент готовит черновики, варианты решений и тестовые сценарии.
  • Разработчик объясняет, почему выбранный вариант соответствует требованиям.
  • Reviewer проверяет ограничения и последствия, а не только формат diff.
  • Автор участвует в выпуске, наблюдении и разборе отклонений.

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

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

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

AI убирает часть полезного трения, и вместе с ним часть практики

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

Модель сокращает этот цикл. Она может сразу предложить код, который компилируется и проходит ожидаемый сценарий. Junior видит итог, но может не узнать, почему выбран конкретный API, какие предположения сделаны о данных и при каком условии решение перестанет работать.

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

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

Почему скорость набора кода больше не показывает инженерную зрелость

Два pull request могут закрывать одну задачу и содержать одинаковое количество строк. В одном автор проверил только happy path. В другом он описал инварианты, добавил негативные тесты, учел откат миграции и объяснил, как изменение поведет себя при недоступной зависимости. Разница находится в качестве решения, а не в размере diff.

AI снижает ценность механической скорости. Поэтому на review заметны другие признаки:

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

Что AI не берет на себя: требования, последствия и решение о релизе

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

Перед merge разработчик должен ответить на конкретные вопросы:

  1. Что система обязана гарантировать при штатном сценарии?
  2. Какие действия и состояния считаются запрещенными?
  3. Какие данные изменяются, читаются или становятся доступными?
  4. Что произойдет при повторном запросе, тайм-ауте, частичном сбое или некорректном вводе?
  5. Как команда обнаружит проблему после релиза?
  6. Как откатить изменение без потери данных и нарушения совместимости?

Фраза «так предложила модель» не отвечает ни на один из этих вопросов. Она описывает происхождение кода, но не качество инженерного решения.

Почему junior, принимающий результат модели без проверки, не растет до senior

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

Правдоподобный код создает иллюзию понимания

У сгенерированного решения есть как минимум три разных уровня качества:

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

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

Работающий happy path не доказывает, что автор понял систему. Например, тест на успешный вход подтверждает прохождение authentication, но почти ничего не говорит о разделении прав, сроке жизни токена, доступе к чужому tenant и отзыве сессии.

Как выглядит потеря учебного контура

Руководитель или ментор может заметить проблему по наблюдаемым действиям, а не по самому факту использования AI:

  • разработчик не может назвать инварианты до начала работы;
  • объяснение решения повторяет формулировки модели и не связывает их с кодом;
  • проверка ограничивается успешным сценарием;
  • автор не замечает подмену идентификатора, нарушение границы доступа или утечку чувствительных данных;
  • review воспринимается как поиск опечаток и стилистических расхождений;
  • после релиза автор не знает, какие сигналы указывают на деградацию;
  • ошибка объясняется «галлюцинацией AI», без поиска пропущенного требования или слабого теста.

Последний признак особенно показателен. Если ошибка модели становится финальным объяснением, команда теряет возможность улучшить постановку задачи, проверку и процесс принятия решений.

Почему полный запрет AI не возвращает инженерное обучение автоматически

Запрет убирает инструмент, но сам по себе не создает практику проектирования, негативного тестирования и анализа отказов. Разработчик может писать код вручную и все равно проверять только happy path, игнорировать границы доступа и не участвовать в наблюдении релиза.

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

Инженерное мышление: от «сделать фичу» к доказательству корректности

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

Зафиксировать инварианты до генерации кода

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

Для изменения в B2B-сервисе набор инвариантов может выглядеть так:

  • пользователь читает только записи своего tenant;
  • идентификатор tenant берется из проверенного контекста, а не из доверенного поля запроса;
  • повтор операции не создает второй побочный эффект;
  • отозванный refresh-токен не выдает новую access-сессию;
  • административное изменение попадает в аудит;
  • миграция сохраняет совместимость на время поэтапного выпуска.

Список должен включать отсутствующие условия. Кто имеет доступ к данным после истечения сессии? Что произойдет при повторной доставке сообщения? Можно ли выполнить операцию через анонимный ключ? Такие вопросы часто отсутствуют в коротком описании фичи, хотя именно они определяют ее безопасность.

Проверить границы доверия и движение данных

Trust boundary, или граница доверия, проходит там, где данные переходят из менее доверенного источника в компонент, который принимает решение. К таким источникам относятся клиентский запрос, браузерное хранилище, внешний webhook, заголовок, файл конфигурации или ответ стороннего сервиса.

При проверке AI-сгенерированного кода нужно проследить путь каждого чувствительного значения:

  1. Кто создает идентификатор пользователя и tenant?
  2. Где система проверяет его подлинность?
  3. Может ли клиент заменить значение перед запросом к базе?
  4. На каком уровне ограничивается чтение и запись?
  5. Какие ключи доступны анонимному клиенту?
  6. Какие административные действия фиксируются в аудите?

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

Разбирать failure modes, а не только happy path

Failure mode, это конкретный способ отказа или нарушения поведения. Его описывают до выпуска, затем связывают с тестом, сигналом наблюдаемости или планом отката.

Для каждой фичи полезно задать пять вопросов:

  • Что сломается первым при росте нагрузки или недоступности зависимости?
  • Что произойдет при повторе операции?
  • Как система поведет себя при частичном сбое, когда запись в одном сервисе уже прошла, а во втором нет?
  • Как она сообщит об ошибке пользователю и оператору?
  • Можно ли вернуть прежнее поведение без ручного исправления данных?

Ответы превращаются в негативные тесты. Для платежного запроса это проверка повторной отправки и тайм-аута. Для авторизации, попытка прочитать чужой tenant, использовать просроченный токен и обратиться к административному методу без нужной роли.

Связать код с production-ответственностью

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

Автор изменения должен знать:

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

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

Один AI-запрос, два уровня инженерной работы: пример с авторизацией

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

Разработчик принимает сгенерированную авторизацию как готовую фичу

Разработчик просит AI подготовить middleware, правила доступа и несколько тестов. Модель выдает код. Автор проверяет успешный вход, получение токена и чтение записи пользователем с разрешенной ролью. Базовый сценарий проходит, после чего изменение отправляется на review.

В таком процессе границы authentication и authorization остаются неразобранными. Неясно, кто определяет tenant, можно ли заменить tenant_id в запросе, как работают политики RLS и что произойдет после отзыва токена. Код может оказаться корректным для проверенного сценария, однако доказательств для остальных условий нет.

Разработчик проверяет запрещенные сценарии и границы доверия

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

Проверка включает:

  • попытку подменить tenant_id в параметрах, теле запроса и заголовках;
  • чтение и изменение записи другого tenant;
  • проверку RLS на уровне базы, а не только в обработчике;
  • поведение refresh-токена после истечения срока и операции revoke;
  • доступ к закрытому методу с анонимным ключом;
  • попытку выполнить административное действие без роли;
  • появление таких действий в аудите.

Негативные тесты подтверждают запрет конкретных действий. Review получает понятную основу для обсуждения: каждый спорный участок связан с инвариантом, границей доверия или failure mode.

В чем принципиальная разница между этими подходами

Элемент работыПоверхностный подходИнженерный подход
ЦельПолучить работающий вход и разрешенный запросПодтвердить допустимое поведение системы
ДанныеДоверие к полученному tenant_idПроверка происхождения и пути значения
ТестыУспешный вход и happy pathЗапрещенные действия, подмена данных, истекшие и отозванные токены
ReviewПоиск ошибок в diffПроверка инвариантов, границ и отказов
РелизЗадача считается закрытой после mergeАвтор знает сигналы, откат и последствия изменения

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

Как не потерять инженерный опыт с AI: учебный контур команды, задача, релиз и postmortem

Команде нужен короткий повторяемый процесс, а не папка из формальных документов. Для небольшой задачи может хватить заметки на несколько абзацев и набора вопросов в pull request. Для изменения авторизации, схемы данных или критичного фонового процесса потребуется более подробный design note.

До генерации: коротко зафиксировать требования и инварианты

Автор задачи или разработчик записывает шесть пунктов:

  1. Цель изменения и пользовательский сценарий.
  2. Проверяемые требования, по которым команда примет результат.
  3. Инварианты, которые должны сохраниться.
  4. Границы доверия и источники чувствительных данных.
  5. Запрещенные сценарии и ожидаемые failure modes.
  6. Открытые вопросы, ограничения и план проверки.

Такая заметка занимает меньше времени, чем разбор инцидента после неясного релиза. Она дает AI контекст и одновременно показывает, понял ли junior задачу до начала генерации.

Во время реализации: использовать AI как собеседника, а не источник истины

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

Запрос к модели полезно строить вокруг ограничений:

  • описать контекст системы и участок, который можно менять;
  • передать инварианты и запрещенные сценарии;
  • попросить несколько вариантов с указанием компромиссов;
  • попросить перечислить предположения и неизвестные условия;
  • запросить негативные тесты и способы проверить откат;
  • сверить ответ с кодом, документацией и поведением тестовой среды.

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

На review: проверять diff и инженерное обоснование

Reviewer смотрит на код через вопросы, которые выявляют качество суждения:

  1. Какой инвариант защищает каждая существенная часть изменения?
  2. Какие негативные тесты подтверждают запрещенные сценарии?
  3. Какие альтернативы рассматривались и почему их отклонили?
  4. Где проходят границы доверия?
  5. Что произойдет при недоступности зависимости или повторе операции?
  6. Как изменение откатить и как заметить проблему после выпуска?

Перед обсуждением деталей автору полезно самостоятельно объяснить решение. Ментор может попросить нарисовать поток данных, назвать самый опасный failure mode и показать тест, который его ловит. Такой review передает опыт через рассуждение, а не превращается в список стилистических замечаний.

Перед релизом и после него: автор должен увидеть последствия решения

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

Если ошибка возникает, postmortem должен ответить на четыре вопроса:

  • какое фактическое поведение нарушило ожидание;
  • какой инвариант оказался пропущен или сформулирован слабо;
  • почему тесты, review или наблюдаемость не обнаружили проблему раньше;
  • какое изменение появится в коде, тестах или практике команды.

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

Как встроить AI-ассистентов в разработку и обучение junior без режима запретов

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

Что можно делегировать модели без потери учебной ценности

Модель может подготовить:

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

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

Что нельзя делегировать без объяснения и проверки

Модель может предложить варианты для следующих задач, но итоговое решение требует участия разработчика и reviewer:

  • выбор архитектурного компромисса;
  • формулировка инвариантов и границ допустимого поведения;
  • проверка авторизации и доступа к данным;
  • работа с персональными, финансовыми и иными чувствительными данными;
  • миграция схемы и сохранение совместимости;
  • выбор failure modes для тестирования;
  • стратегия отката и решение о готовности к production.

Эти зоны требуют контекста продукта и ответственности за последствия. AI не видит всех договоренностей команды, особенностей данных и стоимости инцидента.

Как ментору не превратиться в генератор готовых ответов

Ментор сохраняет самостоятельность junior через последовательность вопросов:

  1. Какую проблему решает изменение?
  2. Что должно оставаться истинным после его выпуска?
  3. Какой сценарий нельзя допустить?
  4. Что предложил AI и на каких предположениях построен ответ?
  5. Как проверить эти предположения?
  6. Какой вариант выбрал автор и почему?

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

Прозрачные правила работы с AI, human-in-the-loop и разбор типичных ошибок помогают сохранить ответственность внутри команды. Практики взаимодействия с AI собраны в материале об ошибках AI-инженера и проверке решений.

Как оценивать рост senior-разработчиков, если AI пишет большую часть кода

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

Смотреть на качество решений, а не на объем написанного кода

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

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

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

Какие артефакты показывают реальный рост

Команда может наблюдать пять типов артефактов:

  1. Короткие design notes с требованиями, инвариантами и открытыми вопросами.
  2. Комментарии в review, где обсуждаются риски, данные и альтернативы.
  3. Негативные тесты, связанные с конкретными запрещенными сценариями.
  4. Записи решений, которые объясняют выбранный компромисс.
  5. Участие автора в наблюдении релиза и postmortem.

Количество таких документов ничего не доказывает. Сигнал роста появляется, когда артефакт помогает увидеть риск, принять проверяемое решение и применить вывод в новой задаче.

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

Почему стаж сам по себе не гарантирует seniority

Двадцать лет работы сами по себе не доказывают seniority. Ценность опыта появляется, когда человек принимал решения, сталкивался с ошибками, разбирал инциденты и видел последствия разных компромиссов на review и в production.

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

Итог: seniority определяется ответственностью за систему

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

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

  1. Что система должна гарантировать?
  2. Какие условия и данные нельзя считать доверенными?
  3. Какие сценарии запрещены?
  4. Что произойдет при сбое или повторе операции?
  5. Как тесты и review подтверждают корректность?
  6. Как команда увидит проблему после релиза?
  7. Какой вывод появится в коде, тестах или правилах после инцидента?

Так AI ускоряет разработку, сохраняя инженерное мышление. Senior отвечает не за ручной набор каждой строки, а за то, чтобы система выполняла допустимые действия, блокировала запрещенные и предсказуемо переживала ошибки в production.

Подписаться на канал