Perché lo zio Bob suggerisce che gli standard di codifica non dovrebbero essere scritti se si può evitarlo?


145

Mentre stavo leggendo questa domanda , la risposta più votata citava lo zio Bob sugli standard di codifica , ma ero confuso da questo suggerimento:

  1. Non scriverli se puoi evitarlo. Piuttosto, lascia che il codice sia il modo in cui vengono catturati gli standard.

Mi rimbalzò nel cervello, ma non riuscivo a trovare un posto dove restare. Se una nuova persona si unisce al team o cambia gli standard di codifica, non potrebbe esserci confusione di informazioni?

Perché non dovrei scrivere uno standard di codifica?


47
Hmm. Sto cercando di immaginare come funzionerebbe in una grande azienda multinazionale con centinaia di sviluppatori e una base di codice che dura da decenni.
Matthew James Briggs,

31
@MatthewJamesBriggs: funziona almeno quanto uno standard scritto che la maggior parte degli sviluppatori ignora, o che aveva un contenuto diverso al momento della scrittura iniziale del codice.
Doc Brown,

7
@MatthewJamesBriggs: d'accordo. La guida di stile dovrebbe contenere informazioni sufficienti per riconoscere le convenzioni precedenti che ora sono deprecate, altrimenti la cultura del "copia lo stile esistente" troverà un po 'di orrore di 10 anni per risorgere. Inoltre, quando si formano casualmente delle cricche che utilizzano campioni diversi e incompatibili per dedurre lo stile ufficiale, la guida di stile scritta dice chi di loro ha ragione (o idealmente, impedisce la formazione della cricca in primo luogo). E se alcune delle tue centinaia di sviluppatori non leggono documenti, in una grande azienda puoi semplicemente licenziarli per una grave muppetria.
Steve Jessop,

14
Anche se per essere onesti, Bob ha anche detto che non dovresti avere uno standard di codifica a livello aziendale in primo luogo, scritto o non scritto. Piuttosto, ogni squadra / cricca dovrebbe sviluppare la propria.
Steve Jessop,

37
Invece di scrivere un documento che nessuno leggerà, usa una linter che impone il codice in un certo modo. Se fa parte del processo di sviluppo, è inevitabile.
Seiyria,

Risposte:


256

Ci sono alcuni motivi

  1. Nessuno legge documentazione.
  2. Nessuno segue la documentazione anche se la legge.
  3. Nessuno aggiorna la documentazione anche se la legge e la segue.
  4. Scrivere un elenco di pratiche è molto meno efficace della creazione di una cultura.

Gli standard di codifica non riguardano ciò che le persone dovrebbero fare, ma ciò che realmente fanno. Quando le persone si discostano dagli standard, questo dovrebbe essere raccolto e modificato attraverso un processo di revisione del codice e / o strumenti automatizzati.

Ricorda, il punto fondamentale degli standard di codifica è rendere le nostre vite più facili. Sono una scorciatoia per il nostro cervello in modo che possiamo filtrare le cose necessarie dalle cose importanti. È molto meglio creare una cultura di revisione per far valere questo piuttosto che formalizzarlo in un documento.


11
E se vuoi far rispettare le cose, dovresti avere una fase del processo di costruzione che le impone, non una guida di stile che lo faccia.
Wayne Werner,

31
Non hai davvero un documento standard, ma urli alla gente per le prime settimane ad ogni revisione del codice? Sembra che ti aspetteresti fondamentalmente dai principianti di decodificare le tue guide di stile di programmazione. O è più un ipotetico "Penso che sia quello che intendeva dire"? Ora, se si tratta di strumenti automatici che applicano tali regole - concordato, è essenziale. Ma non voglio dover faticosamente capire le regole.
Voo,

13
@Voo, perché ritieni di aver bisogno di urlare durante una revisione del codice in caso di problemi?
Jaap,

20
@Jaap Pensavo che l'iperbole fosse ovvia ... apparentemente no. Non urlare contro le persone, ma dire loro che devono tornare indietro e sistemare tutte le cose che hanno violato perché non potevano sapere meglio.
Voo,

5
@Voo: non è necessario "invertire le guide di stile di codifica". Le convenzioni dovrebbero essere evidenti quando si guarda al codice esistente. Tutto ciò che non salta immediatamente all'occhio è insolito o addirittura non riparato. Nel caso in cui ci siano delle regole davvero importanti su qualcosa che si verifica raramente, potrebbe valere la pena discuterne con i nuovi sviluppatori, quando sono loro che devono scrivere tale codice. La comunicazione non può essere sopravvalutata.
Holger,

112

C'è un'altra interpretazione. Non credo sia lo zio Bob, ma vale la pena considerarlo.

Non acquisire standard di codifica in un documento. Catturalo nel codice, avendo un processo automatizzato che verifica il rispetto degli standard .

Non fare affidamento sulle persone che fanno riferimento a un documento, ma allo stesso tempo, non fare affidamento sulle persone che interpretano il codice già esistente e identificano ciò che è convenzionale e ciò che è coincidenza.

Incorporare qualcosa come Checkstyle nella build di commit. Questo può far rispettare le regole di base come la formattazione e gli standard di denominazione, e quindi piuttosto che spendere uno sforzo mentale nel considerare lo stile, che possono essere tutti scaricati in un processo stupido che almeno è garantito per essere accurato.

Se è importante, allora definisci rigorosamente ciò che vuoi e fallisci se è sbagliato.


6
In realtà, sospetto che qualcosa del genere facesse almeno parte del ragionamento di zio Bob per il suggerimento. L'automazione degli standard di codifica si affianca ai test automatizzati come un modo utile per migliorare la qualità, e sono sicuro che Bob sappia che ...
Jules

10
Vale la pena menzionare la regola n. 6: After the first few iterations, get the team together to decide.con solo la regola n. 3 sembra che non stia sostenendo nessuno standard di codifica, ma quando si considerano tutte le regole insieme, e soprattutto il n. 6, sembra che stia davvero dicendo: "Non forzare inizialmente uno standard di codifica. Lascia che si sviluppi organicamente, e dopo un po 'siediti con la tua squadra per approfondire i dettagli. " Che è molto diverso da "Non formalizzare il tuo standard di codifica" (che sembra essere l'essenza di molte risposte).
Shaz,

Se leggi gli articoli penso che scoprirai che questo non è certamente quello che intendeva dire, per esempio questo da solo dovrebbe dirti qualcosa: 2. Lascia che siano specifici del team invece che specifici dell'azienda.
Bill K,

Si noti che sto rispondendo alla domanda "Perché non dovrei scrivere uno standard di codifica" - non "Cosa significava zio Bob"? Ciò potrebbe essere contrario al titolo della domanda, ma non al suo spirito.
Tom Johnson,

Si noti che un sistema di formato di codifica automatizzato che non fornisce una clausola di escape (dove posso disattivarlo per una sezione di codice) sarà quasi sicuramente un malware a un certo punto.
Yakk,

66

Le persone trascurano il vero scopo di un documento sugli standard di codifica, che è quello di risolvere le controversie .

La maggior parte delle decisioni nello standard di codifica avrà solo un effetto molto minore sulla leggibilità e sulla produttività. Soprattutto se si adotta lo stile "normale" per il linguaggio e i progettisti del linguaggio stanno iniziando a rendersi conto che questo dovrebbe far parte delle specifiche (ad es. Go).

Perché sono così banali, gli argomenti possono essere davvero accesi e continuare all'infinito, danneggiando la produttività e la coesione del team. Oppure puoi oscurare la tua storia di cambiamento con una riformattazione infinita tra due o più stili preferiti di due persone.

Avere uno standard scritto pone fine all'argomento. I manager possono indicarlo e deviare l'insoddisfazione verso il documento. Puoi discutere con un pezzo di carta ma non ti ascolterà.

(Vedi anche The Tyranny of Structurelessness )


19
Questo è incredibilmente importante per i team che si occupano di codice legacy. Soprattutto quando si passa dal codice seguendo un set di standard (o non seguendo alcun standard) a un altro. Senza una linea guida a cui fare riferimento, è impossibile dire quale stile di codice seguire quando ci sono più stili già presenti nella base di codice. Penso che il consiglio di non scrivere gli standard sia rivolto a team molto piccoli che lavorano su progetti greenfield senza turnover del rischio - un caso molto raro, nella mia esperienza.
thomij,

4
È molto più importante accettare uno standard, piuttosto che i contenuti effettivi dello standard. Puoi abituarti a qualsiasi stile se lavori abbastanza a lungo.
Mark Ransom,

3
Discutere di banalità è un segno di incompetenza, IMHO. La risoluzione della controversia concreta non risolverà il problema di fondo.
Jørgen Fogh,

1
Sì, la risoluzione delle controversie e il mantenimento della cronologia delle modifiche non inquinata sono entrambi enormi, soprattutto quando si dispone di un mix di sviluppatori OCD e non-OCD nel proprio team. Tuttavia, ho trovato che gli standard scritti sono arbitri molto meno efficaci di strumenti automatizzati come StyleCop, che stabiliscono la legge senza renderla personale o perdere tempo per i manager.
Eric Hirst,

12
"Discutere sulle banalità è un segno di incompetenza" - Vorrei che ciò fosse vero nell'ingegneria del software ... Temo che alcuni sviluppatori molto, molto competenti (almeno tecnicamente) siano esattamente le persone a cui piace di più discutere delle banalità. Diavolo, è il loro sport nazionale. "Infiniti sono gli argomenti dei maghi" -Ursula Le Guin
Spike0xff

21

Perché i commenti sono bugie .

Lo standard di codifica è un grande commento su ciò che dovrebbe essere il codice. Il codice stesso è l'ultima fonte di verità. La verità in questo caso non è il comportamento del codice, è lo stile in cui è espressa. Se i tuoi standard non sono già riflessi nel tuo codice, hai molto lavoro da fare.

Lo zio Bob vede un commento come un fallimento personale del programmatore, perché dimostra che non è riuscito a esprimere lo scopo del frammento di codice con il linguaggio di programmazione stesso. Allo stesso modo, un documento standard non è in grado di esprimere uno stile coerente nella base di codice.

I nuovi programmatori dovrebbero passare il tempo a guardare il codice, non passare giorni a leggere un documento sugli standard multi-capitolo (ho dovuto farlo, sospiro).

Un documento sugli standard non è una cattiva idea, ma sono stato in negozi di programmazione in cui mantenere i documenti sugli standard era il lavoro a tempo pieno di qualcuno. Per favore, se devi conservare un documento standard, conservalo in una pagina. Ma se hai già il codice, nessuno dovrebbe essere in grado di mettere insieme lo stesso documento in meno di un giorno?

Avere standard di codice è importante. Avere un documento che detta ciò che sono non lo è.


22
In realtà ho sperimentato la base di codice pluridecennale con la politica "nessun commento"; mentre incoraggia nomi di metodi descrittivi molto lunghi, è assolutamente terribile nel catturare l'intento, le ragioni per non fare le cose, e ce la caviamo solo avendo uno degli autori originali ancora con noi.
pjc50,

7
+1 "Avere standard di codice è importante. Avere un documento che determina ciò che sono non lo è." Bene e in breve.
David,

4
@ pjc50 Non ho mai sentito zio Bob incoraggiare una politica senza commenti. Non insegna che non dovresti mai commentare. Insegna che dovresti sentirti male quando scopri che devi farlo per essere compreso. Codice non leggibile <illeggibile commentato <codice leggibile che non necessita di commenti. Nota che i commenti che menzioni sono quelli completamente disaccoppiati su COME funziona il codice. I documenti degli standard possono trasformarsi in una lista di controllo del cervello morto che viene spuntato in una revisione del codice. L'importante non è che tu abbia tutte le zecche. È che le persone al tavolo capiscono il tuo codice.
candied_orange

3
"I nuovi programmatori dovrebbero passare il tempo a guardare il codice, non passare giorni a leggere un documento sugli standard multi-capitolo". Non hai idea di quali guide di codifica segui, ma la guida di stile C ++ di Google può essere letta facilmente in meno di un'ora ed è molto più facile da capire che dover decodificare lo stile preferito in base al codice esistente (che suona chiaramente orribile per me). Lo stesso vale per ogni altra guida di stile che abbia mai letto.
Voo,

5
@CandiedOrange: spesso, i commenti più utili sono quelli che descrivono il motivo per cui alcune cose non sono state fatte [poiché in assenza di tali commenti, i futuri programmatori possono perdere tempo a cercare di implementare e ritirare successivamente "miglioramenti" apparentemente ovvi per essere impraticabile]. A meno che uno non impazzisca con i nomi delle variabili, non c'è modo che anche il codice più brillantemente leggibile possa catturare tali informazioni.
supercat,

16

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 ...)

5
Ho annullato il voto perché ritengo che la risposta sia fuori tema rispetto alla domanda, motivo per cui tu (e in particolare lo zio Bob) dovresti scrivere uno standard di codifica , non perché dovresti. Penso che tutti capiscano i vantaggi di avere uno standard scritto, ma i lati negativi sono più difficili da determinare e quando un anziano del settore rispettato esce con una posizione che si oppone alla solita pratica nel settore, esaminando perché è certamente una cosa utile da fare.
Jules,

5
@gnat grazie, non ho bisogno di voti positivi per i post fuori tema, non è "Perché il signor X ha fatto Y?" fuori tema in questo caso? Non conosciamo le sue ragioni e non le ha spiegate, allora la domanda non dovrebbe essere chiusa come fuori tema? In che modo si rispondere a questa domanda? Inventare ragioni casuali o dire che la premessa è sbagliata?
Adriano Repetti,

1
@AdrianoRepetti - Lo zio Bob ha fatto molte spiegazioni nel corso degli anni, quindi è ragionevole considerare che qualcuno potrebbe avere qualche idea sul suo modo di pensare, ma hai ragione se è richiesta l'interpretazione diretta dello zio Bob.
JeffO,

3
@jeff sì, se la domanda riguarda "perché la pensa così" la risposta è solo un'ipotesi. Se la domanda è "è giusto?" allora la mia risposta personale è assolutamente no.
Adriano Repetti,

1
"quando ha lavorato per Microsoft ha dovuto aderire alle linee guida scritte" - scommetti che l'ho fatto. E ovviamente abbiamo fatto uso di FXCop e StyleCop per evitare che alcuni modelli cattivi non venissero mai registrati.
Eric Lippert,

12
  1. Per essere utile uno standard di codifica non deve parlare di questioni sostanziali; solo questioni di stile. Dovrebbe specificare solo quelle cose che sono arbitrarie e ambigue. ad es. posizionamento parentesi graffa, profondità di rientro, spazi vs schede, convenzioni di denominazione, ecc.
  2. I problemi di stile sono locali, non globali. Ogni squadra dovrebbe adottare il proprio stile peculiare, adeguato al proprio compito e alla propria personalità. Ciò mantiene gli standard semplici e leggeri. Gli standard aziendali diventano sovraccarichi di tutte le possibili considerazioni, configurazioni ed eccezioni.
  3. All'interno di un team, l'unico motivo per scrivere un documento di stile di codifica separato è se il codice prodotto dal team non soddisfa lo standard. Nel qual caso non hai standard. Per essere efficace, lo standard dovrebbe essere espresso dal codice stesso. E se è così, non è necessario un documento separato.
  4. Nei sistemi legacy i team e gli stili cambiano nel tempo. Non c'è niente di sbagliato in questo. Il vecchio codice avrà uno stile più vecchio. Il codice più recente avrà uno stile più recente. Il team dovrebbe essere consapevole degli stili e della loro età. Ogni volta che viene scritto un nuovo codice, dovrebbe essere nel nuovo stile, indipendentemente da dove si trova il codice.

Ho poche perplessità: 1) per essere utile uno standard di codifica non dovrebbe parlare solo di formattazione (questione di guerre sante ma codice di lettura facile da capire) ma costruisce per evitare, schemi di codifica (per prevenire errori comuni, linguaggio non facile da capire caratteristiche) e problemi di sicurezza. Queste sono le linee guida per la codifica (più utili dei problemi di formattazione). 2) Vista la premessa del punto 1, non si tratta di personalità (ma può riguardare compiti ), è possibile avere uno standard aziendale leggero, è proprio dovere renderlo leggero.
Adriano Repetti,

3) Il codice può dirti cosa fare ma non può trasmettere ciò che non dovresti fare (a meno che tu non voglia studiare l'intera base di codice e anche in quel caso ... semplicemente non hai dovuto usare il costrutto X o è un no-no?) Un'altra cosa importante è il ragionamento: perché no? e perché si? Le cose possono cambiare nel tempo, ma come fai a sapere se i locali iniziali sono ancora validi? 4) e quando sei un nuovo membro del team e scrivi un nuovo codice ... studi la base di codice con la stessa età per mantenere quello stile di codifica? Il giorno dopo ti sposti su un altro componente più recente e studi di nuovo la base di codice (filtrando per data di creazione?)
Adriano Repetti,

A proposito se, invece, suggerisci di non scrivere solo stili di formattazione del codice, allora potrei essere d'accordo (beh, in realtà no ma con ragioni non così forti oltre a ricordi di discussioni infinite e inutili che inevitabilmente sorgeranno ogni volta - e che una linea guida aziendale eviteremo una volta per tutte) tuttavia dovresti chiarire le cose o le persone interpreteranno le tue parole in modo troppo letterale (vedi la maggior parte delle risposte + commenti qui). Anche quel punto su "goto" è un po 'fuorviante in questo senso (IMO)
Adriano Repetti,

4

Perché non dovrei scrivere uno standard di codifica?

Ci sono molte ragioni per questo. Ecco alcune considerazioni:

  1. Quanto tempo impiegano le persone a "apprendere" gli standard di codice solo per avere un sacco di tempo in tutto il team per rivedere, discutere, documentare, rivedere ... ecc. Gli standard di codice. È come discutere costantemente del tuo "Manuale per i dipendenti" - con che frequenza lo iscrive all'ordine del giorno di una riunione di gruppo ??

  2. Quando un progetto viene rimborsato / accantonato / ecc. quindi le poche persone che rimangono di solito non possono continuare ad aderire (o forse non hanno nemmeno letto) gli standard. La prossima cosa che sai, tutto quello sforzo per "mantenere pulito il codice" è stato praticamente sprecato comunque.

  3. Se il progetto si blocca o viene introdotto un nuovo lead, è molto probabile che la persona ignori totalmente le regole precedenti e voglia farlo in un modo nuovo. Ancora una volta, cosa è stato ottenuto codificando gli standard ??

Dovresti essere sicuro di leggere # 6:

Dopo le prime iterazioni, riunisci la squadra per decidere.

In altre parole, quando è il momento di avviare un progetto, segui il flusso per un po '. Quindi discuti le regole generali degli standard di codifica che il team attuale sta usando e sostanzialmente seguili. In questo modo, si massimizza lo sforzo per migliorare il prodotto minimizzando allo stesso tempo lo sforzo necessario per scrivere, rivedere e documentare lo "zucchero sintattico" che è stato impiegato per ottenere il codice eseguibile.

Pochissimi team traggono enormi vantaggi dagli standard di codifica. Di solito, la "leggibilità" è troppo vaga - e la maggior parte degli sviluppatori non beneficia molto delle regole esatte su spaziatura, nuove linee, ecc. Ma puoi evitare gli sviluppatori costantemente fastidiosi avendo almeno alcune regole.


4

Un'altra risposta che non credo sia stata dichiarata abbastanza chiaramente è che significa anche che le persone non seguono ciecamente le regole. Significa che le persone devono trovare giustificazioni effettive per le loro decisioni di progettazione e le convenzioni di codifica, piuttosto che dipendere dal fatto che è stato scritto per giustificarlo.


4

In primo luogo, per quanto ne so, lo zio Bob è una persona Java, questo è molto importante per capire cosa dice.

Quando lavoro in un team Java o C #, se il codice attuale è stato scritto da sviluppatori esperti, è facile per me imparare lo stile di programmazione e tenerlo aggiornato. Se non sono disposto a farlo, forse non ero la persona giusta per il lavoro ... Se non ci sono revisioni del codice o coppie di programmazione per venirmi a prendere quando non seguo lo stile, allora l'azienda ha un problema più grande rispetto al modo in cui nomina i campi membro!

Sia Java che C #, insieme alla maggior parte dei linguaggi moderni, sono stati definiti in modo che ci siano poche trappole "semplici" in cui cadere un programmatore.

Tuttavia, quando ho iniziato a programmare stavo usando C (e successivamente C ++). In C puoi scrivere codice come

if (a = 3);
{
   /* spend a long time debugging this */
}

Il compilatore non genererà un errore, ed è difficile da individuare quando si legge un sacco di codice. Tuttavia, se scrivi:

if (3 = a)
{
   /* looks odd, but makes sense */
}

Il compilatore dà un errore ed è facile cambiare il codice in 3 == a. Allo stesso modo, se lo standard di codifica non consente =di essere utilizzato in una ifcondizione o " ifistruzione vuota ", è possibile utilizzare un correttore di codice come parte del sistema di generazione per tenere traccia di questo errore.

Le mie opinioni sugli standard di codifica sono cambiate notevolmente quando mi sono allontanato da C / C ++: mi piacevano gli standard di codifica rigorosamente applicati e lunghi in molte pagine. Ora penso che devi solo elencare gli strumenti utilizzati e ottenere un accordo informale tra i membri del team originale su alcune convenzioni di denominazione. Non viviamo più in un mondo di team di oltre 30 sviluppatori che scrivono applicazioni in C / C ++ ...

C'è una ragione per cui non mi è mai piaciuto JScript e penso che TypeScript sia la cosa migliore da anni nello sviluppo web. Mi aspetto che gli sviluppatori dell'interfaccia utente Web abbiano ancora bisogno di standard di codifica a causa di difetti nella progettazione di HTML / CSS / JScript ecc.


4
"Il compilatore non genererà un errore" la maggior parte dei compilatori C e C ++ moderni supporta la segnalazione di tale comportamento con avvisi o, se desiderato, errori completi. gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
JAB

2
"In primo luogo per quanto so che lo zio Bob è una persona Java, questo è molto importante per capire cosa dice", non è vero, lo zio Bob ha scritto articoli fantastici su C ++ e sicuramente ha lavorato diversi anni anche con C.
Alessandro Teruzzi,

@JAB, per fortuna C / C ++ ha smesso di essere utilizzato per le nuove "applicazioni aziendali" molto tempo fa (ad esempio prima dei compilatori C / C ++ per modem), e ora è utilizzato principalmente solo da esperti C / C ++, piuttosto che da persone che sono esperti dell'interfaccia utente (MFC) ad esempio.
Ian,

1
@AlessandroTeruzzi Un unit test ti dirà che un metodo sta fallendo. Perché fallire è una questione diversa: anche se avessi dei test unitari per un metodo con quel tipo di codice, faresti davvero fatica a cercare di scoprire cosa non va. Il C ++ è uno dei linguaggi più punitivi per il debug.
T. Sar,

2
Penso che ci sia un malinteso qui, non puoi prendere una sola frase di UncleBob e analizzarla da sola. Se si dispone di software SOLID con classi di piccole dimensioni, metodo breve e copertura del test dell'unità antiproiettile, lo standard di codifica è ridondante. Se hai un codice debole, un'interfaccia enorme, grandi funzioni e poca copertura, lo standard di codifica può darti qualche vantaggio. Ma UncleBob non sta suggerendo di non averne uno, ma di diffonderlo verbalmente con collaborazione e refactoring (rimuove il codice debole dalla base di origine). Rendi il tuo codice lo standard di codifica vivente.
Alessandro Teruzzi,

3

Avere la fonte come standard di codifica autocompattante implica due cose.

  1. Le persone devono consultare la base di codice ed esaminarla per diventare collaboratori competenti. Questo è incredibilmente importante. La lettura delle linee guida per la codifica è una perdita di tempo rispetto all'immersione nella base di codice.
  2. Ammette che differenze minori non sono importanti. È importante concordare e comprendere i principi di base. Mantenere uno stile coerente non è perseguito come l'arte per l'arte. Non consente ai nitpicker non creativi di infastidire e distrarre altre persone. Si tratta di facilitare la comunicazione attraverso il codice in un team.

2

Un documento di standard di codice frequentemente aggiornato e ben scritto può essere molto utile, ma di solito non è così. Il documento sugli standard non riflette gli attuali standard di codifica utilizzati dall'azienda poiché è molto difficile creare un documento di standard buono e ancor più difficile mantenerlo aggiornato.

Invece di avere un documento sugli standard di codifica scadente e fuorviante, è meglio non averne nessuno e lasciare che il codice stesso rappresenti tali standard. In entrambi i casi, la parte più importante è applicare gli standard nel codice e ciò richiede molto più di un semplice documento. Motivazione, processi, corsi di formazione, strumenti, ecc. Sono molto più importanti.


2

Una cosa molto importante che non è stata dichiarata abbastanza chiaramente è che gli standard di codifica sono come il linguaggio: si evolvono. Uno standard di codifica scritto si oppone a questo, e se non lo fa è continuamente obsoleto e inutile.

Non avere uno standard di codifica inchiodato non è poi così male. Se esegui revisioni tra pari al momento del check-in, ogni volta che qualcosa che non è conforme allo standard di codifica entra nel repository, ciò significa che 2 persone ci hanno pensato * e hanno deciso che il vantaggio di questa variazione supera l'incoerenza con il resto del codice.

Non avere uno standard scritto rimuove anche la burocrazia che impedirebbe a un team di un'azienda di provare una nuova variante dello standard di codifica per un nuovo progetto, sia perché vogliono provare qualcosa, o forse perché uno standard diverso ha applicazioni pratiche su alcuni degli strumenti automatizzati che usano.

La redazione di uno standard ha la tendenza a rimuovere una maggiore flessibilità rispetto a quanto inizialmente previsto, pur occupando un bel po 'di tempo che potrebbe essere speso a fare altre cose. Non sto dicendo che non dovresti mai scrivere gli standard di codifica, gli standard scritti hanno certamente i loro vantaggi, specialmente se i team che lavorano in diverse località lavorano sulla stessa base di codice.

Fortemente correlato: evoluzione degli standard di codifica, come li gestisci?


* Se le persone non pensano durante la revisione tra pari del codice al momento del check-in, i tuoi problemi sono molto più grandi dei semplici standard di codifica.


1

Cambiarli diventa un grosso ostacolo e le persone aderiranno in modo sicuro alla lettera della legge anziché impegnare il cervello e fare la cosa giusta.

Verrà un giorno in cui parte dello standard non sarà utile e peggiorerà il codice. Alcune persone aderiranno allo standard, perché è scritto e sono al sicuro, e perché le regole sono lì per essere seguite. Le persone che vogliono scrivere un buon codice piuttosto che un codice conforme allo standard saranno frustrate e arrabbiate. Ci saranno argomenti e disaccordi, mentre se lo standard non fosse scritto, ci sarebbero esplorazione e discussione.


0

Penso che molti post qui stiano confondendo lo standard di codifica con la guida di stile .

Accertarsi che i moduli sviluppati da team diversi abbiano le stesse opzioni di compilatore e ABI è una cosa diversa da quanti spazi sono rientrati.

Cose come il modo corretto di strutturare i file #include e di non inquinare lo spazio dei nomi globale in un file di intestazione devono essere documentati in modo che possano essere usati come checklist durante la codifica iniziale e le revisioni del codice.

In particolare "non usare XXX perché causa problemi di compatibilità con YYY" non è qualcosa che vedresti nell'esempio nel seguire altri codici, poiché non è presente. Quindi, lascia che il codice sia il modo in cui vengono catturati gli standard potrebbe non essere chiaro o completamente mancante per alcuni tipi di standard, e quindi questo non può essere un piano universale.

Qualcosa di gravemente pervasivo e importante come non usare eccezioni o non usare newin alcuni sistemi embedded non può essere semplicemente lasciato alla conoscenza della cultura comune, poiché "l'informazione è (solo) culturale" contraddice i principi fondamentali degli standard di produzione come ISO-9000, che il lo sviluppatore di questi sistemi embedded sta utilizzando (ad es. per applicazioni automobilistiche). Queste cose importanti devono essere documentate, firmate e archiviate in modo formale.

Questo vale per la codifica , non per lo stile .

Gli inventori di C e C ++ mostrano, ad esempio, l'uso di nomi in minuscolo e non di CaMelCaSe. Quindi perché così tanti sviluppatori non seguono l'esempio implicito della fonte? Lo stile della biblioteca standard e i materiali didattici canonici non dovrebbero essere lo stile implacito da seguire?

Nel frattempo, le persone fanno seguire l'esempio delle intestazioni libreria standard per le cose che non dovrebbero essere copiati, come l'uso di __Uglynomi per i parametri macro e la comprendono file di pattern non ripetizione.

Quindi avere cose spesso non è visto come uno stile importante, o al contrario avere esempi potrebbe non essere chiaro su cosa non dovrebbe essere seguito nel codice del progetto. Entrambi sono controesempi alla tesi secondo cui lo "stile" (o convenzioni di codifica) è meglio lasciare implicito.

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.