Перейти к основному содержимому

Языки конструирования программных систем

Разработчику Архитектору Аналитику

«Язык» шире, чем Java или Python

На курсе «конструирование ПО» слово язык часто путают только с языком программирования. В SWEBOK и на практике под языками конструирования понимают все нотации, в которых вы выражаете и собираете решение: код, схемы, контракты API, конфиги CI.

Если вы только начинаете

Вы думаетеНа самом деле
«Язык = Python»Python — язык программирования; рядом почти всегда SQL, YAML, OpenAPI
«Диаграмма — для отчёта»UML/C4 — язык проектирования; чертёж для команды
«OpenAPI — документация потом»OpenAPI — язык спецификации; по нему пишут тесты и mocks до кода
docker-compose.ymlЯзык конфигурации — часть конструирования, без него код не доедет до staging

Представьте релиз одной фичи «оплата заказа». За неделю команда трогает:

  • TypeScript — handler и доменная логика;
  • OpenAPI — контракт POST /orders/{id}/pay;
  • SQL — миграция таблицы payments;
  • YAML — job в CI и переменные staging;
  • Mermaid / C4 — схема потока в ADR.

Всё это — языки конструирования: разные нотации, одна стадия SDLC — выражение и сборка решения. Учебники выделяют несколько классов; в индустрии они переплетены в одном репозитории и одном pull request.

КлассВопрос, на который отвечаетИсполняется?
ПрограммированияКак алгоритм работает на машинеДа (компилятор/интерпретатор)
ПроектированияИз чего состоит системаНет (чертёж для людей)
Спецификации / контрактовЧто обязан делать интерфейсЧастично (валидация, codegen)
Конфигурации / сборкиКак собрать и развернутьДа (оркестратор, CI)
DSLКак описать узкую предметную задачуЗависит от DSL

Подробнее про артефакты стадии — §1.


Языки программирования

Назначение: алгоритмы, бизнес-логика, драйверы, скрипты автоматизации.

Критерии выбора (не «модный стек»)

КритерийВопрос
ДоменWeb, embedded, data science, mobile, games
ЭкосистемаБиблиотеки, IDE, hiring, community
NFRLatency, memory, realtime, offline (ISO 25010)
Регуляторика«Только из реестра», LTS-версия, сертифицированный компилятор
КомандаНавыки сильнее «идеального» языка

Энциклопедия по языкам — раздел 5. На заказном проекте язык часто задан ТЗ или архитектурным решением (ADR).

COCOMO II учитывает язык через Language Level — продуктивность (эффективных строк на function point): высокоуровневый язык → меньше объём кода при той же функциональности.

Уровни абстракции (для экзамена)

УровеньПримерыРоль на конструировании
Машинный / ассемблерx86 asmДрайверы, hot path, embedded
НизкийC, Rust, ZigСистемное ПО, предсказуемая память
СреднийJava, C#, Go, KotlinКорпоративные сервисы
ВысокийPython, Ruby, JavaScriptБизнес-логика, прототипы, скрипты
ДекларативныйSQL, HTML/CSS, RegoЗапросы, разметка, policy

Один продукт часто мультипарадигменный: Go для сервиса, Python для ETL, SQL для отчётов — это нормальная стратегия конструирования, не «зоопарк ради зоопарка».


Языки проектирования

Назначение: описать структуру и поведение без деталей реализации — «чертёж» для конструктора.

НотацияДля чегоКто ведёт
UML (class, sequence, component)Модули, вызовы, деплойSA, lead dev
C4 (Context, Container, Component, Code)Архитектура на разных zoomАрхитектор
ERDМодель данныхSA + DBA
BPMNБизнес-процессыBA (SA читает)
Wireframes / FigmaUX до вёрсткиUX + frontend

Конструктор читает диаграммы как контракт: отклонение = change request, ADR или согласование с архитектором. Диаграмма в Confluence без связи с репозиторием устаревает за спринт — зрелые команды хранят C4/Mermaid рядом с кодом в docs/.

См. проектирование, API design.


Языки спецификации и контрактов

Назначение: проверяемое описание интерфейса — до или вместе с кодом.

Язык / форматОбластьНа конструировании
OpenAPI / SwaggerREST HTTPКонтракт → mock → реализация → contract tests
AsyncAPIСобытия, Kafka, MQTTСхема топиков и payload
JSON SchemaJSON-документыВалидация запросов/ответов
Protocol Buffers, AvroБинарные RPC, события.proto → codegen клиента/сервера
GraphQL schemaAPI с гибкими запросамиТипы + resolvers
Design by ContractPreconditions/postconditionsAssert, контракты в коде (Eiffel, некоторые библиотеки)

Порядок работ (contract-first):

  1. Аналитик и backend согласовали OpenAPI (POST /orders/{id}/pay, поля, коды ошибок).
  2. Frontend генерирует клиент или пишет против mock-сервера по этой схеме.
  3. QA готовит контрактные тесты: «если amount < 0 → 400».
  4. Backend реализует handler; CI сравнивает ответ с контрактом.
  5. Новое поле в ответе — только через версию API (/v2) или обратно совместимое добавление.

Контрактное тестирование — 121.

Пример — один endpoint в разных «языках»

# openapi fragment — язык спецификации
paths:
/orders/{id}/pay:
post:
responses:
'200':
description: OK
// TypeScript — язык программирования
async function payOrder(id: string, body: PayRequest): Promise<PayResult> { ... }
-- SQL — язык данных
ALTER TABLE payments ADD COLUMN status VARCHAR(32) NOT NULL;

Три файла — один инкремент; все версионируются в git вместе.

Формальные методы (кратко)

В критичных доменах (авионика, платежи, ядро протокола) используют формальные спецификации: Z, B-Method, TLA+, Alloy. Они не заменяют код, но позволяют доказать свойства модели до массового конструирования. Для базового курса достаточно знать: существует класс языков строже UML, применяется точечно.


DSL — предметно-ориентированные языки

DSL — язык узкой задачи: правила скидок, маршруты ETL, политики доступа, сценарии CI.

ПлюсМинус
Бизнес ближе к исполняемому правилуНужна поддержка парсера, IDE, тестов
Меньше boilerplate в основном кодеРиск «языка на коленке» без версионирования
Эксперты читают правила без C++Дублирование семантики с основным кодом

Примеры в индустрии:

DSLЗадача
Terraform HCL, PulumiИнфраструктура
Gradle Kotlin DSL, MakefileСборка
Rego (OPA)Policy as code
Liquid, HandlebarsШаблоны CMS
GherkinBDD-сценарии (исполняются через runner)
Cron syntax, GitHub Actions expressionsРасписание и условия CI

Когда DSL избыточен: одно правило, которое меняется раз в год — достаточно функции в основном языке.


Языки конфигурации и сборки

Конфигурация — часть конструирования: без неё код не собирается и не доезжает до staging.

Язык / форматРоль
YAML, TOML, JSONK8s manifests, GitHub Actions, appsettings
Dockerfile, ComposeОбраз и локальный стенд
Helm charts, KustomizeПараметризация деплоя
SQL (DDL/DML)Миграции схемы (Flyway, Liquibase)
Make, npm/pnpm scripts, MSBuild, CargoЛокальная и CI-сборка
.env.exampleДокументирование переменных без секретов

Версионируются вместе с кодом в SCM — см. 7-13/3. Секреты не в git: Vault, sealed secrets, CI variables.

DevOps-контекст — 8-04.


Как языки связаны в одном инкременте

Пример traceability: требование REQ-042 «скидка 10% для VIP» → строка в Gherkin → тест → функция в домене → поле в OpenAPI discountPercent → миграция не нужна (вычисляемое) → запись в changelog.


Выбор и согласованность языков

ОшибкаПоследствиеПриём
Код без OpenAPIИнтеграция «на глаз», ломаются клиентыContract-first
Диаграммы только в WikiЧертёж ≠ кодDocs as code
Конфиг только на prodНевоспроизводимые багиIaC + parity staging
Смена языка mid-projectПересчёт сроков (COCOMO)ADR + миграционный план
DSL без тестов«Правило в проде» без проверкиFixture-тесты на DSL

TDD, XP и языки

В Extreme Programming конструирование идёт через TDD: тест (язык xUnit) → минимальный код → рефакторинг. Тест — тоже язык (выражение ожидания). Связь с 7-03/1 (XP) и unit-тестами.


Частые вопросы на экзамене

Назовите четыре класса языков конструирования.
Программирования, проектирования, спецификации/контрактов, конфигурации (DSL часто выделяют пятым).

Зачем OpenAPI до кода?
Contract-first: параллельная работа frontend/mobile, mocks, contract tests.

Чем DSL отличается от библиотеки?
DSL — синтаксис предметной области; библиотека — API на общем языке.


Куда читать дальше

ТемаМатериал
Модульность и границы2
Модели ЖЦ и RAD3
API design117
Языки программирования5-languages
DevOps конфиг8-04

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).