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

StackOverflow https://stackoverflow.com/questions/215076

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Я работаю над тем, что в настоящее время представляет собой приложение и библиотеку на C ++ объемом около 20 тысяч строк (Редактировать:маленький в общем плане вещей!).В промышленности, я полагаю, вы получили бы представление от опытного программиста.Однако, если это не так, что вы можете сделать, чтобы начать увеличивать ценность как можно быстрее?

--
Краткое изложение ответов:

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

этот пост является частичным дубликатом -лучший-способ-ознакомиться-с-унаследованной-кодовой базой

Это было полезно?

Решение

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

Другие советы

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

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

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

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

  • Прежде всего, вам нужно иметь представление о масштабах и размерах.Это может включать в себя просмотр документов/uml, если они хорошие.Если это долгосрочный проект и вам понадобится полное понимание всего, я мог бы правильно прочитать документацию.Снова, если они хороши.
  • Узкий — выберите что-то поддающееся управлению и попытайтесь это понять.Получите «вкус» кода.
  • Выберите функцию — возможно, отличную от той, которую вы только что рассмотрели, если вы чувствуете себя уверенно, и начните вносить небольшие изменения.
  • Итерируйте — оцените, насколько хорошо все прошло, и посмотрите, сможете ли вы извлечь пользу из более глубокого повторения первого шага.

Сопряжение со строгой ротацией.

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

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

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

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

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

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

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

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

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

Когда вам нужно что-то сделать, сосредоточьтесь и сделайте это.

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

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

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

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

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

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

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

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

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

И наконец, сделайте несколько заметок (я предпочитаю вики).

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

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

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

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

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

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

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

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

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

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

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

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

Удачи!

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top