Три дня молчало ереванское радио
на четвертый диктор объявил:
Передача для глухонемых окончена.
©анекдот.ру
Великий Михаил Михайлович Жванецкий давал совет: Писать, так же как и писать, надо тогда, когда уже невтерпеж. Вот сейчас примерно такой случай. Давно не было обзоров на хорошие книги, да и я давненько не топтал клавиатуру.
Постановка вопроса:
Книги, трактаты и прочие наставления как оптимизировать труд программиста появляются с достаточной регулярностью со времен появления программирования как предмета. Из бестселлеров и действительно выдающихся изданий, можно выделить "Чистый Код" Роберта Мартина и "Совершенный код" Стива Макконнелла, другой подход к проблеме и не только программирования, "Думай медленно… Решай быстро" Даниэля Канемана. Эта тройка на мой взгляд несомненно обязательная к прочтению.
Казалось бы уже не добавить не убавить, но книга Фелин Херманс "Ум программиста. Как понять и осмыслить любой код" (в оригинале The Programmer's Brain: What every programmer needs to know about cognition [Hermans, Felienne] об этом еще поговорим ниже), действительно стоит особняком и стоит того, чтобы на нее потратить свое внимание и деньги (кто может внести ее в бюджет закупок 2023, поторопитесь).
Как минимум, прочтение этой книги даст вам однозначный и понятный ответ на вопрос о который сломано миллионы копий на профильных и непрофильных форумах: А почему это я(ты, он, она) закончил замечательные, расчудесные, лучшие в галактике (нужное подчеркнуть) курсы программирования, а сеньором(сеньоркой?) не стал(а)?
И да. Это не ответ: Хочешь стать сеньором программистом быстро — переезжай в Мексику.
Там же: можно ли отвлекать программистов в процессе работы, сколько ролей у переменных, что легче для понимания, змеиный или верблюжий регистры и многое другое.
Все это со ссылками на солидные научные исследования. Британским ученым видимо совсем нечем заняться.
По стилю произведение явно писалось как учебник, с домашними заданиями, подведением итогов каждой главы, в образовательных целях ее можно так и использовать, но можно просто прочесть на сон грядущий, как обычный детектив.
Кто любит полную информацию из первых рук, а не пересказ, тот уже гуглит сайты издательства или книжные магазины. Остальные.
Приступим...
Об авторе: Доктор Фелина Херманс — доцент университета в Нидерландах, где читает лекции по методам обучения программированию. Также она преподает в средней школе и является создателем языка программирования Hedy, предназначенного для детей. Возможно поэтому ее книга, хотя и является научным трудом, читается очень легко и приятно, как принято говорить — не оторваться. По крайней мере у меня она прошла запоем, почти с такой же скоростью как и "Снеговик" Ю Несбё.
Во всероссийском конкурсе по вежливости и изысканности слога
с большим отрывом победил петербургский интеллигент Апполон Митрофанович,
который просил у участников 10 рублей, чтобы опохмелиться
©анекдот.ру
Лирическое отступление: Обычно книги по программированию написаны шершавым суровым языком плаката. Эту написала женщина, да еще преподающая детям, поэтому стиль изложения совсем другой. Как мне показалось, значительную часть милоты добавила переводчица. Это похоже на "Приключения Буратино" или Винни-пуха, когда литературный перевод превосходит оригинал именно в душевности изложения.
Многие термины программирования, в силу исторических особенностей, имеют однозначное толкование в английском языке, для людей находящихся в теме, понятные более-менее далеким от профессии, но с трудом поддающимися литературному выражению. Вот и в этой книге, первым предложением первой главы идет фраза, которая наверняка станет мемом вашего отдела разработки минимум на месяц.
"Замешательство — неотъемлемая часть программирования "
Давайте говорить как петербуржцы: Ваш код, сударь, вызывает у меня замешательство.
А не все вот это, что кричат в пустоту экрана счастливые обладатели типовых, совместимых и слегка разбавленных конфигураций 1С их далеким и недалеким разработчикам.
Я не поленился и нашел исходный английский текст книги.
В оригинале фраза звучит
"Confusion is part of programming"
Англо-русский словарь профессора В. К. Мюллера
confusing путанный
confusion смущение, замешательство; неразбериха;
гугл дает перевод всей фразы жестче, но корректнее,
желающие могут в комментариях посоревноваться, в любом случае "замешательство" приятно уху и очень мило.
Видимо с легкой руки маркетологов русского издательства часть названия книги "What every programmer needs to know about cognition" превратилось в "Как понять и осмыслить любой код"
А с предложением "The bug seems to be caused by an off-by-one error" не справляется даже всемогущий гугл,
это словечко англоязычных кодеров, перевод которого как "ошибка, о которой сообщил клиент, — это ошибка на единицу" вам не сильно поможет, хотя я могу ошибаться (пусть это будет вашим домашним заданием, сходить в википедию и предложить свой вариант).
Книга полна милых фраз, которые замещают программистский жаргон, и это скорее плюс, чем минус, поскольку дает большую погруженность и вовлеченность в чтение.
Вообще книга, на каком из языков ее не читай, предназначена разойтись на цитаты, помещенные в рамочку над рабочим местом (отчасти это связано с тем, что автор сама цитирует и опирается на научные исследования)
Как вам: 60% времени программистов тратится на понимание кода, а не на его написание
а вот эту я бы включил в обязательную часть трудового договора:
Программы должны писаться для того, чтобы их читали люди, и лишь во вторую очередь для выполнения машиной сформулирована она в 1996 году!
Три источника и три составных части…
не марксизма…
Весь материал книги опирается на деление памяти человека на рабочую, кратковременную и долговременную. Местами проскакивают упоминания о других, например иконической, но опирается автор на эти три.
Сравнивая весь мозг с системным блоком, долговременная память, сравнивается с жестким диском, на который записываются знания.
Кратковременная память, это ОЗУ, хранящая информацию, которая поступает на короткое время.
Рабочая память, это процессор обрабатывающий информацию, поступающую от долговременной и кратковременной памяти.
Мне больше симпатизирует модель Даниэля Канемана, про быстрое и медленное мышление, но раз система работает и помогает в обучении программированию, почему бы и нет.
Лирическое отступление: Возможности человеческого мозга, скорее всего на текущий момент изучены не более чем на 1% или меньше, иногда все они легко разбиваются об Аннушку, которая уже пролила масло… Поэтому, можно говорить о некоторой модели, работающей в ограниченном пространстве случаев и подходящей вам. Когда человечество считало Землю плоской, то оно вполне успешно пользовалось картами, путешествовало и совершало географические открытия, вписывающиеся в эту модель. А шаманов, которые не смогли ударом в бубен вызвать дождь, просто съедали и начинали пользоваться другими шаманами. Так же и здесь, если программистов проще сейчас учить считая, что у них вместо головы системный блок, можно принять это как данность. Мне, как недоделанному DBA, больше подошла бы метафора с индексированием информации.
Опираясь на три типа памяти, автор выделяет и три типа замешательства:
- недостаток фундаментальных знаний
- отсутствие важной информации в момент кодирования
- и недостаток вычислительной мощности мозга.
Школьный учитель спрашивает учеников о профессии родителей.
— Тим, чем твоя мама занимается на работе?
Тим встает и гордо говорит:
— Она — доктор.
— Замечательно, ну как насчет тебя, Эмми?
Девочка стеснительно произносит:
— Мой папа разносит почту.
— Спасибо, Эмми, — говорит учитель. — Ну, а твои родители
что делают, Билл?
Билл гордо встает и объявляет:
— Мой папа играет музыку в борделе!
Обалдевший учитель решил направиться к Биллу домой.
— В каких условиях вы растите ребенка? — спрашивает он у отца.
Тот отвечает:
— Вообще-то я программист и специализируюсь на TCP/IP
коммуникационном протоколе в системе UNIX. Ну как объяснить
это семилетнему пацану?
©анекдот.ру
Недостаток знаний
Кратковременная память (и выделенная автором в отдельную, рабочая память) по данным различных исследований способна запоминать в среднем 7±2 объекта, максимум 12 у особо одаренных людей.
Это касается не только программирования, а всего в окружающей нас действительности. Чтобы преодолеть это ограничение сознание действует несколькими путями: сопоставляет текущий предмет с хранящимися в воспоминаниях (иногда это играет плохую шутку) и/или объединяет предметы в коллекции, в психологии называемые чанками.
Оба этих пути опираются на использование долговременной памяти, иными словами, багажа знаний.
Именно поэтому выпускник 1-3-6 месячных курсов, никогда не обойдет работающего программиста, если…
Техническое отступление: Классический пример из книги. Когда шахматистам различного уровня давали задание запомнить расстановку фигур на доске, то гроссмейстеры справлялись с этой задачей лучше новичков, потому, что их метод был не линейное запоминание по позициям, а что-то вроде сицилианская защита и слон левее на две клетки, это позволяло на порядок больше запомнить информации… но только до тех пор, пока фигуры не начинали расставляться в хаотическом порядке.
Там никакого преимущества в опыте не наблюдалось. Мораль на поверхности: в общем бардаке сеньоры и джуниоры кодируют с одинаковой скоростью, а при четко выстроенном процессе опытные программисты продуктивнее на порядок.
Рекомендации автора не новы. Учить синтаксис наизусть, знать паттерны проектирования и концепции предметной области.
А вот методы представляют интерес.
Синтаксис предлагается учить с помощью карточек по типу изучения иностранных слов.
Достаточно подробно рассмотрена кривая забывания
с простой формулой
и метод интервального повторения.
Также рекомендуется активная проработка новой информации, например путем рисования схем, построение цепочек связанных воспоминаний.
А вот поиск в интернет Фелин Херманс не рекомендует.
Вопрос спорный, но автор считает и небезосновательно, что выходя в сеть, программист отвлекается на посторонние вещи.
Исследование показало, что после отвлечения человеку требуется примерно четверть часа для того, чтобы вернуться к работе с кодом.
С одной стороны можно быстро посмотреть документацию и не растекаться мысью по древу, с другой… можете рассказать бухгалтерам, чего будет стоить выдернуть программиста из отладки.
Ограничения кратковременной и рабочей памяти.
Как следует из самих ограничений, надо свести количество объектов которые надо держать в уме до приемлемого.
Ключевое слово тут рефакторинг.
Чем яснее будет код, тем легче его будет обрабатывать. Ничего необычного.
Создание графа зависимостей, чтобы понять фрагмент сложного кода или таблицы состояний, в которую записываются промежуточные значения переменных, с этим я не встречался в чистом виде, современные IDE с этим отлично помогают, но порисовать на бумаге блок-схемы или записать что-то на память, это никогда не помешает. Наверняка есть и более технологичные методы вроде MindManager.
Тем кто при слове рефакторинг скорчил мину, что все это уже сказано-пересказано, небольшой тестовый вопрос: Есть переменные счетчики, есть константы, есть переменная бродяга(!). А сколько всего ролей переменных вы знаете?
Согласно словам профессора Йорма Сайаниеми (Jorma Sajaniemi) из Университета Восточной Финляндии с помощью всего 11 ролей можно описать практически все переменные:
- Фиксированное значение
- Счетчик
- Флаг
- Бродяга
- Держатель последнего значения
- Держатель искомого значения
- Накопитель
- Контейнер
- Последователь
- Преобразователь
- Временная переменная
По роли переменной предлагается выбирать ее наименование.
Сейчас только ленивый не поминает венгерскую нотацию как устаревшую, но в ней как оказалось была рекомендация, помимо именования по типу, именовать переменные по их роли.
Помимо советов по именованиям, есть несколько очень интересных исследований.
Например, что опытные программисты при чтении программы не двигаются построчно, как это делают новички, а ищут точку фокуса, например строку, использующую много ресурсов (привет эксперты) и анализируют код начиная от нее.
Какие когнитивные способности указывают на склонность к программированию?
Способность к количественному мышлению — знания и навыки, необходимые для математики, — указывала на способности к программированию всего лишь у 2% участников теста.
Языковые способности дали результат чуть лучше— 17%.
Лучше всего себя показали рабочая память и логическое мышление — 34% участников.
Стратегии, использующиеся для углубленного понимания текстов на естественном языке, например визуализация и резюмирование, могут использоваться для углубленного понимания кода.
К делающему уроки сыну подходит отец, гладит сына по голове:
— Старайся, сынок, крючки пиши аккуратнее.
— Это не крючки, папа! Это интегралы!
©анекдот.ру
Главы по использованию ментальных моделей и условных машин с черепашьей графикой я честно проспал, как и в институте.
Запомнил только, что точные модели работают лучше и что условная машина, которая представляет переменную как коробочку, отличается от условной машины, представляющей переменную как метку с именем.
В целом середина книги получилась несколько замудренной для человека, который уже ни Бойля, ни Мариотта, в лицо не представляет.
Оцените фразу: Трансференция автоматизированных умений отличается от трансференции умений, которые были получены осознанно и все поймете.
Суть главы том, что не все знания полученные в прошлом помогают нам в изучении нового, иногда, иногда они могут вызывать заблуждение.
Конечно же нашелся исследователь, Юха Сорва (Juha Sorva), доцент Университета Аалто в Финляндии, который все заблуждения начинающих программистов посчитал (насчитав 162 заблуждения) и написал конечно же диссертацию.
Способы борьбы с заблуждениями: парное программирование, тестирование и документирование кода.
Продравшись сквозь дебри ментальных моделей выходим на солнечную поляну размышлений об именовании функций и запахе кода.
Запах кода (в подцензурном варианте: код с душком, а в неподцензуроном ...)… вокруг него как мухи вьются различные исследователи.
Уж сколько раз твердили миру… Имена — это самая удобная форма документации, понятные имена лучше закрепляются в долговременной памяти, в коде с некачественными именами больше ошибок.
Очень подробно разбираются идеи Мартина Фаулера (Martin Fowler) из его широко известной в узкихз кругах книги "Рефакторинг: улучшение проекта существующего кода"
Тем, кому кажется это простым вопросом. Профессор компьютерных наук Дрор Фейтельсон (Dror Feitelson), провел исследование для того, чтобы понять, насколько сложно придумать простое и понятное имя. Для 47 элементов, (т. е. переменных, функций и параметров), вероятность того, что два человека присвоят одно и то же имя, составила только 7%.
Лирическое отступление: Впрочем, возможно, дело в месте проведения: Еврейском университете в Иерусалиме. Как известно, сколько евреев, столько и мнений.
Часть книги обязательная к прочтению. И еще одна цитата в рамочку
Имена во всей базе кода должны быть единообразны
Об этом очень часто забывают. Советов как составлять имена много, не надо применять их все в одном модуле.
Завидую количеству свободного времени у людей (или количеству денег у тех, кто им выделяет гранты), которые считают в каком языке программирования, какая однобуквенная переменная встречается чаще.
Зато, как бальзам на душу 1С-ников. Вероятность выбора правильного варианта имени, написанного верблюжьимрегистром, была выше на 51,5%, чем змеиным.(Цена такой точности — скорость. Участником требовалось на полсекунды больше, чтобы найти имена элементов, написанные верблюжьим регистром.)
Желающие удивить коллег познаниями, упомяните в курилке, трехступенчатую модель Фейтельсона для хороших имен переменных.
Далее следует раздел
Как решать задачи
Все просто(читать голосом Алексея Булдакова):
- Поймите задачу
- Составьте план
- Выполните план
Разобравшись с написанием кода, Доктор Фелина Херманс переходит к самому процессу решения задач, лихо поделив долговременную память, к которой читатель уже привык, еще на две, а потом вторую половину еще на две.
Рекомендации — Первое, довести свои действия до автоматизма, ничем другим кроме повторения этого не добиться.
"Нужно активно повторять новую информацию до тех пор, пока вы не запомните ее и у вас не сложатся ассоциации", советует автор. "Например, вы видите открывающую скобку и нервничаете, если не видите закрывающую скобку. Вы понимаете, что лучше писать сразу обе скобки — так вы точно не забудете закрывающую скобку. Говоря другими словами, эффективные действия быстро запомнятся, а неэффективные действия будут забыты."
Лирическое отступление: Можно позавидовать оптимизму Фелины. Быстро запомнятся действия выполняемые с наименьшими трудозатратами, но не обязательно эффективные. А переучиваться будет сложнее.
А второе, это учиться на примерах. Здесь и парное программирование и изучение кодовой базы GitHub (Значит гуглить все таки можно :)
Завершают книгу главы посвященные совместной работе над кодом.
Выделяются пять активностей, которые вы, скорее всего, выполняете во время программирования.
- Поиск, время, когда вы читаете и выполняете код
- Осмысление, похожа на предыдущую, но в этом случае вы еще разбираетесь, что код делает, по ходу чтения
- Переписывание
- Наращивание, эти две активности, собственно кодирование и улучшение кода
- Исследование, это погружение в предметную область
При отладке задействованы сразу все пять активностей.
На этом обсуждение прерывается, но через главу Фелина Херманс будет использовать эту классификацию, при обсуждении проектирования больших систем.
Вишенка на торте, автор снова возвращается к теме отвлечения программистов.
Надеюсь, что ваш начальник не дочитает книгу до этого места, потому что там сказано, что около 20% всего рабочего времени программист отвлекается.
Приняв это как неизбежное зло, можно пробовать уменьшить отрицательный эффект определив как сохраниться при отвлечении и в какой момент можно это делать.
Попутно автор рекламирует устройство FlowLight, которое отслеживает скорость набора на клавиатуре и/или щелчки мышью и определяет, насколько глубоко программист погружен в задачу.
По его цвету можно понять, подходить с вопросами или подождать.
Лирическое отступление: Это видимо для совсем невнимательных, так то каждый бухгалтер знает, если у программиста идет легкий дымок из ушей, то его сейчас лучше не трогать.
А вот про многозадачность как раз эффективным менеджерам почитать стоит.
Люди, которые выполняют сразу несколько задач, чувствуют себя очень продуктивными, но реальное состояние дел показывает, что их производительность гораздо ниже.
В заключительной, 13 главе, рассмотрены проблемы адаптации новичков, опираясь на концепцию Пиаже о развитии детей.
Лирическое отступление: Программисты, они же как дети малые :) глава занятная, прочитайте ее полностью, и оцените, кто из ваших коллег на каком этапе развития остановился.
Этапы я перечислю
- не имеют понятия о плане или стратегии, они просто чувствуют и трогают вещи
- начинают учиться строить представления и планы, но не полагаются на них при мышлении
- могут рассуждать о вещах, которые они видят, но им сложно сделать общий вывод
- могут совершать формальные операции
На экскурсии
— Почему площадь именно Красной называется?
— Видите ли, это очень древняя история. Когда в 1147 году первые жители тогда еще маленького…
— А покороче нельзя?
— Именно поэтому она и называется Красной!
©анекдот.ру
Поскольку книга представляет собой по сути академический труд, то пересказать ее сложно, я такой цели и не ставил, скорее наоборот, хотелось поделиться ощущениями от ее полного прочтения и оставить небольшой конспект на память.
Плюсы конечно и кошке приятны, но если скинетесь отделом, купите и напишете свое мнение в комментариях будет еще лучше.
Впереди время подарков, потом неделя каникул, пуркуа бы и не па?
Ведь книга — это отличный подарок
Картинки взяты с англоязычного сайта книги и открытых источников, анекдоты из головы.
Большое спасибо издательству «БХВ-Петербург» за перевод такой классной книги и конечно Доктору Фелине Херманс.
Любезнейше прошу извинить, если получилось сбивчиво.
Дело для нас новое, неосвоенное…
Замечания и предложения пишите в комментариях.
Приехать в Москву на экзамены не получается, остается пока читать книги и если вам понравится, писать обзоры.
Всем добра и здоровья.
Приезжайте в Питер :)
Комментарии (8)
pharo
04.12.2022 18:59Как понять и осмыслить любой код
Написать свой язык программирования?
Энтузиасты-разработчики компиляторов и их проекты: Перечень
Racheengel
04.12.2022 21:20В анекдоте в оригинале по моему было "мой папа по ночам пингвинов в борделе тр.хает"
А по теме, имхо, как-то очень сумбурно получилось, тяжеловато для восприятия. Может это чисто моя точка зрения, не знаю..
capitannemo Автор
05.12.2022 09:48Знаю этот анекдот с прошлого века и всегда было "играть музыку в борделе"
Несколько сумбурно. Согласен
GGribkov
04.12.2022 22:58А с предложением "The bug seems to be caused by an off-by-one error" не справляется даже всемогущий гугл
Бро, у тебя перенос строки в переводчик вбит, потому гугл думает, что там два разных предложения)
capitannemo Автор
05.12.2022 09:50+1Бро, ты же можешь это легко проверить, надеюсь в гугле тебя не забанили)
capitannemo Автор
05.12.2022 10:57+1Забавная статистика публикации.
Все минусы поставлены в воскресенье, все плюсы в понедельник.
Программисты читающие книги по выходным не работают или наоборот?
saipr
Я бы посоветовал обратиться к наследию выдающегося советского учёного, одного из пионеров теоретического и системного программирования академика Андрея Петровича Ершову:
На моё становление как программиста огромное влияние оказала его статья «О человеческом и эстетическом факторах в программировании» (1972)