Каков наилучший способ познакомиться с большой кодовой базой? [закрытый]
присоединение к существующей команде с большой кодовой базой уже на месте может быть сложным. Каков наилучший подход;
- широкий; попробуйте получить общий обзор того, как все связывается вместе, из кода
- узкий; сосредоточьтесь на небольших участках кода за один раз, понимая, как они работают полностью
- выберите функцию для разработки и обучения, как вы идете вперед
- попробуйте получить представление из диаграмм классов и uml, если таковые имеются (и до дата)
- что-то совсем другое?
Я работаю над тем, что в настоящее время является приблизительно 20k line c++ app & library (Edit: small in the grand scheme of things!). В промышленности, я думаю, вы получите представление опытного программиста. Однако если это не так, что вы можете сделать, чтобы начать приносить пользу как можно быстрее?
--
Резюме ответов:
- шаг через код в режиме отладки, чтобы увидеть, как это работает
- соединитесь с кем-то более знакомым с базой кода, чем вы, по очереди, чтобы быть человеком, кодирующим и человеком, наблюдающим/обсуждающим. Ротация партнеров среди членов команды, так что знания распространяются вокруг.
- писать юнит-тесты. Начнем с утверждения о том, как вы думаете, что код будет работать. Если это окажется так, как вы ожидали, вы, вероятно, поняли код. Если нет, у вас есть головоломка, чтобы решить и или запрос, чтобы сделать. (Спасибо Донал, это здорово ответ)
- пройти через существующие модульные тесты для функционального кода, аналогично выше
- прочитайте UML, Doxygen сгенерированные диаграммы классов и другую документацию, чтобы получить широкое представление о коде.
- внести небольшие изменения или исправления ошибок, а затем постепенно наращивать
- держите заметки, и не прыгайте и не начинайте разрабатывать; более ценно тратить время на понимание, чем на создание беспорядочного или неуместного кода.
этот сообщение является частичным дубликатом -лучший-способ--ознакомления-сам-с-собой-в наследство-кода
19 ответов:
начните с небольшой задачи, если это возможно, отлаживайте код вокруг своей проблемы. Шагая через код в режиме отладки-это самый простой способ узнать, как что-то работает.
другой вариант-написать тесты для функций, которые вас интересуют. Настройка тестового жгута является хорошим способом определения того, какие зависимости имеет система и где находится ее состояние. Каждый тест начинается с утверждения о том, как вы думаете, что система должна работать. Если это сработает таким образом, вы чего-то достигли, и у вас есть рабочий пример кода для его воспроизведения. Если это не работает таким образом, у вас есть головоломка для решения и линия запроса следовать.
одна вещь, которую я обычно предлагаю людям, которые еще не были упомянуты, заключается в том, что важно стать компетентным пользователем существующей базы кода, прежде чем вы сможете стать разработчиком. Когда новые разработчики приходят в наш большой программный проект, я предлагаю им потратить время на то, чтобы стать опытными пользователями, прежде чем погружаться в работу над кодом.
может быть, это очевидно, но я видел, что многие люди пытаются перейти в код слишком быстро, потому что они хотят начать делать достижения.
Это очень зависит от того, какой ученик и какой программист вы, но:
- широкий первый-вам нужно представление о масштабах и размерах. Это может включать в себя просмотр документов/uml, если они хороши. Если это долгосрочный проект, и вам понадобится полное понимание всего, я мог бы правильно прочитать документы. Опять,если они хорошие.
- узкий-выберите что-то управляемое и попытайтесь понять это. Получить "вкус" для код.
- выберите функцию - возможно, другую, чем та, на которую вы только что смотрели, если вы чувствуете себя уверенно, и начните вносить небольшие изменения.
- Iterate-оценить, насколько хорошо все прошло и посмотреть, если вы могли бы извлечь выгоду из повторения раннего шага в более глубокой.
сопряжение с ротации.
Если возможно, при просмотре документации / кодовой базы, попробуйте использовать сопряжение со строгой ротацией. То есть, двое из вас сидят вместе в течение фиксированного периода времени (скажем, 2-часовая сессия), затем вы переключаете пары, один человек будет продолжать работать над этой задачей, а другой переходит к другой задаче с другим партнером.
в парах вы оба получите часть знаний, которые затем могут быть переданы другим членам команды, когда происходит ротация. Что хорошо в этом тоже, так это то, что когда новая пара собрана вместе, тот, кто работал над задачей (в данном случае, исследуя код), может затем суммировать и объяснить концепции более понятным способом. С течением времени все должны быть на одинаковом уровне понимания и, надеюсь, избегать синдрома "о, только Джон знает эту часть кода".
из того, что я могу сказать о вашем сценарии, у вас есть хороший номер для это (3 пары), однако, если вы распределены или не работаете в одном и том же масштабе времени, это вряд ли возможно.
Я бы предложил запустить Doxygen на нем, чтобы получить обновленную диаграмму классов, а затем перейти на широкое время. Это дает вам быстрый большую картину, которую вы можете использовать, как вы получите близко и грязно с кодом.
Я согласен, что это целиком зависит от того, какой тип учащегося вы. Сказав это, я был в двух компаниях, которые имели очень большие кодовые базы для начала. Как правило, я работаю так:
Если возможно, прежде чем смотреть на какой-либо функциональный код, я прохожу модульные тесты, которые уже написаны. Они, как правило, могут помочь довольно много. Если они недоступны, то я делаю следующее.
во-первых, я в значительной степени игнорирую реализацию и смотрю только на заголовок файлы, или просто интерфейсы классов. Я пытаюсь получить представление о том, какова цель каждого класса. Во-вторых, я иду на один уровень глубже в реализацию, начиная с того, что кажется наиболее важной областью. Это трудно оценить, поэтому иногда я просто начинаю сверху и пробираюсь вниз в списке файлов. Я называю это широтой познания. После этого начального шага я обычно углубляюсь в остальную часть кода. Начальная ширина-первый взгляд помогает укрепить / исправить любые идеи, которые я получил с уровня интерфейса, а затем глубокий взгляд показывает мне шаблоны, которые были использованы для реализации системы, а также различные дизайнерские идеи. Под глубиной-во-первых, я имею в виду, что вы в основном проходите через программу с помощью отладчика, входя в каждую функцию, чтобы увидеть, как она работает, и так далее. Это, очевидно, невозможно с действительно большими системами, но 20k LOC-это не так много. :)
работа с другим программистом, который более знаком с системой, чтобы разработать новую функцию или исправить ошибку. Это метод, который я видел лучшие.
Я думаю, нужно привязать это к конкретной задаче. Когда у вас есть время на ваши руки, пойти на любой подход вы находитесь в настроении.
когда у вас есть что-то, что нужно сделать, дайте себе узкий фокус и сделать это.
сделать команда, чтобы поставить вас на исправление ошибок в течение двух недель (если у вас есть две недели). Они будут рады, если кто-то возьмет на себя ответственность за это, и к концу периода вы потратите столько времени на решение проблем с библиотекой, что, вероятно, будете знать это довольно хорошо.
Если у него есть модульные тесты (я держу пари, что это не так). Начните с малого и убедитесь, что модульные тесты не терпят неудачу. Если вы смотрите на всю кодовую базу сразу, ваши глаза будут стекленеть, и вы почувствуете себя подавленным.
Если нет модульных тестов, вам нужно сосредоточиться на функции, которую вы хотите. Запустите приложение и посмотрите на результаты вещей, которые ваша функция должна повлиять. Затем начните просматривать код, пытаясь выяснить, как приложение создает то, что вы хотите изменить. Наконец измените его и убедитесь, что результаты выходят так, как вы хотите.
Вы упомянули, что это приложение и библиотека. Сначала измените приложение и придерживайтесь использования библиотеки в качестве пользователя. Тогда после того, как вы изучите библиотеку, ее будет легче изменить.
сверху вниз подход, приложение, вероятно, имеет основной цикл или основной графический интерфейс, который контролирует все действия. Стоит разобраться в основном потоке управления приложением. Стоит прочитать код, чтобы дать себе широкий обзор основного потока приложения. Если это приложение с графическим интерфейсом, создайте документ, который показывает, какие экраны есть и как перейти с одного экрана на другой. Если это приложение командной строки, как выполняется обработка.
даже в компаниях нет ничего необычного в таком подходе. Часто никто полностью не понимает, как работает приложение. И у людей нет времени, чтобы показать вам все вокруг. Они предпочитают конкретные вопросы о конкретных вещах, так что вы должны копать и экспериментировать на вашем собственный. Затем, как только вы получите свой конкретный вопрос, вы можете попытаться изолировать источник знаний для этой части приложения и задать его.
начните с понимания "проблемной области" (это система заработной платы? инвентаризация? контроль в реальном времени или что-то еще). Если вы не понимаете жаргон, который используют пользователи, вы никогда не поймете код.
затем посмотрите на объектную модель; возможно, уже есть диаграмма или вам, возможно, придется перепроектировать ее (вручную или с помощью инструмента, как предложил Дуг). На этом этапе вы также можете исследовать базу данных (если таковая имеется), если следует следовать объектной модели, но это не может быть, и это важно знать.
посмотрите на историю изменений или базу данных ошибок, если есть область, которая появляется много, сначала посмотрите на этот бит. Это не значит, что он плохо написан, но это тот бит, который все используют.
наконец, держите некоторые заметки (я предпочитаю Вики).
- существующие ребята могут использовать его для здравомыслия проверить свои предположения и помочь вам.
- вам нужно будет вернуться к нему позже.
- следующий новый парень в команде будет Вам очень благодарен.
У меня была похожая ситуация. Я бы сказал, что вы идете так:
- Если это приложение, управляемое базой данных, начните с базы данных и попытайтесь понять каждую таблицу, ее поля, а затем ее отношение к другим таблицам.
- После того, как все будет в порядке с базовым хранилищем, перейдите к слою ORM. Эти таблицы должны иметь какое-то представление в коде.
- После этого перейдите к тому, как и откуда исходят эти объекты. Интерфейс? какой интерфейс? Каких-либо проверок? Какая предварительная обработка происходит на них, прежде чем они перейдут в хранилище данных?
Это позволит вам ознакомиться с системой. Помните, что попытка написать или понять модульные тесты возможна только тогда, когда вы знаете очень хорошо что и почему он должен быть проверен в только этак.
и в случае большого приложения, которое не управляется к базам данных, я бы рекомендую другой подход:
- какова основная цель системы?
- каковы основные компоненты системы, чтобы решить эту проблему?
- какие взаимодействия каждый из компонентов имеет среди них? Составьте график, который отображает зависимости компонентов. Спросите кого-нибудь, кто уже работает над этим. Эти компоненты должны обмениваться чем-то друг с другом, поэтому попробуйте выяснить их также (например, IO может возвращать объект File обратно в GUI и вроде)
- после того, как удобно для этого, погрузиться в компонент, который является наименее зависимым среди других. Теперь изучите, как этот компонент далее делится на классы и как они взаимодействуют друг с другом. Таким образом, у вас есть повесить одного компонента в общей сложности
- переход к следующему наименее зависимому компоненту
- в самом конце перейдите к основному компоненту, который обычно будет иметь зависимости от многих других компонентов, которые вы уже взялся
- глядя на основной компонент, вы можете ссылаться на компоненты, которые вы рассмотрели ранее,поэтому не беспокойтесь, продолжайте работать!
для первой стратегии: Возьмем, к примеру, этот сайт stackoverflow. Изучите хранилище данных, что хранится, как хранится, какие представления имеют эти элементы в коде, как и где они представлены в пользовательском интерфейсе. Откуда они берутся и какая обработка занимает поместите на них, как только они вернутся в хранилище данных.
второй Возьмем, к примеру, текстовый процессор. Какие компоненты существуют? IO, UI, страница и тому подобное. Как они взаимодействуют друг с другом? Двигайтесь вперед, как вы узнаете дальше.
быть расслаблены. Написанный код-это чье-то мышление, застывшая логика и стиль мышления, и потребуется время, чтобы прочитать этот ум.
во-первых, если у вас есть члены команды, которые имеют опыт работы с код, который вы должны организовать для них сделать обзор кода с вами. Каждый член команды должен предоставить вам информацию о своей области знаний. Обычно полезно, чтобы несколько человек объясняли вещи, потому что некоторые из них будут лучше объяснять, чем другие, а некоторые будут лучше понимать, чем другие.
затем, нужно начать читать код на некоторое время без каких-либо давление (пару дней или неделю, если ваш босс обеспечит это). Это часто помогает скомпилировать / построить проект самостоятельно и иметь возможность запускать проект в режиме отладки, чтобы вы могли пройти через код. Затем начните мочить ноги, исправляя мелкие ошибки и делая небольшие улучшения. Вы, надеюсь, скоро будете готовы к среднему проекту, а позже и к большому проекту. Продолжайте опираться на своих товарищей по команде, как вы идете - часто вы можете найти тот, в частности, кто готов наставник вы.
Не будьте слишком строги к себе, если вы боретесь - это нормально. Это может занять много времени, может быть, годы, чтобы понять большую базу кода. На самом деле, часто бывает так, что даже спустя годы все еще есть некоторые части кода, которые все еще немного страшны и непрозрачны. Когда вы получаете время простоя между проектами, вы можете копаться в этих областях, и вы часто обнаружите, что после нескольких попыток вы можете понять даже эти части.
удачи!
возможно, вы захотите посмотреть на исходный код обратного инжиниринга инструменты. Есть два инструмента, которые я знаю:
- SWAG Kit (только для Linux) ссылке
- Баухаус академическаяторговой
оба инструмента предлагают аналогичные наборы функций, которые включают статический анализ, который создает графики отношений между модулями в программном обеспечении.
Это в основном состоит из вызова графики и приличия типа/класса. Просмотр эта информация должна дать вам хорошее представление о том, как части соотносятся друг с другом. Используя эту информацию, вы можете копаться в фактическом источнике для деталей, которые вас больше всего интересуют и которые вам нужно сначала понять/изменить.
Я считаю, что просто прыгать в код может быть немного подавляющим. Постарайтесь прочитать как можно больше документации по дизайну. Это, как мы надеемся, объяснит назначение и структуру каждого компонента. Лучше всего, если существующий разработчик может провести вас через него, но это не всегда возможно.
Как только вы освоитесь с высокоуровневой структурой кода, попробуйте исправить одну или две ошибки. это поможет Вам разобраться с фактическим кодом.
Мне нравятся все ответы, которые говорят, что вы должны использовать такой инструмент, как Doxygen, чтобы получить диаграмму классов, и сначала попытаться понять общую картину. Я полностью с этим согласен.
тем не менее, это во многом зависит от того, насколько хорошо учитывается код для начала. Если это гигантский беспорядок, это будет трудно узнать. Если его чистый и организованный должным образом, это не должно быть так плохо.
посмотреть ответ о том, как использовать инструменты тестового покрытия для поиска кода для интересующего объекта, ничего не зная о том, где находится этот объект или как он распределен по многим модулям.
(бесстыдный маркетинг впереди)
вы должны проверить nWire. Это плагин Eclipse для навигации и визуализации больших сборок. Многие из наших клиентов используют его для взлома новых разработчиков, распечатывая визуализации основных потоков.