Jakiś czas temu odbyła się rozmowa pomiędzy mną a moim dobrym znajomym, w której padły następujące zdania:
— Liczba programistów będzie stale rosła – ponieważ rośnie ilość kodu i stale potrzeba coraz większej liczby programistów do jego obsługi.
— Ale kod się starzeje, część z niego nie jest już obsługiwana. Możliwe jest nawet, że istnieje jakiś rodzaj równowagi.
Wspominając je kilka dni później, zastanawiałem się, czy utrzymanie kodu, wymagającego z biegiem czasu coraz większych zasobów, może ostatecznie paraliżować rozwój nowych funkcjonalności, czy też będzie wymagało nieograniczonego zwiększania liczby programistów? Analiza matematyczna i równania różniczkowe pomogły jakościowo ocenić zależność wysokości wsparcia od rozwoju i znaleźć odpowiedzi na pytania.
Pytanie pierwsze. Czy wsparcie może „pochłonąć” wszystkie zasoby rozwojowe?
Rozważmy zespół programistów, w którym liczba uczestników jest stała. Udział w ich czasie pracy () spędza się na opracowywaniu nowego kodu, a pozostałą część czasu idzie na wsparcie. W założeniach modelu zakładamy, że pierwszy rodzaj działań ma na celu zwiększenie objętości kodu, natomiast drugi ma na celu jego zmianę (poprawę błędów) i nie ma istotnego wpływu na objętość kodu.
Oznaczmy całą ilość kodu napisanego do tego momentu . Zakładając, że szybkość pisania kodu jest proporcjonalna otrzymujemy:
Naturalne jest założenie, że koszty pracy związane z utrzymaniem kodu są proporcjonalne do jego objętości:
lub
Gdzie
Otrzymujemy równanie różniczkowe, które można łatwo całkować. Jeśli w początkowym momencie ilość kodu wynosi zero, to
w funkcja I . A to oznacza stopniowe ograniczanie w czasie rozwoju nowej funkcjonalności do zera i przekazywanie wszystkich zasobów do wsparcia.
Jeśli jednak w tym czasie kod staje się przestarzały i przestaje być wspierany, wówczas ilość kodu wymagającego jednoczesnego wsparcia jest już równa Następnie
а jest rozwiązaniem równania różniczkowego z opóźnionym argumentem [1]:
Rozwiązanie takiego równania jest jednoznacznie określane poprzez określenie wartości „przed początkiem czasu” . Ponieważ w naszym przypadku kod nie został jeszcze napisany przed początkowym momentem w .
Spójrzmy na kilka przykładów. Czas będziemy mierzyć w latach, a ilość kodu w tysiącach linii. Potem dla dopuszczalne są wartości rzędu dziesiątek, przyjmiemy 50 i 100. Oznacza to, że za rok zespół programistów napisze odpowiednio pięćdziesiąt i sto tysięcy linii kodu. Dla dopuszczalne wartości mogą wynosić: , , . Oznacza to, że zespół programistów może obsłużyć tyle kodu, ile napisze w ciągu roku, niezależnie od tego, czy będzie to kwartał, pół czy cały etat. Jako średni czas życia kodu przyjmiemy wartości: 1, 2 i 4 lata. Rozwiązując równanie numerycznie, otrzymujemy przykłady zachowania się funkcji dla niektórych kombinacji parametrów .
Zachowanie funkcji wraz ze starzeniem się kodu uległ on zmianie. Funkcja nie jest już monotonna, ale z czasem wahania „uspokajają się” i jest tendencja do tego do jakiejś stałej wartości. Wykresy pokazują: tym więcej , и , czyli im wolniej starzeje się kod, im szybszy jest rozwój nowego kodu i im niższa jakość kodu, tym mniej zasobów pozostanie na rozwój nowej funkcjonalności. Chcieliśmy podać przynajmniej jeden przykład, w którym „przytulił się” blisko zera. Wymagało to jednak doboru bardzo słabych wskaźników jakości rozwoju i kodu, który nie starzeje się długo. Nawet na lewym dolnym wykresie widoczna jest znaczna ilość zasobów przeznaczona na nową funkcjonalność. Zatem prawidłowa odpowiedź na pierwsze pytanie jest raczej taka: teoretycznie – tak, jest to możliwe; praktycznie - ledwo.
Pytania, na które nie udało się znaleźć odpowiedzi:
- Czy to prawda, że zmierza do pewnego limitu przy dla wszystkich ? Jeśli nie dla wszystkich, to dla jakich?
- Jeśli istnieje granica, od czego zależy jej wartość ?
Pytanie drugie. Czy utrzymanie kodu może spowodować nieograniczony wzrost liczby programistów?
Oznaczmy liczba programistów zaangażowanych w tworzenie nowego kodu. Jak powyżej, — ilość kodu zapisanego do określonego momentu . Następnie
Zajmij się obsługą kodu programiści. Biorąc pod uwagę kod starzenia,
Gdzie
jeśli następnie
Zatem odpowiedź na drugie pytanie jest negatywna: jeśli liczba twórców nowego kodu jest ograniczona, to w warunkach starzenia się kodu wsparcie nie może powodować nieograniczonego wzrostu liczby programistów.
wniosek
Rozpatrywane modele są „miękkimi” modelami matematycznymi [2]. Są bardzo proste. Niemniej jednak zależność wyników symulacji od wartości parametrów odpowiada oczekiwaniom dla rzeczywistych układów, przemawia to za adekwatnością modeli i wystarczającą dokładnością do uzyskania wysokiej jakości szacunków.
Referencje
1. Elsgolts L.E., Norkin S.B. Wprowadzenie do teorii równań różniczkowych z argumentem odchylającym. Moskwa. Wydawnictwo „Nauka”. 1971.
2. Arnold V.I. „Twarde” i „miękkie” modele matematyczne. Moskwa. Wydawnictwo MCNMO. 2004.
Źródło: www.habr.com