Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

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

Хорошая презентация про яичницу-болтунью, в которую превращается код описания предметной области и код описания собственно программазмов -- http://www.intentsoft.com/technology/Oredev_Intentional_Presentation_2007.pdf (особенно мне понравился слайд про рефакторинг). Это презентация от Intentional Software, они называют ЯОП "трендом на предметную ориентированность" (trend of domain orientation). Перечислены проблемы подхода:
-- нотации в предметных областях
-- несколько предметных областей (multy-domain)
-- эволюция предметной области
-- groupware

Экспертов программисты теперь спрашивают не только "что вы хотите нам сказать", но и "как вы хотите нам говорить".

Пример пенсионных приложений, где предмет меняется быстрее, чем его догоняет IT.

Картинки ужасно напоминают презентации ОргМастера от БИГ-СПб, только для произвольной предметной области.

Cписок наименований к предмет-ориентированности:
-- domain specific languages (DSL)
-- domain specific modelling (DSM)
-- domain driven design (DDD)
-- model driven architecture (MDA)
-- model driven development (MDD)
-- generative programming (GP)
-- language oriented programming (LOP)
-- code generation
-- meta programming (Ruby) [интересно, что в предыдущей презентации http://www.intentsoft.com/technology/MIT_EmTech_Simonyi_Keynote_2007.pdf они называют это Internal DSLs (Ruby), а в чуть еще более предыдущей http://www.intentsoft.com/technology/Intentional-JAOO-2007.pdf Internal DSLs+Meta programming (Ruby), плюс добавляют в список идею Martin Fowler об LW/DW -- что это, однако? и External DSL]. Тут я полез к Fowler и добавил к этому списку RepositoryBasedCode (http://martinfowler.com/bliki/RepositoryBasedCode.html) -- все та же мысль про разделение кода и его представления в системе.

Интересная пара слайдов в пенсионной части: как waterfall последовательность "анализ -- функциональный дизайн -- технический дизайн -- программирование -- использование" с тестированием и явным handover между блоками превращается в связанные и перемешанные друг с другом активности без явного handover.

Кстати, явное задание учетности (audit trail, versions, handover) в программистских приложениях все более популярно, только терминология совсем не соответствует терминологии учета в бизнесе и администрировании. Ключевое слово тут обычно handover с обсуждением того, как он реализован в приложении.

Если взять еще более старую презентацию http://www.intentsoft.com/technology/IS_OOPSLA_2006_pres.pdf, то там можно найти еще интересные идеи:
-- сравнение куска текста 1963 года и 2006 года, ясно видно, что ничего в принципе не поменялось;
-- масштабируемость -- это наше всё (телефон Грэхема Белла был прост, но добавлять абонентов было сложно. А вот сотовая телефония сложна, но добавлять подписчиков много проще). Реальная проблема -- это 1М строк кода (400 страниц знания о предметной области, 19600 страниц знания о программной инженерии, которые дают 20000 строк исходного кода, который затем и работает). Хинт: превратить 19600 страниц знания про программную инженерию в 400 страниц исходного кода DSL-языка, что сравнимо с 400 страницами предметного знания;
-- три вида знания в программировании: предметное (детали проблемы), софтовоинженерное (как работает программа), железо (сегодня поддержка знаний про железо автоматизирована);
-- упор на слово "намерение" (intention) в решении проблем;
-- сравнение программирования с криптованием (спецификация перемешивается так со знанием софтовой инженерии, что из исходного кода назад эти знания нельзя разделить);
-- недостаточность нотаций в реальном мире закрывается взглядом на вещи со многих сторон;
-- улучшения в структуре предметной области создает необходимость в новых нотациях;
Текст статьи к этой презентации http://www.intentsoft.com/technology/IS_OOPSLA_2006_paper.pdf содержит много чего забавного, типа различений разных похожих подходов типа language-oriented development и domain-oriented development, и всяких других порождающих подходов (Generative Appoaches).

Еще Intent Software работает с ThoughtWorks (http://www.thoughtworks.com/ -- ага, тем самые IT-консалтеры, чья Studio сделала Mingle, приложение для agile-проектов http://studios.thoughtworks.com/mingle-project-intelligence, а а также RubyWorks), а не только с пенсионниками из CapGemini.

Вот, кстати, видеопрезентация Martin Fowler из ThoughtWorks -- "Introduction to Language Oriented Programming", http://www.infoq.com/presentations/domain-specific-languages. Интересная идея незначимости "какофонии языков" -- ты не должен, конечно, учить 15 языков в Яве, но ты должен выучить 15 разных API, что может быть много хуже (DSL существенно упрощает интерфейс). Какие есть инструменты (Language Workbench) для интеграции внешних предметных языков? Intentional Software (Charles Simonyi), JetBrains MPS (Sergey Dmitriev), Microsoft Software Factories (Steve Cook, Jack Greenfield, et al) and others -- но слишком рано оценивать возможности таких инструментов.

Этим всем рассуждениям уже много больше двадцати лет -- но к языковым Workbench вполне применимо общее тут рассуждение, что мощности машин раньше просто не хватало для создания мощных "проекторов" (редакторов нотаций и систем манипулирования с деревом программы). А теперь начинает хватать. Компьютерная революция только-только начинается.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 22 comments