Использование больших языковых моделей (LLMs) в программировании открывает огромные перспективы, но также обнажает давние недостатки программного обеспечения: код, который является запутанным, сложным для безопасного изменения и часто непрозрачным в отношении того, что происходит под капотом.
Исследователи из Лаборатории компьютерных наук и искусственного интеллекта MIT (CSAIL) намечают более «модульный» путь вперёд. Их новый подход разбивает системы на «концепции» — отдельные части системы, каждая из которых предназначена для выполнения одной задачи, и «синхронизации» — явные правила, описывающие, как эти части взаимодействуют друг с другом.
Результат — более модульное, прозрачное и лёгкое для понимания программное обеспечение. Небольшой предметно-ориентированный язык (DSL) позволяет просто выразить синхронизации в форме, которую LLMs могут надёжно генерировать.
В реальном исследовании команда показала, как этот метод может объединить функции, которые в противном случае были бы разрознены по нескольким сервисам.
Команда, в которую входят профессор электротехники и информатики (EECS) и заместитель директора CSAIL Дэниел Джексон и аспирантка EECS, сотрудник CSAIL Игон Менг, разработчик нового DSL для синхронизации, рассматривают этот подход в своей статье «What You See Is What It Does: A Structural Pattern for Legible Software». Они представили её на конференции Splash в Сингапуре в октябре.
Проблема фрагментации функций
Вызов, как объясняют исследователи, заключается в том, что в большинстве современных систем одна функция никогда не является полностью автономной. Добавление кнопки «Поделиться» в социальную платформу, такую как Instagram, например, не ограничивается одним сервисом. Его функциональность разделена между кодом, который обрабатывает публикацию, уведомления, аутентификацию пользователей и многое другое.
Все эти части, несмотря на то что они разбросаны по коду, должны быть тщательно согласованы, и любое изменение может привести к непредвиденным побочным эффектам в других местах. Джексон называет это «фрагментацией функций» — центральным препятствием на пути к надёжности программного обеспечения.
Концепции и синхронизации призваны решить эту проблему. Концепция объединяет единую, согласованную часть функциональности, такую как обмен, лайки или подписка, вместе с её состоянием и действиями, которые она может выполнять. Синхронизации, с другой стороны, описывают на более высоком уровне, как эти концепции взаимодействуют.
Вместо написания запутанного низкоуровневого кода интеграции разработчики могут использовать небольшой предметно-ориентированный язык, чтобы чётко сформулировать эти связи. В этом DSL правила просты и понятны: действие одной концепции может запустить другую, так что изменение одного состояния может быть синхронизировано с другим.
Преимущества
«Думайте о концепциях как о модулях, которые полностью чисты и независимы. Синхронизации тогда действуют как контракты — они точно описывают, как концепции должны взаимодействовать. Это мощно, потому что упрощает понимание системы людьми и облегчает правильную генерацию инструментов вроде LLMs», — говорит Джексон.
Преимущества выходят за рамки ясности. Поскольку синхронизации являются явными и декларативными, их можно анализировать, проверять и, конечно, генерировать с помощью LLM. Это открывает двери для более безопасной и автоматизированной разработки программного обеспечения, где ИИ-ассистенты могут предлагать новые функции без введения скрытых побочных эффектов.
В своём исследовании учёные назначили такие функции, как лайки, комментарии и обмен, каждой отдельной концепции — подобно архитектуре микросервисов, но более модульной. Без этого шаблона эти функции были распределены по многим сервисам, что затрудняло их поиск и тестирование. Используя подход «концепции и синхронизации», каждая функция стала централизованной и понятной, а синхронизации чётко описывали, как взаимодействуют концепции.
Исследование также показало, как синхронизации могут выделить общие проблемы, такие как обработка ошибок, форматирование ответов или постоянное хранение. Вместо того чтобы встраивать эти детали в каждый сервис, синхронизация может обрабатывать их один раз, обеспечивая согласованность всей системы.
Более продвинутые направления также возможны. Синхронизации могут координировать распределённые системы, поддерживая согласованность реплик на разных серверах или позволяя совместно используемым базам данных взаимодействовать чётко. Ослабление семантики синхронизации может обеспечить согласованность в конечном итоге, сохраняя при этом ясность на архитектурном уровне.
Потенциал для культурного сдвига
Джексон видит потенциал для более широкого культурного сдвига в разработке программного обеспечения. Одна из идей — создание «каталогов концепций», общих библиотек хорошо протестированных, предметно-ориентированных концепций. Разработка приложений тогда станет не столько сшиванием кода с нуля, сколько выбором правильных концепций и написанием синхронизаций между ними.
«Концепции могут стать новым видом высокоуровневого языка программирования, а синхронизации — программами, написанными на этом языке», — говорит Джексон.
«Это способ сделать связи в программном обеспечении видимыми, — говорит Джексон. — Сегодня мы скрываем эти связи в коде. Но если вы можете увидеть их явно, вы можете рассуждать о программном обеспечении на гораздо более высоком уровне. Вам всё равно придётся иметь дело со сложностью взаимодействия функций. Но теперь она открыта, а не разрознена и скрыта».
«Создание программного обеспечения для использования человеком на основе абстракций от базовых вычислительных машин обременило мир программным обеспечением, которое слишком часто является дорогостоящим, разочаровывающим и даже опасным для понимания и использования», — говорит доцент Университета Вирджинии Кевин Салливан, который не участвовал в исследовании.
«Воздействие (например, в здравоохранении) было разрушительным. Менг и Джексон переворачивают сценарий и настаивают на создании интерактивного программного обеспечения на основе абстракций человеческого понимания, которые они называют „концепциями“», — добавляет Салливан.
«Исследование было частично профинансировано Инициативой по применению машинного обучения (MLA) CSAIL Alliances. В то время в совет директоров входили British Telecom, Cisco и Ernst and Young», — говорится в статье.
1. Какие проблемы в программировании решает подход «концепции и синхронизации»?
Подход «концепции и синхронизации» решает проблему фрагментации функций в программном обеспечении. В большинстве современных систем одна функция никогда не является полностью автономной, и добавление новой функции может привести к непредвиденным побочным эффектам в других местах. Концепции и синхронизации призваны упростить понимание системы людьми и облегчить правильную генерацию инструментов вроде LLMs.
2. Как концепции и синхронизации помогают упростить разработку программного обеспечения?
Концепции объединяют единую, согласованную часть функциональности вместе с её состоянием и действиями. Синхронизации описывают на более высоком уровне, как эти концепции взаимодействуют. Вместо написания запутанного низкоуровневого кода интеграции разработчики могут использовать небольшой предметно-ориентированный язык, чтобы чётко сформулировать эти связи. Это упрощает понимание системы и облегчает генерацию инструментов вроде LLMs.
3. Какие преимущества даёт использование предметно-ориентированного языка для синхронизации?
Использование предметно-ориентированного языка для синхронизации позволяет разработчикам чётко формулировать связи между концепциями. Это упрощает понимание системы, облегчает генерацию инструментов вроде LLMs и открывает двери для более безопасной и автоматизированной разработки программного обеспечения.
4. Как подход «концепции и синхронизации» может повлиять на культурный сдвиг в разработке программного обеспечения?
Джексон видит потенциал для более широкого культурного сдвига в разработке программного обеспечения. Одна из идей — создание «каталогов концепций», общих библиотек хорошо протестированных, предметно-ориентированных концепций. Разработка приложений тогда станет не столько сшиванием кода с нуля, сколько выбором правильных концепций и написанием синхронизаций между ними. Это может сделать разработку программного обеспечения более эффективной и надёжной.
5. Какие перспективы открывает использование больших языковых моделей в программировании?
Использование больших языковых моделей в программировании открывает огромные перспективы, но также обнажает давние недостатки программного обеспечения. Подход «концепции и синхронизации» позволяет более эффективно использовать большие языковые модели для генерации кода и упрощения разработки программного обеспечения. Это может привести к созданию более модульного, прозрачного и лёгкого для понимания программного обеспечения.