Domanda:
Come dovrei comunicare gravi difetti di programmazione a qualcuno in modo che non la prenda sul personale?
pek
2016-03-15 11:47:09 UTC
view on stackexchange narkive permalink

Sono uno sviluppatore con solo un paio di anni di esperienza, lavorando in una piccola azienda di otto sviluppatori, su un progetto Java. Il nostro team leader, anche uno dei manager, è più anziano e molto produttivo e dice di avere circa quindici anni di esperienza in Java.

Il mese scorso, mentre discutevamo di alcuni moduli del codice sorgente, ha scritto, Ho notato nel codice sorgente che una delle classi sovrascrive il metodo equals () , ma non il metodo hashCode () - Mi riferisco ai due metodi dichiarati nel Java molto semplice class Object . Quando l'ho fatto notare al team leader, in modo molto calmo ed educato, ha negato che una classe dovesse ignorare entrambi i metodi. Il problema sarebbe finito lì, ma ho trovato immorale lasciare che un tale difetto (bug) danneggiasse il prodotto in seguito.

Pochi giorni dopo, l'ho avvicinato di persona e in privato e gli ho spiegato in silenzio, senza essere irrispettoso, della questione e utilizzato riferimenti esterni (come il libro di Joshua Bloch "Effective Java") . Bene, ha detto che l'avrebbe guardato, e alla fine l'ha fatto. Tuttavia, da allora, mi dà la spalla fredda.

Ancora peggio, di recente ho notato un problema serio nel codice sorgente. Alcune classi che ha scritto implementano l'interfaccia Serializable , ma il campo serialVersionUID non è un numero fisso (costante). Invece varia. Voglio dire, otteniamo un numero diverso ogni volta che eseguiamo l'applicazione.

Sempre con la motivazione di fornire un prodotto sano, vorrei comunicarlo correttamente. Ma non so come farlo correttamente, senza che lui la prenda sul personale. Vedi, i miei precedenti approcci sono falliti. Come potrei farlo?

Qualsiasi consiglio sarebbe ben accetto.

Modifica: lo scopo di questa domanda è trovare modi efficaci, produttivi, educati, rispettosi e collaborativi per comunicare i miglioramenti seri problemi di codice e non mettere in discussione l'autorità o le decisioni di gestione, prese da colleghi o persino superiori.

Quali problemi reali, piuttosto che teorici, stanno causando questi problemi nel tuo codice?
Se questo tizio basa le sue informazioni su un unico libro, allora non va bene. Poni la domanda riguardo al codice java su SO. Almeno lì ottieni una garanzia dagli esperti Java per ciò che è giusto e sbagliato
@Philip I problemi descritti sono quelli che spesso possono non risultare in bug reali, ma se / quando provocano bug sono generalmente difficili da correggere. Anche se qui non fosse così, la domanda si applica ugualmente bene a questioni di stile e pulizia del codice; se siano stati identificati o meno bug effettivi non è rilevante.
Da quanto tempo il tuo collega ti dà la "spalla fredda"? Sembra che tu sia riuscito a convincerlo, quindi potresti non essere stato così infruttuoso come pensi - potrebbe volerci un po 'di tempo perché il suo orgoglio si riprenda.
@PhilipKendall Sono più interessato a comunicare in modo efficace alcune preoccupazioni senza causare alcun danno a lui (o al team e al prodotto). Tuttavia, il piano futuro prevede la comunicazione di alcuni oggetti tramite JMS su diversi computer / JVM.
@Rob Grazie per il tuo contributo - questa situazione è stata per due mesi. Di nuovo, forse dovrei solo aspettare un po ', come suggerisci
"Ho notato nel codice sorgente che una delle classi ha sovrascritto il metodo è uguale, ma non il metodo hashCode." - se vuoi comunicare efficacemente a un programmatore perché qualcosa del genere non va bene, trova esempi di bug effettivi nel codice che possono essere ricondotti direttamente a questa cattiva pratica. Quindi puoi definitivamente dire "se adottiamo la pratica X, bug di questo tipo non si verificheranno".
Non _devi_ sovrascrivere la funzione hash, a condizione che gli oggetti che confrontano uguali abbiano lo stesso codice hash. Se la classe A confronta nomi e nomi hash e la sottoclasse B confronta nomi e nomi, il vecchio metodo hash funzionerà perfettamente. Inoltre, non è necessario sovrascrivere la funzione hash se non viene mai utilizzata.
@Brandin Quindi, sto pensando di creare un test case, o anche un mini programma, per dimostrare questo problema. Sarebbe fantastico, se mi fosse permesso di prendere il tempo sull'orologio (ma ok, potrei sempre farlo durante gli straordinari, se necessario). Tuttavia, non voglio davvero che questi problemi compaiano dopo la consegna e vengano scoperti dai clienti. Grazie.
@pek La cosa migliore sarebbe trovare un bug reale dimostrabile, archiviarlo nel bug tracker, correggerlo e quindi evidenziarlo. Ehi, ho corretto il bug # 1234. Se ci assicuriamo di fare sempre X, bug come questo non si ripresenteranno. Consiglio di renderlo parte dello standard di codifica d'ora in poi. Il resto spetta davvero al team leader.
Grazie @gnasher729 per la risposta. L'ereditarietà non è coinvolta nel nostro caso. Ciascuna delle nostre classi erediterà solo dalla classe Object (come sempre). Tuttavia, abbiamo un set di istanze di queste classi, però.
@Brandin [A: Il migliore sarebbe ...] Vero, vero. Hai assolutamente ragione che un bug reale dimostrabile è una prova migliore. molte grazie
Possibile duplicato di [Come posso evitare di oltrepassare la mia autorità con i colleghi?] (Http://workplace.stackexchange.com/questions/23772/how-can-i-keep-myself-from-overstepping-my- autorità con i colleghi)
Usi TDD? Se riesci a creare un test case che fallisce, hai l'unico bug di cui hai bisogno e sposti il ​​dibattito dal suo codice al tuo test case. Sembra più che tu sia interessato alla completezza e ai programmatori molto produttivi spesso (non sempre) manca quella completezza. Un processo TDD, o almeno test case, farà leva sul processo per sostituire (potenzialmente) cattive abitudini.
@gnat Penso che non lo sia, e onestamente, grazie per aver sottolineato l'altro argomento - aiuta a evitare malintesi. Ho appena apportato anche una modifica. molte grazie
@jimm101 Grazie per aver inserito TDD nell'argomento. Purtroppo no. Ma sento che il tuo commento integra molto bene i commenti di Brandin sopra. Grazie
@pek: Interessante, perché un insieme non dovrebbe funzionare non appena si hanno due diversi puntatori a oggetti in cui gli oggetti sono uguali.
C'è qualcosa che hai notato negli ultimi 2 anni che ti dà informazioni o aree di preoccupazione? Hai mai visto qualcun altro contraddire questa persona? Ti senti a tuo agio a chiedere?
Avere un serialVersionuID diverso per ogni esecuzione va bene fintanto che gli oggetti serializzati vengono riutilizzati solo all'interno di tale esecuzione. In tal caso, potrebbe essere meglio se le versioni cambiano a ogni esecuzione.
hashCode è utile solo a scopo di prestazioni quando si utilizza hashSet / HashMap e questo tipo di oggetti, se l'hashcode è lo stesso, viene eseguito equivale a (). Per serialNumber: non lo metto, aggiungo solo Serializable per consentire la serializzazione in JSON e JSON non usa quella variabile, è solo per la serializzazione java raw, che blocca la comunicazione in modo che sia solo tra applicazioni java. Se l'anziano sta facendo qualcosa di male, non dovrebbe essere che non ha visto hashCode / serialNumberId spiegandoti perché non ne hai bisogno.
Undici risposte:
keshlam
2016-03-15 14:54:32 UTC
view on stackexchange narkive permalink

Promemoria generale: è sempre meglio evitare un tono critico o di lezione. O rendila una semplice osservazione ("sembra che tu abbia dimenticato di implementare hashcode qui") o rendila una domanda ("c'è una ragione per cui non hai implementato hashcode?"). Lascia che la loro risposta guidi la discussione sul perché è importante, se necessario, ma inizia dal presupposto che conoscano i principi e che la stranezza fosse una semplice svista / errore di battitura o avesse qualche ragione razionale dietro di essa che può essere discussa piuttosto che picchiato.

Le persone ascoltano meglio se le tratti con rispetto.

E ricorda, a volte il malinteso sarà tuo. Ti imbarazzerai molto meno in questo modo che se fai una dichiarazione più assoluta o didattica.

L'approccio alla domanda è molto buono!
@keshlam Vero, hai ragione nei tre argomenti trattati nella tua risposta dettagliata. In particolare, il primo paragrafo, l'idea di seguire un "approccio basato sulla domanda", apre una prospettiva completamente nuova sull'argomento e sui metodi di comunicazione, più generali. Davvero, grazie mille
Domande come "c'è un motivo per cui non hai implementato il codice hash?"funziona davvero bene quando si tratta di fannulloni intenzionali;ma tendono a ritorcersi contro quando hanno a che fare con persone che si sentono sovraccaricate (o perché lottano o hanno troppo da fare).Li metterà sulla difensiva e probabilmente causerà attrito.La domanda sottolinea intrinsecamente il loro errore _e_ chiede loro di giustificarlo.È formulato in modo gentile, ma la risposta richiesta non è semplice e implica un senso di colpa attribuito.
Philipp
2016-03-15 15:30:00 UTC
view on stackexchange narkive permalink

Forse guardare questo da un'altra prospettiva potrebbe darti una visione migliore.

Sono un team leader e anche un manager in una piccola azienda di otto sviluppatori. Ho 15 anni di esperienza nella programmazione in Java. Ho una nuova persona nel mio team che è molto più giovane di me con solo un paio di anni di esperienza.

Il mese scorso, mentre discutevamo di alcuni moduli di codice sorgente che avevo scritto, ha iniziato a sminuire il mio codice. Anche se ha molta meno esperienza di me, ha affermato di vedere bug nel codice che funzionava perfettamente. Dopo una breve discussione mi è sembrato di essere in grado di spiegarglielo.

Ma sfortunatamente non riesce a fermare quella faccenda. Continua a minare la mia autorità chiedendo che facciamo tutto tramite libri di testo (come il libro di Joshua Bloch 'Effective Java') anche in quei casi in cui sarebbe solo una perdita di tempo e non si tradurrebbe in un vantaggio tangibile per il nostro prodotto. Come posso convincere questo sviluppatore junior a fidarsi della mia esperienza?

È difficile come un giovane convincere un anziano a cambiare le proprie pratiche. Inoltre, come manager deve mantenere un'aura di superiorità per essere in grado di guidare in modo efficace.

Quindi, quando vuoi migliorare gli standard di qualità sul tuo posto di lavoro senza l'autorità per farlo, dai il buon esempio. Fai bene ciò che gli altri fanno di sbagliato e mostra che la tua strada è migliore perché si traduce in un prodotto migliore in meno tempo. Quando indichi errori nel codice di altre persone, non farlo eseguendo il pignolo nei file del codice sorgente. Fallo presentando un difetto riproducibile nel prodotto stesso e un modo per risolverlo seguendo le migliori pratiche.

A proposito, una delle malattie professionali più comuni per i programmatori è un ego gonfiato. Potrebbe averne già uno, ma stai iniziando a mostrare anche i sintomi delle prime fasi.

Grazie per la tua risposta, è fantastico il modo in cui cerca di mettermi nei suoi panni. Riguardo alla parte narrativa: spero davvero che la prima discussione non sia stata davvero percepita come un argomento, e le preoccupazioni sulla qualità non sono state realmente percepite come "minanti l'autorità". In caso contrario, c'è stato un malinteso davvero enorme. Per il resto, penso che il tuo approccio di "mostra con il buon esempio" e "mostra con casi di prova" sia molto pratico, scientifico e possa alla fine aiutare a costruire un prodotto migliore e forse relazioni ... quindi, sì, mi piace. Davvero, grazie mille
Wow. Predica, fratello.
Non sono uno sviluppatore Java, ma sembra del tutto possibile che lo sviluppatore senior qui possa avere buone ragioni per fare le cose nel modo in cui sono state fatte. Dal momento che (dalla mia esperienza) non fare qualcosa nel modo in cui l'hai fatto a scuola aumenta la velocità di ordine di grandezza (o più) in un'applicazione che richiede tempi critici ... Allora perché non iniziare chiedendo semplicemente perché è stato fatto per di qua? È possibile che tu possa imparare qualcosa.
@jamesqf Le stesse interfacce sono utilizzate in C # e sebbene il codice funzionerà nella maggior parte dei casi (a seconda dell'implementazione), non sovrascrivere Hashcode () causerà il fallimento delle strutture dei dati hash (sebbene tutto il resto dovrebbe funzionare) e lo stesso con serialVersionUID con la causaalcuni problemi difficili da eseguire il debug indesiderati. È facile non ignorare questi metodi se non si comprende appieno l'ambito;qualcosa che pek si aspetta che il suo sviluppatore senior dovrebbe capire.
_ "Inoltre, come manager deve mantenere un'aura di superiorità per essere in grado di guidare efficacemente" _ No.Non è necessario essere superiori per guidare: è necessario essere un buon comunicatore che dà il buon esempio agli altri da seguire, dimostrando impegno, passione, empatia, onestà e integrità.
Questo.Questo è un modo perfetto per porre il problema.Questo commento mi ha fatto capire che si trattava di un problema di prospettiva: "Ho trovato immorale lasciare che un tale difetto (bug) danneggiasse il prodotto in seguito".La parola "immorale" implica che stai assegnando troppa importanza a questo tipo di cose.
@JoeBradley Troppa importanza?Non sappiamo che tipo di software OP funziona, ma se è la mia banca, preferirei che desse "troppa importanza" a tali questioni piuttosto che finire con qualche migliaio di dollari in meno sul conto, perché qualche operazione non hanon trovo una prenotazione che mi abbia trasferito denaro e che quindi l'abbia saltata.Queste sono questioni importanti, la corretta costruzione del software è importante quanto la corretta costruzione del ponte (probabilmente a volte di più a volte di meno).Sono d'accordo sul fatto che vederlo psicologicamente dall'altra parte potrebbe aiutare a ottenere il tono giusto nella conversazione.
Detto questo, sì, il problema di serialVersionUID è in genere di minore impatto, ma incoraggerei sempre uno sviluppatore junior o qualsiasi sviluppatore a discutere del codice fino a quando non capisce perché è così, ecco anche perché ci sono revisioni del codice e perché sono consideratiimportante: coinvolgere l'intera squadra e individuare problemi che altrimenti potrebbero causare problemi in seguito.
Kilisi
2016-03-15 13:56:19 UTC
view on stackexchange narkive permalink

Un modo per mitigare questo tipo di problema è "dare e avere". Ho avuto successo con questa strategia molte volte. Le persone sono più suscettibili ai tuoi suggerimenti e critiche quando è a doppio senso. Quindi avrei fatto domande e consigli quando ne avevo la possibilità e prendevo sul serio le loro risposte. (Ad essere onesto a volte conoscevo già la risposta, ma non si sa mai, ho anche imparato alcune cose interessanti in questo modo.)

Alla fine si costruisce un rapporto in cui ci si sostiene a vicenda e le cose vanno molto meglio in molti modi. E se ha 15 anni di esperienza, scommetto che ci sono molte cose che potrebbe dirti che vale la pena sapere.

Non mi preoccuperei per lui e la sua spalla fredda, è abbastanza normale dopo quello che è successo. Con ogni probabilità avrà preso in considerazione il tuo contributo e sta facendo attenzione intorno a te, e probabilmente lo hai turbato un po '. Ma non è un concorso di popolarità, quindi a meno che non riesca a perdere il controllo, dagli spazio. Rimani amichevole e di supporto e lui si avvicinerà.

Buon punto, buona strategia! Questo può portare a un legame più forte (rapporto) davvero. Grazie!
Thorbjørn Ravn Andersen
2019-01-08 21:56:24 UTC
view on stackexchange narkive permalink

Invece di renderla una discussione "Penso che dovresti" che ormai è chiaro che non ti porterà da nessuna parte, trasformala in una discussione tecnica.

Dopo aver esaminato il codice Ho trovato un problema e ho scritto il test X che lo dimostra.

(Puoi scriverne diversi se necessario). Spetta quindi al team discutere come risolverlo correttamente in modo che il test abbia esito positivo.

WendyG
2019-01-09 18:25:21 UTC
view on stackexchange narkive permalink

Hai alzate mattutine? o altre riunioni di gruppo in cui puoi menzionarlo in modo informale.

Presentandole a tutti in modo completamente impersonale "Oh, fastidio, ho scoperto che questo problema implementato da questa classe è uguale a non hashcode, che può davvero causare problemi se la classe viene mai utilizzato in una hashmap poiché solo l'identità dell'oggetto viene utilizzata come chiave "e quindi si discute quando può essere risolto.

Non hai accusato nessuno di scrivere codice errato, ora tutti sanno perché questo è un problema , il codice viene corretto.

Trevor
2019-01-10 00:37:27 UTC
view on stackexchange narkive permalink

Sii educato e professionale. Invia un ticket per il bug, nel tuo ticket, dettaglia il problema e una potenziale soluzione e lascia un'apertura per essere contattato per ulteriori informazioni o una spiegazione del problema. Lascia stare quello. Quando i tuoi ticket vengono esaminati, verranno assegnati a te stesso per correggere il bug che hai trovato o allo sviluppatore originale. Si spera che l'altro sviluppatore capirà e risolverà il problema o tornerà da te per ulteriori informazioni. Se nessuno dei due accade, ora è un problema di gestione.

Questo metodo non richiama alcuno sviluppatore specifico per errori e consente di tenere conto del tempo di riparazione e possibilmente anche di includere in una mischia (se lo fai quello).

Trovare bug nel codice di altre persone è pratica comune. Ogni volta che un nuovo sviluppatore entra in un progetto, trova problemi. Assegnare la colpa non è importante. Basta fare un ticket e lasciare che siano i processi aziendali a gestirlo. Gli sviluppatori esperti non dovrebbero offendersi se altri trovano problemi nel loro codice. E se lo fanno, probabilmente non dovrebbero essere sviluppatori.

Ben
2019-01-11 18:06:35 UTC
view on stackexchange narkive permalink

Anche se penso che Keshlam abbia un buon punto. È anche importante ricordare che il team possiede il codice, non qualsiasi individuo, quindi evito di utilizzare "Tu" quando chiedi informazioni su potenziali problemi con il codice. Potresti invece chiedere

"Ciao, ho notato che non abbiamo implementato l'hashcode qui, c'è una ragione per questo?"

Sei affrontare il potenziale problema con il codice, ma anche indagare su una possibile ragione del problema e dare al team leader l'opportunità di trasformarlo in un'esperienza di apprendimento per te.

520 says Reinstate Monica
2019-01-11 20:00:49 UTC
view on stackexchange narkive permalink

Alcuni suggerimenti generali, sebbene da queste informazioni, penso che i punti 4 e 5 potrebbero essere i più appropriati:

  1. Separare il codice dal suo autore. Sei qui per valutare il primo, non il secondo. "Questo codice è [X]" è meglio di "Hai creato questo codice [X]".
  2. Sii specifico. Non fornire descrizioni vaghe per l'intera codebase. "I commenti descrittivi sarebbero apprezzati in X, Y e Z riguardo alla formulazione di questa funzione" è infinitamente più apprezzato di "Per me è tutto greco".
  3. Sii anche positivo! il termine per questo processo è "revisione del codice", non "macellazione verbale del codice" per una ragione. Nella maggior parte delle recensioni pubblicate, un revisore parlerà degli aspetti positivi e negativi di un prodotto. Dovresti fare lo stesso.
  4. Scegli le tue battaglie. Non trattare tutto come un insuccesso. Se è un po 'strano ma funziona perfettamente, dategli una nota a piè di pagina nella migliore delle ipotesi e affrontatela come un' problema minore 'o' domanda veloce '. In generale, parlando, se dovete aprire un scenario di rottura, non conta come nulla di grave.
  5. Assicurati che le cose di cui parli non siano solo "in teoria". Prova tu stesso l'applicazione o parla con il team di test di qualcosa che pensi possa essere un problema.
Sascha
2019-01-12 00:17:17 UTC
view on stackexchange narkive permalink

Scrivi un test case, descrivendo il comportamento che ti aspetti e mostra che il problema rompe il test.

(O ragazzo, che cose folli abbiamo scoperto quando abbiamo iniziato a testare hashCode e uguale sistematicamente nel nostro progetto .....)

HotBreakfast
2016-03-15 15:09:43 UTC
view on stackexchange narkive permalink

Ottima domanda. Amo imparare, ma quando qualcuno irrita la mia dolcezza mi sento come se dovessi smettere. Consiglio di rivedere lo "stile di programmazione" dei tuoi colleghi e di identificare i suoi punti di forza in modo che non si senta come se tutto il tempo che ha trascorso ad imparare sia stato inutile. POI identificare OPPORTUNITÀ. In questo modo mostri i punti di forza in futuro che stanno aiutando l'azienda e anche lavorando su quelle "opportunità" che hai già identificato. Conduco le squadre dando un orario di 30-60-90 giorni e poi lodo i ritocchi in cui abbiamo capitalizzato le "opportunità". Funziona molto bene ed è un modo equo per identificare i leader rispetto a persone che non lo sono e non dovrebbero essere leader.

Bene, grazie per aver risposto, ma non sono sicuro di comprenderti. Solo per aver chiarito da parte mia: non sto mettendo in discussione la loro leadership. Nessuno dei due desidera assumere il proprio ruolo di leadership.
Qualcuno deve guidare. Parlo per esperienza personale. Non volevo confonderti.
Ho pietà dello sciocco che "irrita la tua dolcezza".
Tombo
2019-01-11 00:43:11 UTC
view on stackexchange narkive permalink

Risolvilo da solo. Crea un ramo, aggiustalo, sviluppalo e se hai bisogno di approvazione, fai semplicemente una revisione del codice. Cambia il peso per te, ma sei tu che pensi che sia importante, quindi il peso ricade davvero su di te, anche se è il codice di qualcun altro.

L'unico problema con questo approccio è che se il prodotto si rompe e risale a questa correzione, l'OP perde credibilità poiché la sua correzione potrebbe essere una "best practice" teorica e non una correzione effettiva.
@Dan, è d'accordo.È meglio che si assicuri di avere ragione.Ecco perché ho incluso dev test nei passaggi.Se pensa che dovrebbe essere fatto, dovrebbe assumersi la responsabilità non solo di testarlo, ma se anche il suo suggerimento rompe qualcosa, no?Stai suggerendo di far passare la responsabilità a qualcun altro per il suo suggerimento?
@Dan, nell'ultimo commento avrei dovuto dire: "Altrimenti passerebbe la responsabilità a qualcun altro per il suo suggerimento".Non mi consente di modificare i commenti dopo 5 minuti.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...