Как читать тысячи строк кода без какой-либо документации? [закрыто]


12

Ранее я искал хороший элемент управления TimeLine для проекта WPF. Я нашел ответ в этом , которые направляют меня в этот проект CodePlex .

Теперь я хочу изменить код, чтобы удовлетворить потребности моей культуры. Но есть некоторые несоответствия!

Мой вопрос:

Как вы взаимодействуете с такими тысячами строк кода?

РЕДАКТИРОВАТЬ:

Любой ярлык будет отличным!


3
попросить поднять. это всегда помогает. (они могут сделать мотиватор из этого)
Отображаемое имя

2
ударись головой о стол, пока все не станет ясно.
Медуза

19
Как вы едите слона? ... Один укус за раз.
Билл

1
@Jalal Это то, что они хотят, чтобы вы думали.
Матин Улхак,

2
@DisplayName, подход к мотивации с помощью кнута и пряника оказался плохим решением для любой работы, которая требует элементарных когнитивных навыков. Наука о мотивации более сложна, чем система вознаграждений. Прочтите «Драйв: удивительная правда о том, что нас мотивирует» Дэна Пинка, это поразительное чтение. Или посмотрите это видео, которое вы нашли в сокращенном виде. youtube.com/watch?v=u6XAPnuFjJc
Райан Тейлор,

Ответы:


37

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


3
+1, и один хороший способ - написать документацию во время просмотра исходного кода. И зачем отправлять свой вклад обратно в координаторы оп?

1
+1 Кроме того, если вы измените код, убедитесь, что вы также изменили свои комментарии, чтобы будущие поколения не путались из-за того, что вы сделали. Стыдно делать все эти документы и заставлять людей ненавидеть это, потому что это неправильно!
Майкл К

1
Если исходный проект находится в распределенной системе контроля версий (например, git), было бы полезно его разветвить, инкрементно зафиксировать ваши изменения и сделать это таким образом, чтобы вы могли при желании позже объединить свои изменения с оригиналом

8
  1. Шаг через код
  2. Переименовать по мере необходимости
  3. Рефакторинг по мере необходимости
  4. Повторяйте, пока полностью не поймете

... и код поблагодарит вас за это. ;-)


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

Согласитесь, но рефакторинг только для того, чтобы опробовать дизайн, может помочь вам понять, почему код написан так, как он есть (или подтвердить, что вы правы, что он сделан плохо / странно). Вам не нужно сохранять эти изменения.
Рики Кларксон,

+1 кодер. И этот ответ в настоящее время даже не упоминает юнит-тесты. Страшно.
MarkJ

Извините, это не значительный рефакторинг. Говорил больше о незначительном рефакторинге, очистке типа материала. Итак, в конце концов, вы дошли до того, что цель кода очевидна.
Джон Макинтайр

5

Выполните одно действие, отладьте (снова и снова) код, чтобы найти, как это действие выполняется. Запишите то же самое на простом языке, чтобы лучше понять!


Обычно я делаю это, пока не столкнусь с проектом, который не может работать в режиме отладки! При запуске всегда происходит сбой! :( Но он отлично работает в режиме выпуска: S
Afriza N. Arief

@afriza Что за херня. Это какой-то серьезно плохой код, проверь, какие ошибки он тебе дает.
Даниэль С

@afriza, первое, что нужно исправить!

4

То, что Джоэл Спольски написал в далеком прошлом, когда в своем блоге (сейчас не могу найти статью) действительно застряло со мной по этому поводу:

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

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

О, да, я все еще иногда попадаю в эту ловушку. «Делай, как я говорю, а не как я», и все такое. :)


Дело в том, что текст на английском языке, который вы можете «просто прочитать», обычно является линейным, причина, по которой код зачастую трудно переварить на первый взгляд, обычно заключается в том, что он нелинейный, а хитрость просто разбивает его. Множество различных идиом реализации, которые используют разработчики, как правило, тоже не помогают, но на первом этапе обычно запускают код через отладчик и используют точки останова, чтобы увидеть, что к чему. Попытка просто прочитать это довольно бессмысленное упражнение. Серьезно, когда вы в последний раз читали написанный код? (от начала до конца это.)
ocodo

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

4

SE-Radio взял интервью у Дейва Томаса на эту тему

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


Веселая часть опыта Дэйва Томаса заключается в том, что документация - помимо обзора высокого уровня - (почти) без исключения хуже, чем отсутствие документации вообще. (По моему опыту, это потому, что большая часть документации является образцом, дающим понимание «что» или «как» на уровне поверхности, которое неизменно остается устаревшим и вводящим в заблуждение.)
Майкл Кропат,

2

Я должен был сделать это недавно с проектом более 100 000 LOC. Моя первая идея заключалась в том, что шаблоны из 100 или даже 1000 узлов легче увидеть, чем из 100 000 строк текста.

Поэтому я потратил 45 минут и написал короткую (<100LOC) программу на Python, чтобы проанализировать из нее то, что мне нужно, и нарисовать объектные отношения. Я сгенерировал исходный код Graphviz , который очень легко генерировать. (Здесь нет ничего особенного в Python: Ruby или C # или Common Lisp или что-то еще, что может сделать это так же хорошо.)

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

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


1

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


2
Это непрактичный вариант, когда у вас есть тысячи строк кода (особенно когда мы говорим о десятках или сотнях KLOC) и / или если часть этого кода находится в шаблонах. Чтобы получить контроль над новой (и плохо документированной) базой кода, нужно также заняться бизнесом и попытаться понять контекст, в котором должен выполняться код. Если вы можете пройтись по коду с помощью отладчика и получить представление о нем, то эта кодовая база была не такой уж большой для начала (в большинстве случаев использование отладчика довольно не нужно.)
luis.espinal

Горе, если кодовая база слишком велика для отладки в отладчике. Наблюдение за реакцией кода на известный ввод и вывод помогает преобразовать знание «что» в «как». На вопрос «почему» никогда нельзя ответить одним только отладчиком, но могут быть встроенные исходные комментарии, которые вы можете увидеть в IDE при отладке.
grrussel

@grrussel Я должен не согласиться, потому что это не то, что я делаю ... Я понятия не имею, являюсь ли я представителем или нет! Я могу как-то увидеть использование нечетной точки останова (но все же не проходящей явно), и я использую возможности IDE, чтобы позволить мне связывать один фрагмент с другим.
Мерф

1

Поймите, что на самом деле нет никаких путей к полному гроккингу. (И если у вас возникли проблемы с этой фразой, ваше образование, ПОЖАЛУЙСТА, игнорируется. Оно написано Робертом А. Хайнлайном из книги «Незнакомец в чужой стране».)

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

Не поддавайтесь искушению запустить отладчик. Область просмотра отладчика слишком мала: вы видите одну строку за раз, но вы действительно не видите, где вы были или куда вы идете.


Отладчик объясняет некоторые соглашения первоначальных соглашений автора кода о том, что ожидается внутри переменных (например, ожидают ли они полный путь или имя файла или относительный путь?) И многое другое, так что, на мой взгляд, это все еще важно
Afriza N. Arief

2
-1 за то, что ты считаешь себя крутым, потому что ты используешь слово «грок»
Carson63000

1

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


1

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

чтение 14 тысяч строк кода Java не имеет никакого смысла. Функциональность поиска - ваша жизнь


0

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


0

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

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

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


0

Я бы начал с использования Leo Editor в режиме @shadow с активным использованием клонированных узлов . Это позволяет добавлять примечания и комментарии для каждого раздела изучаемого кода без изменения кода , и аннотации всегда будут в контексте, рядом с кодом, о котором идет речь. Вот пример рабочего процесса документации:

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

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


0

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


0

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

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

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


0

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

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

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


0

Подойдите к тривиальному дефекту, например, NullPointerException. Сначала избегайте всего, что касается параллелизма, всего, что по своей природе подразумевает понимание большого количества кода одновременно.

Как только вы исправите несколько ошибок, у вас, вероятно, будет довольно хорошая идея. Во всяком случае, у меня работает.


-2

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

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

И я просмотрел официальный документ http://queue.acm.org/detail.cfm?id=2063168, в котором говорится о стиле кодирования или о том, как мы можем использовать пробел, отступ, изменение шрифта, как большинство IDE, которые мы можем использовать для написания MUCH. Код CLEANER, где мы, люди, можем понять столько же, сколько машины. Больше внимания уделяется написанию кода без комментариев, чтобы наш код отображался в виде абзацев.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.