Привет, All!
Есть большая система (дотнет, С#), в которой периодически требуется чего-то дорабатывать. Документации в виде диаграмм классов на 90% нет (прописаны только Xml-комменты для классов, методов). Есть (грубо говоря) один опытный разработчик, и несколько "джуниоров". Владение кодом совместное. То есть теоретически любой человек разбирается в любом месте системы (на деле не разбирается

)
Сейчас работа делается так — то, что требует вмешательства в архитектуру, опытный разработчик делает сам, а все доработки по мелочам — джуниоры. Не устраивает то, что количество работы непропорционально имеющимся ресурсам — джуниорам чаще отдыхать приходится, хотя дел — вагон. Плюс, хотелось бы чтобы опытный разработчик выполнял в данной системе роль архитектора, т.е. определял, каким именно образом нужно вносить изменения в существующую архитекуту, а джуниоры — кодеров, т.е. просто выполняли бы его предписания.
Так вот какой вопрос. Если мы возьмем для примера стандартный RUP, то там вне зависимости от сложности задач дела найдутся всем — инженеры собирают требования, аналитики анализируют, архитекторы рисуют архитектуру, кодеры её реализуют, тестеры — тестируют. Все при деле, загружены задачами, соотвествующими их уровню, и никто не простаивает.
В нашем случае, если разрабатывается новый функционал, то вопросов нет, опытный разработчик нарисует диаграмму классов, отдаст её джуниору, тот её реализует. (остальные звенья цепи я не рассматриваю). А как быть, когда функционал уже существуетт и его надо модифицировать? Работы по переделке не так много, но главное сделать это ПРАВИЛЬНО. Зачастую получается, что надо потратить день на то чтобы разобраться, что и как, и потом написать 3 строчки кода. (это я утрирую, соотношение "въезжание"/"решение задачи" может быть разным, от 0 до бесконечности

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

К тому же, даже если это получится, все равно будут задачи, для которых "взрослого" разработчика слишком много — опять потери в эффективности.
Третья идея — ввести раздельное владение кодом, что позволит уменьшить затраты на "въезжание" в требующую модификации область системы. Но это мне нравится еще меньше, так как в данном случае уменьшается контроль друг за другом (в случае совместного владения один человек не напишет "кривой" код, зная, что это может потом дорабатывать другой, который выскажет все, что он думает по поводу плохого стиля программирования), появляются проблемы при увольнении сотрудников, трения в смежных модулях, когда причину ошибки два разработчика валят друг на друга, итд
Есть какие-нибудь мысли по данному поводу? Кто как решает у себя данную задачу?
ЗЫ. Сорри за длинное вступление, надеюсь что кто-то дочитает это до конца