Часть знаний о DSL состоит в том, что перед тем, как вы начнете создавать язык (а затем во время его разработки), вы «анализируете предметную область». Что именно это означает?

Понимание

Одним из важных аспектов анализа предметной области является понимание предметной области. Все проекты разработки DSL, в которых я когда-либо участвовал, начинались с понимания того, что должен выражать язык. Я разговариваю с экспертами в предметной области, смотрю на существующий код или другие артефакты предметной области, если таковые имеются. Ключевой компонент понимания, по крайней мере для меня, - это активно слушать. Активное слушание означает, что процесс «слушания» на самом деле является беседой: я объясняю то, что понял. Я немного экстраполирую. И я активно прошу подтверждения: «Вы это имели в виду?» - «Означает ли это, что…»

Обобщение

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

Обобщение помогает мне укрепить мое понимание, но также помогает выявить выбросы, которые не соответствуют обобщению. Ключевым компонентом анализа предметной области является выяснение того, являются ли эти исключительные случаи «ошибками» (что означает, что мы должны избавиться от них в новом мире) или «особенностями» (что означает, что DSL должен иметь возможность выразить и этот случай. ). Это действительно очень важно: отнесение слишком большого числа к действительным может сделать язык очень сложным и трудным в использовании (со слишком низкоуровневыми абстракциями), но отнесение слишком большого числа к категории «вне» может сделать язык бесполезным для реального мира. Не существует простого практического правила, как это сделать, но осознанное осознание этого - хорошее начало.

Скрытые сложности

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

Рассмотрим DSL для расчета заработной платы. Очевидная часть состоит в том, что вам нужно выполнять расчеты. И что вы должны принимать решения, которые, глядя на «конфигурацию» сотрудника, определяют правильную сумму налоговых вычетов или льгот. Неочевидные аспекты включают тот факт, что правила, регулирующие эти расчеты и решения, меняются со временем по мере развития применимого права. И данные, на которых основываются эти расчеты и решения, также меняются со временем: зарплата - это временная величина, так же как и семейный статус или принадлежность к определенной религии. Ключом к успеху DSL (и убедить заинтересованные стороны в том, что это стоит) было включение первоклассной поддержки этих двух ключевых функций в DSL.

Рассмотрите мобильные приложения для обучения пациентов во время лечения. В основе этих приложений лежат алгоритмы, которые собирают данные, анализируют их и принимают решения о том, что порекомендовать пациенту («примите еще одну таблетку», «ешьте меньше», «позвоните своей медицинской бригаде»). Очевидно, что в основе DSL лежит поддержка принятия решений, анализа данных и выражения рекомендаций. За очевидными, важными проблемами связаны с течением времени («если уровень крови, несомненно, был выше X в течение трех дней»), представление абстракций с обозначениями, которые медицинские эксперты могут (и желают) понять, и разделение «Счастливый поток» из всех исключительных и непростых случаев (потому что врачи, по крайней мере на начальном этапе, хотят сосредоточиться на счастливом потоке).

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

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

От двух слоев до трех

Как люди, работающие с DSL, мы всегда знали это базовое разделение проблем: поместите в модели Fachlichkeit, основную логику предметной области (используя DSL для ее краткого выражения), а затем позвольте генератору и средам выполнения решать технические проблемы. Технические проблемы в случае расчета заработной платы и государственного управления связаны с масштабируемостью, надежностью и безопасностью - Fachlichkeit будет выполняться в распределенной инфраструктуре микросервисов. В медицинском случае основная задача состоит в том, чтобы запустить алгоритм на двух основных производителях мобильных телефонов (iOS и Android), а также обеспечить его одинаковую работу для огромного количества вариантов, особенно в категории Android. И, конечно же, безопасность имеет решающее значение: инфраструктура языка и генератора не должна создавать дополнительных явных рисков.

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

Фактически, в некоторых случаях код, который люди теперь пишут с помощью DSL, настолько проще, чем унаследованный код, что люди как бы спрашивали: «Зачем нам нужен DSL? Это просто!". Что ж, это просто потому, что DSL осмысленно обрабатывает сложность.

Резюме

Вместо того чтобы смотреть на установленное двухуровневое разделение между логикой предметной области (выражаемой с помощью DSL) и-способностями (обрабатываемыми генератором и средой выполнения), посмотрите на него как на три уровня: третий уровень находится посередине между двумя и касается «скрытые» сложности в предметной области. Во время анализа предметной области старайтесь раскопать эти сложности. Очень часто это ключ к реальному прогрессу.