Perché lo zio Bob suggerisce che gli standard di codifica non dovrebbero essere scritti se si può evitarlo?
Se stai chiedendo ragioni dietro la sua opinione, potresti avere una risposta solo se pubblicherà una risposta qui (la nostra opinione è solo irrilevante), tuttavia ...
Perché non dovrei scrivere uno standard di codifica?
Se stai chiedendo se ha ragione : lasciami essere l'unico impopolare (finora) a dire che non hai motivo di evitarlo.
SCRIVICI . Comunque proverò a spiegare i miei motivi ...
David ha suggerito in un commento che il punto principale della risposta di Stephen non è il motivo per cui non dovresti scrivere documenti ma in che forma sono. Se le linee guida sono formalizzate in strumenti (non semplicemente revisione del codice manuale), potrei essere d'accordo (quando la legge non richiede qualcos'altro). Si prega di notare che sfortunatamente gli strumenti non possono controllare tutto (la teoria del calcolo non è nostra amica) spesso perché sono limitati a una specifica unità di traduzione o pacchetto o qualunque sia la vostra lingua preferita che definisca un limite .
Tuttavia la formulazione di zio Bob non mi fa pensare che ne stia parlando.
Posso essere in disaccordo con un tale esperto senior? Lo faccio, per quasi tutti i punti citati (vedi anche la seconda parte di questa risposta per i dettagli). Proviamo a capire perché (supponendo che tu sappia già che le linee guida per la codifica non riguardano solo piccoli problemi di formattazione ).
- In alcune circostanze gli standard di codifica scritti sono richiesti dalla legge.
- Leggo la documentazione e sono sicuro di non essere solo. I membri del team possono cambiare nel tempo, le conoscenze non possono essere contenute in una base di codice di 5-10 anni o nelle menti dei membri del team. Le organizzazioni dovrebbero licenziare le persone che non seguono le linee guida interne.
- Gli standard di codifica, una volta che sono stati approvati , non cambieranno spesso e, se lo fanno, vuoi saperlo. Se gli standard sono cambiati, la documentazione (nel codice) non è aggiornata perché tutto il codice non segue il nuovo standard. La riformattazione / refactoring può essere lenta ma devi sempre seguire una guida autorevole da seguire.
- È meglio leggere un documento di 5 pagine piuttosto che ispezionare LOC 10 / 20K per estrapolare una regola (che potresti capire erroneamente, BTW), senza dubbio.
- È ironico che qualcuno che ha scritto molti libri sui principi di progettazione e lo stile di programmazione stia suggerendo che non dovresti scrivere le tue linee guida, non è meglio se ci scaricasse con alcuni esempi di codice? No, perché le linee guida scritte non solo ti dicono cosa fare ma anche altre due cose di cui manca il codice: cosa non fare e ragioni per farlo o no.
"Programmazione auto-organizzata gratuita" è un bene per un ragazzo ninja di 16 anni, ma le organizzazioni hanno altri requisiti :
- La qualità del codice deve essere garantita (e definita) a livello aziendale - non è qualcosa che può decidere un singolo team. Potrebbero anche non avere le competenze per decidere cosa c'è di meglio (quanti sviluppatori, ad esempio, hanno tutte le competenze necessarie per rivedere MISRA o anche semplicemente comprendere ogni regola?)
- I membri possono essere spostati in team diversi: se tutti seguono gli stessi standard di codifica, l'integrazione è semplice e meno soggetta a errori.
- Se un team si auto-organizza, gli standard si evolveranno nel tempo quando i membri del team cambiano - avrai quindi una base di codice enorme che non segue gli standard attualmente accettati .
Se stai pensando alle persone prima del processo, posso solo suggerire di leggere su TPS: gli esseri umani sono una parte centrale di Lean ma le procedure sono altamente formalizzate.
Naturalmente una piccola organizzazione con un solo team può lasciare che il team decida gli standard da adottare, ma deve essere scritto. Qui su Programmers.SE puoi leggere i post di Eric Lippert: suppongo che siamo tutti d'accordo che è uno sviluppatore esperto, quando ha lavorato per Microsoft ha dovuto aderire alle linee guida scritte (anche se alcune regole potrebbero essere errate , non applicabili o inutili a lui.) E Jon Skeet? Le linee guida di Google sono piuttosto rigide (e molte persone non sono d'accordo con loro) ma deve aderire a tali linee guida. È irrispettoso per loro? No, probabilmente hanno lavorato per definire e migliorare tali linee guida, una società non è composta da un membro (o una squadra) e ogni squadra non è un'isola .
Esempi
- Hai deciso di non utilizzare l'ereditarietà multipla e le classi nidificate in C ++ perché i membri effettivi del team non lo comprendono bene . Successivamente qualcuno che desidera utilizzare l'ereditarietà multipla deve esplorare l'intero 1M LOC per vedere se è mai stato utilizzato. È negativo perché se le decisioni di progettazione non sono documentate, è necessario studiare l'intera base di codice per capirle. E anche allora, se non è stato usato, è perché è contro lo standard di codifica, o è permesso, ma non c'erano situazioni precedenti in cui l'ereditarietà multipla era adatta?
- In C # c'erano metodi sovraccarichi per fornire parametri predefiniti perché la base di codice è stata avviata quando i parametri opzionali non erano disponibili in C #. Quindi hai cambiato e hai iniziato a usarli (refactoring del vecchio codice per usarli ogni volta che dovevi modificare tali funzioni). Anche più tardi hai deciso che i parametri opzionali sono sbagliati e inizi a evitare di usarli. Qual è la regola che ti dice il tuo codice? È un male perché lo standard si evolve ma la base di codice è più lenta da evolvere e se è la tua documentazione allora sei nei guai.
- Jon si è trasferito dalla squadra A alla squadra B. Jon deve imparare un nuovo standard; durante l'apprendimento probabilmente introdurrà bug più sottili (o, se fortunato, impiegherà molto tempo a capire il codice esistente e ad allungare la revisione del codice).
- Il team A passa a una base di codice precedentemente di proprietà del team B. Ha standard di codifica completamente diversi. Riscrivere? Adattare? Mescolare? Sono tutti ugualmente cattivi.
Zio Bob
Lasciateli evolvere durante le prime iterazioni.
È vero, fino a quando non si dispone di uno standard e l'organizzazione non ha assegnato il compito di crearne uno.
Lascia che siano specifici del team anziché specifici dell'azienda.
No, per tutte le ragioni spiegate sopra. Anche se pensi di formalizzare solo la formattazione del codice (la cosa meno utile che potresti voler formalizzare) ho ancora memoria di guerre infinite (e inutili) sulla formattazione. Non voglio viverli ancora e ancora, impostalo una volta per tutte.
Non scriverli se puoi evitarlo. Piuttosto, lascia che il codice sia il modo in cui vengono catturati gli standard.
No, per tutte le ragioni spiegate sopra (ovviamente a meno che non riformatterai tutto il codice in un colpo solo quando cambieranno le linee guida). Vuoi lasciare il tuo codice così com'è? Come si ispeziona la base di codice per comprendere le linee guida attuali ? Ricerca per età dei file e adattamento del tuo stile di codifica all'età dei file di origine?
Non legiferare sul buon design. (es. non dire alle persone di non usare goto)
È vero, le linee guida devono essere brevi o nessuno le leggerà. Non ripetere l'ovvio.
Assicurati che tutti sappiano che lo standard riguarda la comunicazione e nient'altro.
Non solo, un buon standard riguarda la qualità a meno che non si desideri avere uno standard solo per dettagli minori .
Dopo le prime iterazioni, riunisci la squadra per decidere.
Vedi il primo punto e non dimenticare che uno standard di codifica è di solito un processo che ha richiesto molti anni per essere sviluppato e perfezionato: poche iterazioni, forse con sviluppatori junior? Veramente? Vuoi fare affidamento sulla memoria di un membro senior (se presente)?
Tre note:
- A mio avviso gli svantaggi sono più gravi in alcuni linguaggi rispetto ad altri, ad esempio in C ++ uno standard a livello aziendale è ancora più necessario che in Java.
- Questo ragionamento potrebbe non essere del tutto applicabile (e le ragioni di zio Bob potrebbero essere meno estreme ) se lavori in una società molto piccola in cui hai solo una piccola squadra.
- Sei assunto (come squadra) e lavorerai da solo con un nuovo progetto, poi lo dimenticherai e andrai avanti. In questo caso si potrebbe non si cura (ma il tuo datore di lavoro dovrebbe ...)