Все мы пишем код на регулярной основе, некоторые чаще, чем другие. Но есть большой недостаток в количестве времени, которое мы тратим на чтение чужого кода.
Авторы не создают хорошую работу, если они не рассматривают работу других, читая ее. Подобная ситуация присутствует у нас, разработчиков.
Чтение больших кодовых баз может быть пугающим. Просто так много абстракций, все связаны друг с другом, запутывая ваш мозг.
Но с небольшим опытом становится намного легче читать код. Давайте доберемся до этого!
Ruby Gems
Стандартный способ распространения кода в мире Ruby — это всемогущий драгоценный камень.
Давайте рассмотрим, как выложены рубиновые камни. Самый быстрый способ увидеть это с помощью команды «bundle gem».
Зайдите туда, где вы пишете код (я обычно использую ~ / code), и запустите команду bundle gem <name of gem>
Это должно создать каталог с названием «имя драгоценного камня». Если вы перейдете в каталог, вы должны увидеть несколько папок и пару файлов.
Команда bundle gem
Интересующий каталог — lib / , который содержит большую часть кода для гемов Ruby. Аналогично, гем может содержать каталоги bin / и test / .
bin / содержит исполняемые файлы, которые должны быть собраны и помещены в систему. Например, сам гем «bundler» будет иметь исполняемый файл bundle
Наконец, spec / или test / обычно содержат модульные и функциональные тесты для драгоценного камня.
Предварительная работа
Прежде чем погрузиться в исходный код драгоценного камня, следует помнить о нескольких вещах.
Прежде всего, придумать цель. Я разработаю это с историей. Пару лет назад я решил, что хочу познакомиться с низкоуровневой разработкой (такой как разработка ядра). Для этого я взял копию реализации файловой системы ext3 и решил узнать о ней как можно больше.
Этот подход был невероятно неудачным.
Я все время отвлекался на мелкие детали, не мог видеть общую картину. Примерно через неделю после этого я решил, что должен поставить цель. Я решил, что хочу изменить кеширование файловой системы.
Когда я только начинал, это казалось невероятно сложным — я понятия не имел, как на самом деле работает код! Но, просто имея цель, я смог разобрать весь код и получить общее представление о том, что разные части делали в моем уме; это потрясающее чувство!
Достижение поставленной цели поможет вам быстро разобраться во всем.
Во-вторых, редактор, который вы используете, важен. Что касается меня, я обычно использую Vim. Однако я знаю нескольких людей, которые используют IDE специально для чтения кода. Я вижу, откуда они берутся; Среды IDE позволяют легко переходить от класса к классу и функции к функции. Итак, выберите то, что вам удобно и позволяет быстро передвигаться. Я могу с уверенностью сказать, что вы будете переключаться между кучей файлов и много искать имена переменных и методов.
Взломать драгоценный камень
Как только вы погрузились в соус, не бойтесь делать предположения! ,
Под этим я подразумеваю, что вам не нужно тратить время на изучение реализации каждой функции (это займет столько же времени, сколько и написание кода!). Вместо этого используйте имя функции / класса / модуля и то, как оно используется, чтобы попытаться угадать, что он делает. Часто это будет очевидно. В других случаях не так много.
Если вы чувствуете, что рассматриваемая функция имеет решающее значение, то обязательно рассмотрите каждую строку кода внутри нее. Но важно пролистать материал, который на самом деле не имеет большого значения (опять же, именно здесь достижение цели имеет огромное значение — вы можете оценить, важно ли что-то или нет).
Если у драгоценного камня недостаточно документации (что, по мнению некоторых, происходит слишком часто), и вам необходимо выяснить, что делает определенная функция, обратитесь к spec / !
Модульные тесты любого проекта являются отличным способом увидеть, как различные части проекта работают вместе и что каждый из них должен делать. Это может быть невероятно полезно для драгоценных камней, которые имеют массу функций, но мало документации.
Делать заметки по ходу дела — отличный способ отслеживать то, чему вы научились. Это также держит вас на пути, что, кажется, является проблемой номер один, когда я читаю код.
Ваши заметки обычно должны состоять из того, что делает каждый класс, функция и метод и как они взаимосвязаны. Например, если вы знаете, что метод Person.get_data
Util.parse_json
Обычная хитрость при чтении кода для исполняемых файлов (в отличие от библиотек) — перейти прямо к так называемому «основному методу». Этот метод «запускает» действие и обычно связывается с пользователем. С помощью этого метода вы можете затем разветвиться и выяснить, на каких частях сосредоточиться. Я обнаружил, что подобный трюк хорошо работает с библиотеками, в которых есть циклы событий — найдите основной цикл событий, найдите в нем вызовы, которые вас интересуют, и следите за крошками.
Наконец, угадайте, что самое важное в попытке прочитать код для драгоценного камня? На самом деле использовать сам драгоценный камень! Это невероятно недооценено. Подумайте об этом так: если вы никогда не пользовались микроволновой печью, как в мире вы должны знать, как она работает ?!
Например, когда я начал работать с Event Machine, мне очень хотелось увидеть, как такие библиотеки написаны под ним, но я никогда не использовал его. Итак, я написал небольшого IRC-бота за неделю с парой интересных функций, и это дало мне понимание того, как Event Machine был структурирован. Без этого опыта очень трудно, если не невозможно, правильно понять, как все работает.
Кроме того, когда вы читаете код, всегда полезно проверить свои «выводы», фактически протестировав их. Если вы считаете, что метод get_server_ident
Если вы пытаетесь угадать как можно больше и просматриваете большие части кода, неизбежно, что вы сначала неправильно поймете некоторые аспекты, и это отличный способ избавиться от этих недоразумений.
Вывод
Чтение кода — это как нить — это одна из тех вещей, которые вы должны делать, но в конечном итоге вы просто не делаете этого.
Но, прочитав это, я хочу, чтобы вы привыкли к этому! Это сделает вас намного лучшим разработчиком.
Надеюсь, это краткое руководство улучшит ваше путешествие по водам Рубиновых Самоцветов.