Понимание большого недокументированного набора исходного кода?

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

Каковы лучшие практики для понимания такой огромной базы кода?

11 ответов

Решение

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

  1. Узнайте, как скомпилировать, установить и запустить собственную версию Wine из существующего исходного кода.

  2. Узнайте, как отлаживать (например, использовать gdb) на работающем экземпляре вашей версии Wine.

  3. Запустите Wine под отладчиком и заставьте его продемонстрировать нежелательное поведение.

  4. Самое интересное: найти путь выполнения кода и начать изучать, как все это происходит вместе.

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

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

Тем не менее, вы должны начать лазать по себе, чтобы по-настоящему понять, на что похож вид сверху.

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

Но никогда не бойся начинать лазить. Представление всегда стоит любых усилий.


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

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

Опыт показывает, что при изучении унаследованной системы у вас есть 3 основных цели:

  1. Узнайте, что код должен делать.
  2. Узнайте, как это делает их.
  3. (крайне важно) Узнайте, почему он делает их так, как делает.

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

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

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

Запустите тестовые случаи, где это возможно.

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

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

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

Как и большинство проектов, WINE располагает хорошими ресурсами для разработчиков; IRC, вики, список рассылки и руководства / обзоры. С большинством сложных кодовых баз это не так страшно после первых нескольких исправлений. WINE действительно большой и очень похож на ядро, я сомневаюсь, что есть специалист во всех системах; не чувствую, что ты тоже должен быть Начните работать над тем, что важно для вас, и возьмите это оттуда.

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

Мы все ценим вашу доблесть и готовность помочь с вином (это нужно). Спасибо и удачи.

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

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

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

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

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

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

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

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

Для исходного кода на C, как только вы почувствуете, над какими областями кода вы хотите работать, создайте базы данных ctags и cscope для этого кода. Эти инструменты намного облегчают прыгать и понимать код. Многие текстовые редакторы (один из примеров - gvim) имеют поддержку ctags и cscope, поэтому вы можете легко перемещаться.

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

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

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

Другие вопросы по тегам