Инструменты и методы для улучшения понимания незнакомого кода?
Я понял, что моя самая большая слабость как студента-программиста - моя плохая способность понимать код других людей.
У меня нет никаких проблем с кодом "учебника" или четко закомментированным кодом, но когда мне дают программу из нескольких сотен строк, содержащую дюжину или около того различных функций и без комментариев, мне очень трудно даже начать.
Я знаю, что этот тип кода - это то, с чем я, скорее всего, столкнусь в своей карьере, и я думаю, что плохие навыки понимания кода будут для меня большим препятствием, поэтому я бы хотел сосредоточиться на улучшении своих навыков в этой области.
Какие инструменты / методы помогли улучшить понимание кода в вашем опыте?
Как вы справляетесь с незнакомым, некомментированным кодом? Зачем? Как насчет вашей техники вы считаете полезным?
Спасибо
5 ответов
Ознакомление с иностранным кодом
Если кодовая база достаточно мала, вы можете сразу начать читать. В какой-то момент кусочки начнут падать вместе.
В этом сценарии "достаточно маленький" меняется, он будет увеличиваться по мере увеличения вашего опыта. Вы также начнете получать выгоду от "обмана" здесь: вы можете пропустить фрагменты кода, которые вы узнаете из опыта "реализации шаблона X".
Может оказаться полезным сделать небольшие обходные пути при чтении кода, например, просматривая функцию так, как вы видите ее вызываемую, а затем потратьте немного времени на ее просмотр. Не оставайтесь на этих обходных путях, пока не поймете, что делает вызываемая функция; это не главное, и вы почувствуете, что прыгаете вокруг и не делаете прогресса. Цель при обходе - понять, что делает новая функция менее чем за полминуты. Если вы не можете, это означает, что функция слишком сложна. Прервите объезд и примите тот факт, что вам придется понимать свою "текущую" функцию без этой дополнительной помощи.
Если кодовая база слишком велика, вы не можете просто начать читать. В этом случае вы можете начать с определения логических компонентов программы на высоком уровне абстракции. Ваша цель - связать типы (классы) в исходном коде с этими компонентами, а затем определить роль, которую каждый класс играет в своем компоненте. Будут классы, используемые внутри компонента, и классы, используемые для взаимодействия с другими компонентами или структурами. Разделите и победите здесь: сначала разделите классы на связанные группы, затем сосредоточьтесь на группе и поймите, как ее части сочетаются друг с другом.
Чтобы помочь вам в этой задаче, вы можете использовать структуру исходного кода в качестве руководства (а не в качестве основного закона; иногда он может вводить в заблуждение из-за человеческой ошибки). Вы также можете использовать такие инструменты, как "найти использование" функции или типа, чтобы увидеть, где на них ссылаются. Опять же, не пытайтесь полностью переварить то, что говорит вам IDE, если вы не можете сделать это достаточно быстро. Когда это происходит, это означает, что вы выбрали сложный кусок металла из машины, которую вы не совсем понимаете. Положите его обратно и попробуйте что-нибудь еще, пока не найдете то, что вы можете понять.
Отладка стороннего кода
Это совсем другое дело. Я немного обманываю, говоря, что, пока вы не накопите массу опыта, вы не сможете успешно отлаживать код, если он вам чужд.
Я считаю, что рисование графа вызовов и деревьев наследования часто работает для меня. Вы можете использовать любой удобный инструмент; Я обычно просто использую доску.
Обычно единицы кода / функции достаточно просты для понимания самих по себе, и я ясно вижу, как работает каждая единица, но мне часто бывает трудно увидеть общую картину, и именно здесь происходит срыв, и я получаю это "я" Я потерял чувство
Начните с малого. Скажите себе: "Я хочу выполнить х, так как это делается в коде?" где x - это небольшая операция, которую вы можете отследить. Затем просто проследите код, сделав что-то визуальное, на что вы сможете вернуться после трассировки.
Затем выберите другой х и повторите процесс. Вы должны лучше понимать код каждый раз, когда вы делаете это.
Когда приходит время что-то реализовать, выбирайте что-то похожее (но не почти идентичное) на одну из вещей, которые вы отслеживали. Делая это, вы переходите от понимания уровня трассировки к пониманию уровня реализации.
Это также помогает поговорить с человеком, который написал код в первый раз.
Первое, что я пытаюсь сделать, это выяснить, какова цель кода на высоком уровне - детали не имеют значения, пока вы немного не разберетесь в проблемной области. Хорошие способы выяснить это включают просмотр имен идентификаторов, но обычно еще более полезно рассмотреть контекст - откуда вы взяли этот код? Кто это написал? Было ли это частью какого-то приложения с известной целью? После того, как вы выяснили, что должен делать код, вы можете сделать копию и начать переформатировать ее, чтобы вам было легче ее понять. Это может включать в себя изменение имен идентификаторов, где это необходимо, сортировку любых странных отступов, добавление пробелов, чтобы разбить вещи, комментирование битов, как только вы выяснили, что они делают, и т. Д. Это начало, во всяком случае...:)
Кроме того - после того, как вы выяснили цель кода, пошаговое выполнение его через отладчик на некоторых простых примерах может также дать вам более ясное представление о том, что происходит в FWIW...
Я понимаю ваше разочарование, но имейте в виду, что там много плохого кода, так что держите ваш подбородок. не весь код плохой:)
это процесс, которому я склонен следовать:
- ищите любые модульные тесты, поскольку они должны документировать, что должен делать код...
- перемещаться по коду с помощью кодовых ярлыков rush / resharper / visual studio - это должно дать вам представление о логических и физических уровнях...
- сначала сканируйте код в поисках общих шаблонов, соглашений об именах и стилей кода - это должно дать вам представление о стандартах команд и, возможно, об оригинальном мышлении программистов...
- перемещаясь по иерархии кода, я делаю заметки об используемых объектах... обычно ручкой и бумагой рисуем простую диаграмму действий:
- Я склонен начинать с общей точки входа, поэтому, если это пользовательский интерфейс, начните с представления и перейдите к коду доступа к данным, если сервис запускается от границы сервиса и проходит до доступа к данным. код...
- ищите код, который можно реорганизовать - если вы видите код, который можно реорганизовать, вы узнали, как упростить его, не изменяя его поведение...
- попрактикуйтесь в создании того же, что вы просматриваете, но по-другому...
- Читая непроверенный код, подумайте, как сделать его тестируемым...
- используйте инструменты диагностики срочного кода, чтобы найти методы, которые имеют высокую сложность обслуживания или цикломатическую сложность, и уделите особое внимание этим областям, потому что есть вероятность, что именно здесь большинство ошибок...
Удачи
Поймите, это потрясающий инструмент анализа кода. Он широко использовался у моего предыдущего работодателя (L-3), поэтому я купил его там, где я сейчас работаю.