2018-01-09 13:13:19 +0000 2018-01-09 13:13:19 +0000
106
106

Come posso trattare con i manager che rifiutano di accettare l'uso di modelli di progettazione comuni di ingegneria del software?

Premessa

Sono un ingegnere del software e un TDD praticante nella mia azienda. Il mio manager è anche responsabile della codifica (se necessario) e della gestione dei suoi subordinati ingegneri.

Ho avuto alcuni accesi dibattiti con il mio manager riguardo all'uso di modelli di progettazione software di recente.

Il problema

Spesso quando sono incaricato di implementare una caratteristica e un codice, vengo sfidato dal mio manager durante le revisioni del codice per l'uso di modelli di progettazione software comuni. Pensa che non sia necessario e che si dovrebbe codificare il codice nel modo più “semplice” possibile. Metto le virgolette in chiaro, perché sembra che non siamo d'accordo su quale dovrebbe essere lo scopo di una “caratteristica”. In molti casi, la caratteristica non è così “semplice” come pensa il mio manager e richiede l'uso di modelli di progettazione per separare le responsabilità e ridurre al minimo l'impatto sulla base di codice (per lo più non testata).

Ci sono due casi di uso comune che applicherò i modelli di progettazione per risolvere un problema:

  • Implementazione di nuove caratteristiche che richiedono modifiche a una classe non verificabile, legacy

  • Affrontare le incertezze interfacciando le incognite

Siamo entrati in alcuni argomenti a causa di riunioni di progettazione simili. In un'accesa discussione mi è stato addirittura detto che “[egli] programma da più di 20 anni!”, il che implica che non dovrei nemmeno osare mettere in discussione la sua autorità.

Ciò che ho cercato di mitigare questo problema

  • Commenti dettagliati scritti su alcuni componenti non tanto ovvi perché ne avevo bisogno e a che scopo servono
  • Ho dimostrato passivamente che il mio progetto è molto più adattabile alle modifiche
  • Un componente che ho costruito ha un numero di bug significativamente più basso rispetto alla maggior parte degli altri componenti
  • Ho correttamente anticipato un cambiamento nei requisiti, che ha portato al minimo cambiamento di codice necessario per soddisfare tale requisito
  • Ha affrontato le sue preoccupazioni in anticipo quando sono stato sfidato spiegando il mio processo di pensiero e di ragionamento
  • Tuttavia, sono ancora rimproverato per l'eccesso di ingegneria del codice.
  • Ne ho discusso informalmente con i miei colleghi e ho chiesto la loro opinione in privato
  • La maggior parte di loro apprezza il mio approccio ben ragionato e uno ha anche detto di aver imparato molto da me. La maggior parte degli ingegneri ama discutere i loro problemi di codifica con me, perché di solito posso dare loro consigli utili o far notare qualcosa che potrebbe essergli sfuggito
  • Tenendo presentazioni informali per educare i miei colleghi ingegneri (e manager) sul perché applico un modello di progettazione qua e là

Non voglio sembrare arrogante dicendo che le mie capacità di codifica sono assolutamente migliori di quelle del mio manager, ma ho davvero esaurito le idee per convincerlo, anche dopo le dimostrazioni, le spiegazioni, e i risultati oggettivi che gli vengono mostrati. Da un lato, vorrei fornire codice privo di bug, ben collaudato e progettato. Dall'altro lato, continuo a essere criticato perché il mio progetto non mi fa sentire bene e ha certamente “complicato” il mio codice forzandolo al modo “approvato”.

Come possiamo trovare una via di mezzo?


Update

Dal momento che sto ricevendo molti commenti che parlano della mia attitudine dogmatica, anche troppo zelante, a seguire i principi dell'ingegneria del software, penso che dovrei chiarire:

Non sto cercando di essere dogmatico né troppo zelante. Mi interessa che le persone leggano e capiscano il mio codice, che usino o meno i modelli di progettazione. Ho chiesto un feedback ai miei colleghi durante le revisioni del codice se capiscono o meno il mio codice. Hanno detto di sì e capiscono perché progetto un componente in questo modo. In un'occasione, il mio uso dei design pattern ha aiutato a centralizzare la logica di ricerca della configurazione in un'unica posizione rispetto ad averla diffusa in dozzine di posizioni, che deve essere cambiata spesso.

Ad essere onesti, sono abbastanza deluso di vedere così tante risposte con un forte stereotipo “Perché voi ingegneri non riuscite a pensare come i manager”. In fin dei conti, si può dire che ogni cosa sia un eccesso di ingegneria: Perché contrassegnare i campi come private invece di esporre tutto, perché testare le unità se nessun utente eseguirà una sola unità, ecc.

La mia motivazione nell'uso del design pattern o in realtà di qualsiasi ingegneria del software è quella di minimizzare il rischio e dare valore all'azienda (per esempio riducendo la diffusione inutile della logica nella base di codice, in modo che possano essere gestiti in un unico luogo).

Scusate se questo suona come una farneticazione. Sto cercando risposte del tipo “come possiamo trovare una via di mezzo” invece di risposte condiscendenti come “gli ingegneri pensano di essere intelligenti applicando modelli di progettazione che nessuno capisce”.

Risposte (11)

235
235
235
2018-01-09 13:48:28 +0000

Fare a modo tuo è mai servito a qualcosa? C'è stata anche una volta in cui hai usato l'indietreggiamento e l'iniezione e le interfacce extra, e c'è stata una deviazione dell'ultimo minuto, e tutto è stato gestito in modo fluido e bello senza imprecare? Anche in un lavoro precedente, se non sei mai riuscito a far impegnare quel codice qui?

Suppongo che ci sia stato. Esercitarsi a raccontare questa storia. È specifica e reale. Non è “x potrebbe accadere” o “y potrebbe cambiare” ma, “Una volta, l'ho fatto in questo modo ed ecco come è andata a finire”. I manager (parlo come uno di loro) sono riluttanti a spendere soldi (e credetemi, scrivere codice più complicato che gli altri non possono capire al primo passaggio è spendere soldi) per quello che potrebbe accadere. Non vogliono finanziare speculazioni che possono essere basate solo sul “book learning” e sull'ultima moda di internet. Ma quando attingete alla vostra esperienza? È una situazione completamente diversa.

Non sono un grande fan di fabbriche, fornitori, iniettori e quant'altro. In genere sono impostati per cose che non accadranno mai veramente (il passaggio da MS SQL a Oracle) o che hanno un piccolo impatto quando accadono (la modifica della cartella dove vengono salvati i file). Hanno un posto negli arrangiamenti che sono altamente volatili, in cui sembra che ci si trovi. Quindi è necessario mostrare che hanno quel posto. Sembra che tu provenga da una posizione del tipo: “Questo è il modo normale di fare le cose, e ho bisogno di un motivo per non farlo”. Il tuo manager viene da una posizione del tipo: “Questo non è normale, il normale è semplice e diretto. Dammi una buona ragione per mettere in mezzo un altro strato”. Lavora su questo motivo. Lavora su una storia di successo passata in cui quel livello extra ha risparmiato giorni o settimane di lavoro. Giustificate la vostra ingegneria, altrimenti è davvero un eccesso di ingegneria.

157
157
157
2018-01-09 15:37:37 +0000

Questa citazione di un vostro commento mi preoccupa:

Come ingegnere del software, diventa per me una seconda natura il “fare-fare-il-coso-che-non-ha-una-buona ragione-sulla-superficie”, come interfacciare le incognite che ho menzionato. Dover essere costantemente sul punto di spiegarmi su argomenti profondamente tecnici (e a volte pesantemente supponenti) mi prosciuga.

Ho visto diverse ripetizioni del seguente ciclo di vita:

  • Il team di programmatori esperti se ne esce con un approccio diverso alla programmazione.
  • È visto per alcuni anni, fino a un decennio, come qualcosa che dovrebbe essere usato universalmente, nonostante tutti gli aspetti negativi e le limitazioni. Durante questa fase, basta dire “sto applicando la metodologia X” senza analizzare se X è un beneficio netto.
  • Va fuori moda, ma le sue idee più utili rimangono in giro come parte del toolkit di sviluppo del software, per essere tirate fuori e usate ogni volta che portano benefici netti.

A mio avviso, sia il TDD che i modelli di progettazione si aggirano intorno alla divisione tra la seconda e la terza fase del ciclo di vita della metodologia di programmazione. Sono sicuro che il TDD e molti modelli di progettazione avranno una vita lunga e preziosa nel toolkit, da usare ogni volta che aiutano più di quanto fanno male. Penso anche che potrebbero essere ancora utilizzati in modo eccessivo, per abitudine piuttosto che per pensiero deliberato.

Non dovreste mai applicare uno schema di progettazione perché è di seconda natura, o avere problemi a spiegare il vostro uso di esso. Invece, prima di applicare un modello di design, pensate ai suoi costi e benefici in questa particolare situazione. Se i suoi benefici sono davvero superiori ai costi, dovreste sapere esattamente perché, quindi spiegare il compromesso non dovrebbe prosciugarvi. Se i suoi benefici non superano i costi, non usarlo. Anche in questo caso, il vostro pensiero sul vostro progetto dovrebbe prepararvi a rispondere se vi viene chiesto perché non avete usato un modello di progetto possibilmente applicabile.

Ricordate che dovete pensare a questi compromessi in termini di manutenibilità generale del programma, non solo di far funzionare rapidamente il vostro pezzo. Troppa indirezione può rendere più difficile per i futuri programmatori scoprire cosa sta realmente accadendo.

52
52
52
2018-01-10 18:53:35 +0000

Sono l'unica persona perplessa di come, sul posto di lavoro, ci si concentri così tanto sulle pratiche di codifica piuttosto che sull'effettivo conflitto sul posto di lavoro? Quindi adotterò un approccio diverso.

Ecco gli aspetti generalizzati del vostro problema per come lo vedo io:

  1. Lei si trova in un campo di competenza che richiede collaborazione
  2. Non ci sono procedure documentate che regolino il modo in cui questo lavoro collaborativo dovrebbe essere svolto
  3. 3. C'è disaccordo su come questo lavoro collaborativo dovrebbe essere svolto
  4. Non ci sono procedure documentate che regolano il modo in cui questo lavoro collaborativo dovrebbe essere svolto Uno di quelli che non sono d'accordo è il vostro manager

Mi sembra che il vostro gruppo abbia bisogno di riunirsi e di concordare quali standard e pratiche adottare e di adottarli a livello globale, nel bene e nel male. Perché nulla è peggio per un prodotto di un team che è costantemente in disaccordo, e nulla è peggio per il vostro rapporto con il vostro datore di lavoro che ribadire costantemente le discussioni con loro.

Quindi cercate di riunire il vostro team per concordare alcuni standard, e usate questa riunione per perorare la vostra causa per le pratiche che state usando. Se li otterrete, ottimo! Altrimenti, così sia. Il vostro compito non è quello di scrivere un bel codice. Il vostro compito è quello di consegnare un prodotto finito. Se il vostro datore di lavoro (come incarnato dal vostro manager) e una pluralità del vostro gruppo insiste che lo facciate in un certo modo, allora chi siete voi per ottenerlo?

Tuttavia, sembra che la maggior parte del vostro team sia d'accordo con voi, quindi dovrebbe diventare abbastanza evidente durante queste discussioni che il vostro manager è quello strano. Se questa persona si rifiuta ancora di passare al consenso del team, allora si tratta di una disfunzione che non possiamo aiutarvi a risolvere (a parte il fatto di consigliarvi di passare a un altro team).

23
23
23
2018-01-09 19:58:25 +0000

Sfortunatamente, lui è il tuo manager, e tu non stai scrivendo il codice nel modo in cui lui vuole che tu lo scriva. Se è un dirigente, potrebbe non avere intenzione di uscire dall'azienda tra 2-3 anni, come la maggior parte degli sviluppatori pianifica di fare. Stai scrivendo del codice che sarà più difficile per i tuoi sostituti da sistemare, ed è per questo che lui è duro con te per averlo costruito in quel modo.

Se mi è permesso fare una supposizione qui, sapendo benissimo che potrei essere fuori strada, per cosa stai scrivendo questa roba? Sarei piuttosto sorpreso se si trattasse di qualcosa di più delle applicazioni LOB. I modelli di design sono probabilmente troppo complicati per un'applicazione LOB che non ha bisogno di essere particolarmente complicata.

Nei miei 10 anni di sviluppo, un vero modello di strategia/fabbrica è stato necessario solo tre volte, due delle quali sono di lavori:

  • In un'applicazione che mostrava informazioni sul prodotto, dove alcuni di quei prodotti erano essenzialmente un gruppo di prodotti più piccoli in una scatola, abbiamo usato una strategia per determinare quale fabbrica era necessaria per trasformare le informazioni sul prodotto (richieste tramite una chiave) in una vista. Non molto gloriosa, ma ha fatto il suo lavoro. Se mi è permesso di eguagliare il vostro umile vanto per i bug, in tutto il mio mandato lì non abbiamo mai avuto un solo bug! (uno è stato segnalato dopo che me ne sono andato, ma si è rivelato essere un errore dell'utente :)).
  • In un'applicazione che mostrava agli utenti dove andare per un corso che stavano frequentando, abbiamo usato una fabbrica e un'astrazione per consentire un rapido passaggio tra una API Bing Maps API e Google Maps API. Questo perché entrambe avevano un rapporto costi/benefici e l'azienda non stava facendo progressi nel determinare quale utilizzare. Alla fine abbiamo saputo dal nostro ufficio di casa che avevamo già una chiave API per una di esse e siamo stati in grado di fare perno all'ultimo secondo su quell'API, proprio prima del lancio.

E un terzo è un progetto con cui sto giocando, che fa il monitoraggio dei server per i server Windows:

  • Uso un'interfaccia per l'output dei dati di monitoraggio e per i monitor stessi. I monitor sono altamente configurabili (in base alle impostazioni dell'applicazione). L'implementazione dell'output varia a seconda che io stia testando o meno un nuovo monitor o che vada al deployment, in modo tale che IOutputInterface ha ConsoleOutput e SqlOutput come implementazioni che possono variare.

Si noti che il mio progetto personale fa immediatamente un uso più frequente di pattern e inversione di controllo (IoC) rispetto ai miei progetti di lavoro.

Se posso darvi un consiglio dopo tutto questo, che sia questo: Un lavoro è un lavoro, e se vuoi fare le cose a modo tuo allora cerca di trovare un mezzo felice. I tecnici di solito non si trattengono a lungo e non vale la pena di litigare con il management su come si fa. Fate in modo che i vostri progetti personali per la casa siano una pila di modelli quanto volete.

9
9
9
2018-01-10 06:54:37 +0000

Soluzione semplice: Lasciare.

Soluzione difficile: in qualsiasi disaccordo, la metà della colpa è tua.

Prenditi un po’ di tempo libero, studia come lavorano le altre squadre, cerca di capire dove si trova il disallineamento d'impedenza tra te e l'altra parte. Parlate con loro di persona, presto e spesso. Se lo farete bene, entrambi imparerete a comprendere le preoccupazioni e le credenziali dell'altra parte, e loro impareranno ad apprezzarvi per il vostro contributo, la vostra esperienza e le vostre opinioni coraggiose. Ecco alcune aree da considerare:

  • prodotto di qualità vs. time to market
  • prodotto buono vs. buon codice
  • codice intelligente vs. codice autoesplicativo
  • cultura aziendale top-down vs. cultura ingegneristica bottom-up

Se non funziona bene, considera un altro ruolo nel team, un altro team nell'azienda o, infine, un'altra azienda.

9
9
9
2018-01-10 03:54:04 +0000

Se affrontate queste persone a testa alta, affronterete la più grande resistenza, cavalletta. Sono stato molto efficace nel portare il cambiamento quando ho colpito strategicamente i giusti punti di pressione. Richiede molta pazienza e cedere molto. Devo prima adattarmi a loro prima di applicare la pressione nei punti deboli.

Svuotate la mente, siate informi. Senza forma, come l'acqua. Se metti l'acqua in una tazza, diventa la tazza. … Ora, l'acqua può scorrere o può crollare. - Bruce Lee

Ascoltateli e fate molte domande. Genuinamente ascoltando qualcuno si toglie il desiderio di resistere. Capire cosa motiva il loro pensiero e poi parlare la loro lingua. Poiché le tue convinzioni sono assiali, al momento, è probabile che egli rispecchi la tua testardaggine, il tuo disprezzo e la tua frustrazione. Poiché siete subordinati, è sua scelta non unirvi alla vostra lunghezza d'onda e spetta a voi costruire il ponte.

Come lo vedete, vedrete voi stessi. Quando lo curerete, curerete voi stessi. Quando penserete a lui, penserete a voi stessi. Non dimenticatelo mai, perché in lui troverete voi stessi o vi perderete. - Helen Schucman

Un maestro di Wing Chun Kung Fu attirerà il suo avversario e chiuderà la distanza prima di cercare e attaccare la linea centrale dove è più vulnerabile. Non discutere le minuzie solo per vincere, trova la linea centrale del problema più grande e concentrati sulla pressione.

Ho a che fare con gli ingegneri su base giornaliera che si rifiutano di riattrezzare o imparare nuovi paradigmi di programmazione e mi è stata data una qualche forma di argomento “Sono qui dai tempi delle schede perforate” più volte di quante ne possa contare. Stimo di aver perso l'80% delle battaglie, ma quel 20%…woh…ho fatto dei grandi cambiamenti. Potrei sembrare vago, ma fai qualche ricerca su google su alcune di queste parole chiave e otterrai quello che voglio dire.

Inoltre, prova a fare un nuovo progetto squirrel che puoi fare a modo tuo. Se funziona davvero e fa risparmiare tempo o denaro, la gente si abituerà al tuo modo di pensare. Se non c'è un nuovo progetto, createne uno nel vostro tempo libero per risolvere un punto doloroso che l'azienda ha e nessuno è interessato a prendersi il tempo di risolvere.

8
8
8
2018-01-09 13:21:09 +0000

Cosa devo fare?

Nell'ingegneria del software, quanto bene il codice sia scritto (o sovrascritto) è sempre soggetto a un certo livello di interpretazione (opinione). Per me, lei sta facendo i passi che farei io nella sua posizione, ma alla fine è il suo manager che ha bisogno di vedere la luce….continuare a mostrargliela.

Continuerei, _ per quanto possa essere doloroso, a fare esattamente quello che sta facendo e _individuare la ricompensa dell'investimento nell'uso del design pattern dove è possibile, senza far apparire il suo manager bad.

Non cambi quello che sta facendo **a meno che non si senta a rischio di un rimprovero peggiore di un'ammonizione. Continuate a mostrare loro i vantaggi dell'uso del modello e alla fine dovrebbero cambiare idea.

Mentre continuate a lottare, provate a conquistare altri alleati nella squadra. In questo modo non sei l'unica voce che si sente parlare a favore dello schema.

Ad un certo punto, però, se si rifiutano di farti scegliere se questo ambiente è quello giusto per te. Non credo che tu ci sia ancora arrivato, ma forse dovrai passare a un ambiente più accettabile per le buone pratiche di codifica.

Ricordati, questa lotta in cui ti trovi è una maratona. Se volete cambiare la cultura della codifica, sta a voi dimostrare il valore del modello.

5
5
5
2018-01-12 18:58:58 +0000

In primo luogo, non possiamo dire dalle informazioni fornite chi ha ragione. Infatti, se venissi chiamato per la verifica del progetto, potrei avere ancora difficoltà a decidere chi ha ragione, perché potreste progettare con obiettivi diversi in mente. Ma la mia ipotesi è che il capo conosca gli obiettivi meglio di lei.

In secondo luogo, la sua domanda: “come posso persuadere il mio capo?” La risposta è: probabilmente non puoi. Alla fine, è lui il capo. L'unica volta che ho convinto il mio capo a cambiare le sue idee sull'ingegneria del software è stato dopo che abbiamo passato un anno a riparare un software inaffidabile, scritto come voleva lui, e gli abbiamo detto che non potevamo renderlo affidabile se non progettandolo in modo diverso.

3
3
3
2018-01-14 16:40:57 +0000

Non sappiamo chi è qui da un punto di vista tecnico da pochi - potrebbe essere un manager bloccato nel passato, o un nuovo sviluppatore che crede ciecamente a tutto l'hype.

Ma lui è il tuo manager, e tu non ti occupi del manager, ti occupi del suo rifiuto di fare ciò che tu pensi sia meglio, e insisti a fare ciò che lui pensa sia meglio. E questo è lo stato normale delle cose, che è il tuo manager a prendere la decisione. È anche normale che sia lui ad avere la responsabilità del successo o del fallimento, e non tu. Lui ha l'autorità. E ha ragione, non dovreste mettere in discussione la sua autorità. Potete mettere in dubbio che abbia ragione, ma non la sua autorità. Quindi o te ne occupi o passi a un'azienda che fa le cose a modo tuo.

Nel frattempo, invece di pensare che le cose non vadano come vuoi tu, pensa a come produrre il codice di qualità migliore possibile entro i tuoi limiti. Molte cose possono essere fatte in modi diversi. C'è “semplice, mal progettato” e “semplice, ben progettato”. Scegliete quest'ultimo.

1
1
1
2018-01-14 20:06:06 +0000

L'esperienza permette di giudicare se i benefici derivanti dal modello di progettazione sono possibili e probabili in futuro. Se il supervisore conosce il modello e lo rifiuta ancora, probabilmente riconosce il caso quando l'applicazione di questo o di un modello simile non paga. A volte l'esperienza contraddice le regole o più probabilmente le interpreta.

È nota l'opinione che un codice più breve e più semplice sia più facile da capire e più aperto ad alterazioni significative.

0
0
0
2018-01-10 10:09:55 +0000

Suggerirei una programmazione a coppie e una revisione tra pari. Questo aiuterà i vostri colleghi a capire meglio il vostro codice, in quanto dovete spiegare perché e come come lo fate invece che dopo il fatto.

O impareranno da voi e vedranno perché è intelligente, oppure imparerete che i migliori programmatori scrivono codice che gli altri possono mantenere.