Il tuo problema è molto comune. E anche un vero problema, perché non c'è una buona soluzione.
Siamo nella stessa situazione qui, beh direi peggio, con 13 milioni riga di codice, fatturato e più di 800 sviluppatori che lavorano sul codice. Discutiamo spesso dello stesso problema che descrivi.
La prima idea - che gli sviluppatori hanno già utilizzato - è quello di refactoring del codice comune in alcune classi di utilità. Il nostro problema con questa soluzione, anche con la programmazione, il mentoring e la discussione di coppia, è che siamo semplicemente troppi perché questo sia efficace. In effetti, cresciamo in sottogruppi, con persone che condividono la conoscenza nel loro sottogruppo, ma la conoscenza non transita tra i sottogruppi. Forse abbiamo torto, ma penso che anche la programmazione e le conversazioni di coppia non possano essere d'aiuto in questo caso.
Abbiamo anche un team di architettura. Questo team è responsabile di occuparsi dei problemi di progettazione e architettura e di creare utilità comuni di cui potremmo aver bisogno. Questo team produce infatti qualcosa che potremmo definire un framework aziendale. Sì, è un framework, ea volte funziona bene. Questo team è anche responsabile di promuovere le migliori pratiche e aumentare la consapevolezza su cosa dovrebbe essere fatto o meno, cosa è disponibile o cosa non lo è.
buon Core Design Java API è uno dei motivi per il successo di Java. Anche le buone librerie di open source di terze parti contano molto. Anche una piccola API ben realizzata consente di offrire un'astrazione davvero utile e può aiutare a ridurre le dimensioni del codice molto. Ma sai, creare framework e API pubbliche non è la stessa cosa, basta codificare una classe di utilità in 2 ore. Ha un costo davvero alto. Una classe di utilità costa 2 ore per la codifica iniziale, forse 2 giorni con i test di debug e unità. Quando inizi a condividere codice comune su grandi progetti/team, crei davvero un'API. È necessario garantire una documentazione perfetta quindi, codice veramente leggibile e gestibile. Quando rilasci una nuova versione di questo codice, devi rimanere compatibile con le versioni precedenti. Devi promuoverlo a livello aziendale (o almeno a livello di squadra). A partire da 2 giorni per la tua piccola classe di utilità, raggiungi 10 giorni, 20 giorni o addirittura 50 giorni per un'API completa.
ed il vostro disegno API non può essere così grande. Beh, non è che i tuoi ingegneri non siano brillanti, anzi lo sono. Ma sei disposto a lasciarli lavorare per 50 giorni su una piccola classe di utilità che aiuta semplicemente ad analizzare il numero in modo coerente per l'interfaccia utente? Sei disposto a lasciare che ridisegnino il tutto quando inizi a utilizzare un'interfaccia utente mobile con esigenze completamente diverse? Inoltre hai notato come gli ingegneri più brillanti del mondo rendono le API che non saranno mai popolari o si sbiadiranno lentamente? Vedete, il primo progetto web che abbiamo realizzato utilizzava solo framework interni o nessun framework. Abbiamo quindi aggiunto PHP/JSP/ASP. Poi in Java abbiamo aggiunto Struts. Ora JSF è lo standard. E stiamo pensando di usare Spring Web Flow, Vaadin o Lift ...
Tutto quello che voglio dire è che non esiste una buona soluzione, il sovraccarico cresce in modo esponenziale con la dimensione del codice e la dimensione della squadra. La condivisione di una grande base di codici limita la tua agilità e reattività.Qualsiasi cambiamento deve essere fatto con attenzione, è necessario pensare a tutti i potenziali problemi di integrazione e tutti devono essere formati sulle nuove specificità e caratteristiche.
Ma il punto di produttività principale in una società di software non è di ottenere 10 o anche 50 righe di codice durante l'analisi di XML. Un codice generico per fare questo crescerà di un migliaio di righe di codice e ricrea una complessa API che sarà stratificata per classi di utilità. Quando il ragazzo crea una classe di utilità per l'analisi di XML, è una buona astrazione. Dà un nome a una dozzina o addirittura a cento linee di codice specializzato. Questo codice è utile perché è specializzato. L'API comune consente di lavorare su stream, URL, stringhe, qualunque cosa. Ha una fabbrica in modo da poter scegliere l'implementazione del parser. La classe di utilità è buona perché funziona solo con questo parser e con le stringhe. E perché hai bisogno di una riga di codice per chiamarla. Ma ovviamente, questo codice di utilità è di uso limitato. Funziona bene per questa applicazione mobile o per caricare la configurazione XML. Ed è per questo che lo sviluppatore ha aggiunto la classe di utilità per questo in primo luogo.
In conclusione, quello che io considero invece di cercare di consolidare il codice per l'intera base di codice è quello di dividere il codice di responsabilità come le squadre crescono:
- trasformare il vostro grande squadra che funziona su un unico grande progetto in piccolo team che lavorano su diversi sottoprogetti;
- assicurare che l'interfaccia sia buona per minimizzare i problemi di integrazione, ma lasciare che il team abbia il proprio codice;
- all'interno di questi gruppi e codebase corrispondenti, assicurarsi di avere le migliori pratiche. Nessun codice duplicato, buone astrazioni. Utilizza le API comprovate esistenti dalla community. Utilizza la programmazione di coppie, una solida documentazione API, wiki ... Ma dovresti davvero consentire a team diversi di fare le loro scelte, creare il proprio codice, anche se questo significa duplicare il codice tra team o decisioni di progettazione differenti. Sai, se le decisioni di progettazione sono diverse, ciò potrebbe essere dovuto al fatto che le esigenze sono diverse.
Quello che stai veramente gestendo è la complessità. Alla fine, se crei una base di codice monolitica, molto generica e avanzata, aumenti il tempo necessario per i nuovi arrivati, aumenti il rischio che gli sviluppatori non utilizzino affatto il tuo codice comune e rallenti tutti perché qualsiasi cambiamento ha molte più possibilità di rompere le funzionalità esistenti.
Vedere http://stackoverflow.com/questions/4188919/how-to-search-for-java-api-methods-by-type-signature – meriton
Immagino che sia possibile adattare questa soluzione per elencare tutti i metodi con duplicati digitare le firme. – meriton