Какой лучший способ познакомиться с большой базой кода?

Присоединение к существующей команде с большой уже существующей кодовой базой может быть сложной задачей. Какой лучший подход;

  • Broad; попытайтесь получить общий обзор того, как все соединяется вместе, из кода
  • Узкие; сосредоточиться на небольших разделах кода за раз, понимая, как они работают полностью.
  • Выберите функцию для развития и обучения, когда вы идете вперед.
  • Попытайтесь получить представление о диаграммах классов и uml, если они доступны (и обновлены)
  • Что-то еще полностью?

Я работаю над тем, что в настоящее время является приблизительно 20-разрядным С++-приложением и библиотекой (Edit: small в великой схеме вещей!). В промышленности я предполагаю, что вы получите представление опытного программиста. Однако, если это не так, что вы можете сделать, чтобы как можно быстрее добавить значение?

- Страница Резюме ответов:

  • Пройдите код в режиме отладки, чтобы увидеть, как он работает.
  • Соединитесь с кем-то, более знакомым с базой кода, чем вы, по очереди, это человек, кодирующий и человек, который смотрит/обсуждает. Поверните партнеров среди членов команды, чтобы знания распространялись.
  • Напишите модульные тесты. Начните с утверждения, как вы думаете, код будет работать. Если это окажется так, как вы ожидали, вы, вероятно, поняли код. Если нет, у вас есть головоломка для решения и/или запрос. (Спасибо, Донал, это отличный ответ)
  • Пройдите через существующие модульные тесты для функционального кода, аналогично выше
  • Прочитайте диаграммы классов классов UML, Doxygen и другую документацию, чтобы получить общее представление о коде.
  • Сделайте небольшие исправления или исправления ошибок, затем постепенно создайте
  • Сохраняйте заметки и не входите и не начинайте разработку; это более ценно для понимания времени, чем для создания беспорядочного или неподходящего кода.

этот пост является частичным дубликатом the-best-way-to-familiarize-yourself-with-an-inherited-codebase

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Это зависит от того, какой ученик и какой программист вы есть, но:

  • Широко сначала - вам нужна идея объема и размера. Это может включать skimming docs/uml, если они хороши. Если это долгосрочный проект, и вам понадобится полное понимание всего, я мог бы правильно прочитать документы. Опять же, если они хорошие.
  • Узкий - выберите что-то управляемое и попытайтесь его понять. Получите "вкус" для кода.
  • Выберите функцию - возможно, другую для той, на которую вы только что посмотрели, если вы чувствуете себя уверенно, и начните делать небольшие изменения.
  • Iterate - оцените, как все прошло, и посмотрите, сможете ли вы повторить ранний шаг более подробно.

Ответ 5

Сопряжение со строгим вращением.

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

В парах вы оба поймете кусок знаний, который затем может быть передан другим членам команды, когда происходит поворот. Что хорошо и в этом, так это то, что когда новая пара объединяется, тот, кто работал над задачей (в данном случае, исследуя код), может затем обобщить и объяснить концепции более легко понятным образом. По прошествии времени каждый должен находиться на одинаковом уровне понимания и, надеюсь, избегать "О, только Джон знает, что бит кода".

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

Ответ 6

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

Ответ 7

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

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

Во-первых, я в основном игнорирую реализацию и смотрю только на файлы заголовков или просто на интерфейсы классов. Я пытаюсь понять, какова цель каждого класса. Во-вторых, я иду на один уровень вглубь внедрения, начиная с того, что, по-видимому, является областью наибольшей важности. Это трудно измерить, поэтому иногда я просто начинаю вверху и прокладываю себе путь в списке файлов. Я называю это обучение с первой половиной. После этого начального шага я, как правило, перехожу глубже по остальной части кода. Первоначальный взгляд на ширину помогает укрепить/исправить любые идеи, которые я получил на уровне интерфейса, а затем по глубине взглянуть на меня, шаблоны, которые использовались для внедрения системы, а также различные дизайнерские идеи. По глубине, я имею в виду, что вы в основном проходите через программу, используя отладчик, вступая в каждую функцию, чтобы увидеть, как она работает, и так далее. Это, очевидно, невозможно в действительно больших системах, но 20K LOC не так много.:)

Ответ 8

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

Ответ 9

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

Когда у вас есть что-то, что нужно сделать, дайте себе узкий фокус и сделайте это.

Ответ 10

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

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

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

Удачи!

Ответ 11

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

Ответ 12

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

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

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

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

Наконец, сохраните некоторые заметки (я предпочитаю wiki).

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

Ответ 15

У меня была аналогичная ситуация. Я бы сказал, что вы так:

  • Если это приложение, управляемое базой данных, начинается с базы данных и пытается понять каждую таблицу, ее поля, а затем ее отношение к другим таблицам.
  • После прекращения работы с базовым хранилищем перейдите на уровень ORM. В этой таблице должно быть какое-то представление в коде.
  • После этого перейдите к тому, как и откуда происходят эти объекты. Интерфейс? какой интерфейс? Какие-либо проверки? Какая предварительная обработка происходит на них, прежде чем они отправятся в хранилище данных?

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

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

  • Какова основная цель системы?
  • Каковы основные компоненты системы для решения этой проблемы?
  • Какие взаимодействия у каждого компонента есть среди них? Создайте граф, который отображает зависимости компонентов. Спросите кого-то, кто уже работает над этим. Эти компоненты должны обмениваться друг с другом, поэтому попытайтесь выяснить их также (например, IO может возвращать объект File обратно в GUI и т.д.)
  • После удобного для этого погружения в компонент, который наименее зависит от других. Теперь изучите, как этот компонент далее делится на классы и как они взаимодействуют друг с другом. Таким образом, у вас есть общий вид одного компонента.
  • Переход к следующему наименее зависимому компоненту
  • До конца перейдите к основному компоненту, который обычно будет иметь зависимости от многих других компонентов, которые вы уже использовали.
  • Рассматривая основной компонент, вы можете обратиться к компонентам, которые вы рассмотрели ранее, поэтому не беспокойтесь, продолжайте работать!

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

Для второго Возьмем, например, пример текстового процессора. Какие компоненты существуют? IO, UI, Страница и т.п. Как они взаимодействуют друг с другом? Двигайтесь вместе, пока вы учитесь дальше.

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

Ответ 16

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

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

Ответ 17

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

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

Ответ 18

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

Ответ 19

(бесстыдный маркетинг впереди)

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