Видео, статьи и обсуждения про ИИ и замену им разработчиков появляются постоянно, но во многих из них встречаются спорные заявления и недомолвки. Мне кажутся глупыми слова, что ИИ заменит программистов. Ведь разве такое вообще возможно?
Программист – это тот, кто создает программы. Программы нужны, и их, скорей всего, будут создавать, пока жива наша цивилизация. И я хочу описать, что мне кажется неправильным в разных заявлениях про замену программистов.
Дисклеймер:
В статье термины "разработчик" и "программист" буду использоваться в одинаковом смысле, без разделения по умениям и характеру работы. А под ИИ буду иметь в виду не полноценный искусственный интеллект, способный мыслить, а обычные генеративные нейросети.
Сейчас где угодно можно увидеть заголовки о том, как нас собираются заменить. Каждый день появляются статьи и выступления о счастливом будущем, где все сами будут создавать программы. Владельцы компаний, связанных с ИИ, заявляют, как их технологии сейчас все поменяют, как все их клиенты начнут экономить деньги на разработке, все вокруг будет так радужно, что вокруг начнут бегать розовые единороги. Также обсуждения увеличивают некоторые программисты с опытом, которые не совсем разобрались в теме и переживают за свое будущее. А всем им помогают продавцы ИИ продуктов и рекламщики курсов. Они уж точно разводят панику, мешающую выбору карьерного пути и создающие нереальные ожидания у всех вокруг.
Лично я не люблю громкие заявления и хайп. Ведь всегда найдутся какие-то условия, какие-то нюансы, о которых не упомянули. И их много. Вот про них давайте и поговорим.
Размер проекта
Размер имеет значение. Сгенерировать простое приложение сейчас может почти любая нейросетка. Но чем больше размер проекта, тем хуже получается результат. Разумеется, в мире полно маленьких проектов. Часть из них вполне может сгенирировать ИИ. А многие и раньше делались за пару часов с помощью шаблонов. Но ведь такое не прокатит со средними и большими проектами.
Наверняка многие тут писали серьёзные системы. Сколько там было логики? Сколько мелких нюансов, которые приходилось учитывать и не раз дорабатывать? И это все нужно как-то скормить нейросетке.
Приведу пример из своей работы. Мы интегрировались с одним из внутренних сервисов в компании. И спецификация обработки событий заняла несколько экранов. Разумеется, это была только часть логики, потому что потом была еще валидация, агрегация обработанных данных, много разных расчетов и т.д. И это только небольшая часть программы. Представьте, когда в эту логику потом понадобится вносить изменения, которые проходят по всем этапам обработки? Нейросеть же перелопатит весь код и сломает все, что возможно.
Так что я искренне сомневаюсь, что с помощью ИИ возможно решать подобные большие задачи. Как сейчас, так и в обозримом будущем.
К тому же, мне кажется, у размера нейросетей может быть некий предел, как у частоты процессоров. Когда дальше увеличивать еще можно, но эффект от роста будет несопоставим с используемыми ресурсами. Это лишь мое мнение на основе нескольких статей, с которыми сталкивался. Кто хорошо разбирается, поправьте, если я не прав.
Сложность логики
Это уже не про размер, а именно про различные сложные расчеты, условия, формулы. Возможно, вы считаете какие-то научные данные, возможно, делаете систему для начисления бонусов клиентам или реализуете бухгалтерский учет в компании. Любая такая логика только со стороны может казаться легкой. Но если вы закопаетесь глубже, то описывать ее словами оказывается сложно и долго.
По моему мнению, различные формулы или запутанные расчеты проще писать самостоятельно. Потому что это будет быстрее и точнее, чем описать это понятно на словах, чтобы точно передать смысл каждой детали и нигде не ошибиться. А даже если описали правильно, не словить глюков от нейросети.
Сюда же я добавлю, что приходится описывать различные нюансы, типа округления в формулах и порядок действий в исключительных ситуациях. Да даже банальную валидацию параметров на входе и то нужно описать.
Количество созданных решений
Писали ли такие вещи раньше? Как много описаний и вариаций можно найти в интернете?
Если это блог, интернет магазин, калькулятор ипотеки или приложение для заметок – конечно же, нейросети скормили немало таких решений. И вы получите вполне неплохой код (но это не точно). Но что делать, когда вы реализуете что-то первым? Ну ладно, пусть не первым, но все остальные проекты хранятся во внутренних репозиториях компаний - конкурентов. На чем тогда учиться нейросетке? И ваша компания тоже, вероятно, никогда не откроет внутренний код для обучения сторонних нейросетей.
Спустившись на уровень ниже также можно сказать и про конкретные классы и модули. Какой-нибудь типовой конфиг логирования или Dockerfile нейросеть вам вполне выдаст. А вот специфичную логику обработки под ваш случай – только с максимально детальным описанием.
Сфера
Здесь очень близко к предыдущему пункту. В некоторых сферах почти одни шаблоны (те же блоги), а в других почти всегда самописные решения (например, в банках), и все реализации сильно отличаются. И если некоторые сферы ИИ может очень сильно изменить, то в других ИИ будет лишь небольшим упрощением работы.
Языки и библиотеки
Выдаваемые результаты будут зависеть от сложности языков, количества написанных и доступных для обучения кодовых баз, времени существования языка, количество версий языка и связанных библиотек и фреймворков.
Пример из жизни. Нужно было обновить версию фреймворка, т.к. накопились обновления с исправлениями багов и уязвимостей. В новой версии устаревает один метод связанной библиотеки, который используется у нас в конфигурации. Исправляется это использованием двух других методов с правильными параметрами. Но это я узнал потом, прочитав разные гайды миграций и документацию кода, потому что почти нигде внятно это не было описано, даже в документации метода в предыдущей версии. Он просто исчез. Сможет ли ИИ это все сделать, обучили ли его на новых версиях? А если учесть, что это было лишь одно из десятков изменений, которые нужно внести в рамках одного merge request, потому что иначе будет с десяток ошибок о несовместимости версий?
Оптимальность
Даже опытные разработчики порой пишут не оптимальный код. На чем там обучалась нейросеть – вообще не понятно. Так что хорошо, если в сгенерированном коде самой страшной проблемой будет поход в цикле за данными в БД.
На самом деле, проблем может быть море:
N+1 проблема
запросы в БД или в другие сервисы в цикле
отсутствие индексов
неоптимальные алгоритмы
неоптимальные коллекции
и т.д.
Приложения то могут работать. Но как только вырастет нагрузка, проблемы сразу появятся. Выявит ли их нейросеть? Возможно. Но только уже после появления проблемы, и когда вы явно напишите запрос.
Но, допустим, что все сгенерировано достаточно оптимально. Но нагрузка растет, нужно масштабироваться. Вариантов решений много, например:
распараллелить код
реализовать обработку пачками
поднять второй экземпляр приложения
Сможет ли ваш ИИ поддерживать такую кодовую базу, если вообще удастся все реализовать?
Недавно у меня возникла необходимость переписать код, реализовав обычную batch обработку событий. В итоге мой код прошел 3 итерации, чтобы оказаться достаточно читабельным. И еще пришлось исправить после себя 2 бага, к счастью, замеченных самостоятельно при тестировании. И даже с учетом стараний сделать код как можно понятней, он все равно заметно усложнился. Сможет ли ИИ дорабатывать такой оптимизированный код?
А что если все сложнее, и у нас есть партиционирование, шардирование, асинхронное взаимодействие внутри сервиса и снаружи, проблемы с порядком сообщений от внешних систем и необходимость реализации идемпотентности этих сообщений?
Observability
Любое приложение может начать тормозить, упасть. Да что угодно с ним может случится. И нужно как-то его мониторить и отлаживать. В итоге нужно как минимум настроить логирование. А лучше еще и дашборды, метрики, алерты, отправку уведомлений по разным каналам.
И получается, что даже для одних логов нужно продумать, что именно логировать, на каком языке, какие параметры выводить, какие данные маскировать. А еще прикрутить трассировку, сохранить контекстные переменные. А также нужно найти баланс между понятностью действий и доступным объемом хранилища под логи. И это все нужно будет описать в промпте.
Потенциальные проблемы
Напишу несколько примеров возможных проблем, о которых тоже надо думать:
утечки памяти
рекурсии и переполнение стека
не оптимальные синхронизации при параллельном выполнении и взаимные блокировки
не закрытые соединения с БД и другие ресурсы
безопасность (SQL инъекции, сетевые доступы, пароли и т.п.)
Возьмем, например, утечку памяти. Статический анализ кода далеко не всегда даст ответ, где зарыта проблема. Тут уже нужно подключать профайлер и смотреть самому. Конечно, будущие ИИ помощники, возможно, смогут и в этом помочь. Но вряд ли в ближайшее время мы их увидим, еще и под каждый стек технологий.
Если подвести итог, использование ИИ без программиста - это небольшая программа, желательно с нуля, очень четко описанная (это надо еще суметь), типовая, на популярном языке и технологиях, не требующая особого масштабирования, не критичная по безопасности, от нее не зависит здоровье, деньги и подобные вещи, ее не нужно будет дорабатывать, т.к. легко сломать новыми требованиями и потом не восстановить, не требующая особого тестирования (или нужен тестировщик), вы не боитесь за свою репутацию или приложение не делает ничего особо полезного, чтоб пользователи могли без особых последствий и негатива прекратить использование вашей программой, если она плохо работает.
В итоге получаем что-то очень ограниченное. Какой-нибудь пет-проект, программа для универа, тестирование небольшой идеи, типовая задача, маленькая утилита, кусок независимого кода и т.п. С развитием нейросетей можно будет генерировать более объемные программы. Но все остальное, как мне кажется, решить будет очень сложно.
Это все касалось проектов и сложности, связанной с ними. Но есть еще вопросы, на которые тоже хотелось бы иметь ответы.
Через сколько лет?
Сейчас генеративные нейросети только развиваются. Где-то они нашли свое применение, но во многих сферах еще остается неопределенность. И разработка программ как раз одна из таких сфер. Еще не понятно, на что в итоге будут способны нейросети через год, пять, десять, и какие инструменты будут созданы на их основе.
Поэтому, я считаю, сильно заморачиваться наперед не стоит. Становление и внедрение новых технологий - вопрос многих лет, а иногда десятилетий. За это время можно успеть обучиться профессии, поработать и успеть ее сменить.
В период неопределенности и паники всегда кто-то будет кричать "все пропало" и предрекать худшее, находить причины проблем во всем, что слышит. Но мы с вами более рациональные люди. Мы видим, что многие задачи даже с самыми крутыми на данный момент ИИ невозможно решить. И я думаю, что большинство из них и дальше будут решаться людьми.
Конечно, иногда может казаться, что уже и ждать не надо – вон, кто-то уже не нанимает новых разработчиков, потому что увеличил производительность на 30%. Но знаете, один из моих бывших начальников и до ИИ рисовал красивые метрики и отчитывался о кратном росте производительности.
На каких этапах разработки?
Написание программ – это ведь не только про код. Например, у вас могут быть следующие этапы решения задач:
переговоры с заказчиками
обсуждение требований и вообще необходимости задачи
договориться об интеграции с другой командой и согласовать контракт взаимодействия
анализ задачи и описание спецификации
тест-кейсы
написание самого кода и тестов
тестирование и отладка
код ревью, исправления, решение конфликтов при вливании кода в репозиторий
тестирование, включая интеграции, регресс тесты и, возможно, тесты на производительность
исправление возникших багов на этапе тестирования и в проде
мониторинг приложения, поддержка, консультации
Сейчас, когда говорят про "ИИ заменит программистов", упоминают написание кода и тестов. Но, как видно, это лишь один из этапов создания программ. Где-то в компаниях есть аналитики, тестировщики, девопсы и SRE, и тогда в некоторых этапах программист не участвует, а написание кода – заметный процент его работы. А где-то программист выполняет сразу все задачи, от начала и до самого конца. Но в любом случае, кому-то придется делать все этапы работы. Как вы должности не называйте, все равно по факту нужен будет человек с навыками программиста.
Кроме этого, в обязанности могут входить и другие активности:
сбор требований со всех заинтересованных сторон для построения правильной архитектуры
разработка полностью новых алгоритмов, нестандартных решений
менторство и обучение
проведение собеседований
разбор инцидентов и восстановление приложений после падений
анализ дампов, логов, профилирование
принятие решений по проекту с учетом компромисов
определение технологического стека, аргументация
поиск и приоритизация тех. долга
В чем из всех этапов и задач ИИ может заменить программиста? Наверно, в чем-то ограниченно может. Но, в любом случае, без программиста никак.
Какими навыками должен обладать не-программист?
Представим, что нас таки заменили. И вот пришел не-программист, который способен с помощью ИИ генерировать программы. Но он же тоже не только промпты должен писать. Он должен разбираться в куче вещей, чтобы запрашивать то, что нужно, и понять, что ему выдает нейросетка. И в первую очередь должен разбираться в разработке программ. Потому что, как говорится, чтобы задать правильный вопрос, нужно знать большую часть ответа. Т.е. мы не можем взять первого попавшего человека.
Отсюда следует, что человек должен знать технологии, уметь анализировать требования и четко ставить задачу, разбираться в инфраструктуре, уметь читать и понимать код, знать алгоритмы, знать способы оптимизации и так далее. В итоге мы приходим к тому, что нам нужен программист.
Программист - это ведь не только про само написание кода. Мы берем требования на человеческом языке и интерпретируем их таким образом, чтобы учесть различные детали, без которых приложение нормально не заработает. Мы настраиваем тестовое окружение и проверяем работоспособность приложения. Мы разбираемся, что делает код, и насколько это соответствует ожидаемому. Мы понимаем, когда код работает не оптимально, и можем сказать, когда это нормально. Мы пользуемся инструментами отладки, профилирования, мониторинга, а перед этим все это настраиваем. Мы проверяем работу других, чтобы код в репозиториях можно было поддерживать, чтобы он не скатился к big ball of mud. Мы определяем единые стандарты и подходы к написанию кода на проекте, потому что это потом кто-нибудь будет читать. Мы определяем баланс и приоритеты по скорости выполнения, занимаемой памяти, нагрузке на БД и др., так как сделать идеально по всем параметрам невозможно. Мы понимаем, когда требования на входе - дерьмо, и их не надо внедрять, и мы, осознавая последствия, можем сказать об этом или даже будем вовсю переубеждать инициаторов. Мы собеседуем других разработчиков и обычно понимаем, кто разбирается в своем деле и будет приносить пользу проекту. Мы проявляем инициативу, сами предлагая улучшения или исправления проблем. И самое главное - мы мыслим.
Я считаю, что мы и дальше будем нужны. Да, в каких-то сферах и проектах и правда смогут сократить разработчиков. Но в целом профессия не вымрет, а, скорее, будет и дальше процветать. Просто может измениться характер работы и количество выдаваемого результата. И это зависит от многих факторов в начале статьи.
По моему мнению, ИИ - всего лишь еще один инструмент, который повысит эффективность создания программ. Нейросети в текущем виде, какими бы сложными они ни были, всего лишь тупые исполнители. Они не имеют критического мышления, они не сомневаются и не пытаются что-то оспорить. Они не делают ничего самостоятельно. И для такого инструмента нужен человек, который будет говорить, что нужно сделать, а потом проверит работу. Как рабочие настраивают станки и изготавливают детали, а затем проверяют их. Только в случае с ИИ пока даже нет такого стабильно хорошего результата на выходе. А если и будет, то это всего лишь упростит работу оператора – программиста.
Так что любое такое ПО — всего лишь помощник, все задачи закрыть он не сможет, и мыслить также не сможет. Конечно, если б существовал настоящий искусственный интеллект, это бы сильно изменило ситуацию. Но его пока нет и не факт что будет. А пока что ИИ — инструмент для программиста, а не замена программиста.