Come rimanere produttivi quando si tratta di codice scritto in modo estremamente scorretto?


63

Non ho molta esperienza nel lavoro nell'industria del software, essendo autodidatta e avendo partecipato all'open source prima di decidere di fare un lavoro. Ora che lavoro per soldi, devo anche occuparmi di cose spiacevoli, il che è normale ovviamente.

Recentemente mi è stato assegnato il compito di aggiungere la registrazione a un grande progetto di SharePoint che è stato scritto da un programmatore che ovviamente stava imparando a programmare il lavoro. Dopo 2 anni di collaborazione, il cliente è passato alla nostra azienda, ma il danno è stato fatto e ora in qualche modo ho bisogno di mantenere questo codice.

Non che il codice fosse troppo difficile da leggere. Nonostante i problemi - ogni progetto ha una classe con diversi metodi incollati, enormi ifannidamenti, sistemi ungheresi, connessioni non sovrapposte - è ancora leggibile.

Tuttavia, mi sono trovato assolutamente improduttivo nonostante abbia lavorato su qualcosa di semplice come aggiungere la registrazione. Fondamentalmente, ho solo bisogno di passare attraverso il codice passo dopo passo e aggiungere alcune chiamate di traccia. Tuttavia, l'idiozia del codice è così fastidiosa che mi stanco entro 10 minuti dall'inizio . All'inizio, avevo l'abitudine di aggiungere usingcostrutti, ridurre l'annidamento invertendo quelli if, rinominare le variabili in nomi leggibili, ma il progetto è grande e alla fine ho rinunciato. So che questo non è il compito che dovrei fare, ma almeno ridurre il disordine mi ha dato una sorta di ricompensa psicologica in modo da poter continuare. Ora il trucco ha smesso di funzionare e ho ancora il 60% del mio lavoro da fare.

Ho iniziato a soffrire di mal di testa dopo il lavoro e non ho più la sensazione di soddisfazione che provavo — che di solito mi permetterebbe di programmare per 10 ore di fila e di sentirmi ancora fresco.

Questa non è solo una grande occasione, perché ho davvero una vera domanda:

C'è un modo per rimanere produttivi e non combattere i mulini a vento?

C'è una sorta di trucco psicologico di rimanere concentrati sul compito, invece di pensare “Che stupido è che ?” Ogni volta che vedo un altro trucco intelligente dal programmatore precedente? Il problema con l'aggiunta della registrazione è che devo davvero capire cosa fa il codice, e così facendo mi fa male il cervello in modo spiacevole.


La notazione ungherese non è male, leggi l'articolo originale per vedere di cosa stava parlando :)
Woot4Moo,

14
So che l'ungherese non è male. Questo è esattamente il motivo per cui ho scritto sistemi ungheresi, non app ungheresi (quello originale). Non vedo alcun senso nell'usare i sistemi ungheresi in C # perché ha un ottimo sistema di tipi e IDE. Avere 10 variabili nello stesso ambito con cui iniziano tutte objè scoraggiante perché sostanzialmente illeggibile.
Dan,

2
Vorrei poter dare a questa domanda più di un voto!
o6tech,


9
Soffio di vapore ponendo domande scontrose in pila che mi fanno sradicare.
Erik Reppen,

Risposte:


32

Mi dispiace dirtelo, ma non tutti i lavori sono pieni di sole e glamour. La maggior parte delle attività di sviluppo coinvolge il lavoro dei drudge come questo. Triste ma vero.

Ti viene assegnato un compito importante, anche se è noioso al punto di guardare la vernice asciutta. È importante per due motivi: 1. Aggiunge la registrazione necessaria a un sistema di grandi dimensioni in modo che quando qualcosa va storto avrai uno strumento per aiutarti a trovarlo. e 2. Ti farà familiarizzare con la base di codice in modo che se e quando qualcosa va storto puoi saltare e risolverlo.

Fondamentalmente stai creando la tua rete di sicurezza qui. Glamour, no, ma importante sì!

Detto questo, come dovresti motivarti? Quando ho un compito anestetico al lavoro, mi pongo degli obiettivi. Termina di eseguire l'attività x entro la fine della settimana. Se realizzo il mio obiettivo, mi ricompenso. Nuovo ristorante che voglio provare? Vai venerdì sera se finisco. È appena uscito un nuovo film? Lo vedrò nel fine settimana se finisco.

Trovo che parlare con il mio supervisore e fargli sapere dove sono e come sto andando mi rende responsabile. Se dico loro che avrò finito entro venerdì, mi sento più incline a farlo entro venerdì b / c, ho detto loro che l'avrei fatto.

Tieni fede che una volta completato questo compito e lo hai fatto bene, in tempo e con budget che le persone noteranno e quando arriverà quel nuovo progetto luccicante, il tuo nome potrebbe essere solo suggerito come colui che lo ottiene. :)


Mi piace soprattutto il punto sulla motivazione del venerdì. È buffo che l'attuale uscita sia prevista anche per venerdì. Penso che valga la pena aggiungere che la motivazione della gratitudine è commovente. Devi assicurarti che qualcuno ti sia grato per il tuo lavoro, altrimenti cambi ciò su cui stai lavorando. Il sincero ringraziamento spesso tira indietro ore irrequiete.
Dan,

1
@gaearon - Sono contento che i suggerimenti ti siano stati utili. Passare attraverso il lavoro con un buon livello di motivazione pagherà alla fine. L'anno scorso nel mio attuale lavoro, ho dovuto fare qualcosa di simile a quello che stai facendo. Quest'anno mi è stata data una nuovissima app per scrivere da zero. Le persone noteranno cosa fai e quanto lavori bene.
Tyanna,

3
-1 Perché collegare la tua vita lavorativa e personale? Sembra simile a rimanere straordinariamente coerentementeI didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

@Vorac ~ Ho detto che è quello che faccio per motivarmi. Ognuno è diverso. E posso assicurarti che non lavoro OT in modo coerente. Trova qualcosa che ti motiva e usalo. Trovo che una ricompensa materiale funzioni meglio quando ho un compito che non voglio svolgere.
Tyanna,

1
@IntegrityFirst ~ Per me, sì. Starò in ritardo per finire la mia lista di cose da fare. Pianificherò il mio tempo per assicurarmi di colpirlo. È la mia integrità per me e per i miei colleghi completare qualcosa quando dico che lo completerò. Ma, se scopro che qualcosa non può essere fatto nel tempo che ho detto, cambio piano e faccio sapere al mio supervisore. E se finisco un po 'tardi, il film / ristorante sarà lì la prossima settimana. :)
Tyanna,

30

Conservare un file di frammenti di codice candidato per l'invio a thedailywtf.com. Anche se non hai intenzione di inviarli, ti dà un aspetto positivo nel trovare del codice che è persino peggio della media.


Vorrei poterlo votare ancora una volta. Si è rivelato un ottimo suggerimento, ora che ho scoperto che questi ragazzi memorizzavano i loro log delle modifiche nei file di configurazione dell'applicazione, proprio prima delle impostazioni effettive.
Dan,

24

Mi trovavo in una situazione simile, con il compito di ripulire un grande corpus di codice mal scritto, copiato e incollato in modo massiccio.

Per mantenere la mia motivazione e la mia sanità mentale, ho scritto uno script chiamato current_scoreche contava il LOC nel progetto (che è diminuito costantemente, mentre eliminavo la duplicazione e passavo a algoritmi migliori) e lo confrontavo con il LOC quando ho iniziato. Ogni volta che mi scoraggiavo o frustravo con la montagna di codice che stavo affrontando, correre current_scoremi dava un senso di progressi tangibili e mi ricordava quanto avevo già realizzato. Ed è stato divertente vedere quanto sia alto il punteggio che potrei accumulare quando affronterò una sezione di codice particolarmente negativa.

Cercherei metriche simili che potresti facilmente scrivere per darti un senso di progresso e trasformarlo in una sorta di gioco. Righe di codice (appena eseguite wc -l), complessità ciclomatica (che dovrebbe andare giù mentre ripulisci quei "ifs" nidificati cattivi), righe di codice che sono state toccate da te anziché dal tuo predecessore (penso che FishEye possa dirti questo per $ 10), ecc. Potresti persino scrivere uno script Perl senza troppi problemi per contare il numero di blocchi di codice che non hanno ancora istruzioni di registrazione.


Uso SourceMonitor
UmNyobe il

13

Ho visto questo libro raccomandato: lavorare in modo efficace con il codice legacy , ma per fortuna non ho avuto bisogno di leggerlo.

Come stai facendo, rifletti ciò di cui hai bisogno in modo da poter capire il codice e ricordare solo che stai rianimando un sistema, che pagherà quando lo mantieni.
Speriamo che questo metta una molla nel tuo passo sulla strada di casa.


2
Questo libro tratta del refactoring del codice esistente per renderlo testabile; Non credo che sarà di grande aiuto in termini di motivazione.
Billy ONeal,

2
Buon punto @Billy ONeal, ma avere un codice verificabile e le metriche associate può mostrare progressi che potrebbero essere motivanti.
StuperUser

1
Ho letto questo libro Sicuramente vale la pena leggere. In realtà ho trovato WEWLC motivante solo perché è stato bello sapere che c'era qualcuno là fuori che aveva capito il tipo esatto di frustrazioni che stavo provando e aveva escogitato modi efficaci per mitigare quelle frustrazioni.
Jason Swett,

1
Quel libro è un po 'vecchio e obsoleto. Se non l'hai letto, perché lo consigli?
BЈовић,

1
@StuperUser Mentre lo leggo, posso dire che è obsoleto e può fornire alcuni consigli utili per gli utenti alle prime armi.
BЈовић

6

Cerca di dividere il progetto in pezzi. Ogni giorno scopri come funziona un pezzo specifico. Cercare di capirlo tutto in una volta è probabilmente ciò che ti sta stressando.

Sii orgoglioso di migliorare il progetto. Ci sono altri programmatori con cui puoi parlare? Aiuta a stare in piedi intorno allo scambiatore di calore per discutere / ridere dell'ultima logica che hai trovato. Cerco di farlo per mantenere un'atmosfera gioviale al lavoro.


Sì, sto lavorando a pezzi e ci sto già lavorando da qualche tempo, quindi ho un'idea approssimativa di ogni componente. Tuttavia, non aiuta molto perché sono i piccoli pezzi di logica che di solito richiedono tempo per capire — e mi arrabbio quando mi rendo conto che il metodo a 30 righe su cui ho trascorso 10 minuti può effettivamente essere riscritto in 2 righe. Per quanto riguarda la società, sfortunatamente, sono l'unico sviluppatore di questo progetto e attualmente sto lavorando nell'ufficio del cliente, quindi non c'è nessuno con cui parlare davvero.
Dan,

@gaearon - Cosa ti impedisce di implementare la tua soluzione a 2 linee? Devi capire come fare ciò che ti è stato assegnato, il problema con il codice può essere risolto in seguito, quando non sei nell'ufficio del cliente. Dovresti tenere le tue note su ciò che hai fatto, su come funziona qualcosa, in modo da poter tornare più tardi in futuro e implementare le modifiche in modo da poter eseguire le revisioni del codice e i test di integrazione.
Ramhound,

@gaearon ah-ha! Sei l'unico programmatore. Quindi il ragazzo prima di te era l'unico programmatore. Puoi cavartela molto quando sei l'unico programmatore (come hai notato dal tuo predecessore). Tienilo a mente quando cerchi il tuo prossimo lavoro. ;)
davidhaskins,

@Ramhound Scommetto che non ci saranno recensioni di codici. Scommetto che non ci saranno test formali di integrazione. Ho lavorato in queste posizioni alcune volte. Generalmente le persone vogliono solo codice che funzioni abbastanza bene e lo desiderano il più rapidamente possibile. Spiegare le "migliori pratiche" è come parlare a un muro, IMHO.
davidhaskins,

@Ramhound, non ci sono test per questo progetto e non voglio essere responsabile di rovinare il sistema per motivi di codice più pulito. Ci sono molti casi in cui il codice attuale implica che vengano ingoiate eccezioni, oppure si basa su altri tipi di cattivi comportamenti che non sono ovvi. Questo è uno dei motivi per cui sto aggiungendo la registrazione, tra l'altro.
Dan,

6

Prendi appunti dettagliati per organizzare domande, pensieri e comprensione del sistema. Questo ha fatto miracoli per me quando ho a che fare con sistemi legacy di grandi dimensioni. Aiuta a cristallizzare la tua comprensione, aiuta a mettere le domande aperte in parole e, poiché i tuoi pensieri sono già messi insieme, rende più facile comunicare spontaneamente con gli altri su problemi / domande / idee / ecc.

Ad esempio, mentre sto esaminando un pezzo del codice, prenderò costantemente appunti su di me. Questa è la mia conversazione con me stesso. Il semplice atto di scrittura aiuta a far emergere più pensieri e mi aiuta a capire meglio le cose. Dopo un po 'potrei avere un Eureka e dovrei disegnare un piccolo diagramma con la "foto più grande" su carta per illustrare cosa ho appena pensato o quali pezzi ho appena messo insieme. Lo faccio sempre solo su carta, eliminando tutte le distrazioni del computer. Questo mi permette di essere più metodico e attento a ciò che sto facendo.

Questo è fondamentalmente un modo conveniente per avere una conversazione perpetua con un esperto di dominio :)


3

So che potresti sentirti improduttivo perché lo stai guardando dal punto di vista 'Sto solo aggiungendo il log' quando in realtà stai aggiungendo il log e stai facendo molto refactoring. Il supervisore è probabilmente a conoscenza della situazione del codice. Tutti potrebbero non apprezzarlo ora, ma quando ricevi una richiesta per aggiungere una funzionalità davvero interessante e stimolante, sarai felice di aver ripulito il codice.


Temo che finirò per riscrivere il progetto, ne abbiamo già parlato. Sebbene questa opzione mi piaccia di più, non aggiunge produttività nel lavorare sul codice usa e getta. So che il logging è richiesto nella prossima versione, e quindi posso andare con le mie cose, ma è solo dover-eseguire-questo-codice-attraverso-la-testa che mi fa impazzire. Mi sembra di diventare più stupido dopo averlo capito :-)
Dan

1
"non aumenta la produttività lavorando sul codice usa e getta" Suuure lo fa. Puoi passare attraverso ampie parti del codice lavorando sulla tua comprensione di esso, mentre esegui un'attività a basso rischio (registrazione). Questa conoscenza che stai acquisendo aiuterà immensamente se si tratta di una riscrittura. Se non c'è una riscrittura, cerca di aspettarti la ricompensa che sentirai quando avrai ripulito grandi quantità dell'app, quanto sarà migliore la base di codice grazie ai tuoi sforzi costanti e persistenti.
Quentin-starin

2

In questi casi tendo a riscrivere una sezione di codice. Per fare in modo che un'area risucchi di meno e poi aggiungo la registrazione altrove. Quindi ripulisci un po 'di codice. Il codice errato è negativo solo se lo lasci lì.


Il sistema fa molto affidamento su cattive pratiche, quindi per riscrivere correttamente un metodo dovrei riscrivere l'intero progetto (cosa che probabilmente farò alla fine ma ho delle scadenze per la versione attuale).
Dan,

Ya capisco, credimi. Scelgo solo una sezione che posso ripulire senza rendere la mia vita dolorosa e ripulirla e poi l'area successiva. La correzione del codice è un processo per il quale non si ottiene mai tempo ma per cui si dovrebbe sempre trovare il tempo.
Erin,

2

Gamify il tuo lavoro. Ad esempio, concediti 5 punti ogni volta che fai una buona domanda sul codice e 10 punti ogni volta che rispondi. Regalati un badge ogni volta che rifletti un metodo o aggiungi una nuova funzionalità. Una volta accumulati abbastanza punti ottieni privilegi come pause caffè o biscotti. Una volta completato l'intero progetto, ottieni il privilegio di regalarti qualcosa che davvero desideri.


0

Il trucco per non annoiarsi o arrabbiarsi in modo da rimanere produttivi è accettare che il codice sia mal progettato. Accettare la tua posizione nel comprendere e aggiornare il codice ti permetterà di non continuare a commentare "quanto è stupido" e invece accettarlo tranquillamente e andare avanti.

Un altro trucco è avere una buona famiglia da non vedere alla fine della giornata. Fidanzate, amiche, giochi tutto funzionerà, per darti un obiettivo per superare la giornata e far valere la pena arrancare anche se brutto codice.


0

"Lavorare efficacemente con il codice legacy" di Michael Feathers può essere d'aiuto.

Se sei preoccupato di rompere le cose quando le cambi, scrivi prima alcuni test, assicurati che passino prima e dopo aver apportato le modifiche. Scrivere il test dovrebbe aiutarti a riassumere e capire cosa fa un determinato codice e ti consentirà di modificarlo con sicurezza.


Sfortunatamente, è un progetto di SharePoint, il che significa che è quasi impossibile da testare. Ho scritto un bel sandboxing per SharePoint in passato usando Microsoft Moles ma richiede molto lavoro aggiuntivo.
Dan,
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.