Learnable Programming
Вид: эссе
Коротко
Вопрос: Как сделать так, чтобы люди понимали программирование?
Ответ: Автор считает, что понимать программирование люди смогут, если изменить само программирование: сделать видимым выполнение программы и поддержать способы мышления, подходящие человеку, а не машине.
Тезисы
Против кого пишет:
- Alan Perlis — утверждал, что для понимания программы нужно стать и машиной, и программой
- обучающая среда Khan Academy на JavaScript и Processing — живое обновление результата и подбор чисел наугад вместо понимания
- Fred Brooks, «No Silver Bullet» — по автору, считает программное обеспечение по природе «невидимым и невизуализируемым» и указывает на неудачи визуального программирования
Т1. Программирование, по автору, — способ мышления, а не заученный навык
- Аргумент: автор открывает ответ двумя мыслями об обучении: программирование — способ мышления, а люди понимают то, что видят. Из них он выводит две цели системы: поддерживать сильные способы мышления и дать увидеть выполнение программы.
- Цитата: «Learning about “for” loops is not learning to program, any more than learning about pencils is learning to draw.» (раздел «вступление»)
- Понятия: Программирование как способ мышления
Т2. Если программист не видит, что делает программа, он её не понимает
- Против: Alan Perlis
- Аргумент: автор отвергает слова Перлиса, что для понимания программы нужно стать и машиной, и программой: человек не машина и не должен быть вынужден так думать.
- Цитата: «If a programmer cannot see what a program is doing, she can’t understand it.» (раздел «вступление»)
- Понятия: Видимость выполнения программы
Т3. Хорошая система спроектирована вокруг определённых способов мышления, а не набора функций
- Аргумент: автор сравнивает набор функций среды с набором слов в книге: значит послание, а не отдельные слова; хорошая система целиком строится вокруг поддержки способов мышления.
- Цитата: «Likewise, a well-designed system is not simply a bag of features.» (раздел «The features are not the point»)
- Понятия: Программирование как способ мышления
Т4. Среда отвечает за прозрачность смысла: подбор чисел наугад — не обучение, а барьер
- Против: обучающая среда Khan Academy на JavaScript и Processing
- Аргумент: по автору, учебные материалы Khan Academy предлагают «случайно подбирать числа»; он сравнивает это с микроволновкой без подписей на кнопках и считает, что смысл кода нужно подписывать и показывать рядом с данными, чтобы ученик думал о понятиях программирования.
- Цитата: «Likewise, guessing the third argument of the “ellipse” function isn’t “learning programming”.» (раздел «Make meaning transparent»)
- Данные: пример автора — подпись при наведении мыши на аргументы функций и подписи, связывающие код с результатом на экране.
- Понятия: Прозрачность смысла
Т5. Ход выполнения программы нужно сделать видимым и осязаемым, а не показывать только код и результат
- Против: типичная среда «живого кодирования» — код слева, результат справа
- Аргумент: автор сравнивает такую среду с кулинарным шоу, где показывают продукты и готовое суфле, но не шаги. Ему нужны управление временем (ползунок, шаги вперёд и назад) и шаблоны выполнения во времени (линия времени).
- Цитата: «We see code on the left and a result on the right, but it’s the steps in between which matter most.» (раздел «Make flow tangible»)
- Понятия: Видимость выполнения программы
Т6. Главное, что можно сделать для обучающей среды, по автору, — показывать данные
- Аргумент: код нужен, чтобы обращаться с данными, а их программист не видит; автор опирается на правило Эдварда Тафти «Show the data» и на второе его правило: показывать сравнения.
- Цитата: «If you are serious about creating a programming environment for learning, the number one thing you can do — more important than live coding or adjustable constants, more important than narrated lessons or discussion forums, more important than badges or…» (раздел «See the state»)
- Данные: пример со значениями scaleFactor в цикле: не видя данных, на вопросы о нём приходится отвечать, пересчитывая значения в голове.
- Понятия: Показ данных
Т7. Скрытого состояния быть не должно: его надо либо устранить, либо показать
- Против: графическая библиотека Processing с неявным «текущим» состоянием (цвет заливки, матрица преобразований)
- Аргумент: строка кода, меняющая скрытое состояние, не даёт видимого эффекта; автор называет такое проектирование безответственным и неуважительным к ученику.
- Цитата: «Code that modifies this state produces no visible effect on the canvas.» (раздел «Eliminate hidden state»)
- Понятия: Скрытое состояние
Т8. Среда программирования должна служить «внешним воображением», где программист постоянно реагирует на то, что уже сделано
- Аргумент: автор приводит живописца и музыканта, которые реагируют на то, что уже есть на холсте или в звуке; программисты, по его словам, традиционно работают в голове. «Живое кодирование» само по себе, по автору, лишь основа для других возможностей.
- Цитата: «Working in the head doesn’t scale.» (раздел «Create by reacting»)
- Понятия: Создание через реакцию
Т9. Учиться обобщению надо от конкретного кода к абстрактному, постепенно
- Аргумент: ученик не учится сразу писать абстрактный код, а начинает с конкретного и постепенно превращает константы в переменные, а затем в функции и циклы; на каждом уровне он управляет параметрами и понимает программу.
- Цитата: «The learner should start by writing concrete code, and then gradually change it to introduce abstraction.» (раздел «Create by abstracting»)
- Данные: пример с домиком из фигур: константа становится переменной, затем циклом, затем аргументом функции.
- Понятия: Создание через абстракцию
Т10. Метафоры языков бывают более или менее подходящими уму; в Logo программист может отождествить себя с черепахой
- Против: Processing и стандартное императивное программирование с метафорой «присвоения переменным»
- Аргумент: черепаха Logo позволяет ученику спрашивать себя, как бы он сам выполнил действие; Smalltalk строится на метафоре сообщений; в Processing, по автору, у программиста нет роли в системе.
- Цитата: «Every programming language is made of metaphors, but some fit the mind better than others.» (раздел «Identity and metaphor»)
- Понятия: Идентичность и метафора
Т11. Язык должен поощрять разложение задачи и повторное сочетание частей
- Против: Processing с глобальным состоянием и единичными точками входа
- Аргумент: автор называет модульность рычагом разума против сложности; Processing, по автору, мешает независимому думанию о частях и склейке чужих программ, а HyperCard, по автору, приспособлен к склейке.
- Цитата: «Modularity is the human mind’s lever against complexity.» (раздел «Decomposition»)
- Понятия: Декомпозиция, Рекомпозиция
Т12. Принципы, по автору, нужны не только новичкам, но и опытным программистам
- Аргумент: опытному программисту не нужно знать, что значит «if», но нужно понимать поведение программы во время её написания; автор предлагает считать принципы требованиями и перепроектировать программирование под них.
- Цитата: «These design principles were presented in the context of systems for learning, but they apply universally.» (раздел «These are not training wheels»)
- Понятия: Программирование как способ мышления
Т13. Визуализировать надо данные и поведение, а не код и статическую структуру
- Против: Fred Brooks, «No Silver Bullet» (по автору, считает программное обеспечение «невидимым и невизуализируемым»)
- Аргумент: автор не винит Брукса, но считает, что традиционные визуальные среды показывают не то: структуру кода, а понимать нужно, что код делает.
- Цитата: «Visualize data, not code. Dynamic behavior, not static structure.» (раздел «These are not training wheels»)
- Понятия: Визуализация данных, а не кода
Пример
К1. Микроволновка без подписей и кулинарное шоу без шагов
Автор сравнивает подбор чисел наугад в среде Khan Academy с микроволновкой, у которой кнопки без подписей, а показ только кода и результата — с кулинарным шоу, где видны продукты и готовое суфле, но не приготовление. Подкрепляет Т4 и Т5.
К2. Домик, который превращают в строку домиков
Рисунок домика из констант сначала переводят в переменную положения, затем в цикл и в функцию с аргументами, на каждом шаге оставляя управление параметрами. Подкрепляет Т9.
Связи
- Из карточки:
Программирование как способ мышления→ автор: обучение программированию — это обучение мышлению, а не отдельным конструкциям языка (Т1) - Из карточки:
Видимость выполнения программы→ автор: программист понимает то, что видит и может осязаемо исследовать (Т2, Т5) - Из карточки:
Прозрачность смысла→ автор: среда обязана подписывать и объяснять в контексте, чтобы ученик мог читать программу (Т4) - Из карточки:
Показ данных→ автор: значения, которые вычисляет код, должны быть сразу видны (Т6) - Из карточки:
Скрытое состояние→ автор: состояние нужно устранить или показать на экране (Т7) - Из карточки:
Создание через реакцию→ автор: программист начинает с чего-то на экране и подправляет (Т8) - Из карточки:
Создание через абстракцию→ автор: сначала конкретное, затем обобщение по уровням (Т9) - Из карточки:
Идентичность и метафора→ автор: язык связывает мир компьютера с миром программиста (Т10) - Из карточки:
Декомпозиция→ автор: разбиение мысли на куски по силам ума (Т11) - Из карточки:
Рекомпозиция→ автор: склейка частей программ и обучение друг у друга (Т11) - Из карточки:
Визуализация данных, а не кода→ автор: показывать поведение, а не статическую структуру (Т13)
Частные вопросы
- В1. Чему должна учить обучающая среда и что ей для этого видеть? → Т1, Т2
- В2. Какие свойства среды помогают понимать программу? → Т3, Т4, Т5, Т6, Т7, Т8, Т9
- В3. Какие свойства языка помогают думать о программе? → Т10, Т11
- В4. Нужны ли эти принципы только новичкам и что визуализировать? → Т12, Т13