Если вы, как и я, являетесь инженером-программистом, то, несомненно, слышали, что наши дни сочтены. Искусственный интеллект (ИИ) наконец-то способен писать код и, следовательно, заменит нас всех. Мы проиграли. По крайней мере, именно так утверждают самые “пророческие” и кликбейтные заголовки на эту тему.

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

Грядущие события  —  как для ИИ, так и для таких инженеров, как мы,  —  вероятно, будут не такими уж черно-белыми, как об этом твердят новостные заголовки. Возможно, мы станем свидетелями каких-то положительных сдвигов, если только примем изменения (до сих пор инженеры всегда принимали их).

Поэтому моей целью является не борьба с заголовками. Я лишь разбавлю их небольшой долей реализма.

Программисты не только пишут код

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

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

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

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

Дело в том, что программное обеспечение не существует в абсолютном вакууме. В конечном итоге оно используется в контексте жизни человека для удовлетворения его потребностей. Здесь, пожалуй, и кроется самая главная причина того, почему работа инженеров не сводится только к написанию кода. Для успеха программного продукта необходимо множество других действий, и эти действия должны “вплетаться” в код и оказывать на него определенное влияние.

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

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

Программная инженерия всегда развивалась

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

Но я уверен, что ИИ не лишит нас необходимости писать код, и уж точно не лишит потребности понимать код.

В 1980-х годах я писал код на языке Assembly  —  вручную. С тех пор новые языки и средства разработки значительно повысили производительность программирования. В некоторых отраслях код уже генерируется за нас.

И все же я по-прежнему пишу код.

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

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

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

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

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

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

Код по-прежнему нужен

Стоит отметить, что генерация кода ИИ не обещает появления искусственного интеллекта общего назначения (AGI), то есть чего-то, что понимает и непосредственно выполняет каждое наше желание.

Речь идет просто об использовании ИИ в качестве инструмента для создания кода, который будет выполняться конкретным механизмом (не ИИ). По крайней мере, так обстоит дело на данный момент. Поэтому в конечном результате все равно будет код. А это означает, что все равно нужно задействовать определенное количество инженеров для каких-либо целей.

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

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

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

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

Несколько фактов о коде, который генерирует ИИ

Что же касается кода, который генерирует ИИ, то давайте немного отвлечемся от громких заголовков.

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

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

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

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

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

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

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

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

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

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

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

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

Возможности для унаследованных систем

К счастью, уже есть множество проектов, над которыми люди не хотят работать, и в данном случае ИИ может стать реальным помощником.

Я имею в виду масштабные миграции и модернизации унаследованных систем. Эти проекты, напоминающие “гонки на выживание”, наконец-то ускорятся благодаря ИИ.

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

Инженеры всегда находятся в процессе развития

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

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

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

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Ian Cackett: Why AI Code Generation Doesn’t Spell the End for Software Engineers

Предыдущая статьяРазветвление вселенной UI
Следующая статьяТест-драйв Solara для разработки веб-приложений на Python