fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Как научиться программированию с нуля

Как научиться программированию с нуля

Объясняю, зачем нужно читать исходный код, как читать код и узнавать как можно больше из исходного кода.

Предисловие

На прошлой неделе я разговаривал с молодым программистом, когда он спросил:

“Как мне читать код?”.

Мы обсуждали это некоторое время, я описал несколько способов более эффективного чтения исходного кода.

“Ты должен написать об этом статью”, – предложил он.

“Это будет полезно для начинающих. Это не та вещь, которую можно почерпнуть из книг или учебников”.

И вот мы здесь. Вот мои советы по изучению исходного кода.

Почему нам нужно читать код

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

Тем не менее, в процессе обучения программированию акцент делается на искусстве написания кода, а не на том, как его читать. Когда я говорю “читать код”, я имею в виду практику целенаправленного чтения исходного кода.

Как мы знаем, программирование и письмо имеют много общего. Дональд Кнут даже ввел парадигму программирования – грамотное программирование. И кодирование, и письмо имеют один общий идеал – выразить наши идеи.

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

“Если у вас нет времени читать, у вас нет времени (или инструментов) писать. Все просто” – Стивен Кинг в своих мемуарах “О писательстве”.

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

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

Есть три преимущества намеренного чтения кода.

Стоять на плечах гигантов

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

Просматривая исходный код ядра Linux, Redis, Nginx, Rails или любого другого известного проекта, вы опираетесь на мудрость тысяч высококлассных программистов по всему миру.

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

Решать сложные проблемы

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

Чтобы расширить свои ограничения

Большинство программистов пишут код только в нескольких конкретных областях. Вообще говоря, если вы не будете постоянно подталкивать себя, ваши навыки программирования будут средними среди ваших коллег. Не довольствуйтесь работой по исправлению некоторых ошибок или добавлению нескольких тривиальных функций в существующую систему. Вместо этого постарайтесь расширить свои знания в новой области, всегда старайтесь найти новую область, которой вы не касались в своей повседневной работе, но которая вас интересует. Это расширит ваше понимание кодирования в целом.

Какой исходный код читать

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

Для начала нужно выбрать цель. Без этой цели ваши попытки понять исходный текст будут менее эффективными.

Вот несколько типичных сценариев:

Когда вы хотите выучить новый язык программирования. Изучение нового языка программирования означает не только изучение синтаксиса. Однако при изучении нового языка чтение исходного кода является очень эффективным методом обучения. Я многое узнал о Rust из проекта rust-rosetta. Rosetta Code – это проект, в котором собраны решения распространенных задач на различных языках программирования. Это полезный ресурс для изучения нового языка программирования.

  • Когда вы хотите понять конкретный алгоритм или реализацию. Например, все мы пользовались функцией sort из стандартной библиотеки. Вы когда-нибудь задумывались, как она реализована? Или, скажем, вам нужно использовать структуру данных Set в Redis, какие структуры данных используются в ее реализации? Для этого вам достаточно просмотреть часть проекта, связанную с реализацией, которая обычно представляет собой несколько файлов или функций.

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

Когда вы хотите перейти в новую область, прочитайте классический и известный проект в этой области. Например, поскольку вы занимаетесь веб-разработкой, интригуют ли вас распределенные системы? Если да, то, возможно, etcd – ваш хороший выбор, если вы знаете Golang. Вы хотите углубиться во внутреннее устройство операционной системы? Тогда, возможно, xv6 будет хорошим началом. Мы переживаем прекрасное время с множеством замечательных проектов с открытым исходным кодом на Github. Попробуйте найти несколько.

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

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

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

Как читать исходный код

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

Предпосылки

Чтобы эффективно читать код, вам нужно подготовить и иметь под рукой несколько вещей:

  • Редактор, который вы можете эффективно использовать. Вам понадобится возможность быстрого поиска ключевых слов или переменных. Иногда вам нужно найти ссылки или определение функции. Наладьте работу с редактором. Чтобы работать более эффективно, научитесь пользоваться им с помощью только клавиатуры. Это позволит вам сосредоточиться на коде без помех.
  • Базовые навыки работы с Git или аналогичными инструментами контроля версий, чтобы вы могли сравнивать различия между версиями.
  • Документы, связанные с исходным кодом. Они послужат вам ориентирами для чтения, особенно документы по проектированию, кодовые соглашения и так далее.
  • Некоторые знания и опыт работы с используемыми языками программирования и паттернами проектирования. Это обязательно для крупных проектов. Если вы хорошо знаете язык программирования, вы будете знать, как организован исходный код, какие существуют парадигмы и лучшие практики. Конечно, для накопления этого необходимо время. Будьте терпеливы.

Процесс и советы

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

1. Читайте код с контекстом

Когда вы начинаете читать код, всегда старайтесь задавать вопросы.

Например, если в приложении есть стратегия кэширования, один из хороших вопросов – что происходит, если ключ становится недействительным, как обновляются значения в кэше?

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

Это становится немного похоже на шпионаж: вы хотите узнать правду о коде, логику кода, как он течет, как история.

2. Запуск и взаимодействие с кодом

Исходный код – это как конструктор LEGO, только уже собранный. Если вы хотите понять, как он собран, вам нужно взаимодействовать с ним, даже иногда разбирать его на части. При работе с кодом полезно читать более старые версии одного и того же источника. Читайте диффы из Git’а и пытайтесь понять, как реализована та или иная функция (для этого полезны Changelog’ы). Например, я нашел первую версию Lua гораздо более простой, что помогло мне понять первоначальные дизайнерские идеи ее автора.

Отладка – еще один способ поиграть с кодом. Попробуйте добавить в код несколько точек останова (или точек печати) и понять любой вывод, выводимый на консоль.

Если вы достаточно поняли код, попробуйте внести в него некоторые изменения, затем перестройте и запустите его. Самая простая техника – попробовать изменить конфигурацию, чтобы увидеть результаты различных конфигураций. После этого можно попробовать добавить несколько тривиальных функций. Если результат окажется полезным для других, вы должны внести свой вклад в upstream.

3. Взаимосвязь между структурами данных

“Плохие программисты беспокоятся о коде. Хорошие программисты беспокоятся о структурах данных и их взаимосвязях”.

– Линус Торвальдс

Структуры данных являются наиболее важными элементами программы. Нарисуйте взаимосвязь между данными

Большие проекты содержат множество модулей, типично один модуль имеет одну ответственность. Это помогает нам уменьшить сложность кода, сделать абстракцию на должном уровне. Интерфейс модуля – это граница абстракции, мы можем прочитать один модуль и перейти к другому. Если вы читаете проекты на C/C++, которые собираются с помощью Make, то Makefile будет хорошим началом для понимания того, как устроен модуль.

Сама граница также полезна. Отличный код хорошо организован, его переменные и функции названы в стиле, предназначенном для чтения. Вам не нужно читать все исходные файлы, вы можете игнорировать неважные или знакомые части. Если вы убедились, что модуль предназначен только для парсинга, вы, скорее всего, уже знаете его функциональность; тогда вы можете пропустить чтение модуля. Это, конечно, значительно сэкономит время.

5. Используйте тестовые примеры

Тестовые случаи также являются очень хорошим дополнением для понимания кода. Тестовые случаи – это документация. Если вы читаете класс, постарайтесь прочитать связанный с ним тестовый код. Это позволит вам понять интерфейс класса и его типичное использование. Интегрированный тестовый пример также полезен для отладки кода с некоторыми специфическими входными данными, что позволяет проследить общий ход программы.

6. Обзор

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

Несколько хороших книг

Я обнаружил, что чтение кода – гораздо более обширная тема, чем я думал. Не существует реального систематического способа тренировки этого навыка. Одним словом, продолжайте практиковаться, чтобы найти свой собственный путь. Вот несколько хороших книг для улучшения навыков чтения кода:

file:img/learn-from-source-code.jpeg

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *