Per prima cosa, crea una categoria per le modifiche tipiche in termini di SLOC (e punti funzione se riguardano modifiche agli elementi dell'interfaccia utente.)
Quindi guarda le modifiche al codice precedenti e vedi dove si inseriscono nel modello di categoria descritto sopra.
Fai lo stesso con le nuove funzionalità (ovvero, tratti le modifiche al codice e le nuove funzionalità in modo diverso a meno che una nuova funzionalità non comporti cambiamenti significativi / costi sulla base di codice esistente). Se l'integrazione di una nuova funzione è banale, separala dalle modifiche al codice. Se la sua integrazione con la base di codice esistente è significativamente costosa, si accontenti di modificare il codice.
Quindi, per ogni cambio di codice categorizzato (o nuova funzione), determina 1) quanto tempo è necessario per completare, 2) quanto tempo è stato necessario per complete, 3) quante persone sono state effettivamente coinvolte nel completamento e 4) quante persone erano inizialmente ritenute necessarie per il suo completamento.
Quindi ora dovresti avere una presentazione tabellare delle risorse fornite (modifiche al codice e nuove funzionalità), ciascuna con colonne che indicano le risorse stimate e reali (ore, persone) consumate.
Puoi quindi assumere uno stipendio / ora medio per ingegnere di ballpark (ad esempio $ 40 / ora). Moltiplicare per 2 per indicare il costo totale dell'ingegnere / ora (una stima del salario orario, dell'elettricità, delle amenità dell'ufficio e del noleggio, ecc.) Non deve essere accurato, solo abbastanza realistico.
Per ogni artefatto consegnato A , puoi calcolare quanto segue:
estimated_cost(A) := avg_hr_salary * estimated_hours(A) * estimated_people(A)
approx_cost(A) := avg_hr_salary * (actual_hours(A) + estimated_hours(A))/2 * (actual_people(A) + estimated_people(A)/2
max_cost(A) := avg_hr_salary * actual_hours(A) * actual_people(A)
Con queste relazioni (che devono essere basate su effettive modifiche al codice o nuovi elementi ... altrimenti non hanno senso), puoi calcolare (per dimensione della categoria), qual è la% di un cambio di codice di quella dimensione per deviare dalla dimensione stimata (un% di errore), il costo approssimativo e la% della modifica del codice potrebbero effettivamente raggiungere un valore massimo. costi.
È probabile che la percentuale per la deviazione massima dal costo stimato (minimo) assomigli sempre più a una distribuzione esponenziale, maggiore è il cambiamento di codice.
Con questa data, puoi dire al tuo cliente quanto segue:
You to your customer:
This change you are requesting (A)
might take 10K SLOC, on the old code
base. Historical data indicates that
it might take 2 people at a minimum
(estimate_people), possibly escalating
up to 3 people (actual_people). The
probability of the change to cost
(estimate_cost) is A%; B% for
approx_cost, and %C for max_cost.
Questa è la chiave. Devi eseguire gli stessi calcoli per nuove richieste (il tipo la cui integrazione con il vecchio codice base comporta cambiamenti non significativi in seguito).
Se ritieni che i costi stimati, approssimativi e massimi per nuove richieste di una determinata dimensione siano (si spera) significativamente inferiori ai costi delle vecchie modifiche alla base di codice della stessa dimensione, < em> THEN hai un argomento per una riscrittura del codice. Hai fornito prove sufficienti del fatto che la vecchia base di codice è costosa da cambiare rispetto alle modifiche della stessa grandezza nel nuovo codice.
Ma se i costi delle nuove richieste di codice non differiscono molto dalle vecchie modifiche al codice della stessa grandezza, sarà difficile giustificare una riscrittura del codice (e potrebbe indicare che i problemi non riguardano solo la base del codice, ma anche nelle tue pratiche di sviluppo.)