Trattare con uno sviluppatore ignorando continuamente casi limite nel suo lavoro


25

Ho un problema interessante, abbastanza comune, immagino, con uno degli sviluppatori del mio team. Il ragazzo è un grande sviluppatore, lavora veloce e produttivo, produce codice di qualità abbastanza buona e tutto il resto. Bravo ingegnere. Ma c'è un problema con lui - molto spesso non riesce a risolvere i casi limite nel suo codice.

Ne abbiamo parlato con lui molte volte e ci sta provando, ma credo che non la pensi così. Quindi ciò che finisce è che il QA troverebbe molti problemi con il suo codice e lo restituirebbe per lo sviluppo ancora e ancora, con conseguente scadenze scadute e tutti i membri del team infelici.

Non so cosa fare con lui e come aiutarlo a superare questo problema. Forse qualcuno con più esperienza potrebbe consigliare?


11
Chiedi a qualcuno di coprire il suo codice con unit test.
Giobbe

8
La persona più qualificata per testare il codice è il suo autore.

16
@Developer Art: completamente in disaccordo. La persona peggiore a fare qualsiasi test del codice è la persona che ha sviluppato quel codice. Tutti hanno punti ciechi ma la persona che sta creando ha il più grande punto cieco in riferimento al suo codice.
James P. Wright,

2
@Developer Art: credo che scrivere test automatici sia in realtà un ruolo abbastanza comune. In genere è qualcosa che fai per un anno o due se non sei ancora pronto per la prima serata nella compagnia in cui ti trovi. È una specie di periodo del purgatorio.
Morgan Herlocker,

19
Lo descrivi come un "grande sviluppatore", "produttivo", un "buon ingegnere" e produce un "codice di buona qualità". Ma il QA continua a trovare problemi con il suo lavoro. Utilizzeresti davvero questi termini per descrivere qualcuno che regolarmente e costantemente inserisce difetti nel loro codice? Mi chiedo se c'è di più in questa storia, dal momento che la descrizione dell'individuo come professionista e il lavoro che stanno svolgendo non corrispondono affatto.
Thomas Owens

Risposte:


29

Richiedigli di scrivere test di unità automatizzati per il suo codice. Scrivere test unitari costringe a pensare attraverso i casi limite.

Alcuni particolari:

  1. Per assicurarsi che non si senta individuato, questo dovrebbe essere istituito per l'intera squadra. Richiedi a tutti di scrivere test di unità automatizzati per il nuovo codice o il codice che modificano.
  2. Richiede che i nomi dei test unitari siano descrittivi sul caso in cui stanno testando.
  3. Coprire i test unitari automatizzati nella revisione del codice ad alto livello. Chiedi ai revisori di cercare i casi di test persi (ad esempio quei casi limite che gli mancano perennemente). Dopo una certa quantità di feedback da parte del suo team sui casi limite persi, probabilmente imparerà a considerare quelli prima della revisione.
  4. Applica questa regola per l'intero team: se il QA rileva un bug, lo sviluppatore responsabile deve il test automatizzato che conferma l'errore e quindi dimostra di averlo corretto. (prima di fare qualsiasi altro lavoro)

Amen, ancora meglio, richiede che tutti scrivano prima il loro codice test. L'uso di un framework BDD di solito riduce il dolore di questo
George Mauer,

@George Buona idea. TDD aiuterebbe ancora di più qui.
Matthew Rodatus,

3
I test unitari non riguardano la ricerca di bug - blog.stevensanderson.com/2009/08/24/…
Dainius

1
@Dainius sono d'accordo. Il test unitario facilita il pensiero di uno sviluppatore attraverso i casi limite, che possono precludere (ma non identificare) i bug.
Matthew Rodatus,

After some amount of feedback from his team about missed edge cases, he will probably learn to consider thoseGli sviluppatori che hanno cattive pratiche spesso sostengono l'irrilevanza dello sforzo aggiuntivo richiesto per le buone pratiche (perché non vedono il vantaggio di farlo). Mentre lo sviluppatore può acconsentire quando aggiungi ulteriori casi limite, ciò non significa che pensi che sia rilevante o se li aggiungerà da solo.
Flater,

23

Dagli una lista di controllo, ad es

  • ingressi nulli
  • ingressi a estremi estremi della gamma
  • ingressi a limite estremamente piccolo dell'intervallo
  • combinazioni
  • input che violano gli invarianti presunti (ad es. se x = y)

La gente di QA può aiutare a elaborare l'elenco di controllo

Dai la checklist a tutti gli sviluppatori, non solo a questo.


1
È bene che tutti gli sviluppatori debbano utilizzare l'elenco di controllo, individuando uno sviluppatore può causare brutti sentimenti. E potrebbe aiutare a migliorare la qualità del codice di ognuno .
FrustratedWithFormsDesigner

Buona idea, anche se sono curioso di sapere come potrebbe essere visto dal punto di vista degli sviluppatori. In realtà non mi sono mai imbattuto in questa pratica nella mia carriera di sviluppatore, quindi è un po 'difficile valutare la reazione. Qualche intuizione lì?
Alex N.

@Alex: le liste di controllo sono una pratica di routine per alcuni sviluppatori e un insulto orribile per altri. Prova e vedi cosa succede. Se si chiude, la qualità del codice migliorerà ;-)
Steven A. Lowe,

4
I tuoi sviluppatori non useranno le liste di controllo? Se una checklist potesse salvare delle vite, le userebbero? Molti dottori non lo fanno e i pazienti soffrono. Leggi questo: newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Barry Brown

1
@ Barry, non ho detto che non lo faranno. Le liste di controllo in questo caso sembrano, IMHO, come un rimedio per i sintomi di un problema, non per il problema stesso. Il problema è la disciplina e la diligenza in questo caso. Quando il problema è la complessità di un sistema che richiede manutenzione d'emergenza con un alto grado di responsabilità e stress, ciò si traduce in un livello degradato di attenzione ai dettagli, quindi sì, liste di controllo ftw (piloti, medici, ecc.) Ma questo è più di un dibattito filosofico immagino, al di fuori dell'ambito di questa domanda.
Alex N.

17

Bravo ingegnere.

Va bene.

Ma c'è un problema con lui - molto spesso non riesce a risolvere i casi limite nel suo codice.

È una qualità che i buoni ingegneri non condividono.


Prestare attenzione ai casi limite è una caratteristica presente o meno nelle persone. Non ha nulla a che fare con l'essere un ingegnere o un programmatore. Lo sviluppo di questa caratteristica è influenzato dal background culturale, dall'ambiente di vita, dagli eventi dell'infanzia e dalle esperienze di vita. Quindi l'atteggiamento viene semplicemente applicato a qualsiasi lavoro svolto da un individuo.

Ciò di cui hai bisogno è scoprire se il tuo ragazzo è di quel tipo che non ha sviluppato questo certo senso (forse ancora). È anche molto probabile che non gli importi per un motivo o per l'altro. Devi analizzare l'intera situazione, se è felice nel suo lavoro. In caso contrario, forse dovresti fare qualcosa per aiutarlo prima.

Se sta bene con il lavoro ma non ha ancora sperimentato il pericolo di casi limite, allora puoi iniziare a educarlo. Se lo prende sul serio, potrebbe cambiare nel tempo. Anche se sono scettico su questo, potresti ancora provarlo.

Se comunque si rivelerà essere quel tipo di persona che non è brava nei casi limite, allora non avrai altro che rimuoverlo dalla squadra. Questa caratteristica è essenziale per la programmazione pratica. Purtroppo, senza di essa nemmeno una persona eccezionale non produrrebbe un buon lavoro.


6
+1 Questa è un'abilità che alcune persone hanno alcune persone devono imparare a essere un buon programmatore. Tuttavia, noterei che esistono due tipi di casi limite: casi limite requisiti aziendali ("Se ordiniamo 27 istruttori di sinistra e 28 istruttori di destra l'ordine è probabilmente errato") che dovrebbero essere trattati nei requisiti del progetto ed effettivi casi limite di codifica (gestione di input non validi, ripetizione costante di elenchi quando un hashset sarebbe più sensibile in termini di velocità quando il set diventa più grande di x ecc.) che sono più qualcosa che devi solo imparare.
Ed James,

Grazie per la tua comprensione. Lo apprezzo davvero. Hai ragione su tutti i fronti qui, anche se sono curioso, se è una persona eccezionale ma manca solo qualcosa che rende grandi ingegneri, come posso ancora metterlo a fare altro lavoro e mantenerlo nell'organizzazione, forse trasferirsi in un'altra squadra o qualcosa del genere ... Anche se credo di poter rispondere solo a questa domanda :)
Alex N.

Ci ho pensato ma non ne sono sicuro. Un altro ruolo da diventare accettabile per quel tipo di persona non dovrebbe richiedere attenzione ai dettagli e non ce ne sono molti in un'azienda di software.

Il mondo non è così bianco e nero come suggerisce la tua prima frase. Credo che esistano sviluppatori che possono identificare alcuni casi limite, ma non tutti.
Mike Partridge,

5

Potresti fare revisioni del codice o revisioni del progetto in precedenza nel processo?


4

Insegnagli a programmare il test prima. Abbinalo a lui. Scriverai i casi di test e lui scriverà il codice per superare i test.


3

Poter coinvolgere il QA abbastanza presto nello sviluppo delle funzionalità può fornirgli un elenco di casi limite vicino all'inizio per coprire? Mentre alcuni potrebbero vedere questo come non aspettandosi che lo sviluppatore copra tutto, questo potrebbe essere un modo per aggirare questo problema se tende a perdere quei casi limite che un tester potrebbe benissimo catturare inizialmente.

L'altra idea che avrei qui è come vede questo problema. È davvero infastidito e ha fatto il segno di se stesso per questo schema o lo vede come normale e non qualcosa di cui preoccuparsi di risolverlo? Ammesso che ciò richieda molta fiducia e che sia aperto sulla sua prospettiva, ma penso che ci sia un certo grado di empatia che può aiutare se riesci a vedere le cose dalla sua prospettiva.


3

Esistono infiniti casi limite, coprirli è impossibile. E se qualcuno lo fa #define TRUE FALSE? Aggiunge casi limite, li controllerai anche tu?

Inoltre, non prenderei in considerazione l'impermeabilità di ogni funzione di una classe privata o di una funzione interna.

L'approccio che scelgo per il codice che deve essere molto solido e stabile è:

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

In questo modo ottieni solidi dump delle applicazioni nel QA e, quando arrivi a una versione, l'app è solida e sicura.

Risolvere gli errori è male. Ok, potresti salvare una funzione se l'handle del file è null e restituisce null, ma nella maggior parte dei casi, c'è un errore di progettazione da qualche parte e l'arresto anomalo dell'app è un modo migliore per forzarti a trovare la causa. La maggior parte dei casi limite mascherano l'errore nascondendo un problema, ad esempio - il pulsante ha smesso di funzionare. Crash ti dice che alcune ipotesi sul prodotto sono sbagliate e devi rivedere la logica che ha causato il crash.


#define VERO FALSO non è un caso limite, è un'offesa di licenziamento.
gnasher729,

1

Se si tratta di un caso limite, deve anche essere preso in considerazione? Se i casi limite sono importanti, i casi limite devono essere inseriti nei requisiti / funzionalità / storia utente.

Se le custodie per bordi sono state considerate come parte di un pezzo di lavoro e i dispositivi devono essere messi in atto, allora dovrebbero essere parte dell'elemento di lavoro e per definizione l'elemento di lavoro non è completo fino a quando il meccanismo per la gestione della custodia per bordi è a posto.

Questo ti dà come Lead Team qualcosa su cui verificare dopo che il lavoro è stato completato durante la discussione post lavoro e dà allo sviluppatore qualcosa su cui verificare mentre completa il lavoro.


Ci sono sempre casi limite. Se qualcuno afferma che i casi limite non saranno mai incontrati, quelli non sono i casi limite giusti.
Barry Brown,

1
@Barry Brown Concordo sul fatto che ci sono sempre casi limite ma c'è una differenza tra casi limite importanti che gli Stakeholder ritengono importanti, che possiamo chiamare Scenari e casi limite che uno sviluppatore ritiene importanti. Se uno Stakeholder ritiene che qualcosa sia importante, dovrebbe essere discusso nella sessione di pianificazione e incluso come Scenario in una User Story e non lasciato allo sviluppatore a pensare, dovrebbe essere un requisito adeguato rispetto all'attività. Richiede molto tempo e non è necessario ma null controlli contro i parametri su ogni singolo metodo non pubblico.
Bronumski,

1

I casi di cattura sono il motivo per cui esiste il QA. I programmatori hanno la responsabilità di espellere il lavoro in modo tempestivo. Trascorrere tutto il loro tempo alla ricerca di casi limite è molto inefficiente. Se hai un ciclo iterativo ragionevolmente veloce, questo non dovrebbe essere affatto un problema. I casi limite sono quasi infiniti. Se fosse un problema con i casi "Core", sarei un po 'preoccupato. Proprio come gli sviluppatori sono esperti nello sviluppo, un tester dovrebbe essere un esperto nei test. Quando un tester rileva un problema, lo rimandano allo sviluppo. Lo sviluppatore risolve il problema. Problema risolto. Il tempo impiegato dallo sviluppatore per rintracciare ogni caso limite è molto più lungo di quanto dovrebbe impiegare il ciclo di test iterativo. Inoltre, quando parlo di test, non intendo test di unità in scatola bianca, ma test rigorosamente in scatola nera.


1
Questa non è davvero la risposta giusta. Essere premiati per aver emesso un lavoro di mezza qualità è una cattiva pratica. Il team di sviluppo dovrebbe essere nel complesso responsabile di un lavoro di alta qualità.
David

Lo sviluppatore decente non deve cercare casi limite. Alcuni codici sono scritti in modo da non avere casi limite, in altri casi i casi limite sono ovvi. Il codice che non gestisce i casi limite è un codice incompleto.
gnasher729,

0

Questo è uno dei casi in cui credo che lo sviluppo guidato dai test venga in soccorso perché aiuta a pensare in termini di casi limite e tutto ciò che può violare il codice.

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.