Quantità di lavoro di routine nello sviluppo di software e relativo effetto sulla stima


11

Sono convinto che la quantità di lavoro di routine nello sviluppo del software sia - e dovrebbe essere - relativamente piccola, se non trascurabile, e che questo sia il problema fondamentale della stima del software.

Consentitemi di descrivere come giungo a questa conclusione e di dirmi se l'argomentazione presenta qualche grave difetto:

  1. Tutto ciò che può essere stimato con elevata precisione è un lavoro di routine, ovvero cose che sono state fatte in precedenza. Tutti gli altri tipi di lavoro che coinvolgono la ricerca e la creatività non possono davvero essere stimati, almeno non con un'accuratezza, diciamo, del +/- 20 percento.

  2. Lo sviluppo del software consiste nell'evitare attività ripetitive. Uno dei suoi principi di base è DRY (non ripeterti). Ogni volta che un programmatore si trova a fare cose ripetitive, è tempo di trovare un'astrazione che eviti questa ripetizione. Queste astrazioni possono essere cose semplici come estrarre il codice ripetuto in una funzione o metterlo in un ciclo. Possono anche essere più complessi come la creazione di una lingua specifica del dominio. In ogni caso, la loro attuazione comporterà ricerca (qualcuno l'ha mai fatto prima?) O creatività.

Da questi due punti traggo la conclusione di cui sopra.

In realtà da un po 'mi chiedo perché questa relazione non sia menzionata in ogni altra discussione, post di blog o articolo sulla stima del software. È troppo teorico? I miei presupposti sono sbagliati? O è troppo banale, ma allora perché la maggior parte degli sviluppatori che conosco credono di poter fare stime con una precisione del +/- 20 percento o migliore?


7
Il 99% di tutto lo sviluppo di software al di fuori di aree come i kernel è stato fatto migliaia di volte in precedenza. Troppi sviluppatori vogliono semplicemente fare tutto in un modo nuovo, reinventando sempre gli stessi vecchi problemi.
Piegato il

@Bent: Quindi stai dicendo che lo sviluppo del software è principalmente copia e incolla? So che molti sviluppatori lavorano in questo modo e spesso hanno scoperto che porta a un codice non mantenibile. Ma questa è una storia diversa. Anche se qualcuno lavora in questo modo, deve capire cosa copiare e da dove. Questo è qualcosa che vorrei considerare anche come lavoro di ricerca.
Frank Puffer,

1
@rwong: ovviamente ha senso usare le librerie. Ma trovare la giusta funzione in una libreria e il modo giusto di usarla è o un lavoro di ricerca (se la lib è lamentex e / o non la conosci bene) o banale (se conosci bene quella funzione). Quello che chiami "codice colla" è nella mia esperienza spesso complessa. L'implementazione non è un lavoro di routine necessario.
Frank Puffer,

1
@ JohnR.Strohm: non ho letto questi libri specifici ma ho familiarità con le basi di COCOMO - tuttavia non l'ho mai usato in pratica. Inoltre ho letto altri due o tre libri di DeMarco. Potresti dare un suggerimento su quali contenuti specifici sono correlati alla mia domanda?
Frank Puffer,

2
@FrankPuffer, "Software Engineering Economics" di Boehm è necessario per la lettura del software. Il libro di Demarco non è molto indietro. La risposta BREVE è questa: se hai abbastanza familiarità con ciò che il software deve fare per stimarlo TUTTO, hai abbastanza familiarità da considerarlo relativamente di routine.
John R. Strohm,

Risposte:


11

Su ogni singolo progetto questo può essere vero. Tuttavia, se lavori su più progetti simili per diverse aziende nel corso degli anni, potresti ritrovarti a "risolvere" sostanzialmente lo stesso problema molte volte con solo lievi variazioni.

Ad esempio, ho scritto livelli di accesso ai dati così tante volte che ora preferisco farlo "a mano lunga" piuttosto che usare il popolare ORM del mese. È più veloce e più facile per me affrontare i "problemi di routine" con soluzioni note piuttosto che trovare e risolvere nuove stranezze nei componenti di terze parti.

Ovviamente potrei scrivere il mio ORM per semplificare il codice ripetitivo senza aggiungere le stranezze sconosciute nel sistema di qualcun altro, ma questo codice apparterrebbe alla società per cui mi è capitato di lavorare in quel momento, e altri sviluppatori lo troverebbero altrettanto eccentrico come qualsiasi altro ORM di terze parti.

Allo stesso modo, secondo la mia esperienza, la maggior parte della programmazione è l'automazione dei processi aziendali e sebbene ad ogni azienda piaccia pensare che i loro processi siano unici per loro; In realtà non lo sono.

Per non dire che la stima è facile! È più facile, ma trovo che in questi giorni il problema della stima sia dovuto all'inadeguatezza dei requisiti piuttosto che al tempo impiegato per la codifica.

I requisiti tendono a rientrare in tre categorie:

  1. Vago, dettagli lasciati allo sviluppatore.

"Fammi un sito Web, deve essere bello e vendere i miei widget"

Questi tendono ad essere i più facili da stimare, poiché quando si verifica un problema grave e imprevisto puoi semplicemente modificare i requisiti in qualcosa di funzionalmente equivalente ed evitare il problema.

  1. Molto specifico

"Rendi il colore di sfondo dell'intestazione # ff1100"

Super veloce da fare e, ancora una volta, facile da stimare. Ma! il requisito è destinato a cambiare. "Hmm no su ripensamenti, prova quest'altro rosso" o "Aspetta! Intendevo solo su quella pagina!" quindi il lasso di tempo reale di "quanto tempo resterò soddisfatto del colore dell'intestazione" non ha nulla a che fare con le stime di codifica

  1. Vago, dettagli ipotizzati

"Fammi un sito Web, (proprio come Facebook)"

Qui la moltitudine di presupposti non dichiarati, "ovviamente vorrai un logo diverso", "dovrebbe avere uno scorrimento infinito", "deve essere scalabile a 1 miliardo di utenti!" controllare efficacemente il preventivo. O lo sviluppatore pensa a tutto e spinge la stima oltre le aspettative "1 ora di manodopera", oppure pensa / presume che siano necessarie solo le funzionalità di base e fornisca una stima troppo bassa. "oh, una o due settimane, presumo che tu voglia solo mettere Facebook in un iframe giusto?"

Con l'esperienza la codifica è molto veloce, ma i requisiti di progettazione sono (di solito) la parte difficile, e questo è sempre più ricondotto ai non programmatori. Con metodologie agili che aumentano la velocità di codifica spostando questa responsabilità verso "l'azienda" anziché verso gli sviluppatori.


Sono assolutamente d'accordo con ciò che hai scritto sui requisiti inadeguati, ma questa è una storia diversa. Nella prima parte della tua risposta affermi che spesso continui a utilizzare tecniche ben note in modo che una maggior parte del tuo lavoro diventi routine. Fai deliberatamente senza ulteriori astrazioni. Questo probabilmente funziona bene per un breve periodo di tempo, forse 2-5 anni, a seconda delle tecnologie che stai utilizzando. Ma poi potresti notare che non hai migliorato il tuo processo tanto quanto alcuni dei tuoi concorrenti. Inoltre, altri sviluppatori che manterranno il codice in un secondo momento potrebbero avere un problema.
Frank Puffer,

Ovviamente non è come se non avessi mai usato materiale di terze parti. Il punto è che se sai già come fare qualcosa con lo strumento X la stima è semplice
Ewan

Non solo la stima, ma anche l'implementazione diventa facile in questo caso. Se il tuo intero progetto è così, sei fortunato. Ma secondo la mia esperienza ciò accade solo in piccoli progetti. Tutti i progetti più grandi (> 10 giorni) in cui sono stato coinvolto hanno richiesto alcuni nuovi concetti o tecnologie e questo è ciò che ha causato la maggior parte del lavoro, rendendo trascurabile lo sforzo per le cose standard.
Frank Puffer,

Non entriamo in una guerra di fiamma "chi è il miglior programmatore". Tutto ciò che sto dicendo è che più cose hai fatto prima di meno cose nuove ci sono. Se tutti i tuoi progetti impongono l'uso della nuova tecnologia per la maggior parte delle funzionalità ... Sembra strano
Ewan

@Ewan "concetti o tecnologie". Per me il primo tende a riguardare le regole aziendali e / o ciò che il designer vuole. Non si tratta solo di nuove tecnologie.
Izkata,

6

perché la maggior parte degli sviluppatori che conosco ritiene di poter fare stime con una precisione del +/- 20 percento o migliore?

Perché stimiamo la nostra pazienza con il problema molto più del problema reale.

Se avessi intenzione di animare una palla che rimbalzava, potrei passare un giorno, una settimana, un mese o un anno su di essa e avere ancora un'animazione di una palla che rimbalza. Spero che sembrerà migliore più tempo ci trascorro, ma ad un certo punto sono ridicolo.

Quanto sforzo faccio per far rimbalzare la palla è una funzione del tempo che è ragionevole spendere su di essa. Se il mio livello di abilità non lo taglia, potrei finire con una palla che si trova lì. Ma quando arriva la scadenza dovrei lasciar perdere la scadenza o almeno ottenere una palla sullo schermo? La cascata ha insistito sul rimbalzo della palla e quindi il programma è scivolato. Agile dice di portare la palla là fuori. Almeno scopriremo quante persone si preoccupano di rimbalzare. Quindi la qualità è scivolata.

Cerco di far rimbalzare le palle, ma quando la scadenza si avvicina è meglio produrre una palla statica piuttosto che niente. Quindi stima il tempo in base a quello che sembra un ragionevole lasso di tempo da dedicare a un problema prima di parlare di alternative. A volte la palla non rimbalza. A volte va bene. Scomparire per un mese non va bene.


Un buon punto, quindi in pratica stai dicendo che la stima dovrebbe essere basata sul valore che una determinata funzionalità ha per il cliente (o il proprietario del prodotto). Personalmente mi piace questo approccio, ma nella mia esperienza questo non è il modo in cui la stima del software è generalmente compresa, anche in un contesto agile. Uno svantaggio è che spesso non si dispone di queste informazioni sul valore del cliente di una funzione. Un altro svantaggio è che non è in grado di gestire pacchetti di lavoro che non comportano direttamente una funzionalità visibile al cliente.
Frank Puffer,

@FrankPuffer Non sono d'accordo sul fatto che i metodi agili non lo chiariscano. SCRUM, in particolare, non chiede nemmeno agli sviluppatori di stimare fino a quando il valore della funzione non è così alto da essere effettivamente programmato, vale a dire una stima appena in tempo. I metodi agili sono particolarmente adatti a questo: prima identifica le funzionalità con il più alto valore aziendale, quindi stimale, quindi FACILITÀ e vedi quanto tempo ha impiegato. Piuttosto risciacqua ripetizione. Dopo alcuni cicli, avrai una buona idea della stima rispetto al tempo di sviluppo effettivo.
RibaldEddie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.