Один из простых способов улучшить свои навыки программирования — читать чужой код

https://changelog.com/posts/one-sure-fire-way-to-improve-your-coding
  • Перевод
Примечание: первоначально эта статья была написана для сайта Fuel Your Coding back в мае 2010 года. К сожалению, этот сайт сейчас не работает, поэтому я публикую статью здесь, чтобы сохранить её для потомков. Я собирался обновить её, учитывая последние веяния, но решил оставить так, как она была написана. Те части, что подустарели, могут показаться немного смешными, но да ладно. Получайте удовольствие…

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

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

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

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

Что читать


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

Читайте программы, имеющие к вам отношение


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

• Плагин WordPress, который вам действительно нравится;
• Ruby gem, который вы считаете полезным;
• Плагин jQuery, к которому вы продолжаете возвращаться.

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

Читайте программы, впечатлившие вас


Помню, что, когда я первый раз просматривал сервис создания презентаций 280 Slides, я подумал: «Да! Круто!». Я быстро выяснил, что программа, управляющая этим сайтом, является проектом Cappuccino с открытым кодом. Это знание вошло глубоко в моё сознание, и когда я как-то наткнулся на ещё одно впечатляющее приложение, работавшее на Cappuccino, я уже знал, что на этом проекте я смогу многому научиться. Что произвело сильное впечатление на вас в последнее время? Эта программа имеет открытый исходный код? Если так, то она — отличный выбор для чтения: код, скорее всего, впечатлит вас так же, как и само приложение.

Читайте программы, написанные теми, кого вы уважаете


image

Программисты, достойные уважения

Если вы уже занимаетесь программированием с открытым исходным кодом какое-то время, то, вероятно, у вас уже есть на примете программисты, заслужившие ваше уважение. Я мог бы с ходу назвать несколько разработчиков, программы которых вызывают у меня просто «белую зависть».

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

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


Если вы склонны рисковать, то можете рассмотреть погружение в большой проект, как, например, Ruby на Rails, Drupal или jQuery. Но я предложил бы вам не использовать пока такие проекты, если вы, конечно, не являетесь опытным читателем программ.

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

Как читать


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

Изучите общую картину


image

Структура каталога twitter gem

Я предполагаю, что вы, по крайней мере, знаете на макроуровне, что делает код, который вы читаете. Если нет, то предлагаю прочитать веб-сайт проекта, учебные пособия, документацию и всё остальное, что вы можете достать помимо кода.

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

Прежде всего, зафиксируйте для себя структуру файлов. Этот шаг легче выполнить с помощью редактора, который имеет вид иерархии папок, как, например, TextMate. Здесь, как пример, показан прекрасный вид Twitter Ruby gem.

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

Документируйте ваши результаты


Чтение кода не должно быть каким-то пассивным действием. Рекомендую добавлять комментарии по мере продвижения, документировать ваши предположения и ваши выводы, когда вы начнёте понимать ход выполнения программы. Когда вы начнёте впервые, ваши комментарии будут выглядеть, вероятно, так:

# Полагаю, что вызов этой функции происходит после "initialize"
# Что же делает эта задача?
# Уверен, эта переменная теряет свою область действия после строки 17

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

Используй тесты, Люк


(Прим. переводчика: автор вспомнил «Используй силу, Люк» из «Звёздных войн»)

Будем надеяться, что проект, который вы выбрали, имеет набор тестов. Если нет, то можете пропустить этот раздел вообще (или найти проект, имеющий такой набор).

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

Измените код, скомпилируйте


Кто сказал, что чтение кода должно быть пассивным? Вы начнёте, действительно, понимать код, только после того, как сломаете всё и снова соберёте вместе. Вспомните пройденные тесты? Сделайте так, чтобы они завершились неудачно, добавьте кое-что или попытайтесь изменить реализацию так, чтобы они прошли нормально. Попробуйте добавить какую-нибудь небольшую «фичу», которая вам кажется «крутой», или настройте регистрацию по всему проекту так, чтобы можно было распечатать вывод на различных этапах выполнения программы. Это по-прежнему чтение? Абсолютно, но такой подход является больше собственным приключением, чем чтением детективного романа. И это — именно то, что надо!

Смыть и повторить


(Прим. переводчика: из анекдота про айтишника, моющегося шампунем строго по инструкции — бесконечно)

Закончив с чтением одной кодовой базы, возьмите другую и начните процесс снова. Чем больше кодов вы читаете, тем лучше идёт это чтение и тем больше вы получаете из него за меньшее время. Я думаю, вы обнаружите, что ваш КПД растёт довольно быстро и что это действительно очень приятный способ обучения.

Где начать


Единственным, самым важным источником для чтения кода является для меня GitHub. Этот сайт позволяет так легко найти новые проекты и действительно великих программистов, что вы действуете себе во вред, если не используете его. Я предлагаю начать на GitHub и читать код прямо на сайте, пока не найдёте проект, из которого по вашему мнению вы сможете извлечь какие-то уроки. Затем склонируйте его и читайте!

А вы используете чтение кода как обучающий инструмент? Какие проекты вы порекомендовали бы коллегам? Прочитали какую-нибудь хорошую программу в последнее время?
Метки:
Поделиться публикацией
Комментарии 34
  • +1
    Советы хороши, спасибо за перевод.
    В свободное время я читаю исходники .NET, очень познавательно. Один из лучших способов понять и запомнить топ двадцать паттернов.

    Кстати, другого способа понять, как делать архитектуру игр, я не нашёл. Игры на C# типа Transistor и Magicka мне сильно помогли.
    • +8
      Кстати, другого способа понять, как делать архитектуру игр, я не нашёл.

      Другой способ есть и он очень даже элегантный — «Пишите код!».

      Пишите код:
      1. Начинайте решать какую-то задачу.
      2. Напишите дополнение для своей задачи.
      3. Приведите сложившуюся архитектуру в порядок.
      4. Добавьте еще функционал, который ломает вашу стройную архитектуру.
      5. goto 3.
      • 0
        Не могу сказать, что вы неправы, но все грабли стоит собирать самому, всё же :)
        • +2
          Для этого желательно иметь чувство перфекционизма (желательно здоровое), иначе будет «и так сойдёт».
          • +1
            Я бы добавил пункт 6. покажите свой код другим разработчикам. Желательно более опытным чем вы.

            Я видел вполне себе неплохие по функционалу проекты с ужасной структурой и кодом внутри ибо никто не критиковал их код.
          • +1
            Transistor написана на C#? C открытыми исходниками?? Сейчас глянул — не вижу исходников в свободном доступе.
            • 0

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

            • 0
              Прекрасный перевод. Полностью согласен с утверждением. Чужой код помогает расширить кругозор и научиться новым методам решений. Проверено на себе. Смог научиться программировать на С# и избавился от «детских» болячек программистов.
              • +4
                Я бы сказал так:
                Один из простых способов улучшить или ухудшить свои навыки программирования — читать чужой код
                • +4
                  Я бы даже сказал так:
                  Один из простых способов улучшить или ухудшить свои навыки программирования — читать чужой код или не читать.
                  • +1
                    Один из простых или непростых способов улучшить или ухудшить свои навыки программирования — читать или не читать чужой код или код землян.
                    • +3
                      Один из простых или сложных способов улучшить или ухудшить свои навыки программирования — читать чужой код или не читать.
                      • +2
                        Скрытый текст
                        Народный лекарь Богомол сухими, как травинки, руками начал дотрагиваться до Буратино.

                        – Одно из двух, – прошелестел он, – или пациент жив, или он умер. Если он жив – он останется жив или он не останется жив. Если он мёртв – его можно оживить или нельзя оживить.

                        Золотой ключик, или приключения Буратино — Алексей Николаевич Толстой
                    • 0

                      Таки да. Код бывает разный. Можно такого legacy начитаться. Самое страшное — это когда из такого кода состоит любимый сторонний проект. Я часто обращаюсь к коду Tornado, и из-за поддержки совместимости он выглядит не так хорошо, как хотелось бы, и, скорее, запутает страждущего.

                      • 0
                        Это как с книгой. Начал читать — не зашло — взял другую.
                    • +1
                      очень вдохновляющий текст, даже удивился что настолько умно автор излагает мысли — пролистал к заголовку — понятно, перевод.
                      все мысли по отдельности вроде как знакомы, но тут собраны в хороший цепляющий мотив,
                      который направляет мышление в конструктивное русло (вместо топтания в рутине или прокр… нации)
                      • 0
                        Я бы еще добавил, что review кода, как под категория 'чтение чужого кода', тоже помогает Вам образовываться, правда к тому моменту как Вы будете иметь полномочия на ревью — у Вас будет нехилый бэкграунд.
                        • 0

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

                          • 0

                            Я подписан на core-libs-dev в OpenJDK. Хотя у меня нет формальных полномочий выступать ревьювером кода, это не мешает смотреть интересные мне запросы на ревью (а иногда даже находить косяки и сообщать о них авторам). Тут было бы желание, а возможность всегда найдётся.

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

                            Очень хорошо, что догадались расширить этот принцип и на программирование. По смыслу получается то же самое.

                            Очень полезная методика.
                            • +1
                              Один из способов улучшить свои навыки — читать хороший чужой код.
                              Беда только в том, что для того, что бы отличить хороший код от плохого — нужно самому уметь что-то делать.
                              Правда — можно спросить — где посмотреть хороший код.
                              • +1
                                На самом деле не так сложно.
                                Хороший код прост и понятен. Плохой код — нет.
                                Соответственно, чем меньше времени уходит на понимание написанного — тем лучше код. (понятно, что это не какой-то фундаментальный закон, а просто наблюдение, из которого можно привести миллион исключений, но всё же)
                                • 0
                                  Понятность кода — необходимое, но не достаточное условие хорошего кода.
                                  Может быть очень понятный код, который делает совершенно не то, что нужно.
                                  Особенно в каких-то граничных случаях.
                                  Не примите за менторство, просто мысли вслух.

                                  А по теме, хороший код — исходники Doom.
                                • +1
                                  Простите, но вы не совсем правы. Плохой код тоже читать надо, в том числе и свой старый. Чтобы понять, как не надо делать.
                                • 0

                                  Добавлю, что исключительно полезным источником знаний о структуре проекта является история системы контроля версий (если она доступна). К примеру, видите вы некоторую функцию. Где она используется явно, где неявно, надо ли её зарегистрировать в каких-нибудь конфигах, где хранятся связанные с ней ресурсы, где хранятся тесты для неё? Ответы на многие из этих вопросов можно узнать, просто найдя коммит, в котором она появилась, и посмотрев, какие ещё файлы были изменены в том же коммите. Это не всегда работает, но мне часто помогает быстро сориентироваться в структуре.


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

                                  • 0
                                    Я и свой-то не читаю, прости госсподи.
                                    • 0
                                      Я и свой-то не читаю, прости госсподи.


                                      Значит, вы работаете в одиночку над совсем небольшими проектами.
                                    • 0
                                      Да.
                                      Только вот проблема, если ты полный ноль, то чей код считать достойным изучения.
                                      Может, это будет код такого же новичка или просто плохого программиста.
                                      • 0
                                        Идеально вместе с кодом читать теорию — Макконнелла, Фаулера и т.п.
                                        Тогда можно будет находить подтверждения теоретическим знаниям — тут такой паттерн, а это разбили на классы для уменьшения связности, а тут, наоборот, плохое место, — не удовлетворяет SOLID.
                                        • 0
                                          Ну я допустим программист с охренительным стажем.
                                          Мне эти все паттерны — будет просто скучно.

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

                                          Но, конечно, проще, чем начинающему.
                                          • 0
                                            Читайте разные проекты на новом языке. Если что-то всегда реализуется одинаково, значит это стандарт для языка. А там, где есть различия — повод самому подумать, как правильно.
                                            • +1
                                              Читайте разные проекты на новом языке. Если что-то всегда реализуется одинаково, значит это стандарт для языка. А там, где есть различия — повод самому подумать, как правильно.


                                              Не думаю.
                                              Все люди в среднем (большинством своим) — не выдающиеся люди, обычные, ленивые, неумные и пр.

                                              А читать то чтобы учиться нужно лучший код, хотя бы чтоб чуток выше среднего.

                                              В этом и проблема — как такой код вычленить.
                                      • 0

                                        Для любителей JavaScript советую прочитать коды Node.js модулей в Github. "Тонны" модулей создаются и обновляются ежедневно.

                                        • 0
                                          Я бы такое даже врагу не пожелал (-:

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