()Вот вот.
Однако код, созданный нейросетью, не всегда имеет практическую пользу
В этом то весь и смысл, точнее пока отсутствие этого смысла. Если в продукции ИИ нет пользы - это не ИИ - это балабол! Обезьяна, которая стучит по печатной машинке, просто у неё красивые буковки получаются. Даже слон, рисующий хоботом картины, и то полезнее.
Deep TabNine. Решение задействует искусственный интеллект, чтобы завершать строки кода
Вот от этого проекта хоть прок есть.
А вообще я уже несколько лет задумываюсь - как ИИ может помогать в программировании! И Это действительно сложный вопрос, если ставить его в рамках текущих возможностей и принципах функционирования информационных систем с ИИ. И даже если их экстраполировать на несколько десятилетий вперёд - особо ничего крутого, что мог бы сделать ИИ в программировании (кроме дописывания уже начатого кода), не приходит. Но, тем не менее с десяток пунктов я набрал, которые считаю вполне реализуемыми к середине XXI века:
1. Уже упомянутая помощь в дописывании кода - в основном циклов, условий ветвления, и иных повторяющихся паттернов - например последовательного (но не обязательно, но уже повторяющегося, хоть в разных местах) свойств объектов, вызов их методов. Когда в проекте над рядом объектов совершаются однотипные действия ИИ мог бы ускорять их ввод. А программисту нужно было бы только вносить небольшие корректировки. Например, если в форме нужно настроить ряд интерфейсных элементов - то код может быть очень монотонным - ИИ мог бы его помогать автоформировать
2. Полиморфная автогенерация кода - когда программист передаёт на вход входные объекты, и назначает применение какого-то паттерна, методики, шаблонного алгоритма (в т.ч. полученного на основе анализа уже написанного ранее кода) - ИИ применяет его к этим объектам и адаптирует. Например, так можно было быстро генерировать базовые алгоритмы, скажем, для печатных форм, для отражения в учёте, для заполнения по структуре данных и т.п. Суть именно в том, что ИИ быстро смог бы осваивать новые паттерны и шаблонные алгоритмы, и адаптивно их применять к новых входным структурам. А программисту в конце останется только внести корректировки по необходимости
3. Выправление стилистики кода, или применение к уже написанному коду каких-то паттернов или иных исправлений. Механизм машинного обучения позволяет ИИ понимать логические отличия в двух немного разных алгоритмах об одном и том же – чтобы видеть конструктивную разницу, не вдаваясь в детали конкретных идентификаторов и последовательностей/вложений расположения функциональных блоков программного кода – тем самым, определять, как из один вид алгоритма превращать в другой вид. Это применительно и к автогонерируемому коду – когда программист постоянно вносит в него правки – ИИ может со временем научиться понимать их «смысл» и «причины» - и тоже уметь их вносить (сразу при автогенерации или по команде – с выбором варианта правок).
4. ИИ может выполнять (да и уже выполняет в продвинутых IDE) анализ уже написанного кода с целью выявления в нём ошибок, неоптимальных последовательностей действий, устаревших паттернов. И предлагать для них автоисправления
5. Продолжая тему анализа – следующее, что мог бы делать ИИ – это авто исправления банальных ошибок, прямо «на лету» (при вводе кода). Причём с глубоким анализом, например, опечаток. Когда – неправильно написана переменная, или имя модуля – ИИ мог бы сам найти правильную (по нечёткому сопоставлению имени, или по иной сигнатуре использования). При этом он мог бы помнить о таких исправления и если в друг позже такое имя появится – то мог бы предупредить программиста о проведённых автозаменах и что, возможно они были не нужны (опечатка могла быть в исходных именах переменных, а не в местах использования)
6. Оптимизация алгоритмов – это то, ради чего ИИ-технологии сейчас активно развивают в IDE – ИИ мог бы не просто находить некорректные участки кода или неоптимальные/устаревшие паттерны программирования. ИИ мог бы производить (да и, собственно, уже производит) полную оптимизацию всего кода – как на уровне исходного кода, так и на уровне выходного (при компиляции). Тут очень много перспектив для развития ИИ. От автооптимизации. До советов программисту – как изменить его алгоритм, чтобы он стал лучше (ну там банальное развёртывание хвостовой рекурсии в циклы, или оптимизация работы с коллекциями, в т.ч. рекомендации по введению «индексов» для этих коллекций и т.п. – тут очень много что могут предложить технологии ИИ программисту). Добавлю, что оптимизировать можно не только алгоритмы, но структуры данных или классов
7. Автотестирование – так же ИИ может помочь в составлении и проведении автотестов алгоритмов
8. ИИ может активно помогать в наборе кода – давая интеллектуальные подсказки по применению тех или иных паттернов, выводя в ТОП списка Быстрой подсказки (или в иных окнах IDE) подходящие операторы/объекты/шаблоны – наиболее востребованные по текущему контексту) – тем самым сокращая их поиск/набор программистом. В том числе, сюда я отношу и поиск готовых паттернов по текстовым запросам (что-то типа GutHub GIST или FastCode 1C) прямо в IDE. При этом такие шаблоны могут быть параметризированы – а ИИ может интеллектуально находить в контексте подходящие для них переменные и константные значения параметров – для автоподстановки в шаблон паттерна)
9. ИИ может осуществлять автогенерацию алгоритмов по декларативным структурам или более высокоуровневым алгоритма. Я тут говорю о том, что программист может описывать желаемую концепцию решения задачи более декларативно и боле абстрактно (чем сейчас, в т.ч. применяя квазиязык, строя разные схемы, заполняя настройки шаблонов) – а ИИ уже на основе такого обобщённого высокоуровневого описания желаемых действий (над указанными в них данными) уже генерировал бы более низкоуровневых код алгоритмов, с большей привязкой именно к возможностям фреймворка конечной платформы назначения и аппаратные заморочки. То есть, я говорю, о дальнейшем развитии идеи управляемых языков программирования (как JavaScript, Python, 1C, SQL – последний ближе всего к сути идеи) – кода программист лишь описательно декларирует что ему нужно сделать над данными – а уже ИИ, анализирует весь контекст этого описания и на контекст фактического места и целей применения, и производит генерацию кода исполнения этих действий на более «машинном» (бинарно-чётком) языке, производя необходимую оптимизацию, в т.ч, опирающуюся на статистику (в т.ч. обрабатываемых данных) и машинное обучение. Программист не вдаётся в детали этой реализации. Например, он может указать, что ему нужно сопоставить несколько коллекций, по заданным правилам и фильтрам, произвести конвертацию некоторых свойств, а результат поместить в другую таблицу (если его там нет) – на описание этого понадобится десять строчек – а ИИ уже будет генерировать все вложенные циклы перебора, сопоставления, применения фильтров, и, при необходимости, внесёт индексы, произведёт распараллеливание выполнения – в итоге сгенерировать сотни строк кода (а вместе с интеллектуально подобранными вызовами библиотек – будет использовать тысячи/десятки тысяч строк кода)
И ещё – хоть я выше упомянул, что язык SQL сам по себе уже является примером декларативного языка. Но это не означает, что над ним нельзя построить ещё более описательные структуры. Банальный пример таких структур – это 1С Система компоновки данных. Вот в таком духе я и имею в виду дальнейшее развитие декларативного программирования. Но это в виде схем; а ещё я продвигаю идею создания более высокоуровневых языков программирования (6-го поколения) – которые были бы чем-то похожи на SQL (но более современные и широкие по возможностям) – то есть, обобщённо описывали бы, что нужно сделать над данными, не в даваясь в детали реализации того, как это нужно сделать. А уже ИИ даллее бы анализировал бы это обобщённое описание – и генерировал бы уже конкретную реализацию выполнения.
Так же этот пункт нуждается ещё в одном замечании. Выше я написал «бинарно-чётком» языке – т.е. я имел в виду язык, реализующий двоичную логику на платформенны (в т.ч. аппаратных) возможностях и особенностях исполнения алгоритмов. Сейчас большинство языков программирования такие. Но есть языки, реализующие нечёткую логику (для квантовых компьютеров), например OpenQASM, Q#, Quipper и другие). Так вот, в будущем (может к концу века) – такая автогенерация будет осуществляться и языки, реализующие нечёткую логику, для исполнения на квантовых компьетрах. Но человеку достаточно сложно писать на них программы. И тут ИИ вполне может помочь. Хотя нечёткая логика может быть и в исходных алгоритмах – но её всё-равно нужно будет конвертировать из поля-понятного проогаммисту (и заказчику), в поле-понятное компьютеру – какая бы архитектура у него не была бы
10. ИИ может выполнять статистический анализ выполнения кода, а также его отладку в рантайм (пока программист «спит») – то есть, анализировать ход выполнения уже написанного кода, сопоставлять его с обрабатываемыми данными, выявлять узкие и неоптимальные места, или, небезопасные/ошибочные места. В общем – накапливать реальную статистику выполнения программы. И вырабатывать пути оптимизации таких алгоритмов или архитектуры (например – вводя или отменяя распараллеливание алгоритмов, индексацию, меняя потерны алгоритмов и задействованные объекты). Конечно, в большинстве случае – в результате такой работы будут лишь подготовлены рекомендации для программиста по внесению таких изменений – делать или нет – это уже пусть сам решает изменять или нет эти алгоритмы. Но для автогенерируемого кода – ИИ может сразу его перестраивать, не дожидаясь, когда программист «проснётся» (ведь не он же его изначально писал, это код был сразу сгенерирован ИИ, поэтому он может в любой момент его «переиначить», следя за статистикой изменения ситуации в которой этот алгоритм работает)
Вот как-то так я вижу развитии ИИ в программировании. То есть – это не замена программиста. Это, скорее интеллектуальное ассистирование и анализ, в крайнем случае – кодирование по заданным правилам и прямым формализованным целеуказаниям. Тем самым я пока не верю в то, что ИИ в обозримом будущем сможет писать код по не очень чётко формализованным ТЗ (а чётко формализованные ТЗ можно отнести к пункту 9.). Соответственно, программисты ещё будут очень даже нужны и востребованы. Просто ИИ сможет несколько разгрузить их от рутины, повысив скорость набора кода, его качество и производительность. А сами программисты смогут сосредоточиться на более творческих, прикладных (задач бизнес-логики), или на продумывании более сложных схем обработки данных и интерфейсов взаимодействия.
В конце ещё добавлю. Что для ИИ так же крайне важны будут как процессы обучения – натаскивания на паттернах, базах знаний, программном коде и т.п. То есть - машинное обучение. Так и консолидация информации в базах знаний. Причём, не только локальной, но глобальной – тем самым накопленные знания и статистика будут нарастать как снежный ком, летящий кубарём с горы, только этих комов-знаний будут миллионы и лететь они будут с сотен тысяч гор. А масса знаний будет единой для всех. Но… тут могут встать проблемы правового толка, конфиденциальности и интеллектуальной собственности. Надеюсь, юристам в недалёком будущем это удастся эффективно решить не в ущерб ИИ. Ведь чем он будет умнее – тем выше будет его эффектность – и это даст высокие преимущества всем! Но разрешат ли всем в мире иметь единое преимущество? Но это уже глобальная политика… хотя, так как, программисты тут по-прежнему являются лучевым интеллектуальным звеном – то их индивидуальное участие в каждом конкретном проекте так и останется персональным/локальным преимуществом (или балластом – это уж как повезёт с людьми) конкретного предприятия – его интеллектуальным активом
P.S.
Буду рад - если кто-то предложит что-то ещё, как можно было бы применить ИИ в средине XXI века.
Так же буду рад конструктивной критике, замечаниям или поддержке данных идей.
Если тема будет интересна - то может напишу отдельную статью с более детальным повествованием на конкретных примерах