Cosa fare con un'applicazione non ben organizzata? [duplicare]

12

Sono un programmatore neo-laureato e sono appena stato assunto prima della mia laurea. In ufficio, ero solito creare e revisionare i moduli di alcune applicazioni sviluppate da altri programmatori nella nostra azienda. I problemi che ho riscontrato con le loro applicazioni sono:

  1. Database non normalizzato al meglio, hanno infranto tutte le regole di normalizzazione del database, Codd deve essere arrabbiato.

  2. Il 50% del contenuto del database è letteralmente NULL (dovrebbero avere il valore predefinito Lo giuro).

  3. Una stored procedure viene utilizzata in tutte le transazioni del database, piena di istruzioni "if-else".

  4. Stanno reinventando le impostazioni dell'applicazione in .NET WinForms, creano il proprio file che contiene tutto ciò che vogliono. Penso che siano molto fan di VB6 o forse non studiano davvero, stanno indovinando come ottenere qualcosa.

  5. Nessuna gestione degli errori! I client a volte segnalano "Eccezioni" che non dovrebbero vedere.

  6. I file Web e Windows Form non sono organizzati o raggruppati in base al loro utilizzo.

  7. Convenzione sui nomi, ci sono casi Camel, puramente minuscole, con e senza underscore e abbreviazioni.

  8. Cattive pratiche di programmazione come transazioni di database in ogni iterazione di un ciclo.

  9. Hanno sviluppato un sito Web con l'iniezione di SQL in mente, li accolgono.

  10. Gli elementi HTML non sono stati utilizzati in base alla loro semantica.

  11. I CSS non sono ottimizzati per i diversi browser.

  12. Includono diverse versioni di jQuery in un unico HTML!

. . .

N. Molti altri!

La cosa peggiore è che mi sentivo accusato della sua fragilità. Voglio dire, quando aggiungo il codice, ci sono volte che si finisce con errori, a volte perché non hanno creato vincoli o hanno permesso dati duplicati. Il sistema è così fragile e dipendente l'uno dall'altro, è come camminare in un campo con mine terrestri! (QUESTO ACCADE A VOLTE, QUESTO NON È IL VERO PROBLEMA)

Che cosa dovrei fare?

    
posta domanokz 16.08.2011 - 10:13
fonte

12 risposte

27

Se sei un programmatore appena esaminato, non suggerire The Grand Rewrite. Miglioralo a poco a poco, passo dopo passo. Stai implorando problemi a riscrivere l'intera applicazione. Trovo che il più grande ostacolo alla scelta del miglioramento incrementale sia nella testa: "come possiamo ripulire questo casino?" Ma più spesso, è più facile di quanto pensi, fai piccoli passi.

    
risposta data 16.08.2011 - 10:42
fonte
12

Penso che la cosa migliore che puoi fare sia impostare con i membri del tuo team e discutere i problemi che hai elencato con loro.
Non si tratta di incolpare l'un l'altro, né dovrebbe essere tirando le sedute dei capelli. Ciò che conta davvero è il progetto stesso. Dovresti tenerlo a mente.

Parla con loro delle decisioni che hanno preso, forse c'è un motivo (chi lo sa?)

Tieni presente che sei un programmatore appena laureato, quindi non dovresti generare l'impressione che ti consideri migliore dei membri del tuo team. Perché molte nuove persone laureate fresche cadono in questa trappola.

Usa domande (innocenti o meno innocenti) per esporre la fragilità di cui stai parlando.

    
risposta data 16.08.2011 - 10:29
fonte
12

Afferra il frutto a sospensione:

Vorrei iniziare con le vulnerabilità della sicurezza. Dite al vostro capo che siete preoccupati per SQL-Injection e dimostrano in che modo un utente malintenzionato potrebbe ottenere l'accesso al sistema. Quando sono preoccupati, digli che puoi risolvere il problema.

Questo ti darà credibilità, una merce che devi avere se intendi implementare il cambiamento. Successivamente,

Parlerei con altri sviluppatori (e forse il tuo capo) per inserire il trapping degli errori nel programma, spiegando che aiuterà a supportare il software se sapessi dove e perché le cose si stanno rompendo e far apparire l'azienda migliore.

Sono stato in un ambiente simile, e questo è quello che ho imparato.

  • Assumi un atteggiamento da studente e non abbia mai un atteggiamento superiore. Alcune domande ben fatte possono indurre gli altri sviluppatori a prendere in considerazione idee che non avrebbero mai nemmeno sentito prima. In qualità di sviluppatore junior, otterrai un tocco più discreto e sottile rispetto ai tratti in grassetto.
  • Non insultare mai gli sviluppatori o il loro codice. Il tuo obiettivo è servire l'azienda e i tuoi clienti implementando un cambio di rotta. Fare nemici funzionerà in modo contrario a questo obiettivo.
  • Ricorda la frase su come mangiare un elefante facendo un morso alla volta. Piccoli passaggi incrementali consentiranno all'organizzazione di digerire facilmente le modifiche, senza bruciore di stomaco.
  • Non dimenticare che teoria e pratica non sono sempre le stesse. Mentre non ci sono scuse per la maggior parte di ciò che hai descritto, ci sono momenti in cui le esigenze del business hanno la meglio sulla teoria del design. Ad esempio, i dati completamente normalizzati potrebbero essere troppo lenti per il rendimento richiesto.
risposta data 16.08.2011 - 15:48
fonte
7

Scopri cosa ha portato a questa applicazione e attacca il motivo

A livello puramente tecnico, sai già cosa fare: normalizza il database, aggiungi vincoli / valori predefiniti, rifatta la stored procedure, ecc. ecc.

Ma, secondo la mia esperienza, questa è solo una circostanza. Il vero problema è l'ambiente che produce un tale disastro.

E potrebbero esserci motivi diversi.

  • Uno potrebbe essere che il team onestamente non lo sa meglio (voglio dire, per ognuno di noi c'è stato un tempo in cui non lo facevamo). In questo caso, potresti tentare con attenzione di educarli. L'obiettivo qui sarebbe di sensibilizzarli ai loro errori, in modo che anche loro vedano l'applicazione e non voi come il problema. Il pericolo qui è quello di trovare "il pugnale", quindi stai attento a criticare il codice, non la persona.

  • Forse si sentono costretti a codificare rapidamente e sporchi . In questo caso, cerca di stabilire che l'eccellenza ripaga. Questo è nella mia esperienza meglio fatta con l'esempio, e in piedi dove la qualità sta per essere sacrificata.

  • il più difficile, e nella mia esperienza lo scenario più comune è che pensano sia "pragmatico" e best practice , a causa del pensiero di gruppo e poca esposizione alla qualità. Ci sono molte soluzioni proposte a tale scenario (spesso citato "come fare le cose come un grugnito"), ma nella mia esperienza, questo non funziona: quando il tuo nuovo codice causa uno strano effetto collaterale, ti viene incolpato di non avere hanno memorizzato tutte le loro strane dipendenze ("non puoi chiamare la funzione data all'interno del modulo clienti, hai bisogno di più disciplina"), e non il ... "programmatore" che pensa che "l'accoppiamento libero" sia per gli hippy.

Per citare qualcuno: "Le cose sono come sono perché sono diventate così ... un passo logico alla volta". Il tuo problema non è il database denormalizzato, il tuo vero problema è la giustificazione della squadra per questo.

    
risposta data 16.08.2011 - 11:28
fonte
2

Cercherò di spiegare a due dei miei senior in una riunione (un programmatore, non uno) che è scritto male e che probabilmente salverebbe i soldi del tuo datore di lavoro per consentirti di riscriverlo ora e ridurre i lavori di manutenzione in futuro, piuttosto che tentare di mantenerlo così com'è.

    
risposta data 16.08.2011 - 10:23
fonte
2

Esci da questo lavoro. Ho lavorato su un progetto simile (eccetto il database era OK, ma l'intera applicazione conteneva 3 classi reali, tutto il codice CRUD era come Issue.Create (50 parameters here) e IDictionary<string,object> Issue.Get(int id) ), metteva alcuni test, scriveva nuove funzionalità in modo pulito ma ho deciso di fare qualcos'altro con metà della mia vita.

    
risposta data 16.08.2011 - 10:38
fonte
2

Odio fare questa domanda perché mi sembra di averlo chiesto molto ultimamente.

C'è uno standard di programmazione locale in atto? In caso contrario, prenderebbe in considerazione la stesura di uno, se non altro per affrontare alcuni dei problemi più stupidi come a) convenzioni di denominazione b) gestione accettabile degli errori e uso non standard delle lingue?

Hai qualche tipo di sistema di tracciamento dei bug in modo che quando fai qualche cambiamento e evidenzi alcuni bug pre-esistenti che puoi tenere traccia di tutte queste cose?

Se vuoi restare lì, non puoi sperare di risolvere tutti i problemi allo stesso tempo. Devi guardare due opzioni 1) prevenire cose rotte in futuro - questo potrebbe essere una priorità più alta e 2) iniziare a sistemare cose precedentemente rotte. Non so quanto sia grande la tua base di codice, ma i miei soldi sono su questo: non lo farai riscrivere tutto nel breve periodo e se il tuo prossimo anno consiste nel riscrivere le cose rotte, ti lascerai comunque andare via .

Sarei propenso a spostarmi se ci sono altre alternative valide. In caso contrario, concediti un lasso di tempo per vedere come si formano le cose e poi prendere una decisione sull'opportunità o meno di rimanere.

    
risposta data 16.08.2011 - 10:48
fonte
2

In pratica hai due opzioni:

  1. Trova un nuovo lavoro
  2. Migliora il tuo attuale ambiente di lavoro.
L'opzione

è auto-esplicativa, ma per l'opzione 2, ciò significa essere un buon programmatore nonostante tutto il resto intorno a te. Attenersi religiosamente alle buone pratiche e alle convenzioni. Cerca di far combaciare queste convenzioni con ciò che già esiste il più possibile (specialmente su cose in cui non ha importanza, come le convenzioni di denominazione - non ha senso fare qualcosa di completamente diverso da ciò che è stato fatto prima di te stesso » Finiremo in questa situazione: xkcd )

Una cosa che ognuno odia (indipendentemente dalla verità effettiva) viene detto che ciò che hanno fatto è inutile; specialmente da un giovane inesperto (mi sono laureato 3 anni fa, credetemi, a loro non piace molto). Tutto quello che puoi fare è dare l'esempio. Se sei sfortunato e nessuno ti segue, almeno alcune aree del codice su cui lavori inizieranno a migliorare, se sei fortunato, alcuni potrebbero anche continuare quello che hai iniziato ... Joel Spolsky ha un buon articolo su questo genere di cose, ci sono un sacco di altri fantastici articoli sul suo sito web.

Ricorda anche: nessun lavoro è perfetto, nessuno scrive codice perfetto e talvolta non è immediatamente ovvio perché un particolare pezzo di codice è stato scritto come fosse.

Fai bene il tuo lavoro e ascolta ciò che altri programmatori (in particolare quelli con cui lavori) hanno da dire. Se non sei sicuro del loro consiglio, fai delle domande, mantienile vestite e non usarle mai per implicare che non pensi che il sistema attuale sia molto buono. Mantieni le domande semplici e aspettati una risposta razionale, in questo modo non otterrai le difese delle persone e otterrai la risposta di cui avresti bisogno o ti congratulerai per aver individuato un difetto / problema che nessun altro però ha.

    
risposta data 16.08.2011 - 11:16
fonte
1

Suggerisci recensioni di codice al tuo programmatore principale. Ciò fornirà un ambiente non conflittuale che puoi criticare il codice. Inoltre ti aiuterà a raccogliere le tecniche per costruire codice stabile in un ambiente fragile.

    
risposta data 16.08.2011 - 10:24
fonte
0

Affrontare solo i problemi specifici che hai citato: quelli gravi sono 5, 8 e 9. Gli utenti non dovrebbero vedere le eccezioni, le cattive pratiche con le transazioni danneggeranno le loro prestazioni (a meno che non ci sia una buona ragione per loro: controlla questo prima di iniziare ad affrontarlo) e SQL dovrebbe essere iniettato mai e poi mai . In effetti, il fatto che l'applicazione sia vulnerabile agli attacchi di iniezione indica anche che è lento: le query parametrizzate sono più veloci perché il database può sapere con certezza che sono valori e non deve controllare la presenza di join nidificati complicati, ecc. più veloce, migliore esperienza utente: queste sono cose che dovrebbero essere in grado di convincere i tuoi colleghi e dirigenti del valore reale di.

Gli altri problemi, anche se probabilmente esasperano (sottolineo che non conosco javascript quindi non posso parlare del punto jQuery), sono cose in cui probabilmente dovrai solo dare il buon esempio. Assicurati che quello che fai sia pulito e facile da usare e comprenda dato il resto della base di codice: l'obiettivo dovrebbe essere che gli altri sviluppatori possano intraprendere ciò che fai senza un addestramento approfondito, e gli utenti possono farlo con (accanto a) nessun allenamento. (Bene, nell'ambito di ciò che è la base di utenti. Non peggiorare è ciò che intendo!)

    
risposta data 16.08.2011 - 14:15
fonte
0

E solo per aggiungere i miei 5 centesimi - da qualcosa come 20 anni di esperienza, lavorare per persone diverse (molte) e avere anche altri che hanno lavorato per me (o il mio team, qualunque cosa).
Mi sto appoggiando a quello che hanno detto i nillls.
a) se è troppo caotico, immagino che potresti lasciare il lavoro - ma non è questa la risposta - non troverai troppe compagnie "ideali" o vecchio codice, sono sempre problemi, sia persone che codice,
b) lavorare con esso, il codice, e con loro, le persone - lentamente, provare ad affermare i tuoi "standard" (o qualsiasi standard in questo caso:) - e spiegare, parlare con loro.
c) non provare a revisionare tutto, dato che puoi anche lasciare il lavoro. Di solito finisce male - o peggio, tutto finisce per colpa tua, anche se sono suscettibili - tu non vuoi avere così tanta responsabilità, specialmente essere il debuttante
d) cerca di capire perché è come è - spesso, c'è una vera ragione per cui il codice della vita reale è troppo disordinato - troppo poco tempo, troppi programmatori, ecc. È meglio se puoi lavorare "con il sistema", spiegare con argomenti (che quello che stai facendo è salvare i soldi, mantenere ecc.). Anche i progetti reali non sono mai divertenti - e le persone investono denaro odio per ottenere suggerimenti da qualcuno interessato a rendere le cose 'belle' - questo è quello che assomiglia al loro lato - è necessario creare il tuo caso - e in pratica un buon s / w è ciò che fa risparmiare , breve o a lungo termine, quindi lavora in quella direzione.
e) dimentica di codificare 'correttamente' o di farne dei calci - guarda come il lavoro - hai ovviamente il background tecnologico necessario - prova ad imparare le corde con questi lavori - i dolori veri, si occupano esattamente di situazioni / situazioni rientro in questo momento, ecco di cosa tratta la maggior parte dei lavori, almeno quello che ho visto:)
f) e pratico, consiglio di codifica -
fai 'facciata' il tuo codice - db o altrimenti
parti separate che stai facendo dal loro codice
L'ho imparato e quello funziona benissimo - devi integrare alcune parti, ma dato C # e tutto ciò che puoi separare facilmente.
... quindi, se non ti piace il codice db - fai un piccolo 'strato' che useresti - per iniziare, copia e modifica le cose lentamente - ma lo svilupperai correttamente, struttura, standard sicuri e tutto (non sempre possibile, ma il più delle volte)
... in questo modo, saresti in grado di separare un po 'dagli errori se non è relaly il tuo errore, allora dovresti essere un buon caso in realtà utilizzalo a tuo vantaggio per mostrare loro perché il vecchio codice crea problemi, mentre il tuo nuovo funziona perfettamente con circa db è più difficile (all'interno del db, design) - ma puoi sempre provare e cercare, cambiare le cose lentamente, campo dopo campo, indice per indice, ecc.
e così via in questa direzione
e btw. questo non è il peggior lavoro al mondo, ottenere il massimo da esso, puoi stabilire i tuoi standard, avere un impatto maggiore, imparare altre cose Miglior

    
risposta data 16.08.2011 - 19:47
fonte
-2

Quando il codice sembra giusto, la logica è giusta .

Il processo di riformattazione e refactoring del codice che ti viene addebitato di correggere / modificare è una tecnica efficace per intercettare errori logici e casi d'angolo non gestiti. Codice "Facade" che il tuo codice dipende da (vedi la risposta di Gaga, punto f, per i dettagli) , è una pratica approccio alla pulizia del codice per l'uso corrente. La creazione di wrapper o anche di un livello API parallelo può essere un modo affidabile per far evolvere il codice base mantenendo la compatibilità con le versioni precedenti per il codice dipendente che non può essere ancora modificato.

Su mainframe e altri sistemi "legacy" in cui il downtime non è un'opzione, dove spesso non sono disponibili i più moderni strumenti e linguaggi e dove i nuovi assunti spesso si trovano mentre "apprendono le corde", tecniche di manutenzione del codice come questi possono essere di vitale importanza per il successo.

(ampiamente rivisto dall'originale in base al feedback di seguito)

    
risposta data 04.02.2013 - 10:48
fonte

Leggi altre domande sui tag