Как вы читаете чужой код? [закрыто]

23

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

Вы читаете это или нет? Если да, то как часто и как проходит процедура чтения кода? Кроме того, новичкам немного сложно иметь дело с SVN - кучей файлов. Какое решение?

Сергей
источник

Ответы:

25

Вы читаете это или нет?

Да.

Если вы делаете, как часто

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

и какова процедура чтения кода?

Um. Откройте и прочитайте.

Кроме того, новичкам немного сложно иметь дело с SVN - кучей файлов. Какое решение?

Откройте и прочитайте. Тогда читайте больше.

Это не просто. Ничто не облегчает. Там нет королевской дороги к пониманию. Требуется работа.

С. Лотт
источник
Спасибо за ответ. Как определить, хорош ли код или нет? Потому что не каждый проект с открытым исходным кодом сделан настоящими профессионалами?
Сергей,
1
@ Сергей: «Как определить, хорош код или нет?» Прочитайте код. «Хорошо» субъективно. Если это полезно, и вы можете это понять, это хорошо. Если это сбивает с толку, или на самом деле не работает, это не хорошо. Существует множество атрибутов качества: поддерживаемый, безопасный, адаптируемый, высокопроизводительный и т. Д. И т. Д. И т. Д., Код может быть хорош в одном и менее хорош в другом.
S.Lott
7
Я не смог устоять: osnews.com/images/comics/wtfm.jpg
Гэри Уиллоуби,
@ Сергей - даже если это самый лучший код, когда-либо написанный, если вы не можете его прочитать (из-за вашего уровня опыта), это не принесет вам никакой пользы. Хотя это может показаться вам не лучшим использованием вашего времени, вы столкнетесь с плохо написанным кодом, так что вы также можете узнать разницу. Как сказал С. Лотт, это требует работы и времени.
JeffO
Хотя я восхищаюсь теми, кто может сидеть сложа руки и читать код, как будто они читают роман, я иногда нахожу его немного утомительным. Я понял, что для меня «чтение кода» на самом деле не описывает действия, которые я предпринимаю, - лучшая фраза для того, что я делаю, это «понимание кода» и включает в себя чтение документации, пошаговое выполнение ее в отладчике и даже чтение тестов. Я написал длинный пост о чтении кода - technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer
Нихилу
9

У вас есть несколько слоев головоломки. Сначала начнем с высокого уровня, так сказать с высоты птичьего полета. После того, как вы проверите проект, в структуре каталогов будет множество файлов. Это то же самое, смотрите ли вы на открытый исходный код или закрытый исходный код (исходный код в конце концов является исходным кодом). Итак, начнем с этого:

  • Как организованы исходные файлы? Можете ли вы сказать по имени файла или по названию директории с содержимым, что вы можете найти внутри? Нам, программистам, нравятся предсказуемые имена и логическая структура. Вы должны иметь возможность получить приблизительное представление о том, где искать конкретную проблему.
  • Какова природа приложения, веб-интерфейс, командная строка, графический интерфейс? Это важно по той причине, что вы хотите знать, с чего начать отслеживать выполнение. Если это веб-интерфейс, вы хотите начать с того, где приложение начинает обрабатывать запрос. Если он построен на фреймворке, тем лучше. После того, как вы узнаете структуру, вы, как правило, сможете разобраться в коде, который там есть. В противном случае вы начнете с соответствующей точки входа для приложения командной строки / GUI.
  • Возьмите лист бумаги и карандаш, или, если вам повезет, доску и фломастеры. Дайте названия компонентов (или используйте те, которые предусмотрены в коде) и нарисуйте линии между полями со стрелками, чтобы вы могли видеть, как все это обрабатывается. В качестве альтернативы, если вы смотрите на алгоритм, набросайте структуры данных так, чтобы вы могли понять, и наметьте, как ими манипулируют.

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

Берин Лорич
источник
Одним из аспектов чтения кода является абстракция. Такие вещи, как выяснение того, как организованы источники, определенно абстрагируют процесс чтения кода.
Дэвид Гао
5

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

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

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

Карл Билефельдт
источник
4

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

Михал Пясковский
источник
1
+1: я тоже. // Однажды у меня был начальник, который заметил рефакторинг и обвинил меня в потере времени. Он не мог понять. Как глупо.
Джим Г.
2

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

Если вы, как заявленный программист, не можете понять структуру проекта из «набора файлов», либо это крайне плохо организованный проект, либо вы неумелый программист (или, в крайнем случае, оба).

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

jwenting
источник
3
«Потребуется время», чтобы «построить понимание» - это в значительной степени определение «трудно». Только потому, что с этой трудностью нам приходится сталкиваться каждый день, это не делает ее менее трудной. "Где я могу сделать это изменение?" это общий вопрос даже среди профессионалов. Кроме того, контроль исходного кода и работа с большими базами кода является одной из огромных дыр в образовании колледжа. Я думаю, что я сделал один или два проекта в колледже, которые требовали более одного исходного файла, и они получили только около 10 файлов.
Карл Билефельдт
0

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

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

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

Ник Бедфорд
источник
0

Посмотрев на «Сначала начните с высокого уровня, с высоты птичьего полета», когда @Berin Loritsch предложил, вы можете искать юнит-тесты и / или интеграционные тесты, если таковые имеются.

Юниттесты интересно посмотреть, как (api-) детали работают.

Обычно интеграционные тесты дают хороший обзор бизнес-процессов.

k3b
источник