Херманс - Ум программиста Как понять и осмыслить любой код - 2023

  • Первый тип замешательства - недостаток знаний Например, абсолютно непонятный синтаксис языка Значит в долговременной памяти отсутствуют нужные факты.

  • Второй тип замешательства - недостаток информации Например, Integer.toBinaryString(n). Ты не знаешь что делает этот метод и надо читать доку Проблема для кратковременной памяти. Просто можете забыть в потоке изучения множества информации. При чтении программы все ключевые слова, имена переменных, структуры данных хранятся в кратковременной памяти.

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

Все когнитивные процессы связаны с памятью. Все три работают одновременно. Когнитивный процессы: 1. получение инфы из долговременной памяти 2. сохранение инфы о текущей программе в кратковременную память (имя переменной, метода) 3. рабочая память. Обработка кода

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

Что улучшает читаемость и понимаемость кода (это помогает разбивать код на чанки):

  • оспользование паттернов проектирования

  • добавление коментов помогает новым программистам понять код

  • маячки

    • значимые имена переменных

Когда читаешь новую информацию, мозг пытается разделить ее на знакомые части, к. называются чанки => чем больше концепций и примеров синтаксиса знаешь, тем проще будет делить код на чанки => проще запоминать код и обрабатывать

Отвлечение снижает производительность

Перерывы негативно влияют на производительность.

Как учить синтаксис

Карточки

Например, Базовое выражение <-> numbers = [х for х in numbers]

Читаешь описание в карточке и пытаешься вспомнить синтаксис и написать его. Приложения в помощь: Anki, Cerego, Quizlet.

Иногда еще можно создавать карточки с кодом с обеих сторон. С одной стороны код, который вы хорошо понимаете, а с другой тот же код, но, например, на лямдах.

Карточки можно еще создавать для ментальных моделей (паттерны проектирования, архитектурные паттерны)

Запоминание

Большие интервалы повторения (месяц, 8 недель) и с большим количеством повторений. В следующий раз, когда вы соберетесь что-нибудь загуглить, возможно, стоит сна­чала вспомнить синтаксис самостоятельно. Даже если у вас не получится вспом­нить синтаксис, сама попытка укрепит вашу память, и, может быть, в следующий раз вы сможете вспомнить нужную вам информацию. Однако если это не помогает, то сделайте дидактическую карточку и активно ее учите

Механизмы извлечения информации

Уровень хранения

Насколько хорошо сохранилась информация в дол­говременной памяти. Когда вы постоянно изучае­те какую-то новую информацию, вы укрепляете уровень хранения этой информа­ции. Просто хранить информацию в долговременной памяти недостаточно.

Уровень воспроизведения

Насколько легко можно что-то вспомнить. Когда вы пытаетесь вспомнить факт, который, как вам кажется, вы знаете, то вы улучшаете уровень воспроизведения. Активные попытки вспомнить что-то укрепляют память.

Как работает память

  • Воспоминания и связи между ними формируют схему или схемы.

  • Люди не запоминают просто слова или факты, а подстраивают их под уже имеющийся опыт, знания и взгляды

Проработка

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

Когнитивная нагрузка

Тип нагрузки
Краткое пояснение

Внутренняя нагрузка

Насколько задача сложна сама по себе

Внешняя нагрузка

Какие отвлекающие факторы усугубляют задачу

Соответствующая нагрузка

Когнитивная нагрузка, созданная необходимостью хранить все мысли в долговременной памяти

Когда вся когнитивная нагрузка состоит из внутренней и внешней, то места для соответствующей нагрузки не остается. Вы не можете вспомнить уже решенные задачи и способы, которыми вы их решали. Поэтому после напряженного сеанса программирования вы не можете вспомнить, что именно делали. Мозг был настолько занят, что не мог запомнить ваши действия.

Способы снижения когнитивной нагрузки

Когнитивный рефакторинг

Работать с кодом для улучшения его понимания. Это иногда может быть контрнаправлено по сравнению с обычным рефакторингом кода. Т.е. сделать inline метода, чтобы не прыгать между файлами. Итого: реформатировать код так, чтобы было легче с ни работать. Эти изменения можно не комитить.

Малознакомые языковые конструкции увеличивают внешнюю когнитивную нагрузку на рабочую память.

Выделение потоков переменных

Распечатать код или рисовать на экране. Кружком выделить все переменные, и одни и те же переменные соединить линиями. То же самое можно сделать с инстансами классов.

Таблица состояний

Таблица где для каждой переменной свой столбец. И в процессе когнитивной компиляции заполнять таблицу значениями (например, одна строка это один цикл).

Работа с ролями переменных

Распечатать код или стилусом на экране помечать роли переменных в коде.

Углубленное понимание программ

  1. Найти точку фокуса

  2. Анализировать из этой точки

  3. Понять концепцию из набора связанных объектов

  4. Понять концепцию из всего множества объектов

Понимание текста <-> понимание плана

Чтение кода как текст

Какие когнитивные способности указывают на способности к программированию:

  • Способность к количественному мышлению (для математики) - 2%

  • Языковые способности - 17%

  • рабочая память и логическое мышление - 34%

Когнитивные навыки, к. используются при чтении кода, похожи на навыки, к. используются при чтении текста на естественном языке

Стратегии при чтении текста/кода

  • Активация пассивных знаний. При сканировании кода смотрим на используемые концепции, синтаксис. Начинает работать рабочая память, ищет связи в долговременной памяти. Если видите незнакомое понятие, то надо изучить.

  • Наблюдение. При чтение важно понимать, что вы понимаете и что нет. Можно делать пометки

  • Определение важности разных строк кода.

Ментальная модель кода

  1. Начни с создания локальных моделей (таблицы состояния, графы зависимостей). Это поддерживает рабочую память и снижает когнитивную нагрузку. Это будет кирпичиками для создания модели для большой модели

  2. Составь список элементов, используемых в кодовой базе, и отношения между ними.

  3. Ответьте на вопрос о системе:

    1. Какие элементы (классы, объекты) являются самыми важными в системе? Они есть в модели?

    2. Каковы отношения между этими элементами?

    3. Какова основная цель кода?

    4. Как цель связана с важными элементами и отношениями между ними?

    5. Как обычно используется код? Отражено ли это в модели?

Типы долговременной памяти

  1. Процедурная (имплицитная) - моторные навыки ниже уровня сознания человека (умение завязывать шнурки)

  2. Декларативная (эксплицитная) - [играет роль при решении задач] - факты, которые ты можешь вспомнить

    1. эпизодическая (воспоминания о событиях). Как в лагере был. Но и вспоминаем решение задачи в прошлом. Часто воссоздается решение знакомой задачи.

    2. семантическая (память фактов, концепция). Что 7 на 5 будет 35

Подходы в решении задач

Автоматизация. [Имплицитная память] Несколько раз до идеала довести действие. Только проработкой и навыком прокачивается эта память.

Дидактические карточки полезны для декларативной памяти.

Память о том как что-то сделать создана не мышлением, а практикой.

Когнитивный этап

Человеку нужно разделить новую информацию на небольшие фрагменты. Нужно подумать над поставленной задачей. На этом этапе в мозге формируются или обновляются схемы

Ассоциативный этап

Активно повторять новую инфу до тех пор, пока не запомнишь ее и у тебя не сложатся оссациации. Эффективные действия быстро запомнятся, а неэффективные забудутся. Чем труднее задача, тем больше времени требуется для прохождения ассоциативного этапа.

Автономный этап

Навык автоматизирован. Его применение не вызовет когнитивной нагрузки.

Отшлифовывать навык небольших задач. Например, написание циклов. Или любая другая небольшая задача. Написание паттернов, например. Это позволит упростить решение более сложных задач.

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

Исследование: дети получают больше пользы из чтения программ и их объяснений, а не из программирования.

Активности при работе с кодом

Поиск

Например, поиск ошибки, все места вызова метода. Сложно потому что надо держать в голове:

  • что вы ищете

  • какие места кода просмотрели и почему

  • что еще нужно найти

Осмысление

Это когда читаешь и выполняешь код с целью понять его смысл и возможности.

Как подготовиться к отвлечению

  • сохранять воображаемую модель кода (заметки, комментарии, TODO)

Общая идея комментариев заключается в хранении информации, о которой думал программист, но которая не была отражена в самом коде

  • разбить задачу на промежуточные цели и выразить их в виде комментариев (возможно в нескольких классах, местах) в коде что надо сделать. Таким образом быстрее восстанавливается контекст.

Когнитивные измерения баз кода

Подверженность ошибкам

Код на JS из-за нестрогой типизации будет более подвержен ошибкам, чем на Java/Kotlin.

Согласованность

Насколько согласованны имена переменных, расположения файлов, и. т.д

Размытость

Это про длину методов, про то насколько язык много словен (java vs Kotlin). Про то, что некоторые вещи в языке можно решить длинно или коротко.

Скрытые зависимости

Когда файлы, с которыми работает код, лежат в другом месте. Когда сложно понять кто кого вызывает.

Вязкость

Насколько сложно внести изменения в уже существующую кодовую базу.

Почему профи может думать по-другому в отличие от новичка

  • у профи есть много сформированных схем в долговременной памяти

  • профи может разбивать код на чанки и разбираться в артефактах кода (тесты, логи, ..)

Last updated

Was this helpful?