Книга освещает практические основы когнитивистики для программистов. Основные темы: осмысление и развитие чужого и собственного кода, изучение новых языков программирования, мнемонические приемы для программистов, поддержка кода в читаемом состоянии. Объяснено, как снижать когнитивную нагрузку при работе программиста, как делать код логичным и понятным для себя и коллег. Рассмотрены приемы именования функций, классов и переменных, подходы к ведению репозиториев, совместной разработке и доработке кода.
Author(s): Фелин Херманc
Edition: 1
Publisher: БХВ-Петербург
Year: 2023
Language: Russian
Pages: 272
City: СПб.
Tags: Programming; Cognitive Psychology; Problem Solving; Naming
Оглавление
Предисловие
От автора
Благодарности
О книге
Структура книги
Дискуссионный форум liveBook
Об авторе
Об обложке
ЧАСТЬ I. ОБ УЛУЧШЕНИИ НАВЫКОВ ЧТЕНИЯ КОДА
Глава 1. Определение вашего типа замешательства при кодировании
1.1. Разные типы замешательства в коде
1.1.1. Первый тип замешательства — недостаток знаний
1.1.2. Второй тип замешательства — недостаток информации
1.1.3. Третий тип замешательства — недостаток вычислительной мощности
1.2. Различные когнитивные процессы, влияющие на процесс кодирования
1.2.1. Долговременная память и программирование
Программа на APL с точки зрения долговременной памяти
1.2.2. Кратковременная память и программирование
Программа на Java с точки зрения кратковременной памяти
1.2.3. Рабочая память и программирование
Программа на BASIC с точки зрения рабочей памяти
1.3. Совместная работа когнитивных процессов
1.3.1. Краткое описание того, как когнитивные процессы взаимодействуют друг с другом
1.3.2. Когнитивные процессы и программирование
Выводы
Глава 2. Скорочтение кода
2.1. Быстрое чтение кода
2.1.1. Что только что происходило в вашем мозге
2.1.2. Перепроверка воспроизведенного кода
Вторая попытка воспроизведения кода
2.1.3. Перепроверка воспроизведенного
2.1.4. Почему читать незнакомый код так сложно
2.2. Преодоление лимитов памяти
2.2.1. Сила чанков
Чанки кода
2.2.2. Опытные программисты запоминают код лучше начинающих программистов
2.3. Вы видите намного больше кода, чем можете прочитать
2.3.1. Иконическая память
Иконическая память и код
2.3.2. Это не то, что вы помните; это то, как вы запоминаете
Как написать код, который можно разделить на чанки
Используйте паттерны проектирования
Пишите комментарии
Оставляйте «маячки»
2.3.3. Применяйте чанки
Выводы
Глава 3. Как быстро выучить синтаксис
3.1. Советы по запоминанию синтаксиса
3.1.1. Отвлечение снижает производительность
3.2. Как быстро выучить синтаксис с использованием карточек
3.2.1. Когда использовать карточки
3.2.2. Расширяем набор карточек
3.2.3. Убираем ненужные карточки
3.3. Как не забывать информацию
3.3.1. Почему мы забываем
Иерархия и сеть
Кривая забывания
3.3.2. Интервальное повторение
3.4. Как запомнить синтаксис надолго
3.4.1. Два способа запоминания информации
Уровень хранения
Уровень воспроизведения
3.4.2. Просто увидеть недостаточно
3.4.3. Воспоминания укрепляют память
3.4.4. Укрепление памяти путем активного мышления
Схемы
Проработка для запоминания концепций программирования
Выводы
Глава 4. Как читать сложный код
4.1. Почему так тяжело понимать сложный код
4.1.1. Чем друг от друга отличаются рабочая память и кратковременная память
4.1.2. Типы когнитивной нагрузки и как они связаны с программированием
Внутренняя когнитивная нагрузка при чтении кода
Внешняя когнитивная нагрузка при чтении кода
4.2. Способы снижения когнитивной нагрузки
4.2.1. Рефакторинг
4.2.2. Замена незнакомых языковых конструкций
Лямбда-функции
Генератор списков
Тернарные операторы
4.2.3. Синонимизация — отличное дополнение к дидактическим карточкам
4.3. Вспомогательные средства при перегрузке рабочей памяти
4.3.1. Создание графа зависимостей
4.3.2. Использование таблицы состояний
4.3.3. Сочетание графов зависимостей и таблиц состояний
Выводы
ЧАСТЬ II. ПРОДОЛЖАЕМ ДУМАТЬ О КОДЕ
Глава 5. Совершенствуем навыки углубленного понимания кода
5.1. Роли переменных
5.1.1. Разные переменные выполняют разные действия
5.1.2. Одиннадцать ролей, охватывающие почти все переменные
5.2. Роли и принципы
5.2.1. Польза ролей
Практические советы по работе с ролями переменных
5.2.2. Венгерская нотация
Системная и прикладная венгерские нотации
5.3. Углубленное понимание программ
5.3.1. Понимание текста и понимание плана
5.3.2. Этапы понимания программы
Применение этапов углубленного понимания
5.4. Чтение кода как обычного текста
5.4.1. Что происходит в мозге при чтении кода
Поля Бродмана
Показания фМРТ
5.4.2. Если вы можете выучить французский, то сможете выучить и Python
Как люди читают код
Перед тем как читать код, программисты сканируют его
Начинающие и опытные программисты читают код по-разному
5.5. Стратегии понимания текста, которые можно применить к коду
5.5.1. Активация пассивных знаний
5.5.2. Наблюдение
5.5.3. Определение важности разных строк кода
5.5.4. Предположения о значении имен переменных
5.5.5. Визуализация
Таблица операций
5.5.6. Постановка вопросов
5.5.7. Резюмирование кода
Выводы
Глава 6. Совершенствуем навыки решения задач программирования
6.1. Использование моделей для размышлений о коде
6.1.1. Преимущества использования моделей
Не все модели одинаково полезны
6.2. Ментальные модели
6.2.1. Подробное исследование ментальных моделей
6.2.2. Изучение новых ментальных моделей
6.2.3. Как эффективно использовать ментальные модели во время размышлений о коде
Ментальные модели в рабочей памяти
Точные модели работают лучше
Создание ментальных моделей исходной программы в рабочей памяти
Ментальные модели в долговременной памяти
Создание ментальных моделей исходной программы в долговременной памяти
Ментальные модели, одновременно хранящиеся в долговременной и рабочей памяти
6.3. Условные машины
6.3.1. Что такое условная машина
6.3.2. Примеры условных машин
6.3.3. Разные уровни условных машин
6.4. Условные машины и язык
6.4.1. Расширяем набор условных машин
6.4.2. Разные условные машины могут создать взаимно конфликтующие ментальные модели
6.5. Условные машины и схемы
6.5.1. Почему схема важна
6.5.2. Являются ли условные машины семантическими
Выводы
Глава 7. Заблуждения
7.1. Почему второй язык программирования выучить намного проще, чем первый
7.1.1. Как увеличить шанс воспользоваться знаниями по программированию
7.1.2. Разные виды трансференции
Осознанная и неосознанная трансференция
Близкая и дальняя трансференция
7.1.3. Знания: добро или зло?
7.1.4. Сложности трансференции
7.2. Заблуждения. Ошибки в мышлении
7.2.1. Исправление заблуждений путем концептуальных замен
7.2.2. Подавление заблуждений
7.2.3. Заблуждения о языках программирования
7.2.4. Предотвращение заблуждений при изучении нового языка программирования
7.2.5. Выявление заблуждений в новой базе кода
Выводы
ЧАСТЬ III. О ХОРОШЕМ КОДЕ
Глава 8. Совершенствуем навыки присваивания имен
8.1. Почему присваивание имен так важно
8.1.1. Почему присваивание имени так важно
Имена составляют существенную часть кодовой базы
Имена играют роль в обзорах кода
Имена — это самая удобная форма документации
Имена могут служить маячками
8.1.2. Разные точки зрения на присваивание имен
Хорошее имя можно определить синтаксически
Имена во всей базе кода должны быть единообразны
8.1.3. Важно грамотно подбирать имена
Заключения о практике присваивания имен
8.2. Когнитивные аспекты присваивания имен
8.2.1. Форматирование имен поддерживает кратковременную память
8.2.2. Понятные имена лучше закрепляются в долговременной памяти
8.2.3. Полезная информация в именах переменных
8.2.4. Когда стоит оценивать качество имен
8.3. Какие типы имен проще всего понимать
8.3.1. Использовать аббревиатуры или нет?
Однобуквенные имена переменных
8.3.2. Змеиный или верблюжий регистры?
8.4. Влияние имен на ошибки кода
8.4.1. В коде с некачественными именами больше ошибок
8.5. Как выбирать хорошие имена
8.5.1. Шаблоны имен
8.5.2. Трехступенчатая модель Фейтельсона для хороших имен переменных
Трехступенчатая модель во всех деталях
Успех трехступенчатой модели Фейтельсона
Выводы
Глава 9. Боремся с плохим кодом и когнитивной нагрузкой. Две концепции
9.1. Почему код с запахами кода создает большую когнитивную нагрузку
9.1.1. Краткая информации о запахах кода
Запахи кода на уровне метода
Запахи кода на уровне класса
Запахи кода на уровне базы кода
Влияние запахов кода
9.1.2. Как запахи кода вредят мышлению
«Длинный список параметров», сложные «Операторы переключения» — перегрузка рабочей памяти
«Всемогущий класс», «Длинный метод» — невозможно эффективно разбить код на чанки
«Клоны кода» — невозможно правильно разбить код на чанки
9.2. Зависимость когнитивной нагрузки от плохих имен
9.2.1. Лингвистические антипаттерны проектирования
9.2.2. Измерение когнитивной нагрузки
Шкала Пааса для когнитивной нагрузки
Измерение нагрузки по глазам
Измерение нагрузки по коже
Измерение нагрузки по мозгу
Запись биотоков мозга
Функциональная fNlRS-томография и программирование
9.2.3. Лингвистические антипаттерны и когнитивная нагрузка
9.2.4. Почему лингвистические антипаттерны вызывают замешательство
Выводы
Глава 10. Совершенствуем навыки решения сложных задач
10.1. Что такое решение задач
10.1.1. Элементы решения задач
10.1.2. Пространство состояний
10.2. Какую роль при решении задач программирования играет долговременная память
10.2.1. Решение задачи — это отдельный когнитивный процесс?
При решении задач вы используете долговременную память
Вашему мозгу проще решить знакомые задачи
10.2.2. Как научить долговременную память решать задачи
10.2.3. Два вида памяти, наиболее существенные при решении задачи
Какие виды памяти играют роль при решении задач
Потеря знаний или навыков
10.3. Автоматизация: создание имплицитной памяти
10.3.1. Имплицитная память с течением времени
Когнитивный этап
Ассоциативный этап
Автономный этап
10.3.2. Почему автоматизация помогает программировать быстрее
10.3.3. Улучшение имплицитной памяти
10.4. Обучение на основе кода и его объяснения
10.4.1. Новый вид когнитивной нагрузки: соответствующая нагрузка
10.4.2. Примеры с решением на практике
Работайте вместе с коллегой
Используйте GitHub
Читайте книги или блоги об исходном коде
Выводы
ЧАСТЬ IV. О СОВМЕСТНОЙ РАБОТЕ НАД КОДОМ
Глава 11. Процесс написания кода
11.1. Различные активности, выполняемые во время программирования
11.1.1. Поиск
11.1.2. Осмысление
11.1.3. Переписывание
11.1.4. Наращивание
11.1.5. Исследование
11.1.6. А как же отладка?
11.2. Программист отвлекся
11.2.1. Задачи программирования нуждаются в «разогреве»
11.2.2. Что происходит после отвлечения
11.2.3. Как подготовиться к отвлечению
Сохраняйте воображаемую модель
Помогите своей проспективной памяти
Определитесь с промежуточными целями
11.2.4. Когда отвлекать программиста
11.2.5. Пара слов о многозадачности
Многозадачность и автоматизация
Исследования многозадачности
Выводы
Глава 12. Проектирование и усовершенствование больших систем
12.1. Проверка свойств базы кода
12.1.1. Когнитивные измерения
Подверженность ошибкам
Согласованность
Размытость
Скрытые зависимости
Преждевременная фиксация решения
Вязкость
Поэтапное оценивание
Выразительность ролей
Близость соответствия
Трудность мыслительных операций
Вторичные обозначения
Градиент абстракции
Наглядность
12.1.2. Использование когнитивных измерений базы кода для улучшения базы кода
12.1.3. Проектные маневры и их плюсы и минусы
Подверженность ошибкам и вязкость
Преждевременная фиксация решения и поэтапное оценивание против подверженности ошибкам
Выразительность ролей и размытость
12.2. Измерения и активности
12.2.1. Влияние измерений на разные активности
Поиск
Осмысление
Переписывание
Наращивание
Исследование
12.2.2. Изменение базы кода под ожидаемые активности
Выводы
Глава 13. Как ввести новых программистов в курс дела
13.1. Проблемы процесса адаптации
13.2. Различия между профессионалами и новичками
13.2.1. Поведение новичка более подробно
Оригинальная концепция Пиаже
Концепция неопиажизма для программирования
При изучении новой информации вы можете временно забывать некоторые вещи
13.2.2. Разница между вещественным и абстрактным видением концепций
13.3. Активности для улучшения процесса адаптации
13.3.1. Ограничение заданий до одной активности
13.3.2. Поддержка памяти новичка
Поддержка долговременной памяти: объяснение релевантной информации
Поддержка кратковременной памяти: ставьте небольшие конкретные задачи
Поддержка рабочей памяти: используйте диаграммы
13.3.3. Совместное чтение кода
Активация
Определение важности
Постановка предположений
Наблюдение
Визуализация
Постановка вопросов
Резюмирование
Выводы
Эпилог. Пара слов перед прощанием
Предметный указатель