Dovremmo persistere con un dipendente che scrive ancora codice errato dopo molti anni? [chiuso]

13

Sto mettendo questa domanda ai programmatori C ++ perché: a) Solo un programmatore C ++ può giudicare i meriti tecnici degli esempi; b) Solo un programmatore avrà un'idea del temperamento di un altro programmatore che scrive un codice come questo.

Le risorse umane e gli amministratori sono consapevoli che c'è un problema semplicemente perché vedono le prove sul campo. La mia chiamata è se diamo più tempo al programmatore in questione. Molti degli errori sono a un livello molto basilare - la mia domanda (ai programmatori) è se qualcuno che professa di essere uno sviluppatore C ++ di alto livello dovrebbe avere il beneficio di un dubbio sulla base di campioni del loro codice corrente. I non programmatori, anche persone esterne alla programmazione in C ++, non possono dare alcun giudizio su questo.

Per motivi di background, mi è stato assegnato il compito di gestire gli sviluppatori per un'azienda consolidata. Hanno un singolo sviluppatore specializzato in tutto il codice C ++ (da sempre), ma la qualità del lavoro è pessima. Le revisioni del codice e i test hanno rivelato molti problemi, uno dei peggiori dei quali è la perdita di memoria. Lo sviluppatore ha mai testato il suo codice per perdite, e ho scoperto che le applicazioni potevano perdere molti MB con solo un minuto di utilizzo. Gli utenti segnalavano enormi rallentamenti e la sua versione era "non ha niente a che fare con me - se smettono e ricominciano, va tutto bene di nuovo".

Gli ho dato strumenti per rilevare e rintracciare le perdite, e mi sono seduto con lui per molte ore per dimostrare come vengono utilizzati gli strumenti, dove si verificano i problemi e cosa fare per risolverli. Siamo 6 mesi in pista, e l'ho assegnato per scrivere un nuovo modulo. L'ho rivisto prima che fosse integrato nella nostra più ampia base di codice ed ero costernato nello scoprire la stessa cattiva codifica di prima. La parte che trovo incomprensibile è che alcuni dei codici sono peggiori di quelli amatoriali. Ad esempio, voleva una classe (Foo) che potesse popolare un oggetto di un'altra classe (Barra). Decise che Foo avrebbe tenuto un riferimento a Bar, ad esempio:

class Foo {
public:
    Foo(Bar& bar) : m_bar(bar) {}
private:
    Bar& m_bar;
};

Ma (per altri motivi) ha anche bisogno di un costruttore predefinito per Foo e, piuttosto che mettere in discussione il suo progetto iniziale, ha scritto questo gioiello:

Foo::Foo() : m_bar(*(new Bar)) {}

Quindi ogni volta che viene chiamato il costruttore predefinito, viene fatta trapelare una barra. A peggiorare le cose, Foo alloca la memoria dall'heap per altri 2 oggetti, ma non ha scritto un distruttore o un costruttore di copie. Quindi ogni allocazione di Foo in realtà perde 3 oggetti diversi, e puoi immaginare cosa è successo quando è stato copiato un Foo. E - migliora solo - ha ripetuto lo stesso schema su altre tre classi, quindi non è una scivolata unica. L'intero concetto è sbagliato su così tanti livelli.

Mi sentirei più comprensivo se venisse da un principiante totale. Ma questo ragazzo lo fa da molti anni e negli ultimi mesi ha ricevuto una formazione e dei consigli molto mirati. Mi rendo conto che ha lavorato senza mentori o revisioni tra pari la maggior parte di quel tempo, ma sto iniziando a sentire che non può cambiare. Quindi la mia domanda è: vorresti insistere con qualcuno che sta scrivendo un codice così palesemente cattivo?

    
posta user94986 26.06.2013 - 16:13
fonte

8 risposte

22

Il mio consiglio sarebbe di confrontarlo con questo particolare esempio e vedere cosa dice. Se lui nega che ci sia qualcosa di male con il codice, allora temo ci sia poco che tu possa fare. Se accetta di aver fatto un errore (anche se è difensivo a riguardo), allora almeno c'è margine di miglioramento. Se accetti il tempo e gli sforzi per migliorarlo, allora tu o un programmatore anziano dovrete sedervi e programmare insieme fino a che tutte queste tendenze non saranno appiattite (preparatevi a dedicare questa persona per almeno 1 mese).

Un programmatore cattivo, di solito con cui posso lavorare, ma un programmatore che non può migliorare, non posso.

    
risposta data 26.06.2013 - 16:22
fonte
17

So my question is, would you persist with someone who is writing such obviously bad code?

No. Vorrei licenziare qualsiasi sviluppatore C ++ professionale che mancava la comprensione di base della gestione della memoria.

Se si tratta di qualcuno proveniente da Java o C # o qualcosa, darei loro un po 'di lattazione, ma questa è pura incompetenza.

    
risposta data 26.06.2013 - 16:24
fonte
13

Non possiamo rispondere alla parte più ampia della tua domanda. Vale a dire, dovresti trattenere o licenziare quel dipendente. Licenziare un dipendente è difficile, ma questa è una decisione al di fuori della portata di una comunità come questa.

Hai aggiornato la tua domanda per limitare le risposte ai programmatori C ++. Per il mio background / qualifiche: ho tagliato i denti in C, e posso scrivere in C ++, C # e Java. E mi piace inseguire le condizioni di gara tra i thread perché penso che sia divertente. Sì, "ottengo" un po 'di giocherellando.

La tua risposta e la tua decisione si sovrappongono: se qualcuno può cambiare o meno dipende dall'individuo e se vogliono cambiare.

Ma iniziamo con alcune domande su di te:

  1. Gli hai chiesto del codice e dell'esempio che hai menzionato? Qual è stata la sua impressione della recensione?
  2. Gli hai dato degli specifici durante quei 6 mesi riguardo alla comprensione della manipolazione della memoria e assicurandoti che il suo codice non avesse perdite di memoria?
  3. Stavi fornendo un feedback ragionevolmente frequente durante quei 6 mesi per indicare se stava facendo progressi o no.
  4. Hai esplicitamente fatto notare che il suo vecchio modo di codificare non era più accettabile nel nuovo codice?

Devi assicurarti di poter dire di sì a tutte quelle domande. Altrimenti, c'è ancora un carico di prova da parte tua per comunicare con lui.

La sua risposta alla tua recente recensione sarà la parte più significativa.

Se ha provato e mostra qualche segno di progresso, forse è necessario rivedere il processo di mentoring. Se mai, forse hai bisogno di considerare l'abbinamento con un programmatore più esperto in modo che possa ottenere un feedback immediato mentre sta prendendo decisioni di progettazione. Non sono un fan della programmazione di coppia, ma può essere molto utile in un caso come questo. Inviarlo continuamente a fare sempre più revisioni al vecchio codice non è sempre un percorso pratico per l'apprendimento.

Se non ha provato, devi capire meglio la sua motivazione. Non ha capito che ha bisogno di provare più duramente? A lui semplicemente non importa? Ci sono altre aree nella squadra in cui le sue abilità sarebbero più adatte e lui è più interessato a questo? Se non gli importava di provare, allora hai bisogno di capire perché.

Da lì, saprai se vuole cambiare e se può cambiare. Nessun desiderio di cambiare equivale a non essere in grado di cambiare. Se c'è il desiderio e un certo grado di progresso, allora considera strongmente di cambiare il modo in cui stai cercando di riabilitarlo.

    
risposta data 26.06.2013 - 16:26
fonte
10

Temo che il suo codice errato non sia l'unico problema nella tua squadra.

  1. Chi esamina il suo codice? Perché è scivolato via senza un avvertimento per aver accettato il codice con vulnerabilità alla perdita di memoria?
  2. Perché i test di stress non hanno riscontrato questo problema? Li usi? Se sì, allora perché non stanno lavorando?
  3. È stato lasciato incustodito per un lungo periodo di tempo. Perché?
  4. Non sta usando gli strumenti che gli hai dato. Come lo hai motivato a iniziare a utilizzare strumenti adeguati?

Dici che è stato in compagnia per un lungo periodo di tempo. Sparare a una tale persona raramente è una buona idea (a meno che non sia un dipendente di Wally). La loro conoscenza delle esigenze del cliente, dei prodotti che possiedi, ecc., Spesso è molto più preziosa del codice che scrivono.

Soluzioni:

  • spostalo nel QA per fargli imparare cosa evitare
  • coppia la programmazione con qualcuno che può segnalare i suoi errori
  • Sforzo QA esteso sul suo codice
  • fagli scrivere stress test, se vedrà la sua macchina di sviluppo crollare dopo aver creato e distrutto 10k di oggetti forse imparerà
  • alcuni / tutti sopra:)
risposta data 26.06.2013 - 16:44
fonte
3

Prendere la decisione di licenziare qualcuno è una decisione difficile da fare per chiunque. La tua situazione però è composta da diversi fattori:

  1. Sembra che questo sviluppatore sia stato in compagnia per diversi anni
  2. Lo sviluppatore scrive tutte le società del codice C ++
  3. Sembra         che prima di te nessuno ha mai discusso del livello di codice scadente con         lo sviluppatore
  4. Come nuovo manager non hai idea di chi / cosa sia     lo sviluppatore sa in / sulla società e ciò che il politico     le conseguenze dello sparo dello sviluppatore sono

Detto questo hai passato gli ultimi 6 mesi a mostrare allo sviluppatore l'errore dei suoi modi e il suo nuovo codice non è ancora migliorato.

In questa fase hai davvero bisogno di iniziare una gestione proattiva in modo che entro 3 mesi hai

  • Un programmatore C ++ decente che sa cosa sta facendo

o

  • Terminato lo sviluppatore.

Per fare questo però devi sederti con lo sviluppatore, spiegare cosa c'è di sbagliato nella scrittura / email, spiegare come lo sviluppatore può migliorare e dichiarare molto chiaramente che se non ci si attende un miglioramento atteso, sarà terminato in 3 mesi.

Devi anche essere molto chiaro che il miglioramento è previsto da questo punto in avanti per il resto del suo impiego con l'azienda e non solo per il periodo di 3 mesi!

Dovresti anche informare il tuo manager e il reparto risorse umane (se presenti).

Durante questo processo dovrai gestire attivamente lo sviluppatore e rivedere attività / codice ogni 1-2 giorni e assicurarti che siano all'altezza, specificando quelli che non lo sono e spiegando cosa può essere fatto per migliorarli.

    
risposta data 26.06.2013 - 17:49
fonte
1

O non sei stato chiaro su quanto seriamente prendi la sua scarsa abilità (cioè è possibile che veda il tempo che hai speso con lui come opzione se vuole migliorare piuttosto che una necessità assoluta), o ha un atteggiamento incredibilmente cattivo che è insostenibile. Se non è già chiaro a questo sviluppatore che stai prendendo in considerazione la sua posizione su questo problema, allora deve essere enunciato (assumendo che la tua leadership sia d'accordo con la tua autorità di terminare). Speriamo che lo shock porti a un cambiamento.

La decisione sull'occupazione ha implicazioni molto più ampie rispetto a questo ragazzo, però, è necessario considerare l'impatto sul team. Se il suo atteggiamento è permesso di prosperare, può fornire risentimento agli altri o far credere che anche questo genere di cose sia ok. Dal punto di vista della squadra, però, deve essere assolutamente chiaro che se fosse andato, era per le ragioni giuste e aveva ampie opportunità di migliorare.

Un gioiello che ho imparato in un corso di anni fa è il fatto che le persone con conoscenze tecniche che altri non hanno possono indurre il management a dare loro un po 'di flessibilità. È male per la squadra. Potresti aver paura di perdere l'unico sviluppatore c ++, ma possono essere sostituiti. Ovviamente ci sono rischi intrinseci se conosce bene i prodotti rilasciati, ma spesso ho visto persone con conoscenze di prodotto / tecnica apparentemente insostituibili sostituite più facilmente del previsto. Squadre e organizzazioni possono spesso colmare lacune che inizialmente sembrano difficili da colmare. Ovviamente se non ha competenze in c ++ o conoscenze specifiche dell'organizzazione che ritieni siano difficili da sostituire, c'è molto meno problema!

    
risposta data 26.06.2013 - 18:46
fonte
0

Certo che non dovresti. Ricorda, questo non è un ente di beneficenza, stai scambiando soldi per lavoro. Se non trattiene la sua parte dell'affare, come qualsiasi operazione che smetterei di pagare.

    
risposta data 26.06.2013 - 16:26
fonte
-1

Se vuoi dargli una possibilità, sviluppa un test standardizzato che raccolga le metriche sulla perdita di memoria. Monitora i suoi progressi su base settimanale, insistendo sul vedere il codice che ha cambiato e cerca miglioramenti. Se non può gestire a quel punto, licenzia l'invettiva inutile.

    
risposta data 26.06.2013 - 18:27
fonte

Leggi altre domande sui tag