In che modo i team di sviluppo software professionisti affrontano la complessità del design in progetti non banali?


9

In primo luogo, mi rendo conto che questa domanda potrebbe essere piuttosto lunga e vaga e mi scuso per questo. Questo è probabilmente un problema di base con un breve nome per chiunque abbia "capito", ma siccome mi trovo carente in questo senso, per favore abbi pazienza nel descrivere il problema.

Ho programmato in questo modo o nell'altro da quando avevo circa 11 anni. Questo significa che mi sono principalmente insegnato tutto dall'inizio. Ho ricevuto una formazione tecnica, ma non rigorosamente in Informatica (mi sono laureato in Ingegneria Fotonica). Naturalmente avevamo dei corsi di programmazione, ma per me questo era principalmente roba di base e non ho imparato molte cose nuove. Ho continuato a educare me stesso lungo la strada per la gioia di esso e ho sempre saputo che avrei perseguito una carriera nella programmazione, ma tutti i miei progetti erano piuttosto piccoli in quel momento. Non ho avuto problemi a tenerli nella mia mente e mantenerli.

Ora mi trovo al comando di un team, ma non in un ambiente aziendale - lavoro per l'università sviluppando software scientifico (in C ++) per applicazioni di ingegneria. Improvvisamente il progetto sta diventando (relativamente) grande e ho difficoltà a pensarci su per la maggior parte del tempo. Sto perdendo molto tempo e sforzi principalmente su due cose:

  1. Quando devo tornare a una sezione di codice su cui non ho lavorato per un po ', ho difficoltà a ricordare come ha funzionato. Passo molto tempo a rivedere i file di intestazione per le classi pertinenti e a leggere i commenti che ho inserito lungo il percorso nei file di origine. Vorrei che ci fosse una qualche forma di "schema" che potevo vedere e riconquistare più facilmente il quadro;
  2. Quando introduco cambiamenti, a volte mi rendo conto a metà strada che ciò che sto cercando di fare romperà le cose da qualche altra parte (o peggio, si presenta solo in fase di esecuzione come una sorpresa). Ripristino e comincio a farlo diversamente, solo per scoprire che ho trascurato l'influenza su qualche altro componente. Vorrei che ci fosse un "diagramma dell'architettura" in cui potevo vedere come vengono fatte le cose, come ciò che sto cercando di fare influenzerà altri componenti e un modo per pianificare in dettaglio prima di iniziare a implementare le modifiche.

La maggior parte delle persone con cui lavoro hanno storie simili alle mie: forte orientamento tecnico e talvolta grandi capacità, ma senza modo di organizzare il proprio lavoro. Tuttavia, i loro progetti sono in genere molto più piccoli dei miei, quindi riescono a farcela in qualche modo. Comunque, ciò che significa per me è che sono da solo e non ho nessuno da cui imparare le buone pratiche.

Ho seguito un corso post-laurea in gestione dell'IT e, sebbene lo trovo abbastanza soddisfacente, si rivolge principalmente ai non programmatori, insegnando metodologie di gestione del progetto, stime di budget / pianificazione, architettura aziendale ecc., Non progettazione del software e pianificazione in quanto tale. Va bene, sto cercando di imparare anche quella roba. Naturalmente, sono stati introdotti alcuni strumenti (come UML) e i tipi di processi di sviluppo del software (a cascata, iterativi, agili ...), ma ovviamente non in grande dettaglio e faccio fatica a decidere cosa dovrei scegliere e usare ( e in quale misura).

Ho letto molte domande e risposte sulla progettazione di software su SO - ce ne sono molte nel farlo usando questo o quel particolare strumento o metodologia, e se fossi convinto che la documentazione UML avrebbe risolto i miei problemi - l'avrei presa e inizia ad usarlo. Ma alcune persone lo giurano, altri dicono che è inutile. Sto cercando una risposta a un livello più alto di astrazione - ci sono modi per risolvere i due problemi che sto avendo e come lo fai personalmente? Cosa dovrei imparare per poterlo fare, possibilmente senza essere vincolato a un particolare strumento? Questi vanno e vengono di volta in volta fuori moda, e mi aspetto che la loro applicabilità vari a seconda del tipo di progetto.

Grazie mille per la lettura, non sono stato in grado di dire ciò che intendo più brevemente (mancanza di esperienza di progettazione software e vocabolario).


2
Penso che la risposta professionale più comune alle difficoltà di cui stai parlando sia "Fanculo", seguita da incolpare la gestione, il prodotto o qualche altro SOB casuale.
Edward Strange,

Risposte:


9

Quando devo tornare a una sezione di codice su cui non ho lavorato per un po ', ho difficoltà a ricordare come ha funzionato. Passo molto tempo a rivedere i file di intestazione per le classi pertinenti e a leggere i commenti che ho inserito lungo il percorso nei file di origine.

Immagina come si sentirà il povero ragazzo che viene dopo di te - non ha nemmeno il vantaggio di aver saputo una volta come funziona il tuo codice. Invece di provare a decifrare il tuo codice, dovresti rivedere la documentazione che hai scritto per il modulo in questione. Tale documentazione dovrebbe offrire una visione ragionevolmente accurata di ciò che il modulo fa del perché. Non è "il modulo inizia inizializzando tre array usando una tripla per loop ...", ma invece: "questo modulo recupera i dati raccolti dal sensore principale del Fabulotron, li riorganizza nel formato standard napoletano (cioccolato, vaniglia, fragola), e lo consegna al modulo di analisi. "

In un mondo perfetto, avresti un documento di progettazione che espone i vari moduli nel sistema e descriva le rispettive responsabilità, e ciascuno dei tuoi moduli potrebbe semplicemente fare riferimento a quel documento per spiegare cosa fanno: "Questo modulo fornisce Servizio di raccolta dati Fabulotron come dettagliato nella sezione 4.8 del documento di progettazione: http://fabulotron.org/design/section4-8.html . " Se non hai qualcosa del genere, inizia a scrivere una panoramica di ciascun modulo mentre lavori su di esso. Non è necessario scrivere un libro: alcuni paragrafi sono spesso sufficienti per orientarti.

Quando introduco cambiamenti, a volte mi rendo conto a metà strada che ciò che sto cercando di fare romperà le cose da qualche altra parte (o peggio, si presenta solo in fase di esecuzione come una sorpresa). Ripristino e comincio a farlo diversamente, solo per scoprire che ho trascurato l'influenza su qualche altro componente.

Ciò potrebbe indicare che i tuoi moduli sono troppo interconnessi. Più indipendente puoi rendere i tuoi moduli / classi / unità, meno è probabile che ti imbatterai in questo tipo di problema. Cerca di rendere le interfacce tra i moduli il più esplicite possibile e cerca di limitarle a ciò che deve essere lì. Un'interfaccia è un contratto - se sai che alcuni moduli sono all'altezza dei suoi obblighi come specificato nell'interfaccia, non hai bisogno di sapere nient'altro al riguardo. Ciò impedisce alle modifiche nel modulo su cui stai lavorando di influire su altri moduli.

Vorrei che ci fosse un "diagramma di architettura" in cui potevo vedere come vengono fatte le cose

L'utilizzo di parti standard può essere d'aiuto in questo senso. C ++ fornisce parti standard sotto forma di Libreria di modelli standard e l'utilizzo di tali parti ove appropriato consente di lavorare a un livello di astrazione più elevato. Se hai scritto il tuo codice per gestire strutture di dati come elenchi, tu e quelli che seguiranno dovrete costantemente leggere la fonte per capire cosa sta succedendo. Se invece utilizzi parti standard fornite da STL, qualsiasi programmatore C ++ sarà in grado di dire rapidamente cosa sta facendo il tuo codice senza scavare nelle tue routine di gestione dei dati.

Un altro tipo di parte standard viene dai modelli di progettazione. Sono concetti standard che possono essere usati come stenografia per spiegare come funziona la relazione tra due oggetti.


Grazie per la risposta. Ovviamente utilizzo STL da molti anni, ma la sequenza di passaggi che il mio programma esegue per eseguire alcuni calcoli forzati è talvolta difficile da immaginare in modo completo anche con il suo utilizzo. Lo stesso vale per i moduli. Non intendevo cambiare uno si rompe un altro, ma piuttosto che cambiare qualcosa da qualche parte provoca un problema tecnico, ad esempio quando un utente fa qualcosa di non standard nella GUI in cui una sequenza complicata è ulteriormente complicata dall'ordine imprevedibile di passaggi che prendono per completarlo.
neuviemeporte,

5

Sono stato uno sviluppatore professionista solo per un breve periodo di tempo e ho lottato molto su come farlo quando ho iniziato. Ero principalmente autodidatta, anche attraverso l'università. Fortunatamente per me le persone con cui ho lavorato hanno molta esperienza e sono state in grado di educarmi sui modi di gestire e lavorare su grandi progetti.

Una delle prime cose che mi ha fatto fare è stato sedermi e leggere il codice pulito . Che è un libro fantastico che mi ha aiutato a capire come scrivere codice che potrei capire quando sono tornato ad esso o che qualcun altro potrebbe capire.

La seconda cosa era scrivere test di buona qualità, Unità, Integrazione, Accettazione. Se il tuo codice è ben testato saprai rapidamente quando hai rotto qualcosa e sarai in grado di diagnosticare rapidamente il problema. Ci sono molte buone risorse di test disponibili su Internet e non sono sicuro di quali siano le migliori da suggerirti.

I miei punti chiave sono Testing e Clean Code.


Grazie per il suggerimento, sarò sicuro di dare un'occhiata al libro (anche se "agile" nel sottotitolo sembra indicare che è principalmente rilevante per quella metodologia). Ho dei test e ho letto molti libri di stile di programmazione (ad es. Pragmatic Programmer) Mi sforzo sempre di creare interfacce pulite e ben separate, ma per un test automatizzato è difficile per la parte GUI della mia applicazione e non ho ancora un modo per fare una buona progettazione complessiva su larga scala, che va oltre l'implementazione di pratiche "pulite" su blocchi di codice relativamente piccoli.
neuviemeporte,

2

Ecco alcune idee di alto livello per l'organizzazione di grandi sistemi software. Gran parte della mia esperienza è nei sistemi Internet, ma penso che queste idee si applichino al software di ingegneria.

  • Separare la funzionalità in blocchi modulari relativamente isolati. Ad esempio, potresti avere un modulo per ogni famiglia di calcoli fornita dal tuo software.
  • Applicare il modello di progettazione MVC per l'interfaccia utente, se presente. Mantieni l'interfaccia e il modello separati con confini ben definiti.
  • Prendi in considerazione l'utilizzo dei livelli per raggruppare i moduli. In un'applicazione che utilizza i livelli di astrazione, ogni livello dipende solo dal livello sottostante.
  • Quando scrivi la documentazione, supponi che dimenticherai tutti i dettagli dell'implementazione. Scriverai molta documentazione in base a questo presupposto: forse almeno la metà del tuo codice sarà commenti, ma sarai molto meno confuso in seguito.
  • Test automatici di unità, integrazione e accettazione sono ottimi in alcuni spazi, ma gli sviluppatori C ++ sembrano avere sentimenti contrastanti su di loro.
  • Disegna pesantemente su modelli di design . Oltre ad essere generalmente buone idee, i modelli di progettazione forniscono un vocabolario comune nell'ingegneria del software. Chiamare una classe WidgetFactory è un modo conciso per comunicare che è una classe esistente per creare widget.

È passato molto tempo da quando ho lavorato con software di ingegneria, quindi il tuo chilometraggio può variare su questi suggerimenti. In bocca al lupo!


1

La risposta è ingegneria del software.

Questo è per progetti di grandi dimensioni che segui una sequenza prestabilita di raccolta dei requisiti, definizione del processo, specifiche, ecc. Molto prima che venga effettuata qualsiasi codifica effettiva.

Esistono varie metodologie utilizzate a seconda dell'ambiente e della cultura. Le imprese di tipo aziendale tendono a seguire il " processo unificato razionale " o simili, le start-up tecnologiche di solito vanno per qualche variazione su Agile , i dipartimenti governativi un po 'troppo metodologia Waterfall .

In ogni caso il processo ti aiuta a definire esattamente cosa stai facendo e, verso la fine del progetto, ti consente di dimostrare di averlo fatto.


Supponendo che i requisiti non cambino (un'ipotesi non realistica in molti casi, lo so), è effettivamente possibile specificare tutto prima della codifica e quindi creare software funzionante dalle specifiche senza grandi modifiche lungo la strada? Non riesco proprio a immaginarlo. Devo iniziare a scrivere codice per sentirmi. modifica un po ', modifica un po' di più ecc ...
neuviemeporte,

Questo potrebbe funzionare per piccoli progetti, ma per progetti di grandi dimensioni è necessario prima fare i conti con i requisiti. Anche una parte vitale di RUP è la modellazione del sistema proposto con diagrammi UML e Sequence. È molto più facile modificare e riformattare un modello rispetto al codice reale.
James Anderson,

@neuviemeporte: dipende. A volte i requisiti cambiano o vengono scoperti nuovi requisiti durante lo sviluppo. A volte i requisiti sono abbastanza chiari fin dall'inizio e solo alcuni dettagli minori cambieranno durante lo sviluppo, ma l'architettura generale rimarrà la stessa.
Giorgio,

1

Consiglio vivamente di mettere le mani su Enterprise Architect , che sebbene non sia gratuito, offre prezzi accademici. È uno strumento eccellente per disegnare diagrammi sia a livello macro che a livello micro. Può anche decodificare i file sorgente in diagrammi di classe, il che sarebbe probabilmente un buon inizio per te nella documentazione e nella riorganizzazione del modo in cui la tua applicazione va insieme.

Vorrei anche secondo i consigli di @ Klee. Non lasciarti scoraggiare dai presunti strumenti "agili", in quanto sono in realtà solo articoli delle migliori pratiche che sono anche utili (se non obbligatori) se stai seguendo un processo agile. Ma l'integrazione continua (per esempio) è preziosa indipendentemente dalla tua metodologia. Inoltre, i test unitari (cppUnit?) Sono i tuoi amici. I test unitari dovrebbero essere molto realizzabili se testate le classi logiche chiamate dall'interfaccia utente, anziché testare direttamente l'interfaccia utente. Esistono anche strumenti che potrebbero aiutarti ad automatizzare i test dell'interfaccia utente, ma prima proverei a mettere insieme le cose del back-end.

In bocca al lupo!


1

Credo che il tuo problema abbia tre dimensioni

  1. Programmatore-Oriented
  2. Programma-Oriented
  3. Manutenzione del programma - Orientato

Per quanto riguarda il primo problema, potresti avere programmatori che non comprendono il concetto di ciò che fa il programma (ciò accade spesso nelle configurazioni aziendali). Ma andando dalla tua domanda e dal dominio in cui ti trovi, sembra che tu e il tuo team abbiate il controllo di ciò che fa il programma, ma non potete tradurlo in un programma di lavoro in breve tempo (per citare un esempio, ho sentito parlare di persone avere post-dottorato in Fisica avendo difficoltà a comprendere i suggerimenti in programmazione e sono sicuro che la Fisica sia molto più difficile del C ++). In tal caso, il tuo problema è principalmente incentrato sul programma (devi essere abbastanza fortunato che le persone intorno a te possano capire cosa sta facendo il tuo programma e apprezzarlo).

In caso di problemi incentrati sul programma, uno dei miei suggerimenti scandalosi sarebbe quello di passare a un livello di astrazione più elevato rispetto al C ++ come l'apprendimento di una nuova lingua come Python o Haskell (Python è abbastanza facile da imparare e se hai buoni matematici, Haskell è semplicemente fantastico). Passare a un livello più elevato di astrazione manterrebbe la dimensione del codice bassa, facile da capire e mantenere a lungo termine ed effetti rapidi delle modifiche. Quindi puoi avere 10 righe di codice al posto delle 50 righe di codice originali. Inoltre, avere qualcuno con esperienza nella programmazione del computer sarebbe sicuramente di aiuto. Essendo in un'università, potresti anche coinvolgere alcuni studenti nella GUI e nelle interfacce in modo da poterti concentrare maggiormente sulla funzionalità. Consiglio anche il libro C ++ Software Design su larga scala di John Lakos(È un libro abbastanza grande, puoi diventare un abile programmatore Python nel tempo che potresti impiegare per leggere il libro)

Se si risolvono le prime 2 dimensioni del problema, la terza viene risolta automaticamente. Dal momento che credo che tu stia lavorando su un unico grande progetto, qualsiasi software di gestione del progetto decente ti supera. È necessaria una pianificazione anticipata. Se inizi a scrivere codice subito, potresti essere troppo coinvolto nel programma da dimenticare il quadro generale. Tenere a mente le cose non funzionerebbe per un grande progetto. Metti tutto nella carta (o nel computer). Usa un wiki per condividere informazioni. Per quanto riguarda le metodologie, preferisco la metodologia agile (semplicemente, agile è un nome elegante per lo sviluppo software incrementale). Suggerisco anche di assumere qualcuno con esperienza in questo settore in modo che si prenda cura di questi in modo che tu possa concentrarti sul tuo programma principale. La linea di fondo qui è che tutte le metodologie di gestione del progetto sono solo un modo per garantire il successo del programma; così puoi scegliere chiunque si adatti a te e alla tua squadra invece di selezionare qualcosa che qualcuno ti consiglia al meglio. Inoltre, può essere utile anche il seguente software

  • Mind - Software di mappatura mentale
  • Trac - Programma di bug software semplice e veloce e un wiki
  • MoinMoin - Wiki rapido per consentire la condivisione delle conoscenze sul programma

Sebbene i suggerimenti di cui sopra richiederebbero un po 'di curva di apprendimento, ne varrà la pena nel lungo periodo. Infine, la programmazione è più semplice dell'ingegneria fotonica (sebbene non della programmazione C ++)


0

Come la tua domanda, ogni risposta che ti sarà utile sarà molto lunga e vaga, ma la risposta breve è "Ingegneria del software"

Ti suggerisco di dedicare un po 'di tempo libero, il più possibile se sei serio su una carriera di sviluppo software, e iniziare visitando il sito di Steve McConnells . La programmazione è facile e può essere insegnata in un semestre, l'ingegneria del software è un ordine di grandezza più complesso e richiede molto più tempo per imparare.

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.