me

Два вида чтения кода

На самом деле нельзя просто обсуждать чтение кода (например, в контексте внедрения тех или иных практик), нужно обязательно уточнять, о каком виде чтения идёт речь. Ибо их два: ознакомление (поверхностное чтение) и изучение (глубокое погружение)1.

Приведу пример – сразу предупреждаю, пример дурацкий, полное нарушение SRP, в реальной жизни так писать нельзя. Используется просто для иллюстрирования мысли.

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

Разработчик начинает просматривать метод сверху вниз, причём поначалу его совершенно не интересуют детали реализации (типы переменных, точное понимание алгоритмов и т.д.) – ему просто надо понять, относится эта строка уже к конвертации или это ещё валидация или обработка. Т.е. цель читателя – как можно быстрее понять общий смысл и принять решение: переходить к следующей строке или остановиться здесь и начать более глубокое погружение в код.

И только когда разработчик доберётся до нужного места, он начнёт изучать код – смотреть типы переменных, может быть “проваливаться” в вызываемые методы и т.д.

Зачем нужно различать эти два вида чтения? Дело в том, что требования к коду для них зачастую диаметрально противоположны.

Пример 1: использование var.
В .NET Переменную можно объявить двумя способами:

List<Emplyee> departmentWorkers = GetEmploeesByDepartment(departmentId);

или так:

var departmentWorkers = GetEmploeesByDepartment(departmentId);

Первый вариант, конечно, очень удобен при изучении (погружении): не надо наводить курсор мыши на переменную, чтобы узнать её тип, да и этот тип всегда перед глазами.

Но с точки зрения ознакомления эта информация не нужна, а лишний текст загромождает зону чтения и мешает, создаёт излишнюю когнитивную нагрузку.

Пример 2: комментарии. Вне всякого сомнения, они помогут при изучении. И так же вне всякого сомнения, что при ознакомлении это лишний (и потому вредный) балласт.

Сразу же возникает следующий вопрос: так какой же стратегии придерживаться при написании кода: “затачивать” его под ознакомление или под изучение?

На мой взгляд, ознакомление происходит значительно чаще, чем изучение (возьмите, к примеру, чтение кода рецензентами на код-ревью – это всегда ознакомление), поэтому всё делаем для его облегчения: типы при объявлении не пишем, комментарии не используем, при разрыве длинных строк переносим на новую строку разделители и т.д.


1 Термины придумал сам, если кто-то предложит более удачные – буду признателен.


Дедушка Волшебник, 2021-03-11