Просмотров: 14725

Как читать код: научный эксперимент по специфике его чтения


Я прочитал ещё одно исследование о том, как мы читаем код.

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

Что же оказалось самым сложным и затратным при разборе чужого кода?

Вот выдержка из этого исследования:

правильно читать код рефакторинг код оптимизация разработка  программ дизайн

Слева на картинке изображён код, который суммирует числа от одного до заданного максимума.

В правой части — траектория движения взгляда во время чтения кода. Заметьте как глаза кодера сначала сканируют заголовки функций, затем кратко сканируют тело функции, а уже затем взгляд фокусируется там, где проблема скорее всего должна быть в реальном коде (цикл)

Чтение кода похоже на чтение Талмуда

Это напомнило очень старый пост Джоэля Спольского. Джоэль цитировал в нём Сета Гордона:

Тактика и техника чтения Талмуда, как мне кажется, могут быт полезны и для чтения кода.

Если кто-то не в курсе, вот правила того, как полагается читать Талмуд:

правильно читать код рефакторинг код оптимизация разработка  программ дизайн

  1. Работайте в парах, проговаривая вслух мысли друг другу.
  2. Аргументируйте и требуйте аргументации. Если ваш партнёр озвучивает какую-то идею X, и вы её не понимаете или имеете другую позицию, требуйте объяснений.
  3. Время от времени, когда вы имеете дело с каким-то участком текста, часто проще понять его содержание уже после того, как вы прочитаете текст целиком. Таким образом, если вы затупили в каком-то моменте, попробуйте пропустить его, поняв, что вы можете вернуться к нему позже. (Но так или иначе к нему надо будет вернуться).
  4. Читайте «изнутри» и «снаружи». Внутреннее чтение подразумевает перевод на английский (ну или любой другой язык, которым вы оперируете) фраз одну за другой, внешнее чтение предполагает перевод целого куска разом для осознания общего смысла. Если вы читаете только последовательно, вы можете потерять целое в частностях, при попытке осознать текст исключительно целиком по смыслу, вы теряете детали.

Два типа кода по Сету

  • Некоторый код проще читать и понимать, так как он является базовой основой (общей логикой) для остальной программы (Тип 1);
  • Второй тип кода зависит от первой части кода, и его проще понять, уже зная контекст. И наоборот, его почти невозможно понять, не зная этот самый контекст (Тип 2).

Это соответствует моим представлениям о том, как мне читать новый код:

  1. Зависимость классов и интерфейсов: обратите внимание на классы, которые не зависят от других классов. Это обычно небольшие и довольно простые объекты, чьё предназначение заключается в первоначальной поддержке организации работы. Они могут выполнять какие-то вычисления, но обычно созданы для хранения данных и поддержки get-set -функций. Это код Типа 1. Просмотрите их в первую очередь.После того как вы ознакомитесь с базовыми блоками, вы можете перейти к изучению управляющих классов. Чаще всего это здоровенные «мохнатые» классы, которые представляют собой фактически ядро программы. Это классы Типа2.


    Убедитесь, что вы поняли из названий функций, какая из них чем управляет. После чего вы можете углубиться в их изучение. Управляющие объекты обычно можно понять только в их взаимодействии друг с другом, соответственно вы должны иметь представление о том, как они спроектированы до того, как уже погружаться в их исследование. (Хинт: управляющие классы не всегда называются соответствующим образом. Обычно это классы, вызывающиеся из main() ).

  2. Предполагайте. Предполагайте, что могут значить имена функций и переменных. Если бы вы писали код, что бы делала функция GetNetIndex ? Предположите, что она делает как раз то, что вы думаете. Если из названия функции очевидно вытекает её предназначение, пропустите её. Вы к ней всегда сможете вернуться, если вам это когда-либо понадобиться. Зачем тратить время на то, что вам сейчас не нужно? Если вы начнёте в этом всём сейчас копаться, вы начнёте забывать то, что прочитали перед этим. Сконцентрируйтесь на значении и структуре, а не реализации.
  3. Отладка решает. Юнит-тесты важны, но реальный код значит куда больше. Если вы действительно хотите понять, как работает код, быстрейший способ сделать это запустить его. Раскочегарьте ваш IDE и на скорую руку напишите грязную и примитивную демку того, как вы в целом планируете использовать код.


    Шансы на то, что это сработает, минимальны. Я буду удивлён, если всё заработает с первого раза. Это нормально. Начните отладку.Через неё вы поймёте особенности работы кода (и его баги) изнутри гораздо быстрее, и вы сможете сфокусироваться на тех частях кода, которые действительно для вас важны.

Читабельный код — это важно

  • Правильные и удачно подобранные имена функций решают: мы давно все всё это прекрасно знаем, но мы всё равно должны понимать, что именно имена мы читаем в первую очередь. Хорошее, правильное, говорящее название функции — и вам не придётся лишний раз углубляться в её реализацию.
  • Правильные имена переменных решают: опять-таки ничего нового. Вспомните, как часто глаза возвращаются к определению переменной и присвоению ней значений. Мы постоянно ищем в коде напоминания о значении переменной.
  • Циклы — корень всех зол: конечно, не одни они, но они хуже всех других утверждений. Вспомните, что прояснение работы циклов, это самое затратное по времени занятие при разборе кода. В них и скрывается большая часть ошибок. (Да, в индексе их не сильно меньше или даже столько же, я забыл, да). Комментирование в каком-то роде помогает, но сохранение простоты и читабельности кода определяет. Упрощайте сложность циклов.
  • Короткий код проще обрабатывать: поэтому достаньте свои тулзы для рефакторинга из вспомогательного инструментария, пришло время разделять наиболее жирные функции.
  • Мой любимый гайд по написанию читабельного кода — это книга дяди Боба Мартина «Clean Code: A Handbook of Agile Software Craftsmanship.» Даже если в некоторых моментах она скучна и в ней хватает переусердствований, она остаётся отличным пособием для практикующего кодера, разбирая многие важные моменты написания читабельного кода и рефакторинга.

правильно читать код рефакторинг код оптимизация разработка  программ дизайн

Примечание о методе приведённого выше исследования

Данный ресёрч, конечно, не является какой-то истиной о том, как мы читаем код, так как эксперимент был проведён всего лишь на пяти программистах. На мой взгляд, это слишком мало.

Я имею в виду, что создавать крутое «взглядоотслеживающее» устройство, откалиброванное настолько, что может сказать, какая конкретно строчка читается в данный момент, чтобы испытывать его всего на пяти кодерах? Сложно ли было пригласить больше людей для участия в эксперименте? Лично мне бы было интересно поучаствовать в таком исследовании, чтобы узнать свои привычки чтения кода.

Эй, пожалуйста, в следующий раз возьмите и меня!

dev.by, 2011

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru pikabu.ru blogger.com liveinternet.ru livejournal.ru google.com bobrdobr.ru yandex.ru del.icio.us

Подписка на обновления блога → через RSS, на e-mail, через Twitter
Теги: , , ,
Эта запись опубликована: Понедельник, 12 марта 2012 в рубрике ПрограммированиеМнения.

2 комментария

Следите за комментариями по RSS
  1. Явно перевод, но вот откуда? Хотелось бы почитать и оригинал

  2. Mike Loh McLaud

    Дайте-ка догадаюсь - оригинальная статья была на иврите?

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Зарегистрировать/комментатор

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

(обязательно)


⇑ Наверх
⇓ Вниз