Некоторое время назад между мной и моим хорошим другом состоялся разговор, в котором прозвучали такие фразы:
— Количество программистов будет постоянно расти — ведь количество кода растет, и для его поддержки постоянно требуется все больше разработчиков.
— Но код стареет, часть его уходит из поддержки. Не исключено даже наличие какого-то равновесия.
Вспомнив их через несколько дней, я задумался, действительно ли поддержка кода, требуя с течением времени все больше и больше ресурсов, может в конечном счете парализовать разработку нового функционала, либо потребует неограниченного увеличения количества программистов? Качественно оценить зависимость объёма поддержки от разработки и найти ответы на вопросы помогли математический анализ и дифференциальные уравнения.
Вопрос первый. Может ли поддержка «съесть» все ресурсы разработки?
Рассмотрим коллектив программистов, в котором число участников постоянно. Доля их рабочего времени () приходится на разработку нового кода, а оставшаяся доля времени уходит на поддержку. В рамках допущений модели предположим, что первый вид деятельности направлен на увеличение объёма кода, а второй — на его изменение (исправление ошибок) и существенного влияния на объём кода не оказывает.
Обозначим весь объём кода, написанный к моменту времени . Считая скорость написания кода пропорциональной , получаем:
Естественно предположить, что трудозатраты на поддержку кода пропорциональны его объёму:
или
Откуда
Получаем дифференциальное уравнение, которое легко интегрируется. Если в начальный момент времени объем кода равен нулю, то
При функция , а . И это означает постепенное сокращение с течением времени разработки нового функционала до нуля и переход всех ресурсов на поддержку.
Однако, если за время код устаревает и перестаёт поддерживаться, то объём кода, требующего поддержки, в момент времени равен уже Тогда
а является решением дифференциального уравнения с запаздывающим аргументом [1]:
Решение такого уравнения однозначно определяется заданием значений «до начала времён», при . Так как до начального момента времени кода написано ещё не было, то в нашем случае при .
Рассмотрим несколько примеров. Будем измерять время в годах, а объём кода в тысячах строк. Тогда для приемлемыми являются значения порядка десятков, мы возьмём 50 и 100. То есть за год группа разработки напишет пятьдесят и сто тысяч строк кода соответственно. Для приемлемыми могут быть величины: , , . Это означает, что группа разработчиков способна поддерживать объём кода, который написан ей же за год, при занятости на четверть, на половину или для этого требуется полная занятость. В качестве среднего времени жизни кода зададимся величинами: 1, 2 и 4 года. Решая уравнение численно, получим примеры поведения функции для некоторых комбинаций параметров .
Характер поведения функции в условиях старения кода изменился. Функция перестала быть монотонной, но колебания со временем «успокаиваются», наблюдается тенденция стремления к некоторому постоянному значению. Графики показывают: чем больше , и , то есть чем медленнее стареет код, чем быстрее происходит разработка нового кода и чем ниже качество кода, тем меньше ресурсов будет оставаться для разработки нового функционала. Было желание привести хотя бы один пример, в котором «прижалась» близко к нулю. Но это потребовало подбора очень плохих показателей качества разработки и долго не стареющего кода. Даже на левом нижнем графике на новый функционал остается ощутимое количество ресурсов. Поэтому правильный ответ на первый вопрос скорее такой: теоретически — да, это возможно; практически — вряд ли.
Вопросы, на которые не удалось получить ответ:
- Верно ли, что стремится к некоторому пределу при для всех ? Если не для всех, то для каких?
- Если предел существует, то как его значение зависит от ?
Вопрос второй. Может ли поддержка кода стать причиной неограниченного роста количества программистов?
Обозначим количество программистов, занятых разработкой нового кода. Как и выше, — объём кода, написанного к моменту времени . Тогда
Пусть поддержкой кода заняты программистов. C учётом старения кода,
Откуда
Если , то
Таким образом, ответ на второй вопрос отрицательный: если количество разработчиков нового кода ограничено, то в условиях старения кода поддержка не может стать причиной неограниченного роста количества программистов.
Заключение
Рассмотренные модели являются «мягкими» математическими моделями [2]. Они очень просты. Тем не менее, зависимость результатов моделирования от значений параметров соответствует ожидаемой для реальных систем, это говорит в пользу адекватности моделей и достаточной точности для получения качественных оценок.
Список литературы
1. Эльсгольц Л.Э., Норкин С.Б. Введение в теорию дифференциальных уравнений с отклоняющимся аргументом. Москва. Издательство «Наука». 1971.
2. Арнольд В.И. «Жесткие» и «мягкие» математические модели. Москва. Издательство МЦНМО. 2004.
Автор: Дмитрий Пашуткин