Come impedire a un dipendente di tenere in ostaggio l'azienda?
Lavoro in un team che scrive software per facilitare una delle unità aziendali chiave dell'azienda. Sono entrato nel team qualche mese fa e ho scoperto che c'è un alto turn-over nel mio team dovuto a una sola persona. Questa persona (chiamiamolo Mr. A) è in azienda da 7 anni, è molto difficile lavorare con lui e prende ripetutamente decisioni sbagliate di proposito per mantenere il prodotto software instabile, difficile da mantenere e da risolvere i problemi. In questo modo, quando c'è un problema, solo lui può risolverlo.
Il mio manager lo sa, ma dice che non può fare nulla per il signor A.
Cosa posso fare per risolvere questa situazione? Voglio rendere il software moderno, manutenibile e stabile.
FYI, il software monitora gli eventi, effettua alcune elaborazioni su di essi e poi intraprende le azioni appropriate. Il signor A ha:
- Purpospossibilmente tenuto lontano dai moderni quadri di sviluppo del software;
- Logica di core business scritta in linguaggi che non possono essere testati;
- Ricostruzione dei componenti software in 30 moduli per aggiungere complessità e problemi di certificazione delle versioni;
- Progettato in modo non scalabile, assicurando che non ci siano capacità di HA (alta disponibilità).
Aggiornamento:
Per quanto riguarda il codice non verificabile, la logica di business è stata spostata da Java a script groovy incorporati in XML. I test unitari del codice Java sono stati scartati.
Per quanto riguarda la modularità/complessità, ogni modulo è stato dotato di un proprio git repo e ha una propria versione. Ora solo Mr. A sa quali versioni sono compatibili tra loro. Non è possibile rilasciare la versione 2.0 del prodotto e distribuire tutti i moduli 2.0. Dovete rilasciare il modulo A 2.0, che funzionerà con il modulo B 1.0-2.0 e il modulo C 1.0-1.5. Per me, questo è un pessimo progetto, dovrebbe essere tutto versionato sotto un unico repo come il framework Spring (Spring 5.0 significa Spring-Core-5.0, Spring-Context-5.0, Spring-Web-5.0, Spring-Security-5.0, ecc).
Manager dice che non può farci nulla perché il signor A è stato lasciato andare all'inizio, ma poi quando sono emersi dei problemi ha dovuto essere richiamato per risolverli. Quindi il prodotto non può essere mantenuto senza di lui.
Considero questo come un mio problema perché non voglio abbandonare il manager perché è stato molto gentile con me. E il mio primo istinto è quello di risolvere un problema, non di abbandonarlo, anche se vedo come abbandonare questo sarebbe davvero facile, e una parte di me è tentata di farlo.
Altri hanno lasciato la squadra a causa sua, perché a pranzo è quello di cui tutti si lamentano. Ogni volta che c'è un incontro con il signor A, la gente ne esce scuotendo la testa (per ore).
2° Aggiornamento:
HA è l'abbreviazione di High-Availability. In Architettura Software questo significa sviluppare il vostro software in modo che possa essere ospitato / distribuito in ambiente di produzione in modo ridondante, così se un'istanza di esso va giù, l'altra istanza (o le altre) possono prendere il carico con conseguente tempo di inattività pari a zero. L'utente finale non si accorgerebbe nemmeno che qualcosa è andato storto.
Per quanto riguarda: Questa sembra una normale grande base di codice. Non credo che questo sia dovuto alla grande base di codice, dato che il prodotto non è così ricco di funzionalità. È un sistema backend che sgranocchia i dati. Altre aziende hanno prodotti simili per soddisfare le loro esigenze di business, sono in grado di farlo utilizzando le moderne opzioni HA/Scalable, quindi non capisco perché questo team debba farlo in Java 6 senza HA/Scalabilità.
3° Aggiornamento:
Per quanto riguarda “Le ultime versioni di tutti i moduli funzionano insieme? Non necessariamente. Ha fatto rollback di alcuni moduli in prod se c'è un bug identificato, ma il rollback ha introdotto più bug dato che alcune versioni di moduli non sono compatibili. Tutto questo potrebbe essere evitato se tutti i moduli venissero rilasciati insieme, perché in tal caso l'intero prodotto verrebbe testato e nel suo complesso garantirebbe determinate funzionalità. In altre aziende/progetti dove ho lavorato, è così che sono stati in grado di sviluppare e distribuire progetti molto più complessi con facilità.
@pipe: Non sono appena uscito da scuola. Ho lavorato in varie aziende e su grandi progetti per oltre 10 anni e tutto quello che vedo Mr. A propose va contro le convenzioni e il buon senso. I 30 moduli (in repository separati) erano il modo in cui aveva originariamente impostato l'albero delle fonti. Uno sviluppatore intelligente che è stato nel team per 1 anno, ha visto i problemi di compatibilità e ha spinto per combinare tutto in un unico repo, realizzando un progetto multi-modulo maven. Quello sviluppatore si è stancato della natura di Mr. A e ha trovato lavoro in una delle prime 5 aziende IT. Non farò il nome dell'azienda per mantenere l'anonimato, ma per prime 5 aziende IT intendo Microsoft, Google, Apple, Facebook e Amazon. Quindi questo Lo sviluppatore non era stupido né incompetente. Aveva 8 anni di esperienza. Il signor A ha riportato il cambiamento al suo modo di essere, 30 moduli in repository separati. Quindi questi 30 moduli non sono stati aggiunti per gestire la complessità di una grande base di codice. Sono stati messi in atto per garantire che ci siano problemi di compatibilità in prod. Complessità inutili.
Per saperne di più su "Perché questo è il tuo problema? Quando parlo con gli sviluppatori che lavorano presso (o hanno amici che lavorano presso) Microsoft, Google, Amazon, Facebook, Apple; mi dicono che spesso si trovano persone con cui è difficile lavorare. Considero questa situazione come una sfida che affronterò ripetutamente ovunque io lavori, non importa quanto sia fantastica l'azienda. Quindi ho bisogno di sapere come gestire correttamente questa situazione per continuare a crescere nel mio campo.
Obiettivo (per mantenere questa domanda sull'argomento):
Mi pongo questa domanda per sapere qual è il modo migliore di gestire situazioni come quella descritta sopra per raggiungere gli obiettivi delineati qui di seguito. Credo che sia impossibile evitare i colleghi difficili, quindi, sulla base dell'esperienza altrui, forse possiamo tutti imparare qualcosa.
Migliorare la stabilità del prodotto riducendo al minimo il codice degli spaghetti e la complessità non necessaria, come richiesto dal management.
Renderlo HA come richiesto dal management.
Utilizzare framework e language spec moderni (Java 6 vs Java 8) in modo che i nuovi sviluppatori siano facili da trovare sul mercato e possano essere produttivi più velocemente.
Eliminare la dipendenza da una singola persona.