Concreto i sintomi di-ingegneria

Ho recentemente trovato nella posizione di spiegare una (In-House) applicazione che ho scritto per due candidati della mia azienda piace a noleggio a scopo di facilitare la manutenzione e l’aggiunta di funzionalità minori.

È la prima “produzione” applicazione che ho scritto, è 45k Locomotive e ho trascorso quasi due anni di “solo” il suo sviluppo. Io sono abbastanza giovane (18) e ha scritto l’applicazione da zero, mentre in fase di contratto come stand-in per un ex sviluppatore che ha lasciato l’azienda. Esperienza nella progettazione di applicazioni di queste dimensioni, ho cercato di uso comune, architettura e design-pattern.

Oggi so di avere fatto alcuni gravi sopra di ingegneria, ad esempio con una scollegato il rilevamento delle modifiche architettura, invece del modello di Unità Di Lavoro, che la scelta ORM ha già implementato. Io probabilmente mai andare “reale” tre livelli.

Entrambi i candidati hanno 10 anni+ di sfondo in una Casa di Sviluppo di Applicazioni con la piattaforma in questione. Essendo la metà della loro età e avendo poca esperienza io rispetto la loro opinione. Quando le ho spiegato l’architettura di un’applicazione per loro, i commenti sono lungo le linee di:

  • Cavolo, nessuno mi avrebbe pagato per fare cose del genere, devo fare le cose
  • Bastone con ciò che il quadro, non utilizzare la fantasia librerie/tecnologie
  • Non avvolgere il codice del framework. Una squadra, ognuno potrà scrivere il proprio codice di wrapper comunque.
  • Che si sta utilizzando .NET 3.5? Bene, stiamo usando 2.0.
  • Cosa che LINQ roba di comprarmi? Tutto questo query composizione e la proiezione sembra troppo complicato.

Ora mi chiedo:
Io sono un architettura astronauta? Come faccio a sapere che sto andando troppo in là con l’architettura? Quali sono i sintomi più comuni di over-engineering?

  • Questo potrebbe essere meglio come comunità wiki – probabilmente non c’è un ampio consenso su ciò che conta come over-engineering.
  • A volte il ragazzo con 10+ anni di esperienza è il migliore della sua squadra, a volte ha la carriera amatoriale. A volte il ragazzo con nessun grado esegue ad un livello alto, a volte non hanno mai scritto una riga di codice in vita sua e pensare di programmazione simile a questo: youtube.com/watch?v=gwlE1aASc4g . Per che cosa vale la pena, siamo tutti inclini a over-engineering. Non vorrei sudore, soprattutto se quei ragazzi in realtà non ho visto il codice vero e proprio. Basta fare un paio di clean sweep di rimuovere qualcosa che assomiglia a DailyWTF materiale e lo chiamano buono.
  • D’accordo con Giulietta – se stai imparando da esso e funziona, quindi non preoccuparti. Quasi tutti vanno verso troppo complicato prima di capire come il codice in un modo più semplice di moda, come si ottiene più esperienza. Almeno si è pensato…

 

17 Replies
  1. 118

    Quali sono i sintomi più comuni di
    over-engineering?

    Codice che risolve i problemi non hanno.

    • Alcune delle Infrastrutture è eccessivo, come ho detto. Devo considerare un (possibile pericolosi/costoso) refactoring?
    • Sono d’accordo con Giulietta – non c’è bisogno di sudare, a meno che si sta facendo in modo di estendere o di mantenere il vostro codice. Ma vale la pena di combattere l’impulso in futuro!
    • sarà risolvere un problema reale?
    • Il corollario che potrebbe essere “il Codice che crea problemi non avete fatto prima.” @Solo si può risolvere un problema reale, ma è un problema che vale la pena risolvere o anche rilevanti?
    • si potrebbe chiedere a qualcuno di coppia con te a fare il refactoring? Che sarebbe il mio suggerimento che dà un paio di vantaggi per il refactoring: Qualcuno viene a conoscenza di quello che hai fatto, si impara a conoscere come qualcun altro fa il lavoro, e l’applicazione è migliorata per 3 vantaggi a farlo.
    • Per un cliente, quando si crea bisogni che non esiste, si chiama marketing. Se si dispone di entrambi (marketing + over-engineering) è chiamato Apple.

  2. 25

    Uno molto forte segnale di avvertimento di overengineering è quando tutto va in modo molto indiretto che è difficile trovare il pezzo di codice che implementa un po ‘ di cemento, a livello di dominio pezzo di funzionalità. Se si trova che la maggior parte delle funzioni molto poco lavoro concreto e basta chiamare altre funzioni virtuali, si può avere un problema.

  3. 18

    Noia

    La noia è un buon precursore oltre progettati codice. Lo ammetto, quando ho ottenuto il mio primo lavoro, mi sono sentito così sottoutilizzato. Ero solo annoiato. E quando mi sono stufato, ho scritto il codice. Non solo qualsiasi codice — CATTEDRALI DI CODICE.

    No, seriamente, ho avuto una immagine mentale che il mio codice e astrazioni come grandi torri con golden sporgente guglie, archi rampanti di vitreo, onyx, una splendida volta a sostegno da archi a cupole condita con una bella geometriche, ricamo, ecc ecc ecc.

    E ‘ stato davvero affascinante vedere i modelli che lavorano insieme per me, ma col senno di poi, io sono completamente vergogna degli empi pasticcio che ho lasciato dietro.

    Se si sta scrivendo la propria quadri e Dsl, codice, mentre i meno stimolante ore al lavoro, solo interrompere. Il tempo è speso meglio di lettura Reparti Di Wiki, o la scrittura open source libro, o si può chiedere di gestione di lavoro in più.

    • Posso utilizzare che come un nome di dominio – Cathedralsofcode.com? Che bello.
  4. 11

    La scrittura di un proprio Quadro

    Probabilità sono, qualcuno ha già fatto. Di più, l’hanno già fatto 1000 volte meglio di quanto si potrebbe mai. Di più, quello che hanno sempre fatto, probabilmente, è già uno standard del settore, in modo che l’apprendimento della tecnologia più competitiva a altri lavori.

    Presso l’ultima azienda in cui ho lavorato, un programmatore che aveva lavorato solo sui suoi progetti per la maggior parte del suo mandato. Scrisse una delle società più app popolari ed è stato ampiamente considerato come il migliore del team-ma, a mio parere, aveva la brutta abitudine di scrivere tutto ciò che gli serviva da zero.

    Aveva scritto un quadro di iniezione di dipendenza, la sua ORM, un framework per lo unit testing (che, inspiegabilmente, ha guardato e ha agito molto simile a NUnit — perché non l’ha usato NUnit?), un framework per la creazione di una fabbrica di oggetti (un “fabbrica fabbrica” mi piacerebbe chiamare).

    Mente, il codice è effettivamente notevole, ma quello che era il punto?

    Scrivere una migliore Libreria di base

    Al mio attuale società, mi è sempre sembrato come i programmatori di scrivere inutili quantità di codice per replicare le funzionalità già presenti nel .NET framework.

    Tra le altre cose, hanno scritto:

    • Active-directory quadro per l’autenticazione basata su form ASP.NET webforms — inspiegabile perché ASP.NET ha questa funzione built-in.
    • Hot-swap temi e skin per siti web-anche inspiegabile, dal momento che il codice è meno funzionale di built-in ASP.NET temi e richiesto il 1000% in più di bloat.
    • Che inspiegabilmente hanno scritto le loro digitato insiemi di dati e adattatori di dati. Questi oggetti fornito meno funzionalità rispetto dataset tipizzati che VS si genera automaticamente per voi, mentre contemporaneamente richiede più codice standard di NHibernate oggetti di dominio.

    O che non conoscono il quadro molto bene, o pensano che notoriamente inadeguata.

    Ci sono solo preziosamente alcuni esempi posso pensare, dove il re-implementato biblioteca è meglio dell’originale (vedi Jane Street Core Library, C5 Generico Collezioni per .NET, valuta reale classe), ma le probabilità sono, non scrivere meglio una libreria standard.

    • Oh, e per quanto riguarda il “meglio core library” commento, un programmatore C++, mi ha spiegato che il built-in classe string è così frustrante terribile che la sua praticamente un rito di passaggio per scrivere la tua classe string.
    • Io essere quel ragazzo che aveva avuto il tempo di fare quello che ha fatto. E scommetto che lui sapeva perché le cose non ha funzionato il modo in cui l’hanno fatto, e scommetto che è molto meglio nella raccolta di off-the-shelf le cose in futuro. A volte, si ha bisogno di persone che sanno come fare le cose da zero. Se che hanno contribuito alla sua linea di fondo o la società è una questione diversa.
    • Non può essere giusto per dire “scrivere 1000 volte meglio di quanto si potrebbe mai”, senza l’implicita “, dato il tempo che avete a vostra scrivania di lavoro”. Potrebbe essere l’unico motivo che è 1000 volte meglio hanno avuto il tempo da dedicare, più che la noia/tempo di riempimento di codifica
  5. 11

    Quanto alla questione se un’architettura astronauta: Se sei a conoscenza del pericolo che si mette davanti a un sacco di gente. Non vuoi fare la fine dei tuoi colleghi sia, sembra che alcuni di loro sono diventati croccante vecchio piagnoni.

    Over-engineering è il risultato di un problema con priorità che ha portato in qualche parte del sistema di troppa attenzione. Così il più evidente sintomo di eccesso di ingegneria sarebbe che si può vedere tutti intorno ad altre parti del sistema che sono male per mancanza di attenzione.

    (C’è anche una tendenza per il corso di ingegneria per esporre il sistema ad un aumento dei rischi di cattiva progettazione, a causa della maggiore complicazione e la quantità di errore incline alla speculazione coinvolti nel decidere che cosa aspetti a oltre-ingegnere, ma come un commento sottolinea, che non segue automaticamente.)

    • La presenza di più luoghi che hanno bisogno di cambiare per una singola unit’ non è un sintomo di sopra di ingegneria, ma per accoppiamento stretto/cattiva progettazione/underengineering
    • Questo è un buon punto, stavo pensando di over-engineering con il che implica che le parti del sistema di ottenere troppa attenzione, con la conseguenza che le altre parti del sistema di ottenere affamato di attenzione. Quando vedo qualcosa che overengineered di solito ci sono altre parti che sono underengineered.
  6. 10

    Per la maggior parte delle applicazioni aziendali in-house, la maggior parte del codice dovrebbe essere interessato con l’implementazione di attività d’impresa, e non di problemi tecnici indipendenti per il business (come il tuo “disconnesso il rilevamento delle modifiche architettura”). Attualmente disponibile quadri sono abbastanza maturi e supporta i più comuni casi di utilizzo. Se stai inventando ogni nuova tecnologia o (nel contesto di business-sviluppo di applicazioni) appena il confezionamento di alcuni altri framework esistenti o libreria solo per il gusto di avvolgimento, probabilmente stai facendo sbagliato. Idealmente ogni pezzo di architettura di costruire deve essere riconducibile ad alcuni requisiti di business. Mantenere le cose semplici.

  7. 9

    IMHO la maggior parte dei commenti che ho la vostra applicazione non sono realmente di ingegneria corso di ingegneria non riguarda la tecnologia. Si parla di architettura. Le nuove tecnologie possono essere imparato e capito in un ragionevole lasso di tempo. La comprensione di un’applicazione progettata è di solito molto più difficile e a volte anche impossibile. Questo rende i punti 2, 4 e 5 non valido. Il primo punto non è davvero valido, perché, ovviamente, ha pagato per scrivere l’applicazione così com’è e se funziona hai nessun problema qui.

    Questo è il mio “quick test” per capire se un’applicazione tende a essere progettato:

    • Wrapper per “tutto”: Wrapper sono utili, ma è facile esagerare. Controllare se è solo per avvolgere le cose che si ha realmente bisogno di essere avvolto. (In pratica ho avvolto il mio wrapper una volta. So di cosa sto parlando 😉 .)
    • Reinventare la ruota: Un classico. Questo è molto comune e si è già accennato. Hai implementare alcune funzionalità perché si necessari al tuo voluto per? Che cosa fa il tuo quadro di fare ciò che altre librerie disponibili non?
    • “Sente” over-ingegnerizzato: Questo è il punto più importante, ma anche il punto più difficile da vedere. Dare un’occhiata al tuo codice e l’aspetto che le parti si sentano troppo complicato. Chiedere la vostra auto, quindi se c’è un modo più semplice per implementare e perché non si sceglie in questo modo. Se non hai una buona risposta a questa parte è probabilmente sovra-progettato.

    Questi sono solo suggerimenti rapidi che io uso per le mie applicazioni. Essi non sono garantiti per essere l’essere-tutto e la fine di tutti “over-engineering di rilevamento”.

    • LOL a “disposizione il wrapper”! Ma IMHO, wrapper, di solito, rendere più leggibile il codice, quindi credo sia OK, se è per esagerare.
    • A volte, se si ha tempo, si deve reinventare la ruota. È bello sapere perché qualcosa si trasforma, non solo si trasforma.
  8. 9

    Quando un co-lavoratore computer viene volano passato la tua testa, perché ho passato gli ultimi 6 ore e ore cercando e non riuscendo a fare una cavolo di finestra di dialogo vengono visualizzati utilizzando il ridicolo quadro, che è un tipo molto concreto sintomo proprio lì.

    • beh, questo è in realtà ciò che dicevano a me hanno paura di (non hanno lavorato con il codice di sicurezza). Si tratta di un’applicazione MDI e utilizza alcune funzioni di ritorno a capo per l’avvio di conversazioni figlio, etc.
  9. 8

    Evitando l’uso di YAGNI, LAVAGGIO, e BACIO vengono in mente nel guardare alle cose che sono progettati. Se ci sono molte parti che sembrano essere parzialmente completato e molte parti di codice che sembrano avere un “e se questo accade? Che cosa succede se che succede?” si sentono ad essa, che sarebbe un altro punto. Ignorando buoni principi di OO design o SOLIDI principi sarebbe un’altra nota. Se si pensa di aver scritto il codice perfetto, che sarebbe un altro segno di guai, come è estremamente raro per chiunque di scrivere qualcosa che non può essere migliorata in un modo o nell’altro.

    IMO, attenzione, è possibile che alcune persone possono essere troppo critici di lavoro come parte di qualsiasi codice di base in grado di coinvolgere tutti coloro che amano le cose in un certo modo, ad esempio, le convenzioni di denominazione su metodi, i test e le variabili. Questo è solo il modo in cui è. Ora, quello che si può capire è come gestire le persone in siutations come conflitto o persuasione/influenza, dove ci sono strumenti che possono aiutare.

    • sei d’accordo che la violazione di LAVAGGIO troppo ovvio, è un segno di “sotto”di ingegneria, una mancanza di progettazione?
    • Certo, la violazione di LAVAGGIO è un segno di “sotto”-ingegneria, della mancanza di pianificazione. Alcuni di ciò che ho descritto è perché refactroring può essere così utile, a volte.
  10. 6

    Plugin che forniscono intrinseca funzionalità delle app

    Ammettiamolo, pluggable architetture sono solo dannatamente sexy e divertente da scrivere. Tuttavia, questo è un altro di quei settori in cui avete bisogno di chiedere a te stesso: “ho davvero bisogno di farlo in questo modo?”.

    Se non hai bisogno di ad-hoc aggiunte alla tua domanda, non aspettatevi a chiunque di scrivere estensioni di terze parti, e l’ambito di applicazione ben definito, non avete bisogno di un’architettura plug.

    Non si deve scrivere plugin per il supporto intrinseca funzionalità dell’app. Diciamo che state scrivendo un programma per il disegno; probabilmente il supporto plugin per salvare i file in più formati, ma non avrebbe bisogno di un plug annulla manager o file finestra di dialogo di ricerca.

  11. 5

    Non sei un’architettura astronauta. LINQ è abbastanza semplice e di base e utile, per uno. Stesso vale per .NET 3.5.

    Allo stesso tempo, sei il newbie in squadra e di andare a prendere qualche tipo di nervature, anche se a loro piace quello che hai fatto.

    Di prendere tutto con un grano di sale. Accettano critiche, un cenno, e una birra con loro in seguito.

    Se ti chiedono di cambiare, quindi il tuo commento è “cavolo .. mi sa che ho fatto male, ma funziona e si sta andando a essere troppi problemi per il cambiamento”.

  12. 3

    Provate a valutare se avete fatto le cose per ridurre al minimo il lavoro oltre la durata prevista del codice. Questo include la manutenzione e sviluppo.

    Nel codice del ciclo di vita, ricordare che la vita di codice non è lo stesso come la vita dell’applicazione. E ‘ forse meglio scrivere rapidamente un prototipo prima, poi re-ingegnerizzare/refactoring dopo una migliore comprensione del dominio. In questa situazione, il ciclo di vita è molto breve, in modo da mantenere le cose semplici.

    Inoltre, diverse applicazioni richiedono diversi amouhts di ingegneria. Questa applicazione è andando a costare la vita se fallisce? I. e. è un controller per un cuore meccanico, o per lo space shuttle navigazione razzi? O è un elenco di contatti per adolescenti annoiati?

  13. 3

    Su un più generico e approccio di alto livello,

    I feel that when there's a gap between the complexity of the problem and
    the complexity of the solution, then you have a clear case of overengineering. 
    

    Quali sono i modi per ottenere questo?
    Risolvere problemi che non si hanno, vedendo che il problema più complesso che è veramente, cercando di previsioni troppo in futuro, anche l’edificio generico roba, tra gli altri.

  14. 2

    Ha messo in atto il progetto entro un ragionevole lasso di tempo? Sta lavorando in questo momento? Se è così, probabilmente si può rilassare un po’, come uno dei peggiori problemi con il corso di ingegneria non è mai effettivamente ottenere qualcosa di utile fatto.

    I ragazzi è parlato anche può avere alcuni buoni suggerimenti, ma questo non significa che avete bisogno di prendere tutto quello che dicono come vangelo. Per esempio, usando una versione recente di .NET su un nuovo progetto non mi sembrano nulla di cui preoccuparsi. Sono davvero lamentarsi che?

    • Concordato. Eventuali reclami sull’utilizzo di v3.5 e LINQ non sembrare una lamentela, sembrano ammissione di non sapere o di aver lavorato con loro prima. Che va bene, ma non dovrebbe essere un denuncia.
    • No, non erano lamentarsi. E ‘ più come Funka, ha detto. L’applicazione è in produzione da quasi un anno e mezzo ora, gli utenti e per il proprietario del prodotto sono felice. Il programma è stato rispettato ragionevolmente, considerando la mia esperienza e le circostanze (tipo di contratto, la visita della scuola, etc.)
  15. 2

    di cui la metà è vecchi (sono nel loro campionato) attaccando il vero e proprio motore a vapore che ho conosciuto. l’altra metà è vero, ma in realtà non dicendo nulla di nuovo.

    oltre a questo, Jeff Sternale la risposta è stellare.

  16. 0

    Come qualcuno che è stato lo sviluppo di software professionale per 24 anni, tutto quello che posso dire è che questo problema – di effettuare la chiamata al livello di astrazione necessario per un particolare problema – è il più difficile parte del mio quotidiano design & lavoro di programmazione.

    Nei vecchi giorni, sotto-engineering è stata diffusa, che ha portato a tutte le metodologie strutturate e pratiche. Ora, sembra che siamo andati in altro modo. La risposta non è semplice, e a volte sarà solo sapere se è sotto o sopra, progettato in senno di poi 😉

    Ho avuto più il senno di poi esperienze in cui mi sono detto: “vorrei non complicare così tanto”, ma anche “Se solo avessi ascoltato la vocina nella parte posteriore della mia testa, e l’ha resa un po ‘più generico qui”.

    Non ho ancora distillare regole assolute per effettuare la chiamata…

    Ho il sospetto che io sono incline a un eccesso di ingegneria, così ho fatto questa foto il mio PC carta da parati Concreto i sintomi di-ingegneria

  17. 0

    Vogliono offrire una prospettiva diversa, ma credo che questo termine non deve essere depennata e sostituita con una descrizione più appropriata. Si stigmatizza “ingegneria”, che dovrebbe essere circa la semplicità e la manutenibilità e la praticità di sopra di tutti, quando un sacco di ciò che è descritto come “over-engineering” è l’esatto contrario di qualità (come se di ingegneria troppo, o prendendo troppo sul serio, si suppone resa più articolata di soluzioni). È comune, per esempio, di vedere una correlazione tra over-engineering e poveri procedura di verifica (almeno io ho visto spesso questi due vanno mano nella mano), e che tipo di eccesso in ingegneria esegue la quantità minima di formale testing?

    Io dico che il fatto di venire da un punto di vista in cui ho sentito spesso responsabili del software e occasionali dinosauri che non erano così SE-savvy per lanciare questo termine intorno a chiunque di tentare, per esempio, a ridurre i costi di manutenzione in un sistema o proporre di più il suono delle procedure di verifica degli standard di sicurezza. E ‘ troppo facile per il profano pensare che qualsiasi tipo di gravi focus su ingegneria del suono, test, e che non produce codice in volata-come snap snap snap pace quello che vogliono è “over-engineering”.

    Ci sono molti che veramente riconoscere il vero odore di “over-engineering”, ma il termine è di almeno probabilmente fuorviante.

    Come per i sintomi, oltre alle eccellenti quelli già previsti, per me è una blindspot essere in grado di valutare correttamente e rivalutare il lavoro di fronte a voi. I programmatori possono creare mondi nella loro immaginazione, ossessionati e assorbito con grandi concetti. Mentre è un po ‘ noioso e risposta generica, che può portare a un pericolo di non vedere i problemi e le priorità, proprio sotto il nostro naso. Per concettualizzare troppo profondo è spesso sviluppano un blindspot, come per ciò che è giusto davanti a noi, per complichino ulteriormente i problemi, a perdere il contatto con la realtà e l’utente-end esigenze. Per me la più grande sintomi di guardare fuori per le ruotano intorno psicologia.

    Tutti i tipi di professioni che ruotano attorno produzione sono vulnerabili a questa tendenza di fondo nel quale si perde di vista il reale e immediato i problemi da risolvere come risultato di ottenere troppo ossessionati concetti (es: un regista). Con la programmazione in generale, un modo di combattere è a favore di chiarezza, di semplicità, di concretezza, di codifica e di prima di prima di pensare qualcosa all’ennesima potenza (acquistando più tempo per rivalutare la prima cadiamo troppo profondamente in amore con tutte le idee). Uno può non andare troppo lontano sbagliato abbracciando questi ideali, ma la chiave per me è per evitare lo sviluppo che blindspot che ci impedisce di essere in grado di valutare correttamente il proprio lavoro. Un overengineered codebase non venire domani-ci vuole un lungo lasso di lavoro dedicato nella direzione sbagliata per cedere, e per me la più grande prevenibile problema che non è lungimiranza connessi, ma spesso lo sviluppo di una corretta senno di poi è troppo tardi.

Lascia un commento