Какие инструменты и методики существуют для изучения больших проектов?
Всем добрый день.
В этом году я подал заявку на участие в Intel Summer School и, как следствие, проходил телефонное собеседование с сотрудником Intel. В ходе него ментор одной из команд особенно интересовался наличием опыта изучения больших (действительно больших, студенческий проект в 120 тыс. строк кода в качестве примера не был принят категорически) проектов, и спросил: «А как бы вы изучали большой проект? Какие инструменты использовали?» Меня, признаться, немного обескуражил этот вопрос. Я стал отвечать, перечисляя то, что мне приходило в голову:
1. Чтение официальной документации, вики, статей и публикаций, созданных в рамках проекта
2. Изучение автоматически генерируемой документации, например, doxygen'овской, благо, она ещё и простейшие диаграммы классов содержит
3. Отладка: запуск под консольным отладчиком, графическим, может быть даже, отладочная печать
4. Чтение кода и навигация по нему средствами современных IDE.
5. Чтение тестов, если они есть. Часто тест — неплохой пример правильного использования модулей и классов внутри проекта.
6. Эксперимент и попытка модификации.
7. Общение с членами команды разработчиков, если это возможно
8. Создание дополнений и исправлений к проекту, закрытие issues из багтрекера проекта, запросы на слияние сделанных изменений.
Так вот мне показалось, что ответ моего интервьюера не удовлетворил. Кажется, я не знаю чего-то важного. Так вот, как изучать большой проект? Какие инструменты существуют для этого? Как ВЫ это делаете?
Скорее всего человека ожидал услышать процесс разбора, а не используемые методы. Т.е. то, что вы перечислили это все верно, но теперь из этого надо выстроить логическую схему где и когда из этих инструментов применять.
К примеру:
1) Нахожу точку входа в программу.
2) Глядя в код определяю какие классы создаются и что они запускают.
3) Если есть дока — читаю, что эти классы делают
4) С помощью навигации по коду вычленяю какой код за какие функции отвечает.
5) Ну и т.д.
Спасибо, вероятно, вы правы.
Мне отвечают не только с хабра — и заметили уже примерно то же. Отметили, что в большой проект приходить нужно не просто поизучать его, а с некоторой определенной задачей. Тогда нужно понять, какой участок кода эта задача вообще затрагивает, локализовать его (даже нагрепать просто что-то, что похоже на то, что вам надо) — а затем читать всё, что находится в непосредственной близости: доку, комментарии рядом, код и прочее.
Вот было б, кстати, здорово иметь такой инструмент — запускаешь под ним программу, выполняешь её полностью или частично (до точки останова, например, как при классической отладке), а потом просишь инструмент построить диаграмму вызовов (обращений) с разверткой по времени (по типу interaction diagram UML) с любой степени детализации: конкретные объекты, только их классы — или вовсе модули / пакеты. Чтобы было видно, кто кому какие данные передает и кто чьи методы вызывает, чтобы достичь той или иной цели. Если код записан хорошо с точки зрения принципов ООП, такая диаграмма, я думаю, могла бы быть очень информативной. И не только при изучении проекта — при его отладке.
Нет уже чего-то похожего хотя бы для какого-нибудь языка?