Cosa dovrebbe sapere ogni programmatore sulla programmazione?


52

Per favore, rimani su questioni tecniche , evita comportamenti, problemi culturali, di carriera o politici.



Questo tipo di domanda mi dà davvero fastidio. Può solo nascere dalla mente di qualcuno che vede il mondo in termini di bianco e nero. Non tutti i programmatori hanno lo stesso lavoro e se è il minimo comune denominatore che stai cercando, le risposte che seguono mostrano che finisci con un elenco di animali domestici.
Captain Sensible,

Risposte:


92
  1. Il bug è nel tuo codice, non nel compilatore o nelle librerie di runtime.

  2. Se vedi un bug che non può accadere, controlla di aver compilato e distribuito correttamente il tuo programma. (Soprattutto se stai usando un IDE complicato o un framework di build che cerca di nasconderti i dettagli disordinati ... o se la tua build comporta molti passaggi manuali.)

  3. I programmi simultanei / multi-thread sono difficili da scrivere e più difficili da testare correttamente. È meglio delegare il più possibile a librerie e framework concorrenti.

  4. Scrivere la documentazione fa parte del tuo lavoro come programmatore. Non lasciarlo fare a "qualcun altro".

MODIFICARE

Sì, il mio punto n. 1 è sopravvalutato. Anche le migliori piattaforme applicative progettate hanno la loro parte di bug, e alcune di quelle meno ben progettate sono piene di loro. Tuttavia, dovresti sempre sospettare prima il tuo codice e iniziare a incolpare i bug del compilatore / libreria solo quando hai prove chiare che il tuo codice non è in errore.

Nei giorni in cui ho fatto lo sviluppo di C / C ++, ricordo casi in cui i presunti "bug" dell'ottimizzatore si sono rivelati essere dovuti a me / qualche altro programmatore che ha fatto cose che le specifiche del linguaggio dicono che hanno risultati indefiniti. Questo vale anche per linguaggi apparentemente sicuri come Java; ad es. dare una lunga occhiata al modello di memoria Java (JLS capitolo 17).


17
Preferisco dire "Il bug è probabilmente nel tuo codice", dal momento che ho riscontrato alcuni bug nelle librerie di runtime alcune volte. Devo ancora imbattermi in un bug del compilatore. +1 comunque.
Chinmay Kanchi,

29
Se non hai mai trovato un bug in buona fede nel compilatore, non sei abbastanza avventuroso con la tua codifica. ;)
Mason Wheeler,

8
@Chinmay, @ spudd86, @Mason - sì ... e ho anche trovato la mia parte di bug del compilatore e della libreria nei miei oltre 30 anni di programmazione. Ma nella mia esperienza, il 99 +% dei bug risulta (almeno in parte) colpa del mio codice. La mia risposta sopravvaluta deliberatamente questo per capire che dovresti sempre sospettare prima il tuo codice.
Stephen C,

5
Non ho la paura irrazionale che le persone hanno con la programmazione multi-thread. Sospetto che le persone che perpetuano questa visione, non programmino molto codice multi-thread. Non è poi così difficile. +1 per tutto il resto però.
Steven Evers,

4
Se stai lavorando sul compilatore, probabilmente il bug è sia nel tuo codice che nel compilatore;)
Legooolas

84
  • Come leggere il codice di altre persone.
  • Il codice non esiste se non è selezionato nel sistema di controllo versione.

8
+10000 se potessi per il commento sul controllo della versione. La cronologia e la registrazione delle modifiche sono assolutamente indispensabili e sono la ragione per cui dovresti mettere tutto sotto controllo della versione fin dall'inizio.
Legooolas,

2
... e il repository è stato sincronizzato con almeno un'altra posizione. Importante con DVCS, ma anche con VCS centralizzato.

Del resto, il codice non esiste a meno che non esista un oggetto di lavoro che autorizzi lo sviluppatore a scriverlo.
Jesse C. Slicer,

2
Ne aggiungerò uno per imparare a leggere il codice di altre persone. È più difficile che la maggior parte di noi realizzi, ma una parte essenziale di una programmazione di successo.
Bogeymin,

più uno per imparare a leggere il codice di altre persone.
itsaboutcode

76

I calcoli in virgola mobile non sono precisi.



Se qualcuno non sa di cosa sto parlando, leggi il link di @ Adam. È un eccellente riassunto delle insidie ​​del calcolo in virgola mobile.
Chinmay Kanchi,

1
E se non sanno che possono essere tra le persone che chiedono quotidianamente su StackOverflow.
Brian R. Bondy,

1
@Brian: così vero. Vorrei che ci fosse un modo per identificare le domande spiegate dall'aritmetica in virgola mobile. Puoi creare un'app Stack che visualizza ogni giorno una domanda in virgola mobile diversa!
Adam Paynter,

63

Non smettere di imparare.


1
Correlati: non smettere di credere.
Fishtoaster,

3
Correlati: non smettere di pensare a domani.
ottobre

7
Correlati: non interrompere la musica.
Adamk,

1
Correlati: non smettere di muoverti! È la tua vita, continua a muoverti, fallo bene, devi farlo bene!
ottobre

44

Che la cosa numero 1 che puoi fare per aumentare la qualità e la manutenibilità del tuo codice è RIDURRE LA DUPLICAZIONE.


4
SECCO, sì! Come posso dimenticare? ;-)
Maniero

È così importante che ho risposto di nuovo .

Preferirei dire: RIDURRE CONDIZIONALI. Ogni volta / if / for è un potenziale bug.
zvrba,

1
Sai, la cosa divertente di DRY è che si ripete dappertutto. :) +1
Billy ONeal

39

Competenze di risoluzione dei problemi e debug

A malapena trascorrono del tempo su questo argomento in nessuno dei corsi di programmazione che ho seguito, e nella mia esperienza è uno dei principali fattori determinanti della produttività di un programmatore. Piaccia o no, trascorri molto più tempo nella fase di manutenzione della tua app rispetto alla nuova fase di sviluppo.

Ho lavorato con moltissimi programmatori che eseguono il debug cambiando casualmente le cose senza alcuna strategia per trovare il problema. Ho avuto questa conversazione dozzine di volte.

Altro programmatore: penso che dovremmo provare a vedere se lo risolve.
Io: Okay, supponendo che lo risolva. Cosa ti dice su dove si trova l'origine del problema?
Altro programmatore: non lo so, ma dobbiamo provare qualcosa .


2
Stavo per pubblicare questo. Gran parte del lavoro di un programmatore consiste nel correggere i bug e molte persone tendono a non essere in grado di farlo (specialmente nel codice degli altri).
Dov

+1 Sono passato da javascript / php a C # e mi sono innamorato di passare attraverso il codice. Vorrei che le lingue tipizzate dinamicamente potessero fare un lavoro molto migliore di questo.
Evan Plaice,

Un altro strano comportamento è il programmatore che insiste sul fatto che ogni parte del suo programma è corretta mentre il risultato è difettoso. "-Non è necessario stampare l'array sulla console per verificare se è ordinato perché la riga sopra è array.sort ()." "-Beh ... sai, non funziona. Ci deve essere qualcosa di sbagliato da qualche parte. A questo punto non puoi semplicemente difendere il tuo codice!"
gawi,

2
Penso al punto di debug per convalidare i tuoi presupposti nel tuo programma. A volte, devi andare a pescare per alcuni indizi. Questo deve essere fatto sistematicamente. È perfettamente valido provare qualcosa che potrebbe dirti qualcosa di nuovo. Lo faccio spesso.
gawi,

37
  1. Non essere intelligente; essere chiaro.
  2. Utilizzare prima del riutilizzo.
  3. I nomi contano.
  4. Una funzione fa 1 cosa e lo fa bene.
  5. Piccolo è meglio di grande.

2
Puoi chiarire "Usa prima del riutilizzo". Non l'ho mai sentito prima.
Tjaart,

34

Le basi. Attualmente i programmatori apprendono le tecnologie e non i concetti. È sbagliato.


Sì e no. Sembri ogni professore che abbia mai avuto all'università ... tutti quanti non hanno mai fatto una leccata di software in tutta la loro vita. La conoscenza, senza competenze, è inutile nella nostra professione.
Steven Evers,

4
+1, così vero. Sì, questo è qualcosa che i tipi di torre d'avorio amano dire, ma non lo rende meno vero per il resto di noi nelle trincee.
MAK,

2
Nozioni di base come l'ortografia? Its wrongdovrebbe essere it's wrong, per esempio.
Konerak,

2
No, le basi come non si preoccupano di un refuso ma si preoccupano dei problemi di programmazione.
clrod

5
È facile imparare i passaggi per fare qualcosa e spesso è difficile scoprire quando dovresti usarlo e, soprattutto, quando potresti usarlo ma non dovresti. I libri di testo non sono particolarmente abili nel mostrare il come ma non il perché (e perché no).
HLGEM,

27

Ogni programmatore dovrebbe sapere che inserisce sempre delle assunzioni nel codice, ad esempio "questo numero sarà positivo e limitato", "questo codice sarà in grado di connettersi al server in un batter d'occhio".

E dovrebbe sapere che dovrebbe prepararsi per quando quelle ipotesi si rompono.


6
dichiarare specificamente quelli con assert()- ovunque. assert()ti aiuterà a documentare i tuoi presupposti e a salvarti quando sbagli.
Dustin,

@Dustin +1 Non puoi assolutamente ricordare tutte le tue assunzioni: documentale a livello di programmazione e ti verrà detto esattamente quando si rivelano ipotesi errate.
Skilldrick,

1
... a meno che non sia compilato con NDEBUG.


17

Impara i concetti . Puoi Google la sintassi.


Buono in teoria, tranne Google è terribile per trovare una sintassi specifica : cercare termini come "riferimento all'oggetto" o "questo" dato un risultato gazillion e cercare modi di dire come "$?" non dà alcun risultato.
10


14

Test unitari. Questo è un ottimo modo per codificare i tuoi presupposti su come usare il codice.



13

È più difficile di quanto pensi.

Sebbene sia facile (ish) mettere insieme qualcosa che funzioni quando usato normalmente, gestire input errati, tutti i casi limite e angolare, possibili modalità di errore ecc. Richiede tempo e probabilmente sarà la parte più difficile del lavoro.

Quindi devi anche rendere l'applicazione buona.


3
penso che questa sia la fonte del vecchio detto '90% del lavoro richiede il 90% delle volte. l'ultimo 10% impiega l'altro 90% del tempo '
GSto

Penso che molte persone tendano a sottovalutare costantemente la complessità. "Quanto X può essere difficile?" - ultime parole famose: /
Roman Starkov,

@GSto non voglio lavorare il 180% delle volte, il 100% va bene per me!
Adamk,

13

Conoscenza del dominio. Le specifiche non sono mai al 100%; conoscere il dominio effettivo con cui si sta sviluppando aumenterà SEMPRE la qualità del prodotto.



11

Puntatori, ovviamente. :)


3
I puntatori sono davvero necessari solo in un sottoinsieme di lingue per un piccolo sottoinsieme di attività. Per la maggior parte delle attività, è possibile (e si dovrebbe essere in grado di) programmare come se il concetto di puntatore non esistesse.
Chinmay Kanchi,

14
@Chinay Kanchi No. I puntatori dovrebbero essere compresi da tutti.
alternativa dal

5
Che in realtà dipende da cosa si intende per puntatore. Se intendi i puntatori in stile C che puoi manipolare (che è quello che ho assunto), direi che un programmatore Java / C # / Python non ha bisogno di sapere nulla su di essi. Se intendi un puntatore come nei "riferimenti" di Java, cioè un puntatore che non può essere manipolato, allora sì, è necessaria una certa conoscenza di essi, se non altro per impedirti di scivolare.
Chinmay Kanchi,

@mathepic Sarai scosso dal profondo se dovessi sapere quanti studenti CS si laureano ogni anno che non capiscono la prima cosa sui puntatori. Se non avessi fatto il possibile per prendere un posto ogni estate, non mi sarei nemmeno insegnato su puntatori in C o riferimenti in Java ...
Mike B

5
@Chinmay: un programmatore Python / Java / C # che non capisce il concetto di puntatori viene perso. L = [[]] * 2; L[0].append(42) Lingue diverse usano nomi diversi, ma l'indirizzamento indiretto è essenziale ovunque.

11

Codice completo 2 - da copertina a copertina


dovresti davvero saperlo prima di accettare denaro da programmare. Se trovi qualcosa che non sapevi in ​​esso, considera un cambiamento di carriera o un intenso periodo di studio auto diretto per farti capire tutto. E poi scusati con i tuoi colleghi. E copre solo le basi della programmazione.
Tim Williscroft,

11

I dati sono più importanti del codice.

Se i tuoi dati sono intelligenti, il codice può essere stupido.

Il codice stupido è facile da capire. Anche i dati intelligenti.

Quasi ogni dolore algoritmico che io abbia mai avuto è stato dovuto al fatto che i dati si trovavano nel posto sbagliato o abusavano del suo vero significato. Se i tuoi dati hanno un significato, inseriscilo nel sistema dei tipi .


2
Mi hai avuto fino a quando non hai detto "sistema di tipo".

10

Quale lingua e ambiente è più adatto per il lavoro. E non è sempre il tuo preferito.


10

Dividere e conquistare. Di solito è il modo migliore per risolvere qualsiasi tipo di problema pratico dalla pianificazione al debug.


8

La vera abilità si riflette nella capacità di eseguire bene un progetto semplice, non nella capacità di far funzionare un progetto complicato.

Questa abilità deriva da una maggiore padronanza dei fondamenti, non dalla padronanza degli arcani. Un programmatore di alto livello non è definito dalla sua capacità di codificare ciò che gli altri non possono (utilizzando funzioni di livello superiore, programmazione funzionale avanzata, what-have-you) ma piuttosto dalla loro capacità di affinare la codifica perfettamente banale. Scelta della decomposizione appropriata della funzionalità tra le classi; costruzione robusta; utilizzando tecniche di programmazione difensiva; e usando schemi e nomi che portano ad una maggiore autocertificazione, questi sono il pane e il burro della programmazione di alto livello.

Scrivere un buon codice a cui tu, o qualcun altro, potete tornare in una settimana al mese o un anno e capire come usare, modificare, migliorare o estendere quel codice è cruciale. Ti fa risparmiare tempo e fatica mentale. Unge le ruote della produttività rimuovendo i blocchi stradali su cui ti saresti imbattuto prima (forse interrompendo il tuo treno di pensieri, o forse prendendo ore o giorni di sforzo lontano da altri lavori, ecc.) Semplifica la concentrazione sui problemi difficili e a volte risolve i problemi.

In una parola: eleganza. Ogni classe, ogni metodo, ogni condizione, ogni blocco, ogni nome di variabile: ricerca dell'eleganza.


8

Non incolpare mai l'utente di ciò che potrebbe essere risolto con un'esperienza utente più pulita o una migliore documentazione. Spesso, i programmatori presumono automaticamente che l'utente sia un idiota che non può fare nulla di buono, quando il problema è una scarsa esperienza generale o mancanza di comunicazione. I programmi sono pensati per essere utilizzati e trattare l'utente con disprezzo significa in primo luogo perdere il punto della programmazione.


6

Ogni programmatore dovrebbe sapere come usare il debugger e saperlo usare bene .





4

Come stimare con precisione il tempo impiegato da una funzionalità per implementare. Ancora più importante, come comunicare che non stai cagando quando invii quella stima.


2
o impara come ospitarti bene e comunicare che non sei ospite ...;)
Billy Coover,

4

Lo stile di programmazione è importante:

  • rientri coerenti
  • uso coerente delle questioni relative agli spazi bianchi (ad esempio intorno agli operatori),
  • collocamento coerente di {} questioni,
  • gli identificatori ben scelti contano,
  • eccetera.

... e il buon design conta.

Idealmente, il programmatore impara queste cose prima (o durante) la sua prima revisione del codice. Nel peggiore dei casi, il programmatore li impara quando il capo gli dice di apportare in fretta alcune modifiche non banali a un codice orribile.

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.