Quantos programadores você precisa para suportar códigos escritos anteriormente?

Algum tempo atrás, ocorreu uma conversa entre mim e meu bom amigo, na qual as seguintes frases soaram:

- O número de programadores crescerá constantemente - porque a quantidade de código está aumentando e cada vez mais desenvolvedores são constantemente necessários para suportá-lo.
- Mas o código está envelhecendo, parte dele está deixando o suporte. A presença de algum tipo de equilíbrio não é descartada.

Lembrando-os alguns dias depois, imaginei se o suporte ao código, exigindo mais e mais recursos ao longo do tempo, poderia paralisar o desenvolvimento de novas funcionalidades ou exigiria um aumento ilimitado no número de programadores? A análise matemática e as equações diferenciais ajudaram a avaliar qualitativamente a dependência do volume de suporte no desenvolvimento e a encontrar respostas para as perguntas.

A primeira pergunta Pode apoiar "comer" todos os recursos de desenvolvimento?


Considere uma equipe de programadores em que o número de participantes seja constante. Parte do seu tempo de trabalho  mu(t)( 0< mu(t)<1) recai sobre o desenvolvimento de um novo código e a fração restante do tempo 1 mu(t)vai apoiar. Sob as premissas do modelo, suponha que o primeiro tipo de atividade tenha como objetivo aumentar a quantidade de código e o segundo - altere-o (corrigindo erros) e não afete significativamente a quantidade de código.

Nós denotamos y(t)todo o código escrito por hora t. Considerando que a velocidade de escrever código é proporcional  mu(t)nós obtemos:

 fracdy(t)dt=a0 mu(t);a0 in mathbbR,a0>0.


É natural supor que o trabalho envolvido na manutenção do código seja proporcional ao seu volume:

1 mu(t)=a1y(t);a1 in mathbbR,a1>0


ou

 mu(t)=1a1a(t)


De onde

 fracdy(t)dt=a0(1a1y(t))).


Temos uma equação diferencial que se integra facilmente. Se, no momento inicial, a quantidade de código for zero, então

y(t)= frac1a1(1ea0a1t).


At t a+ inftyfunção y(t) to1/a1e  mu(t) a0. E isso significa uma redução gradual ao longo do tempo do desenvolvimento de novas funcionalidades para zero e da transição de todos os recursos para suporte.

No entanto, se a tempo h>0Como o código se torna obsoleto e deixa de ser suportado, a quantidade de código que requer suporte por vez tigual a y(t)y(th).Então

1 mu(t)=a1(y(t)y(th)),


 mu(t)=1a1(y(t)y(th)),


mas y(t)é uma solução de uma equação diferencial com um argumento atrasado [1]:

 fracdy(t)dt=a0(1a1(y(t)y(th))).


A solução para esta equação é determinada exclusivamente pela configuração dos valores y(t)"Antes do início dos tempos", com t em[h,0]. Como nenhum código foi escrito antes da hora inicial, no nosso caso y(t)=0às t em[h,0].

Vejamos alguns exemplos. Mediremos o tempo em anos e a quantidade de código em milhares de linhas. Então para a0Valores da ordem de dezenas são aceitáveis, tomamos 50 e 100. Ou seja, em um ano a equipe de desenvolvimento escreverá cinquenta e cem mil linhas de código, respectivamente. Para a1valores aceitáveis ​​podem ser: US $ 0,25 / a_0 $ , US $ 0,5 / a_0 $ , 1/a0. Isso significa que a equipe de desenvolvimento é capaz de manter a quantidade de código que ele escreveu para o ano, com um quarto, metade ou carga de trabalho completa. Como o tempo médio de vida do código, vamos definir os valores: 1, 2 e 4 anos. Resolvendo a equação numericamente, obtemos exemplos do comportamento da função  mu(t)para algumas combinações de parâmetros h,a0,a1.
imagem
Função Comportamento  mu(t)em face do código antigo mudou. A função deixou de ser monótona, mas as flutuações “se acalmam” ao longo do tempo, há uma tendência a  mu(t)para algum valor constante. Os gráficos mostram: quanto mais h, a0e a1isto é, quanto mais lento o código envelhece, mais rápido ocorre o desenvolvimento de um novo código e menor a qualidade do código, menos recursos permanecerão para o desenvolvimento de novas funcionalidades. Havia um desejo de dar pelo menos um exemplo em que  mu(t)"Snuggled" perto de zero. Mas isso exigiu a seleção de indicadores de qualidade de desenvolvimento muito ruins e código de longa duração. Mesmo no gráfico inferior esquerdo, resta uma quantidade significativa de recursos para a nova funcionalidade. Portanto, a resposta correta para a primeira pergunta é mais provável: teoricamente - sim, é possível; praticamente - dificilmente.

Perguntas que não puderam ser respondidas:

  1. É verdade que  mu(t)tende a um certo limite para t a+ inftypara todos a0,a1>0? Se não for para todos, então para qual?
  2. Se o limite existir, como seu valor depende de a0,a1?

A segunda pergunta. O suporte ao código pode causar crescimento ilimitado no número de programadores?


Nós denotamos q(t)número de programadores envolvidos no desenvolvimento de novo código. Como acima y(t)- a quantidade de código escrito pela hora t. Então

 fracdy(t)dt=a2q(t);a2 in mathbbR,a2>0.


Deixe o código suportar ocupado p(t)programadores. Envelhecimento do código C

p(t)=a3(y(t)y(th));a3 in mathbbR,a3>0.


De onde

p(t)=a3 inttht fracdy(s)dsds=a2a3 intthtq(s)ds.


Se q(t) leqC1então

p(t) leqa1a2C1h.


Portanto, a resposta para a segunda pergunta é negativa: se o número de desenvolvedores de novo código for limitado, no contexto do código antigo, o suporte não poderá causar um aumento ilimitado no número de programadores.

Conclusão


Os modelos considerados são modelos matemáticos "suaves" [2]. Eles são muito simples. No entanto, a dependência dos resultados da simulação sobre os valores dos parâmetros corresponde ao esperado para sistemas reais, o que favorece a adequação dos modelos e a precisão suficiente para obter estimativas qualitativas.

Referências


1. Elsgolts L.E., Norkin S.B. Introdução à teoria das equações diferenciais com argumento divergente. Moscovo Editora "Ciência". 1971
2. Arnold V.I. Modelos matemáticos "rígidos" e "flexíveis". Moscovo Editora do Centro. 2004.

Source: https://habr.com/ru/post/pt430782/


All Articles