Программирование в большом и программирование в малом
Программирование в большом и программирование в малом — понятия в инженерии программного обеспечения, обозначающие два различных аспекта разработки программного обеспечения. Программирование в большом подразумевает проектирование крупной системы как совокупности меньших составляющих, тогда как программирование в малом — создание этих составных частей посредством программирования на языке программирования.
Термины были введены Фрэнком ДеРемером и Хансом Кроном в их статье 1975 года «Programming-in-the-large versus programming-in-the-small»[1], где авторы утверждали, что это по сути разные виды деятельности: обычные языки программирования и практика структурного программирования хорошо подходят для «программирования в малом», но не решают задачи «программирования в большом». Для программирования в большом, по мнению авторов, требуется специальный «язык межмодульных связей» (MIL), обеспечивающий надёжное объединение модулей, сокрытие информации и проверку согласованности[2].
Эти понятия соотносятся с более поздней дихотомией Остерхаута, которая различает языки системного программирования (для компонентов) и языки сценариев (для связующего кода).
Теоретические основы
Фред Брукс отметил, что процесс создания индивидуальной программы существенно отличается от создания «программного системного продукта»[3]. Первая обычно выполняет одну относительно простую задачу, разрабатывается одним инженером, является законченной и готова к запуску в среде разработки; на неё затрачено немного времени. Такую деятельность ДеРемер и Крон определяют как программирование в малом.
Иначе обстоит дело с проектами создания программных систем (по определению Брукса): в них участвуют средние или большие промышленные команды, работают над проектом от нескольких месяцев до лет. Проект зачастую состоит из множества (иногда сотен) отдельных модулей, по сложности сравнимых с индивидуальными программами, описанными выше, но каждый модуль определяет интерфейс взаимодействия с другими модулями.
Брукс описывает, что подобные проекты ведутся как формальные работы с применением лучших отраслевых практик, включают тестирование, документирование, постоянное сопровождение, а также обеспечение обобщённости продукта — его работоспособности в разных условиях и на различных системах, отличных от среды разработки.
В рамках этой концепции Брукс (в книге «Мифический человеко-месяц») приводит матрицу эволюции, описывающую переход от простой программы к программному системному продукту с соответствующим ростом трудоёмкости. Если базовая стоимость разработки простой программы принимается за единицу (1x), то создание программного продукта (протестированного и задокументированного) увеличивает затраты в 3 раза. Разработка конечного программного системного продукта, объединяющего характеристики программного продукта и программной системы, требует в 9 раз больше трудозатрат по сравнению с базовой программой[4].
Программирование в большом
В разработке программного обеспечения программирование в большом может означать разработку программ большими коллективами либо небольшими группами на протяжении долгого времени[3]. Любое из этих условий приводит к созданию больших и сложных программ, сложно понимаемых сопровождающими.
При программировании в большом руководители разработки делают акцент на разбиении работы на модули с чётко определёнными взаимодействиями[5], что требует тщательного планирования и документирования.
Изменение таких программ может быть затруднено[3]. Изменения, затрагивающие границы модулей, могут потребовать пересмотра работы многих участников. Поэтому одной из целей программирования в большом является организация таких модулей, которые не придётся изменять при ожидаемых корректировках системы. Этого достигают за счёт проектирования модулей с высокой когезией и слабой связанностью.
Программирование в большом требует управленческих навыков: построение абстракций здесь направлено не только на описание работоспособного решения, но и на управление деятельностью всей команды[5].
Термин был введён Фрэнком ДеРемером и Хансом Кроном в их статье «Programming-in-the-Large Versus Programming-in-the-Small», IEEE Trans. on Soft. Eng. 2(2), 1975[5][6].
Согласно их работе, ключевое различие между этими подходами заключается в том, что программирование в большом представляет собой создание крупных систем из множества независимых модулей, тогда как программирование в малом — это написание самих этих модулей. Для объединения модулей в единое целое, формальной фиксации архитектуры и проверки её согласованности в рамках программирования в большом необходим специальный «язык межмодульных связей» (Module Interconnection Language, MIL), в то время как для программирования в малом используются обычные языки программирования. Кроме того, крупные системы создаются усилиями множества людей, а отдельные модули разрабатываются так, чтобы их логика была полностью понятна одному человеку[5][6].
Инструменты и технологии
В терминах информатики программирование в большом часто связано с созданием кода, реализующего логику переходов между состояниями системы (например, когда нужно ждать сообщений, посылать сообщения, компенсировать неудавшиеся не-ACID транзакции и т. д.). Для управления длительными бизнес-транзакциями применяется паттерн Saga, который разделяет операцию на последовательность локальных транзакций и использует компенсирующие транзакции при сбоях[7].[8].
На смену языкам, созданным с расчётом на программирование в большом (таким как BPEL), пришли современные платформы оркестрации — Temporal, AWS Step Functions и Camunda[9].
Важную роль в контрактном программировании играют современные языки описания интерфейсов (IDL), такие как OpenAPI и gRPC. Они определяют строгие границы ответственности и форматы взаимодействия между компонентами распределённых систем[10][11].
Для описания и документирования программной архитектуры применяются специализированные инструменты моделирования на базе модели C4 (например, Structurizr), реализующие подход «архитектура как код»[12].
Программирование в малом
В разработке программного обеспечения программирование в малом обозначает написание небольшой программы — по размеру исходного кода, обычно легко формализуемой, быстрой в реализации и решающей одну или несколько тесно связанных задач.
Программирование в малом чаще осуществляется индивидуально или малыми группами за короткий срок и зачастую сопряжено с менее формализованным процессом (например, меньшее внимание к документированию и тестированию), выбором инструментов и языков программирования (например, предпочтение слабо типизированного языка сценариев вместо строго типизированного языка). Такой подход характерен и для прототипирования программ или приоритетного быстрого развития приложения над стабильностью и корректностью.
В информатике программирование в малом связано с краткосрочным поведением программ, обычно выполняющихся в рамках одной ACID-транзакции и работающих с локальными ресурсами — файлами, базами данных и т.д.
Развитие генеративного искусственного интеллекта и инструментов автодополнения кода привело к росту автономности ИИ-агентов в задачах программирования в малом. Несмотря на расширение возможностей ИИ-ассистентов, полная автоматизация рутинных задач пока не достигнута. Искусственный интеллект способен генерировать код и исправлять баги, однако часто не понимает причин их возникновения и может создавать собственные ошибки. В результате человек по-прежнему остаётся необходимым звеном в цикле разработки: участие разработчика критически важно для управления контекстом, оценки рисков, контроля безопасности и поддержания качества кода[13]..
Примечания
Литература
- DeRemer, Frank; Kron, Hans (1975). “Programming-in-the large versus programming-in-the-small”. Proceedings of the international conference on Reliable software [англ.]. Лос-Анджелес, Калифорния: Association for Computing Machinery: 114—121. DOI:10.1145/800027.808431. Дата обращения 2024-06-15.
|access-date=требует|url=(справка)