Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Computational thinking, информатика и dataflow языки

Недовольный современным "программированием" (ага, в кавычках) Алексей Корнилов в https://www.facebook.com/alx.kornilov/posts/1896610697217157 запросил помощь зала: ему нужно программировать интернет вещей -- но он не хочет императивного, объект-ориентированного, реактивного и прочих "программирований", а хочет понять, чего же он хочет. Ибо чем круче программист, которого научили программировать железо на каких-нибудь сях, тем хуже он вообще может понять, что от него хотят -- программировать там нужно в стиле "делай что хочешь, но как будешь дома -- позвони", "когда тебе стало жарко -- включи кондиционер"). Он там пишет, что "автоматы, event-drive programming - все это в природе существует, но это не раньше третьего курса далеко не каждого университета. А "программирование" уже чуть ли не в детский сад сейчас засаживают ((( И не переучишь ведь потом".

Точно, не переучишь. Императивщиков в объект-ориентированные программисты сначала не переучишь, потом объект-ориентированных в функциональных не переучишь, а шаг вправо-влево от этой магистрали так и вообще побег. При этом императивному программированию учат в детском саде, или восьмом классе -- а дальше всё. Моего сына в физматлицее начали учить писать программы на Паскале буквально пару месяцев назад! А раньше по линии официальной школы ни-ни. Опять же, если бы я его не учил Питону, про объекты и методы он бы и вообще не узнал, а если бы не игрушки типа Human Resource Machine, то и про ассемблер никогда не узнал. Но главное, школа совсем и никак не озабочена наличием у него в голове концепции вычисления как такового -- вычисления, подразумевающего множество парадигм проведения вычисления.

Мне кажется, выход тут в том, что преподавать нужно computational thinking -- вычислительное мышление, в котором сразу даётся знание о вычислениях, о мультипарадигмальности. Это не лучше и не хуже, не сложней и не проще математики и физики в школьном курсе. Это ортогонально к ним. И это явно больше, чем знание какого-то конкретного допотопного языка и набора алгоритмов в императивной записи на каком-нибудь Паскале. И это отличается от некоторого винегрета компетенций, который подаётся как computational thinking в консенсусе https://k12cs.org/computational-thinking/, хотя и существенно пересекается.

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

В этом клубке самых разных дисциплин выделяется информатика, которую я определял в http://ailev.livejournal.com/1008054.html: Информатика -- это работа агентов (людей и компьютеров) с текстами и кодами. Текст -- понимается тут как "всё есть текст" ("text" is any object that can be "read," [человеком] whether this object is a work of literature, a street sign, an arrangement of buildings on a city block, or styles of clothing), неформален в части семантики и синтаксиса использованного в нём языка. Код -- формальное в части семантики и синтаксиса использованного языка представление какого-то содержания, независимо от сериализации в строку буковок или оставления в виде какого-нибудь графа, таблиц или триплов. Особо нужно обсуждать действия в информатике: "акты" (в том числе речевые акты) и "вычисления" (в том числе отработка инструкций компьютером).

Но сегодня такой подход к computational thinking проблематизируется машинным обучением: всё то же моделирование, которое происходит не вручную, а путём выучивания на каких-то данных (в том числе на данных, получаемых в результате моделирования -- всякие GAN-архитектуры). Машинное обучение, похоже, просто расширяет эту область -- у нас кроме кодов появляются модели и другого рода: нейронные сети тут самый яркий пример. Ну, и байесовщина говорит, что булева логика и "строгая формальность" это просто частный случай байесовской рациональности -- http://ailev.livejournal.com/1311261.html

Так что "чему учить" -- эти предметы ещё нужно построить, эти курсы ещё нужно создать. Настоящий (на состояние знаний и практики 2017 года) курс информатики или computational thinking никто не озаботился делать -- все питаются старьём образца примерно 1985 года, когда закладывались основы современных курсов программирования. И пиком достижений тут был переход от функциональной (LISP) парадигмы к объект-ориентированной в вузовском профессиональном курсе, когда выяснилось, что LISP это не "наше всё" и это не ведущая парадигма вычислений. А вот в школьной информатике даже этого не случилось, так на Паскале всё и завязло, и даже Питон не взлетел -- олимпиадное программирование перешибло все ростки вычислительной мысли с его C++.

Мне в каком-то плане с системным мышлением было проще: не было установившейся традиции преподавания. Пришлось делать курс с нуля. А тут тоже нужно сегодня делать курс с нуля, но трудозатраты огромны, бенефитов нуль, результаты неочевидны и огромное число людей, которые по накатанной воспроизводят однолетний опыт 1985 года как тридцатилетний опыт "достижений". Вот никто нового курса и не делает.

А чисто практически программирование интернета вещей может вестись на dataflow и state machine -- примером тут служит, например, SCADE: http://www.ansys.com/products/embedded-software/ansys-scade-suite, используется в авиации и прочих системах с жёсткой сертификацией программных кодов, обрабатывающих довольно сложные ситуации. Из других инженерных языков на эту тему выделяется LabVIEW, хорошо известен Max/MSP -- а вообще их множество, тут огромный зоопарк: https://en.wikipedia.org/wiki/Dataflow_programming. Это всё промышленное программирование, оно про real time, оно абсолютно непопсово, ему нигде не учат. Более того, я совсем не уверен, что именно ему нужно учить, когда учишь людей пониманию вычислений. Но и Verilog, и VHDL тоже оказываются тут, и из совсем свежих -- TensorFlow. То есть не учить dataflow парадигме сегодня нельзя.

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

UPDATE: дискуссия в фейсбуке -- https://www.facebook.com/ailevenchuk/posts/10210098080022570
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 7 comments