Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Category:

О предмете курса вычислительного мышления

Вычислительное мышление/computational thinking/информатика -- просто мышление с использованием понятий computer science, примерно так же как "физическое мышление" связано с физикой-наукой или химическое мышление связано с химией-наукой. Термин появился в середине 80х, когда computer science потребовалось внести в школьные программы (в США и СССР -- в США назвали computational thinking, в СССР -- информатика), для обсуждения с организаторами образования нужно было делать акцент не на содержании предмета, а на навыках мышления, которые даёт знание нового школьного предмета. Тогда вычислительное мышление/информатика понималось прежде всего как навыки планирования каких-то действий, возможно с условиями (то есть по факту это была императивная алгоритмика). Но по мере того, как акцент сдвигается с императивной алгоритмики на другие виды вычислений/inference/evaluation, вычислительное мышление становится просто мышлением об операциях с моделями -- преобразовании одних моделей в другие, выводе на базе информации моделей, моделирование в части разбиения на уровни абстракции в моделировании и т.д.. Вот тут я делал разбор отличий научного, инженерного, вычислительного мышления и ссылался на июльскую публикацию 2018г. в Communications of ACM -- https://ailev.livejournal.com/1439141.html. Вот 2006 год, Jeannet Wing, про то же самое и там же -- https://www.cs.cmu.edu/~15110-s13/Wing06-ct.pdf

Один из трендов -- вычислительное мышление скатывается к пониманию его как "просто мышлению", "мыслительными вычислениями", независимо от природы компьютера. Мозг человека тоже подойдёт, но полно работ и о вычислениях какой-нибудь плесневой слизи, типа https://www.sciencedaily.com/releases/2014/03/140327100335.htm. Серьёзным вопросом последних лет в вычислительном мышлении стал вопрос о включении в computer science алгоритмики вычислений/вывода на дифференцируемых программах/differentiable programming и далее дифференцируемых моделях в целом/differentiable modeling -- "дифференцируемое всё: от чёрно-белой модели мира к рябенькой", https://ailev.livejournal.com/1464563.html.

Just as functional programming involves reasoning about and expressing algorithms using functional patterns, differentiable programming involves expressing algorithms using differentiable patterns. Many such design patterns have already been developed by the deep learning community, such as for handling control problems or sequence and tree structured data. This post has introduced a couple of new ones, and as the field matures many more will be invented. The resulting programs are likely to make even the most advanced current deep learning architectures look crude by comparison. -- https://fluxml.ai/2019/03/05/dp-vs-rl.html

Karpathy про Software 2.0 тоже ясно написал, что "градиентный спуск лучше пишет код, чем программисты". Тренд понятен. А ещё моделирование данных: непонятно, где там программирование, а где уже нет (работа с кучерявыми типами данных ведь без разницы, в базах данных, или в переменных — и там тонкая разница про "языки запросов" и "обычные языки").

Коннективистские модели тем самым тоже попали в предмет вычислительного мышления. Авторы алгоритмов обучения нейронных сеток ЛеКун, Бенжио и Хинтон стали лауреатами Тьюринговской премии этого года -- https://awards.acm.org/about/2018-turing, то есть искусственный интеллект (занимающийся мышлением-не-в-человеке) признали частью computer science и software engineering в профильной ассоциации, Association for computing machinery. Я вот уже делал вывод (https://ailev.livejournal.com/1469822.html), что по мере ухода всей науки/science в компьютеры она будет называться learning, а в пределе -- self-supervising learning, а по мере ухода инженерии в компьютеры она будет называться search. Всё это будет алгоритмика обучения и поиска, computer science, а мышление на эти темы -- computer thinking.

И это далеко не весь список "программирований". Вот, например, квантовое программирование -- https://en.wikipedia.org/wiki/Quantum_programming

Это совершенно не означает, что забывается классическая "информатика", про работу агентов (людей и компьютеров) с текстами и кодами -- http://ailev.livejournal.com/1008054.html. Там тоже мутновато получается, ибо в сферу информатики попадает и лингвистика, и когнитивистика, и философская логика, и даже биосемиотика. А классическая computer science занималась описанием перекодирования: как из одного кода получить другой код. Код -- это формальное в части семантики и синтаксиса использованного языка представление какого-то содержания. А текст -- это вообще "всё есть текст". И одна из основных практик информатики тем самым -- форматизация и деформализация (фордеф как тип софта для такой практики, как модем/модулятор-демодулятор), https://ailev.livejournal.com/969337.html. Информатика должна быть информатикой-в-большом, распределённым моделированием мира. А программирование-моделирование-онтологизирование суть одно, и это и есть информатика/computational thinking, https://ailev.livejournal.com/1167761.html. Поэтому тематика вычислительного мышления оказывается близка к тематике и системного моделирования, где у нас есть какие-то размышления про System Modeling Language, SysMoLan, https://ailev.livejournal.com/1443879.html (заодно понимаем, что модели SysMoLan могут быть вычислимыми/executable, вероятностными, дифференцируемыми -- это как раз обсуждается в рамках вычислительного мышления, а не системного моделирования! Из системного моделирования там как раз онтология системного мышления, а собственно моделирование и вид модели, включая обсуждение идей про теорию категорий как основу представления моделей и всё остальное, что там было наобсуждено -- это вычислительное мышление).

В курсе вычислительного мышления должен быть какой-то более-менее попсовый рассказ про разные "программирования" — разные модели вычислений. Императивное, функциональное, объектное, вероятностное, дифференцируемое и т.д.. И data science, где обсуждаются разные алгоритмы работы с данными прежде всего -- хотя предметом вроде как и являются сами данные. Вообще, ещё Дейкстра сказал, что программа = алгоритм+данные. А данные стали весьма и весьма кучерявыми: поглядим на базы данных! Domain driven design — это ж всё про данные, но вроде как про разработку программ! Текущее программирование в большинстве своём -- простые алгоритмы над сложными данными, утрамбованными в какие-то базы данных. Простые алгоритмы вывода/оценки/вычислений над сложными моделями мира.

Курс вычислительного мышления, по идее, должен втыкаться в линейку методологических курсов "мышлений": рядом с онтологикой, научным мышлением, системным мышлением и должен учить абстрагированию и композиции/декомпозиции моделей мира с выполнением потом вычислений/вывода/оценки моделей.

Вот этот акцент на моделирование и является важным. "Алгоритмика, информатика, моделирование, далее везде" -- https://ailev.livejournal.com/1265432.html про обучение информатике детишек на примере четырёх роботов (платоновский робот, робот-из-программы, физический робот-на-коврике, робот-из-возможного мира где-то в космосе). И этот подход продолжает реализовываться, см. доклад Кушниренко и Райко "Дошкольная информатика без компьютера" (видео второго доклада https://vimeo.com/337031069, слайды http://g-l-memorial.ice.ru/files/941738/Kushnirenko_Raiko_2019.pptm).

Собственно, когда-то SICP (Structure and Interpretation of Computer Programs вышел в 1979 году, 40 лет назад) был "фундаментальным курсом" для computer science (https://mitpress.mit.edu/sites/default/files/sicp/index.html), но он был уволен из-за маленькой неувязочки: курс реально помогал постановке вычислительного мышления, но был абсолютно бесполезен для построения на его основе дальнейших курсов программирования или каких бы то ни было других -- что-то в мире пошло не так с ролью функционального программирования: In short, sicp, Scheme, and functional programming don’t prepare students properly for other programming courses and thus fail to meet a basic need -- https://www2.ccs.neu.edu/racket/pubs/jfp2004-fffk.pdf. Название этой критики SICP ровно то, что нам нужно -- The Structure and Interpretation of the Computer Science Curriculum (Matthias Felleisen, Northeastern University, Boston, MA, USA, Robert Bruce Findler, University of Chicago, Chicago, IL, USA, Matthew Flatt, University of Utah, Salt Lake City, UT, USA, Shriram Krishnamurthi, Brown University, Providence, RI, USA).

Эта критика 2005 года, но с тех пор жизнь ещё раз поменялась, и нужно учитывать вот эти новые программирования -- вероятностное, дифференцируемое и всё прочее, что приходит с коннективистской парадигмой.

На первых порах нужно не столько учить, сколько создать сам предмет/дисциплину. Предмет создаётся в форме учебника, то есть в форме учебного курса -- но поначалу с акцентом не на лёгкость обучения (instructional design), а с акцентом на "все нужные понятия под одной обложкой". Я учебник системного мышления так и сделал: вытащил из десятка инженерных стандартов кусочки про системы, и объединил в связное изложение. Вот и получилось "Системное мышление 2019". С computer science тоже нужно что-то подобное сделать. Выдрать правильные фундаментальные/методологические идеи из разных мест и изложить связно текущий state-of-the-art под одной обложкой -- с надеждой, что над этими идеями можно будет потом строить кругозорные курсы software engineering, data engineering, neural networks engineering и т.д.

И тут два пути: ждать каких-то Великих Гениев, или самим объявлять себя такими и делать. С системным мышлением я просто взял, и сделал -- хотя до сих пор не закончил, работа-то началась по факту осенью 2007 года, когда я столкнулся с системной инженерией и тамошним вариантом системного мышления. С онтологикой и научным мышлением — это делает сейчас Прапион Медведева (https://ailev.livejournal.com/1461525.html). Понятно, что это курс не для специалитетов/магистратур, а для бакалавров -- то есть курс не должен предполагать, что выпускник станет потом software engineer или data scientist. Но что искусственный интеллект не результат работы алгебраических торсионных полей выпускник такого курса должен знать. И потом использовать знание материала курса для продолжения обучения более прикладным инженерным дисциплинам, самым разным.

С вычислительным мышлением самая интересная тусовка людей, знакомых с классикой computer science и всеми этими новомодными заходами на другие модели вычислений собралась вокруг языка Julia -- русскоязычная публика обсуждает проблемы языка в телеграм-чате тут: https://t.me/JuliaLanguage. Почему Julia? Потому что Julia заточена под моделирование. Вот, например, заход на инженерное моделирование: https://ailev.livejournal.com/1366789.html. А вот заход на differentiable programming и искусственный интеллект, это ж по сути дизайн-цель языка: https://julialang.org/blog/2018/12/ml-language-compiler. У меня простая мысль: строить новый курс на базе Julia примерно так же, как SIPC строился на базе Scheme.

DISCLAIMER: по сути дела, это не текст с собственным содержанием, а аннотированный набор ссылок с текстами, откуда и нужно брать идеи для дальнейшего продвижения в создании курса. Без какого-то знакомства с материалами, изложенными по этим ссылкам (а внутри текстов по этим ссылкам есть и много других ссылок!), текущий пост -- просто многабукофф, провоцирующих споры о терминах.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 3 comments