September 12th, 2019

2019

SysMoLan как eDSL для Julia

В дискуссии о типах языков программирования/моделирования/представления знаний (там, кстати, уже 320 дискутантов -- https://t.me/typeslife) сегодня был очередной поворот: попытка вместо говорения об онтологии и представлении знаний (что сразу вызывает математических и философских духов) говорить о предметно-специфичности, продолжая программистскую традицию и попадая в программистский язык. Так что ответы на наши вопросы про языки моделирования разных предметных областей будем искать по ключевым словам "domain-specific".

Когда-то и Fortran называли domain-specific, ибо он только для formula translations, а не универсальный, как машинный язык. И то же самое было со всеми языками высокого уровня, они были domain-specific. Тем не менее, domain-specific пока чётче ведёт к цели, чеми использование всяких других слов. Нам нужно делать еmbedded domain-specific languages (eDSL) с domain-specific types (как онтикой предметной области) и domain-specific solvers (для того, чтобы интерпретировать модели в онтике/типах предметной области, задавать вопросы/делать запросы/вычислять).

В группе "Аттик" мехмата МГУ рассказывали, что нашли причину, почему Паскаль никак не мог победить Фортран в своё время. Они считали, что Паскаль был безблагодатен по сравнению с пакетными языками (Modula, Ada), ибо не было "пакетов" как раз для реализации общей для нескольких программистов системы типов — нельзя было делать "пакеты" как eDSL для domain-specific работы (те самые domain-specific types и domain-specific solvers, в терминах группы Аттик domains -- это были миры и solvers -- исполнители для этих миров). В Фортране же это реализовалось на раз-два через common-блоки! Потом какие-то аналоги common blocks начали делать в паскаль-компиляторах (но это уже потом! в учебниках паскаля это не было свойством языка, а только свойством реализации в конкретном компиляторе). Потом появились на краткий исторический миг пакетные языки, а потом domain specificity начали понятными словами объяснять как делать в ООП и в реляционных моделях данных — тут все эти "пакетные языки" и деревянные с сетевыми базы данных начала восьмидесятых и смыло в унитаз истории, где они и находятся до сих пор.

Вся дискуссия в чате крутилась вокруг того, что удобных для программирования eDSL языков программирования/моделирования/запросов к базам данных/представления знаний нет. Так что я продолжаю придерживаться мнения, которое выработалось у меня на прошлом такте дискусии (https://ailev.livejournal.com/1487293.html): работать тогда будем с Julia как хост-языком. И на Julia будем реализовывать структуры данных и солверы SysMoLan как eDSL.

Вчера на докладе на митапе по Julia (https://juliameetup.timepad.ru/event/1047482/, слайды https://yadi.sk/i/yBeUJJj1iuiJXQ, видео https://vimeo.com/360541672#t=4940s) я высказал ещё пару идей. Солверы для eDSL отличаются тем, что эффективно обрабатывают частные случаи -- предоставляют оптимизированные для этих частных случаев решения. И в Julia как раз отрабатывается такой подход на примерах методов оптимизации (JuMP) и методов решения систем дифференциальных уравнений (DifferentialEquations). Солверы этих систем -- это просто коллекция самых разных солверов, эффективных для самых разных ситуаций. Итого eDSL выглядит как набор типов, в терминах которых удобно описывать предметную область, плюс набор эффективных солверов -- типы должны универсально отражать задачи предметной области, а солвер должен устойчиво работать и жужжать в части скорости. Поэтому типы должны быть более-менее богаты в части их конструирования для отражения объектов и отношений в domain (сравнимы в этом плане с богатыми типами статических языков программирования), но динамическими, чтобы по ходу дела в runtime подбирать оптимизацию для solver. Ну, и проблема двух языков: на одном и том же языке и компактно и красиво (с рафинадом) высокоуровнево выражать domain, но не теряя низкоуровневости в скорости. И настолько не теряя низкоуровневости, чтобы эта оптимизация докатывалась аж до уровня железа -- до GPU. Вот Julia как раз имеет примеры таких решений. Вот этим путём и хочется пойти для SysMoLan: иметь возможность самых разных солверов для предлагаемых SysMoLan как eDSL структур данных.

Идти туда, как мне кажется, нужно в несколько шагов:

1. Сделать простой (архитектурный и требований) текстовый моделер для простых архитектур и использовать его, например, для обучения инженерии требований и инженерии системной архитектуры. У меня проходит в год сотня студентов и курсантов по разным линиям, вот это будет учебный софт. SysMoLan в объёме реализации IEC81346-1 для моделирования системного разбиения (чтобы можно было показать функциональное и конструктивное системное разбиение в их взаимосвязи на пару уровней) тут вполне подойдёт. Это MVP. Ничего вычислять даже не будем (может быть, будем проверять целостность, но и тут не факт), только отображать удобно. Солвер -- голова инженера. Для чего такое нужно? Для помощи со стороны компьютера в присмотре за вниманием в ходе архитектурной работы и работы над требованиями, речь идёт о киборгизация архитектора (вот тут про киборгизацию присмотра за вниманием: https://ailev.livejournal.com/1488271.html). Как над шахматными партиями удобней думать, если есть просто шахматная доска, на которую можно смотреть, так и архитектурный моделер помогает думать уже тем, что он помогает стабилизировать внимание архитектора.

2. Иметь полноценный текстовый язык представления знаний в качестве полноценного системного языка. Тут уж точно иметь eDSL, ибо к более-менее сложным архитектурным моделям и моделям требований захочется делать запросы.

В чате была дискуссия о том, что лучшим приближением к языкам представления знаний является common logic, и какой-нибудь FOL солвер. При этом SQL предлагался как успешный вариант языка для FOL -- без пояснения того, как это всё предполагается в работе у инженера. Ибо логические языки почему-то нигде не взлетели в их чистом логическом виде.

Тут ещё и социальные аспекты, конечно. Пара релевантных ссылок в Communications of ACM (http://cacm.acm.org/blogs/blog-cacm/173328-programming-languages-are-the-most-powerful-and-least-usable-and-learnable-user-interfaces/fulltext) -- там обсуждается вопрос, почему люди не хотят учить языки программирования (языки моделирования, языки мета-моделирования). Там вводят понятия cognitive load (http://en.wikipedia.org/wiki/Cognitive_load, связанные с использованием рабочей памяти умственные усилия), для разных людей они будут разные при изучении предмета. И далее говорится, что люди оценивают не реальную когнитивную нагрузку, а субъективно воспринимаемую (percieved) будущую нагрузку -- когда вы даже воспринимать её по факту не можете, ибо ещё не знакомы с предметом. Да, и полезность вы тоже представить не можете, ибо не знакомы с предметом. А решение "учить-не учить" принимается до изучения предмета. То есть бесполезно уговаривать что-то учить, потому как оно "полезно". Решение принимается не только и не столько по "пользе", сколько по "цене изучения" -- например, считает ли потенциальный ученик, что у него есть способности к предмету. Это всё expectancy value motivational theory -- https://www.researchgate.net/publication/265965932_Expectancy-Value-Cost_Model_of_Motivation. If students are not convinced they can learn it and they are not convinced of the value, then they don't learn it. Решение автор текста предлагает в повышении usability для изучаемых предметов (языков программирования/моделирования), но и learnability -- это разные свойства. Requirements нужно формулировать для обеих характеристик. Легко такую банальность предложить, трудно выполнить.

Вопрос мой в том, что современные информационные системы решают многие из тех задач, которые раньше считалось, что смогут решать только экспертные системы. И эти системы написаны на обычных языках программирования, а не на логических языках. Нет ли какого-то способа представления знаний, отличного от тупого использования логического языка? Логическая парадигма только одна из многих, и в языках программирования она явно не главная. Иначе мы бы видели вокруг сплошных потомков Пролога. Но нет, потомки Пролога везде маргинализуются, и никакая опенсорсовость им не помогает. CycL тоже делал OpenCyc, потом закрыл этот проект: не взлетело. Логическое не взлетает, на SQL делают только запросы в базу данных, а не программируют -- вот я и интересуюсь, что ещё на свете существует для представления знаний. Какая-нибудь Java для представлений знаний неудобна, но модели самых разных domain обрабатываются в мире главным образом на ней, а не на CycL или Agda. Получается, вся краса мира у нас уходит в язык программирования, который нужен для того, чтобы вызвать SQL над базой данных, в которых и отображён domain. При этом как domain отражается в реляционных базах данных — понятно, этому учат в университетах, и по большому счёту DDD (domain-driven design) тоже редко когда про язык программирования, чаще про базы данных.Ответа в чате я так и не получил, хотя обсуждение и было бурным. Так что за подробностями отправим в чат, а тут продолжим.

3. Иметь дифференцируемый язык представления знаний как eDSL, чтобы использовать этот язык не только для ручного ввода архитектурных моделей и моделей требований в рамках облегчения работы subject expert по knowledge aquisition, но и в рамках порождения/generation, а ещё в рамках оптимизации (про "дифференцируемое всё" я писал в https://ailev.livejournal.com/1464563.html). У Julia тут неплохая репутация: Viral Shah [один из разработчиков компилятора Julia] addressed the World Artificial Intelligence Conference, held in Shanghai Aug 29-31 with a discussion on "Julia: Generalizing Deep Learning with Differentiable Programming" (почему я и хотел бы держаться к Julia поближе, а не к C#, С++, R или каким-то другим языкам, не приспособленным для численных методов). Порождаемые архитектуры, оптимизируемые архитектуры, фронтир — вот это всё тут, все эксперименты с искусственным интеллектом и компьютерным творчеством.

4. А ещё нужно будет реализовать mapper (генератор конверторов/адаптеров/плагинов/мостов и т.д. -- систему типа .15926 https://github.com/TechInvestLab/dot15926/, только не обязательно на ISO15926, зато с удобным порождением парсеров и генераторов данных, eDSL для этого), ибо любой архитектурный редактор быстро будет нуждаться в частных моделях из разных САПР, и дело быстро дойдёт до полноценной PLM. Когда будет реализовываться мэппер, там результат будет вполне дискретный и формальный и FOL внутри, а вот методы получения моделей данных могут быть с использованием нейросетей, вероятностных языков и разных других численных алгоритмов. В итоге получится гибрид, а не только нейросети или только строгая логика. Вот, кстати, пример такого "загрузчика данных" (мэппера) для табличек: о "импорту табличек в программу", Flatfile can automatically match 95% of imported columns, using a combination of machine learning and fuzzy matching. Users can upload data via CSV, XLS, or simply paste from the clipboard — https://venturebeat.com/2019/09/10/flatfile-pursues-intelligent-data-importing-with-2-million-round/. JuliaDB при этом тоже работает с файлами табличек, в колонках которых могут быть любые типы Julia, а не только числа или строки, но всё-таки мэппер должен работать не только с табличными форматами. Первое, о чём спросят инженеры, так это о мэппинге 3D-моделей современных САПР.

Задача представления системных знаний на SysMoLan сложная, поэтому решаем её эволюционным путём, а не "сразу всё во взаимоувязке". Системный подход не должен становиться болезнью, когда вгоняет проект в analysis paralysis и заставляет "учесть всё-всё" в один подход и один проход.

UPDATE: обсуждение в фейсбуке -- https://www.facebook.com/ailevenchuk/posts/10216230511529525
2019

Роли начальников, роли помощников, роли любителей, роли карьеристов

Начальник в проектных ролях -- это джокер, играет любую подвернувшуюся ему роль. Имеет право. Квалификация игры по роли тут уже не имеет значения -- "я начальник, ты дурак", если спецы по данной роли в команде есть. При этом у начальника хотя бы есть полномочие делегировать исполнение роли, если есть кому. А вот у самых разных помощников/ассистентов по должности делегировать исполнение роли обычно некому, хотя "должностные обязанности" примерно так же расплывчаты, как у начальников -- "заниматься всем, чем нужно". И об уровне образования помощников пекутся много меньше, чем об уровне образования начальников. При этом на помощников накидывают не только много работы (это нормально!), но много работы по самым разным практикам -- а это означает, что квалификация помощников в выполнении этих разных практик будет плохой, они не смогут специализироваться и достигнуть мастерства по каждой из них.

У меня курсанты все спотыкаются на ролевых разбирательствах начальства и помощников: названия должностей отвлекают от выявления играемых ролей, исполняемые людьми в должностях начальства и помощников роли явно не соответствуют профессиональному их исполнению, а количество ролей зашкаливает. Но это разбирательство обязательно нужно делать: часто через пять минут уже понятно, что нужно что-то менять. Но для этого "понятно" нужно поработать с таблицой из учебника системного мышления 2019 года. Вот она:
roles

И если для начальников ситуация выглядит безнадёжной, то для разных помощников и ассистентов -- нет. Перегруз и недоквалификацию можно выявить. Лишние роли снять, а исполнению самых нужных ролей доучить прямо в рабочее время, на рабочем месте. И жизнь станет лучше.

Пример из моего любимого детского садика Монтессори (https://ailev.livejournal.com/1485977.html): помощник педагога там имел целый букет страннейших ролей, в том числе роль охранника. Помощник педагога в роли охранника отгонял по вечерам детей от дверей, ибо дети садились под двери и ожидали там родителей. Роль охранника поменяли на роль аниматора: помощник педагога играл с детьми, и ни у кого из детей не появлялось желания выйти из игры и сесть под дверь. Этот пример показывает, что разбирательство с ролями ведёт часто к архитектурным решениям: важнейшие/архитектурные решения для организации это про то как роли распределяются по их исполнителям. Так вот иногда интересней поменять не исполнителя, а саму роль и играемую этой ролью практику. Заметить такую ситуацию и даёт работа с таблицей ролей.

Таблица ролей даёт и много материала для лидерской работы (как живых людей уболтать выполнять их роли): часто люди начинают играть те роли, которые никак не соответствуют занимаемой ими должности -- это любительские роли. Почему это происходит? Иногда причина в кривизне архитектуры: делать дело/выполнять ролевую практику нужно для успеха проекта, но конструкция/штатное расписание не предусматривает для этого дела ровным счётом ничего. И это обычная ситуация, тут ничего не поделаешь. Но иногда причина в личных ролевых предпочтениях, людям нравятся какие-то роли, хотя работа от них этого не требует (а иногда выполнение таких ролей и прямо вредит работе). Я когда-то играл в духовом оркестре военной кафедры, и любил сыграть там на концерте на саксофоне какую-нибудь джазуху: хриплый тембр саксофона при этом легко перекрывал весь остальной оркестр и мою импровизацию легко было слышать из зала. Ни в каких нотах этого не было, для выступления это было не нужно, это были мои персональные хотелки. Иногда для успеха концерта это было хорошо, иногда плохо. В любом случае -- это была проблема лидерства: я в самый критический момент (на концерте) от проектной роли игрока маршей по нотам лихо отходил, и играл любительскую роль джазмена, уж как мог. Лидер оркестра регулярно с этим разбирался, это была его проблема. Если в игротехнической компании человек в должности менеджера проекта играет роль игрока-любителя, то вместо управления проектом/операционного управления он будет тратить много рабочего времени на обсуждение вопросов геймдизайна.

Ещё одна категория людей, которые выявляются при работе с таблицей ролей -- это карьеристы. Это необязательно плохо, но это тоже нужно учитывать. Карьеристы прихватывают роли других должностей, они просто по факту начинают выполнять другую работу (часто продолжая выполнять работу по своим ролям). Лидеру опять-таки нужно этим озаботиться, например, перевести человека на другую работу (не всегда ступенькой вверх, для карьериста может быть важна работа на похожей должности, но с другим предметным содержанием), если выполнение этих других ролей у него хорошо получается, т.е. профессиональная квалификация достаточна. А если не получается, и это "хотелки", то можно или подучить сначала, а потом перевести на другую работу, или провести воспитательную беседу о необходимости хорошо выполнять свою работу, а не прихватывать чужую. Или решать более сложную задачу: работу на текущей должности карьериста выполнять будет некому, но всей организации уже будет понятно, что карьеристу на текущей должности делать нечего, и нужно его двигать туда, куда он хочет -- но кто тогда займёт его место?! Это типичные проблемы лидеров: проблемы соответствия должностей с приписанными к ним ролями и исполнителей ролей со всеми их хотелками по поводу исполнения этих ролей.

Интересно, что с таблицей ролей вполне можно работать и на уровне таких исполнителей, как оргзвенья более чем из одного человека (например, подразделения или какие-нибудь рабочие группы или комиссии. В последнем абзаце текста про соотношение ролей деятельностных, проектных, функциональных, организационных тоже это упоминается -- https://ailev.livejournal.com/1487927.html).

Табличка с ролями поднимает осознанность в организационной работе (https://ailev.livejournal.com/1488271.html), служит чеклистом: она заставляет думать про какого-нибудь программиста как программиста-должность, программиста-роль, программиста-исполнителя и не позволяет ничего из этого пропустить. Дальше можно задаваться вопросом про квалификацию исполнителя роли, про достаточность полномочий должности для игры по роли, уместность этой роли у данной должности и т.д. В случае программиста ответы на эти вопросы будут тривиальны, но не всегда (интересы любительства или карьерные интересы могут вас сильно удивить в некоторых случаях). А вот в случае должностей начальников и помощников мой опыт свидетельствует, что удивление результатами рассмотрения по табличке наступает почти всегда: должности настолько заслоняют их роли в обыденной жизни, что работа с их ролями обычно открывает что-то новенькое и даёт много пищи для размышлений и улучшений.