June 28th, 2016

2019

Практика системной информатики

Если кратко и без нюансов, то системная информатика -- это практика (наука/дисциплина и технологии/софт) многоуровнего множественного описания системы. Я писал о ней подробней тут: http://ailev.livejournal.com/1272169.html

Многоуровневого -- это уровни абстракции, "мета", описания описаний (методы описаний), описания описаний описаний (описания методов описаний), описания описаний описаний (описания языков описания методов описаний). В случае коннекционистского моделирования, это уровни абстракции, "глубина". Про важность "глубины" и обоснование многоуровневости в описаниях (речь идёт прежде всего о краткости выражения пути между разнородными далёкими описаниями) см. http://ailev.livejournal.com/1274014.html

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

Дисциплина -- это какой-то теоретический аппарат, набор основных понятий, опирающийся на понятия системного подхода в части описаний систем (если грубо, то дисциплина работы с альфой определения системы из Systems Engineering Essence -- см. системную схему проекта, например, в варианте http://ic.pics.livejournal.com/ailev/696279/103958/103958_original.png). Основная диаграмма тут -- модифицированная для всех видов описаний (а не только архитектурное) из ISO 42010 -- http://ic.pics.livejournal.com/ailev/696279/104932/104932_original.png

Основная технология -- это мегамоделирование, поддерживаемое мегамоделерами, многоязычными групповыми IDE (http://ailev.livejournal.com/1273208.html). Сами мегамоделеры базируются на инфраструктуре, поддерживающей множество viewpoints и view (алгоритмическими, данными в XML или JSON, онтологическими, текстовыми-с-синтаксисом, фото-видео-адио, 3D-модели и т.д.) и мэппинги между различными форматами данных. Базовый софт для мегамоделеров (так сказать, "мегамоделер без моделей") -- systems framework, по аналогии с language workbench, которые должны были стать инструментами для создания IDE для разных DSL, а сейчас называются language frameworks, например Xtext -- http://www.eclipse.org/Xtext/. Так и тут: systems frameworks должны стать инструментами для создания мегамоделеров (см. дискуссию к посту по ссылке в этом абзаце), удобных для различного рода систем: инструментами комплексирования множества реализаций viewpoints для документирования описания какого-то класса систем. Типа как игровые движки/фреймворки, которые инструменты для создания игр и модов, моделирующих различные игровые миры.

По системной информатике пока нет специального образования (information systems тут не в счёт, ибо это подходит больше для узкого класса корпоративных менеджерских систем). Учат computer science (алгоритмы и структуры данных), учат архитектурам софта, учат многоуровневости определений данных и программ (формальным спецификациям) в ООП, кое-где учат онтологиям и моделированию данных, даже учат DDD (domain driven design). Нигде не учат многоуровневым многоаспектным описаниям и работе с ними под контролем конфигурации -- немного касаются этого в курсах системной инженерии, но и там для программистов больше делают акцент на практики системной инженерии для "железных" систем, а не на системное мышление. Для разворачивания образования нужно:
-- формулирование профиля компетенций (что-то типа GRCASE для системной инженерии -- см. ).
-- формулирование предмета/дисциплины (серии моих постов тут явно маловато. Нужно делать какой-то учебник).
-- разворачивание какой-то учебной технологии, system workbench (ибо побеждает не дисциплина, а практика: обёрнутая в удачную технологию дисциплина. Плохая технология предаёт дисциплину забвению, идеи умирают легче, чем хорошо работающий софт).
-- подготовка набора задач и проведение практических работ по а) разработке/доработке мегамоделеров, methodology realm и б) работе с ними в условиях целевых рабочих проектов, endeavor realm.
-- дидактика: как и в каком порядке всё это воплощать в учебных курсах?
-- сообщество системных информатиков, рефлексирующих практиков. Если не будет практикующих, то всё это ненастоящее. Тут нужно учесть, что NCOSE появилось только в 1990, хотя практика системной инженерии много раньше. Но тогда ещё не было ни web 1.0, ни тем более web 2.0, всё было в социальном плане медленно.

Это всё легко написать, но очень трудно сделать -- возможно, это займёт несколько лет.

Нужно показать систему разделения труда в системной информатике, её подпрактики. Где кончается системная информатика и начинается просто программная инженерия (как в системной инженерии на V-диаграмме показывают, где начинаются и где заканчиваются системноинженерные практики). Лет тридцать назад (в конце 80-х) в СССР было некоторое неформальное обсуждение вопросов "системного программирования", которое понималось как строительство прежде всего компиляторов, баз данных и прочего "системного софта" (и системных компонент, например тех же баз данных и компиляторов в прикладном софте: все же помнят, что "любая достаточно развитая программная система с какого-то момента начинает включать в себя кривой и неразвитый Common Lisp").

Но это "системное программирование" в те времена дико путалось ещё с "системным администрированием". На одной из тусовок "системных программистов" в Киеве где-то году так в 1989 родилось определение "системный программист -- это тот, кто всё время дискетки копирует", и это было правдой: системные администраторы и системные программисты в те поры практически не отличались, но точно занимались не тем, чем прикладные программисты с их вгрызанием в прикладную предметную область. Системные программисты вгрызались именно в computer science, а не прикладные предметы, но вот что все свои инструментальные системы они потихоньку ведут к мегамоделеру -- это явно не отслеживалось. А инструментарий для построения инструментария, все эти YACC и СУБД в целокупности состявляющие systems frameworks -- это даже не обсуждалось. Всё было ad hoc, и слипалось потом причудливо в самые разные "системы", общность функционала и архитектуры в которых было уж не разглядеть.

То, что "системный софт" как-то отличается от "прикладного софта", отражается даже в ArchiMate -- он моделируется в "оборудовании", а не "софте" (ибо он не прямо поддерживает деятельность людей, а поддерживает работу прикладного софта) -- http://pubs.opengroup.org/architecture/archimate3-doc/chap10.html#_Toc451758049. "This can be, for example, an operating system, a JEE application server, a database system, or a workflow engine. Also, system software can be used to represent, for example, communication middleware".

Инженерия систем машинного обучения, вероятно, тоже должна пройти подобный путь развития. Одни (системные машинообучатели) лепят всяческие "фреймворки" и "библиотеки" (типа TensorFlow) и думают, как бы их интегрировать в объемлющие когнитивные архитектуры и поудобней включить в состав мегамоделеров, а другие делают прикладные системы -- занимаются моделированием языков, анализируют изображения, изготавливают корпуса текстов и устанавливают к ним baseline.

Что же касается моделирования и онтологизирования, то computer science (за исключением странных эпизодов типа Simula 67) и software engineering вообще их не считают "своими" -- и те болтаются практически бесхозными. А уж комплексное моделирование-онтологизирование будущей системы (т.е. конструирование-проектирование) так вообще "чужое", а ведь это всё про одно и то же -- создание многоуровнего множественного описания системы различными средствами. Сборка всех частных описаний (view, каждый под своим viewpoint) в общий system description -- этим ни одна из дисциплин не озабочена. Так, modeling-in-the-large вообще не обсуждается (иногда как "коллаборативное проектирование"), и эта дискуссия совершенно отдельна от очень редких обсуждений programming-in-the-large -- http://www.cs.umd.edu/class/spring2005/cmsc838p/General/pitl.pdf, https://en.wikipedia.org/wiki/Programming_in_the_large_and_programming_in_the_small, пункт 2 в http://ailev.livejournal.com/1122126.html про "птолемеевкую модель кода", и много чего ещё из этой серии. Всё это появляется в силу наличия многих стейкхолдеров со многими интересами, плюс необходимости сочетать работу над целевой системой с жизненным циклом (т.е. заниматься работой обеспечивающей системы), т.е. это всё системная информатика.

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

Образование по computer science для начинающих

Есть три главные проблемы в образовании по информатике для начинающих:
-- практически не уделяется внимания образованию в части структур данных. Всё начинается алгоритмикой, и заканчивается ей. При разговорах с преподавателями какая-нибудь "структура Паскаля с пятью полями", "двумерный массив" и "магазин" -- это потолок. Объект-ориентированность идёт лесом, другие варианты жизни (функциональное программирование, multiple dispatch) идут тем же лесом.
-- вы можете заниматься два-три месяца, после чего должны ждать много лет (и программировать на одном уровне грамотности, если уж совсем невмоготу ждать и пальцы чешутся), и так будет несколько раз. Ну, или вы можете начинать сразу с восьмого класса и игнорировать более младшие возрасты, тогда всё будет более-менее непрерывно по нарастающей.
-- с выбором языка, учебников, задач и всего остального у вас будут проблемы.

Образование "сержантским методом" подразумевает решение многих мелких задач и довольно таки эффективно -- собственно, обучение физике и математике примерно так и устроено. Много мелких задач довольно легко игрофицируется. Но для этого нужно "всего ничего": online judge и последовательность задач с учебником.

Вот примерный "жизненный цикл" образования в computer science для начинающих (примерно по первый курс ВУЗа):

-- для дошкольников и начальношкольников можно использовать http://www.piktomir.ru/. Отличный и быстрый старт, правильная постановка задач, обучение именно алгоритмике. Автоматическая проверка выполнения заданий есть.
-- дальше проблема: если у вас детка, то он не знает ещё математики, а вся "школьная алгоритмика" активно использует знание математики. Вы можете, например, использовать КуМир (мой отрок прошёл этот путь летом между вторым и третьим классом), там есть набор задач, который при последовательном их предъявлении составляет вполне полноценный курс: http://server.179.ru/wiki/?page=DenisKirienko/Kumir. Этот оказывается вполне хорош, потому как КуМир уже текстовый, а не тайловый. Проблема в том, что с 14 темы там уже плавающие (которые проходят по математике только через несколько лет -- где-то в шестом классе), и дальше количество используемых знаний по математике и геометрии (исполнитель "Черепаха") стремительно нарастает. Но до пункта 13 всё можно пройти и второкласснику, проверено. И это ой-ой сколько. Вот пример реальной работы моего отрока в 2012 году (начало 3 класса): http://aalev.livejournal.com/1122.html. Альтернативы: прежде всего Scratch, и там рисовать разные мультфильмы и простейшие игры. Основная проблема: без учителя никуда, проверка заданий отсутствует.
-- тут идёт огромная пауза, поскольку дальше всё интересное начинается только с восьмого класса: курс алгоритмики на Питоне, тоже с автоматической проверкой задач -- http://informatics.mccme.ru/course/view.php?id=156. По объему он только слегка больше, чем курс на том же КуМире, но требует знания математики уровня восьмого класса. Есть видеолекции (довольно скучные) и текстовые шпаргалки. То есть это таки "дистантный курс". Дальше можно тренироваться в этой ползьбе до уровня олимпийских чемпионов (например, на ресурсе https://acmp.ru/). В принципе, такого сорта курсов для разных языков сейчас много, просто Питон представляется мне выбором получше, чем Паскаль или Си для образования по информатике. И на этом уровне можно спокойно заканчивать: вся школьная система заточена на "олимпиады по информатике", для них больше ничего не нужно знать.
-- дальше можно пытаться рассказать о собственно computer science. Если вы идёте по линии Python, то можно использовать книги со встроенной системой визуализации исполнения: по которому переделали его со Schema на Python — вот примеры книжек с исполняемыми кодами: http://interactivepython.org/courselib/static/pythond.. и http://composingprograms.com/, https://wizardforcel.gitbooks.io/sicp-in-python/conte.. (это SICP-на-Питоне). Альтернатива -- гарвардский CS50 (там не Питон, а Си и PHP, тем не менее) — https://newtonew.com/news/harvard_cs50_in_russian (оригинал https://www.edx.org/course/introduction-computer-scie..). Основная проблема всего этого счастья: нет проверки исполнения, никакого online judge. Компьютерная программа хороша тогда, когда она берёт входные данные, и выдаёт на их основе правильные выходные данные — с учётом разных граничных вариантов. При этом сами варианты обычно остаются неизвестными ученикам (в отличие от тестов, которые нужны для отладки программ, тут тестируется понимание учеников). Такие системы, например, могут сказать тебе: "программа прошла 8 из 10 тестов", но не сказать, какие были при этом входные данные — ты должен думать сам. Это даёт возможность одному учителю сработать с классом из 20 учеников, или занятому родителю с классом из одного своего отпрыска — время уходит при этом больше на объяснения и преодоление затыков, чем на рутинные проверки правильности решений. Вот этого-то и нет на этом уровне.
-- дальше идут самые разные курсы прикладные курсы: биоинформатики http://rosalind.info (с онлайн проверкой и каким-то учебником, тоже Питон), или "ноутбуки" курсов по математике (вот для примера курс современной линейной алгебры на Julia -- https://github.com/ivanslapnicar/GIAN-Applied-NLA-Course, но онлайн проверки тут нет, хотя есть assignments, то бишь задачи).

В эту экосистему прорваться не так просто. Так, вы можете решать задачи из http://informatics.mccme.ru/course/view.php?id=156 на Питоне, Си, Паскале, Руби, Джаве и даже Хаскеле. Online Judge вполне на месте, на любом из этих языков (а для некоторых языков возможно использовать и разные версии языка -- питон 2.7 и 3.5, например). Но это только один курс, перед ним и после него -- огромные дыры в части учебной инфраструктуры.

Например, что нужно сделать для использования Julia в качестве учебного языка? На нём ведь довольно много курсов численных методов (ссылки тут: http://ailev.livejournal.com/1271980.html), поэтому почему бы с него не начинать? Потому что для этого нужно было бы:
-- подправить для Julia какой-то "базовый курс" типа того же курса Кириенко для Питона для восьмиклассников. Это недолго, задачи там будут практически теми же самыми, но лекции и тексты придётся переделать, по факту написать книгу. И это совсем не похоже на текущие учебники Julia на русском (вот например, выходит через пару недель: http://dmkpress.com/catalog/computer/programming/978-5-97060-370-3/ -- но там Mastering Julia, то есть уже предполагается некоторое знание языка).
-- для Julia сделать какую-то визуализацию исполнения, как для Питона. Можно, конечно, использовать готовящийся к выходу отладчик, но вряд ли он будет удобен именно для учебных целей.
-- изготовить online judge и тестовые наборы к задачам.

Если же идти по этой линии дальше, то нужно будет:
-- переработать на Julia курс SIPC так же, как в 2010 его переделали со Schema на Python
-- сочинить какие-то задачки, которые можно проверять автоматически (что уже сомнительно)

Это всё малоподъемно. Так что текущим наиболее приспособленным для обучения computer science языком является Python -- при всех недостатках. С его использованием можно идти и дальше: в биоинформатику, в тьюториалы-ноутбуки Jupyter для deep learning, в численные методы и т.д..

Всякие же дискотеки (курсы на основе игровых движков, например подхакивание Mincraft) тут не проходят. Я уже спрашивал тут в ЖЖ совета по поводу образования в computer science, получил много советов "побольше кодировать всяких задачек, поменьше знать". Я не возражаю против программирования, программной инженерии и всего такого вокруг игр -- связь теории с практикой, конечно, важна. Но мне нужно:
-- освоение теории, не просто кодирование, а программирование с использованием теории
-- по-возможности, чтобы этот тренинг проходил без дорогого времени учители и родителя.

Увы, при таком огромном числе программистов в мире и учителей информатики, нормальной инфраструктуры для обучения computer science на протяжении нескольких курсов не построено. Все команды образователей делают какой-то одно-двухсеместровый "курс" и автоматизируют его в силу своих небольших возможностей, а вот с преемственностью в цепочке этих курсов и связях с другими курсами (математика, физика, работа с базами данных и т.д.) всё плохо, этим никто не озабочен.

Я это обнаружил только потому, что у меня отрок потихоньку растёт, и я пытаюсь дать ему образование в computer science, причём с экономией собственных усилий. Но если бы я занимался именно образованием "как учитель", то тоже бы концентрировался
-- на подготовке к олимпиадам, ибо "все так делают", олимпиады неплохая игрофикация. Но они не требуют широкого знания computer science, метапрограммирование для олимпиад маргинально, особенности объектного и функционального программирования можно не проходить
-- одном каком-то этапе жизненного цикла ученика: "вокруг ЕГЭ" или "дошкольная информатика", или "первый курс ВУЗа". И, конечно, ни о каких связках между этими курсами, ни о каких разрывах в годах и годах между этими курсами, я бы не думал.

А если брать не computer science, а информатику в целом (http://ailev.livejournal.com/1008054.html), включая машинное обучение (это ж тоже должно входить в грамотность! это ж тоже нужно со школы учить!), и добавить сюда системный подход и азы системной информатики (http://ailev.livejournal.com/1272169.html, http://ailev.livejournal.com/1273208.html, http://ailev.livejournal.com/1274210.html), то всё становится ещё хуже и неподъемней. "Компьютерной грамотности" сегодня обучают из рук вон плохо, обрывочно и это обучение очень плохо поддержано технологически. У восьми нянек жизненный цикл такого обучения получается без глазу, носу, зубов и почти всего остального.