Topjava — онлайн-школа по обучению программированию на самом популярном в мире языке Java
Первое занятие бесплатно
Как быстро и эффективно разбираться в чужом коде
Недавно начинающий программист-самоучка задал мне вопрос:

"Как ты понимаешь чужой код? Я хорошо разбираюсь в своём собственном коде, но всякий раз, когда мне нужно понять чужой, я теряюсь. Чувство потерянности преследует меня все время, особенно, если код плохо задокументирован. Я до сих пор не представляю, с какой стороны нужно подступиться, чтобы работать с чужим кодом более эффективно. Было бы хорошо, если бы ты дал мне парочку советов."

Мне понравился этот вопрос по нескольким причинам:

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

Итак, давайте пойдём по порядку.
Как лучше всего читать и понимать чужой код?
1. Найдите ту часть кода, которую понимаете, а дальше попытайтесь распутать логическую цепочку из вызовов методов, классов и переменных в обратном направлении.
Например, вы точно знаете, что кусок кода, который вы просматриваете, создает файл с заголовками фильмов. Сначала выясните, где конкретно находятся строчки, которые создают этот файл на диске. Далее, найдите место в коде, в котором в файл добавляется информация. Двигаясь в обратном направлении, найдите место откуда берется эта информация. И так далее…

Давайте назовем эти связанные между собой куски кода "Цепочкой действий".

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

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

Делая так, вы постепенно будете всё лучше и лучше понимать чужой код. И вскоре в больших кусках кода, в которых вы ранее не могли ничего понять, вам станут "открываться" отдельные части. И постепенно будет приходить понимание все большего и большего количества строк кода. Это примерно как стоять в большой, абсолютно тёмной комнате, в которой постепенно зажигается свет, и вы со временем начинаете различать всё больше и больше предметов, находящихся в ней.
Используйте подход "Цепочка действий" чтобы постепенно начать разбираться в ранее незнакомом коде
2. Повторяйте данные действия снова и снова.

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

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

Данный вывод подводит нас к первой причине, по которой мне понравился заданный вопрос: к важности учиться часто, регулярно и на хороших примерах. В данном случае, под хорошими примерами подразумеваются примеры кода, которые пишут более опытные программисты — эксперты в своей области.
О важности регулярного обучения на примерах высокого качества
В своей новой книге "Badass: Making Users Awesome" Кэти Сьерра заявляет, что регулярное обучение на примерах высокого качества является одним из двух основных факторов, влияющих на то, как быстро и эффективно люди приобретают новые навыки (второй фактор — это целенаправленная практика).

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

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

"Общеизвестно, что определение пола недавно вылупившегося цыплёнка является очень не простой задачей. Однако, для крупных коммерческих птицеферм крайне важно как можно раньше разделять цыплят по половому признаку. В 1900-х годах, в Японии был разработан особый метод для определения пола, а также появилась группа экспертов в этом деле.

Отлично, скажете вы! Теперь эти эксперты смогут научить остальных, верно? Не совсем, есть одна проблема: они не знали, как им это удается. "Я просто знаю пол и всё" — отвечали они.
Так как же они проходили обучение? Предположим, вы один из новобранцев в ряды определителей пола цыплят. Вы встаете перед ящиком с цыплятами. Проблема в том, что для вас они ничем друг от друга не отличаются. Но вам сказали просто брать одного и делать предположение о поле цыплёнка. Вам кажется, что ваши предположения полностью случайны.

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

Та как же вся эта "магия" работает? Кэти Сьерра рассказывает:

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

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

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

  1. Вы начинаете быстрее понимать примеры кода, которые просматриваете, пока пишите свой собственный код (это может быть кусок кода из онлайн-курса или ответа на StackOverflow).
  2. Вы начинаете с первого взгляда понимать код, который написали именно вы (и эта способность ещё не раз пригодится, ведь вам неизбежно придется работать с множеством различных частей кода).

В конечном итоге это означает:

  1. Меньше пауз.
  2. Больше прогресса.
  3. Больше веселья и наслаждения от процесса!
Оригинальная статья How to quickly and effectively read other people's code