il modo migliore per "presentare" OOP / OOD al team di ingegneri C ++ esperti


17

Sto cercando un modo efficiente, che non venga considerato un insulto, per introdurre concetti OOP ai membri del team esistenti? I miei compagni di squadra non sono nuovi alle lingue OO. Facciamo C ++ / C # da molto tempo, quindi la tecnologia stessa è familiare.

Tuttavia, mi guardo intorno e senza una grande infusione di sforzi (principalmente sotto forma di revisioni del codice), sembra che ciò che stiamo producendo sia il codice C che si trova all'interno delle classi. Non c'è quasi alcun uso del principio di responsabilità singola, delle astrazioni o dei tentativi di minimizzare l'accoppiamento, solo per citarne alcuni. Ho visto classi che non hanno un costruttore ma ottengono memset su 0 ogni volta che vengono istanziate.

Ma ogni volta che faccio apparire OOP, tutti annuiscono sempre e fanno sembrare che sappiano esattamente di cosa sto parlando. Conoscere i concetti è buono, ma noi (alcuni più di altri) sembra che ci sia molto difficile applicarli quando si tratta di consegnare il lavoro reale.

Le revisioni del codice sono state molto utili, ma il problema con le revisioni del codice è che si verificano solo dopo il fatto, quindi ad alcuni sembra che finiamo per riscrivere (è principalmente refactoring, ma richiede ancora molto tempo) il codice che è stato appena scritto. Anche le revisioni del codice forniscono feedback solo a un singolo ingegnere, non all'intero team.

Sto giocando con l'idea di fare una presentazione (o una serie) e provo a richiamare OOP insieme ad alcuni esempi di codice esistente che potrebbero essere stati scritti meglio e potrebbero essere refactored. Potrei usare alcuni progetti molto vecchi che nessuno possiede più, quindi almeno quella parte non dovrebbe essere un problema delicato. Tuttavia, funzionerà? Come ho detto la maggior parte delle persone ha fatto C ++ per molto tempo, quindi la mia ipotesi è che a) si siederanno lì a pensare perché sto dicendo loro cose che già sanno eb) potrebbero effettivamente prenderlo come un insulto perché sono dicendo loro che non sanno come svolgere il lavoro che svolgono da anni se non da decenni.

Esiste un altro approccio che raggiungerebbe un pubblico più ampio rispetto a una recensione di codice, ma allo stesso tempo non sembrerebbe una lezione di punizione?

Non sono un ragazzo fuori dal college che ha ideali utopici di codice perfettamente progettato e non me lo aspetto da nessuno. Il motivo per cui sto scrivendo questo è perché ho appena fatto una recensione a una persona che in realtà aveva un design decente di alto livello su carta. Tuttavia, se immagini le classi: A -> B -> C -> D, nel codice B, C e D tutte implementano quasi la stessa interfaccia pubblica e B / C hanno una funzione di rivestimento in modo che la classe A più alta stia facendo assolutamente tutto il lavoro (fino alla gestione della memoria, analisi delle stringhe, negoziazioni di installazione ...) principalmente in 4 metodi mongo e, a tutti gli effetti, chiama quasi direttamente in D.

Aggiornamento: sono un capo tecnico (6 mesi in questo ruolo) e ho il pieno supporto del gestore del gruppo. Stiamo lavorando su un prodotto molto maturo e i costi di manutenzione si stanno sicuramente facendo conoscere.



3
Sei il loro supervisore o capo in qualche modo? In caso contrario, hai il supporto del direttore tecnico che è il capo di tutti voi? Se sei solo uno dei ragazzi e lo sviluppo è stato costante e produttivo per anni senza l'utilizzo di progetti OOP profondi, sei in una battaglia in salita per convincere i programmatori che il codice di lavoro non funziona e la gestione che non stai sprecando soldi spesi meglio per generare codice.
Patrick Hughes,

Dopo aver pubblicato questo post, sono spuntati i relativi link che sembrano molto simili alla mia situazione: programmers.stackexchange.com/questions/43214/… . Sono preoccupato esattamente per la stessa cosa. Il problema è che il loro team aveva 2 sviluppatori e potrei sicuramente gestirlo con le revisioni del codice. Sto cercando un approccio che funzioni con le dimensioni del nostro team (10+). Non riesco proprio a comunicare con ogni sviluppatore uno contro uno tanto quanto vorrei.
DXM,

Risposte:


5

Perché non sviluppi una breve formazione sui principi SOLID e dai loro questa formazione? Sembra che abbia funzionato abbastanza bene per me nella mia attuale organizzazione e trovo che dare brevi corsi di formazione sia davvero divertente (per tutti i soggetti coinvolti).

Quando ho impartito la mia formazione, mi sono preso del tempo per cercare esempi "cattivi" patologici nel codice esistente (di vari progetti), e li ho riformattati nella presentazione, passo dopo passo, usando i principi. Ciò lo ha dimostrato

  1. Non è così difficile fare questi refactoring
  2. Non ci vuole molto tempo
  3. Il risultato finale (scelto con cura ;-)) è chiaramente migliore del codice originale.

5

Le revisioni del codice sono state molto utili, ma il problema con le revisioni del codice è che si verificano solo dopo il fatto.

In un progetto, abbiamo realizzato recensioni di design.

15 minuti. Alla lavagna bianca. Parla attraverso il design prima della codifica.

La parte più importante è la pianificazione della revisione del progetto prima di qualsiasi lavoro di implementazione.

Avevamo anche "Critical Design Reviews" che erano un grosso affare sudato. Hanno coinvolto molti documenti e una lunga presentazione. Erano difficili da programmare e quasi sempre venivano espulsi fino a quando non era iniziata la codifica, riducendo il loro valore a zero.

Le revisioni informali del progetto - prima della codifica - nessuna pressione - nessuna documentazione - consentono una migliore discussione su come vengono assegnate le responsabilità e su come gli oggetti collaboreranno.


sì, facciamo già recensioni di design esattamente come le hai descritte. Il problema sono le attività di medie dimensioni. Se il compito è abbastanza grande, generalmente mi prendo il tempo di elaborare un diagramma di classe iniziale che poi viene perfezionato dal team. Se l'attività è piccola, la progettazione di alto livello esistente è già abbastanza buona. Tuttavia, per compiti di medie dimensioni, non ho la capacità di mettere abbastanza pensiero nel progetto, quindi la regola di base è "usa il miglior giudizio e segui OOP". Se dovessi svolgere questi compiti da solo, inizierei con la codifica e mescolando quello con il refactoring continuo e ...
DXM,

... lascia che il codice decida come dovrebbe essere il progetto finale. Tuttavia, quando lascio queste attività ad alcuni membri del team, ciò che a volte trovo nella revisione del codice è roba simile a quella che ho descritto nel mio post iniziale.
DXM,

1
@DXM: cosa? Li stai facendo? O non li fai? Se grande, allora non stai facendo recensioni di design - stai facendo design per qualcun altro - chi impara quando fai design? Se piccolo, allora non stai facendo recensioni di design - il "design esistente è abbastanza buono" - chi si appoggia quando ignori il design? Se medio, non fai design e non rivedi nemmeno i loro design? Non sembra che tu stia effettivamente facendo recensioni di design. Perché dici di essere e poi fai tre esempi in cui non sei?
S.Lott

@Lott: dopo aver riflettuto sulla tua risposta, la mia unica conclusione è che hai assolutamente ragione. Immagino che avrei dovuto dire che ho sollevato questa idea esatta almeno 8 volte e tutti erano sempre d'accordo, ma sì, se guardo indietro al ritmo su cui ci siamo accordati, non lo stiamo davvero facendo. Vorrei discuterne ulteriormente, ma sono già stato disciplinato dalle mod per avere una discussione su un sito rigorosamente di domande e risposte. Potremmo passare alla chat? Vorrei spiegare di più la situazione e forse scegliere un po 'il cervello (o chiunque altro voglia unirsi). Mai fatto chat, sai come funziona?
DXM,

@DXM: la chat è banale. E non troppo utile. Se hai ulteriori domande - più dettagliate di questa domanda iniziale - dovresti porre quelle domande più dettagliate. Questo è il punto. In alcuni casi "ulteriore discussione" equivale a "Non mi piace la tua risposta alla mia domanda per i seguenti motivi ..." che è piuttosto sciocco. Non gradire una risposta è semplicemente non gradire una risposta e non richiede alcuna discussione. In alcuni casi, la discussione equivale a "la mia domanda non è vaga, semplicemente non riesci a leggere". Inutile, davvero. Poni le tue domande. Come domande.
S.Lott

4

Suppongo che tu sia più giovane di alcuni sviluppatori, ma più in alto nella catena alimentare.

A rischio di essere seppelliti nei voti negativi, potrebbe essere che gli "ingegneri esperti" stiano effettivamente facendo la cosa giusta - o poiché si tratta di un prodotto maturo che potrebbe essere stato in circolazione per decenni, quella che una volta era la cosa giusta.

Il codice precedente tende ad essere ottimizzato per essere eseguito rapidamente sull'hardware del tempo; tra le altre cose, ciò significa ridurre i livelli di ereditarietà ed evitare chiamate a funzioni / metodi per operazioni banali.

I compilatori sono diventati molto più intelligenti nel corso degli anni, quindi non tutto ciò che una volta era vero ora lo è - ad esempio, un compilatore può scegliere di incorporare una piccola funzione.

Forse una strada da percorrere sarebbe quella di adottare un approccio diverso - chiedi agli sviluppatori di spiegare come / perché il loro metodo è migliore della teoria che ti è stata insegnata - e di essere sincero al riguardo.


0

Fare pressioni per test unitari con una copertura del ramo del 100% per ogni metodo nuovo / modificato non porterebbe a minimizzare l'accoppiamento tra metodi.


UT è una buona idea, ma non sono convinto che ciò raggiungerebbe il risultato desiderato. Inoltre, uno dei principi fondamentali di OO è che l'accoppiamento tra funzioni è inevitabile, quindi è meglio rendere esplicite e raggruppare tali funzioni accoppiate in un'unica classe.
MSalters,

Concordo sul fatto che "è inevitabile accoppiare ciascuna tra le funzioni". Tuttavia, un buon design riduce il numero di altre funzioni anche a ciascuna funzione. (Una lezione è solo un mezzo per raggiungere questo scopo)
Ian,

0

Potresti prendere il libro "Design Patterns" dalla Gang of Four. Non è specifico del C ++, quindi non critichi apertamente la conoscenza del C ++ dei tuoi colleghi quando ti riferisci ad esso. Allo stesso tempo, affronta argomenti che ritieni rilevanti. Inoltre, il libro è ampiamente accettato come pertinente, quindi non possono facilmente liquidarlo come teorico o poco pratico.

D'altra parte, considera che C ++ non è un linguaggio OO puro, né nella progettazione né nella pratica. L'intera storia del costruttore / memset suona che dovresti introdurre RAII, che non è affatto una tecnica OO ma specifica per C ++ (sfortunatamente - IDispose di .Net mostra cosa succede quando RAII è un ripensamento). I libri rilevanti qui sono (Più) C ++ efficace e (Più) C ++ eccezionale.


2
Ma gli autori affermano chiaramente che i modelli di progettazione non sono un'introduzione a OOP / OOD in generale! Il pubblico dovrebbe prima avere familiarità con le tecniche offerte da OOP prima di immergersi in un catalogo di modelli di progettazione hardcode! "Head First Design Patterns" farà una buona introduzione.
Falcon,

2
Dalla descrizione del PO sembra che conoscano OOP / OOD, semplicemente non lo usano (forse per paura che sia troppo complicato), nel qual caso un libro che spiega perché è utile può motivare meglio degli esempi di codice.
Wildpeaks,

@wildpeaks: l'OP dice il contrario. Non conoscono OOP / OOD. Stanno programmando OOP in modo procedurale. Hanno bisogno di qualcosa per introdurli alle tecniche di progettazione e il libro GoF non si adatta a questo scenario imho.
Falcon,

Mi riferivo alle frasi But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboute My teammates are not new to OO languages, ma posso vedere come sia davvero un po 'vago in quanto potrebbero mentire sul conoscere OOP quando OP ne parla con loro.
wildpeaks,

1
@MSalters - Prefazione dei modelli di progettazione: "Questo libro non è un'introduzione alla tecnologia o al design orientati agli oggetti. Molti libri già fanno un buon lavoro. Presuppone che tu sia abbastanza esperto in almeno un linguaggio di programmazione orientato agli oggetti e tu dovrebbe avere anche una certa esperienza nella progettazione orientata agli oggetti ". Questo libro non soddisfa i requisiti. Dovrebbero leggere alcune cose OOD entry level.
Falcon,
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.