Quali sono i concetti matematici fondamentali che un buon sviluppatore dovrebbe conoscere?[Chiuso]

StackOverflow https://stackoverflow.com/questions/52176

Domanda

Da quando mi sono diplomato in una scuola molto piccola nel 2006 con un programma mal strutturato e obsoleto (sono straniero e non conoscevo scuola migliore in quel momento) sono arrivato a rendermi conto che mi mancavano molti concetti di base da un prospettiva matematica e software che sono per lo più le basi di altri concetti superiori.

Cioè.Ho provato ad ascoltare/guardare il corso aperto del MIT in poi Introduzione agli algoritmi ma mi resi subito conto che mi mancavano diversi concetti matematici per comprendere meglio il corso.

Quindi quali sono i concetti matematici fondamentali che un buon ingegnere del software dovrebbe conoscere?E quali sono i possibili libri/siti che mi consiglierai?

È stato utile?

Soluzione

Matematica per programmatori.Una buona lettura.

Altri suggerimenti

L'algebra booleana è fondamentale per comprendere le strutture di controllo e il refactoring.Ad esempio, ho visto molti bug causati da programmatori che non conoscevano (o non potevano usare) la legge di deMorgan.Come altro esempio, quanti programmatori lo riconoscono immediatamente

if (condition-1) {
    if (condition-2) {
        action-1
    } else {
        action-2
} else {
    action-2
}

può essere riscritto come

if (condition-1 and condition-2) {
    action-1
} else {
    action-2
}

La matematica discreta e la combinatoria sono estremamente utili per comprendere le prestazioni di vari algoritmi e strutture dati.

Come menzionato da Baltimark, l'induzione matematica è molto utile per ragionare su cicli e ricorsione.

La teoria degli insiemi è la base dei database relazionali e di SQL.

Per analogia, vorrei sottolineare che i carpentieri utilizzano abitualmente una varietà di tecniche pratiche nella costruzione di cose come tetti e scale.Tuttavia, la conoscenza della geometria consente di risolvere problemi per i quali non si dispone di una regola empirica "preconfezionata".È come imparare a leggere tramite la fonetica anziché il riconoscimento visivo di un vocabolario di base.Oltre il 90% delle volte non c'è molta differenza.Ma quando ti imbatti in una situazione sconosciuta, è MOLTO bello avere gli strumenti per trovare da solo la soluzione.

Infine, il rigore/precisione richiesto dalla matematica è molto utile per preparare alla programmazione, indipendentemente dalla tecnica specifica.Ancora una volta, molti dei bug nella programmazione (o anche nelle specifiche) che ho riscontrato nella mia carriera hanno come causa principale la superficialità.

Sceglierei i campi indicati da Landon:

Matematica discreta, algebra lineare, combinatoria, probabilità e statistica, teoria dei grafici

e aggiungere la logica matematica.

Questo ti darebbe una presa sulla maggior parte dei campi di CS.Se vuoi entrare in campi speciali, devi immergerti in alcune aree in particolare:

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory

In ordine di importanza:

  • Conteggio (necessario per i cicli)
  • Addizione, sottrazione, moltiplicazione, divisione.
  • Algebra (necessaria solo per comprendere l'uso delle variabili).
  • Algebra booleana, logica booleana e binaria.
  • Esponenti e logaritmi (ad es.comprendere la notazione O(n)).

Qualunque cosa più avanzata di questa è solitamente specifica dell'algoritmo o del dominio.A seconda delle aree di tuo interesse, potrebbero essere rilevanti anche quanto segue:

  • Algebra lineare e trigonometria (visualizzazione 3D)
  • Matematica discreta e teoria degli insiemi (progettazione di database, progettazione di algoritmi, progettazione di compilatori).
  • Statistica (beh, per applicazioni statistiche e/o scientifico/economiche.forse utile anche per la progettazione di algoritmi).
  • Fisica (per simulazioni).

Anche comprendere le funzioni è utile (non ricordare quale sia il termine matematico per quell'area), ma se sai programmare probabilmente lo sai già.

Il mio punto è:Un bambino di dieci anni dovrebbe conoscere abbastanza matematica per poter comprendere la programmazione.Non è necessaria molta matematica per la comprensione di base delle cose.È tutta una questione di logica, davvero.

La "dimostrazione per induzione" è un concetto matematico fondamentale che i programmatori devono conoscere.

Notazione O grande nell'analisi generale degli algoritmi e in relazione alle raccolte standard (ordinamento, recupero, inserimento e cancellazione)

Per la matematica discreta, Qui è un fantastico set di 20 lezioni dell'Arsdigita University.Ciascuno dura circa un'ora e venti minuti.

Inizia con quella che noi CS chiamiamo "matematica discreta".Anche il calcolo e l’algebra lineare possono tornare molto utili perché ti aprono la porta a molti domini applicativi.Una volta che hai imparato questi tre, passa alla teoria della probabilità.Quei 4 ti porteranno alla competenza nel 95% (me lo sono inventato) dei domini applicativi.

Matematica concreta copre la maggior parte degli argomenti principali.Un buon libro sulla matematica discreta, come quello di Rosen Matematica discreta e sue applicazioni, colmerà eventuali lacune.

Penso che dipenda dalla tua concentrazione.Qualche anno fa ho acquistato il set di Art of Computer Programming di Donald Knuth.Dopo aver guardato i libri mi sono reso conto che praticamente tutto è una prova di calcolo.Se sei interessato a sviluppare i tuoi algoritmi generici e le relative prove, allora ti consiglio di essere in grado di comprendere i libri di cui sopra poiché è ciò con cui avresti a che fare in quel mondo.D'altra parte, se si desidera/è necessario utilizzare solo vari tipi di ordinamento/ricerca/albero/ecc...le routine quindi la notazione O grande come minimo, la matematica booleana e l'algebra generale andranno bene.Se hai a che fare con il 3D, allora anche la geometria e la trigonometria.

Tendo ad essere più dalla parte dell'utilizzo che della creazione di prove, e anche se mi piace pensare di aver fatto alcune cose intelligenti nel corso degli anni non mi sono mai seduto e sviluppato una nuova routine di ordinamento.Il miglior consiglio che posso darti è imparare ciò di cui hai bisogno per il tuo campo, ma esporti a livelli più alti in modo da sapere che esiste e quanto c'è ancora da imparare, altrimenti non otterrai molta crescita.

Direi logica booleana.E, O, XOR, NON.Ho scoperto che come programmatori lo usiamo più spesso rispetto agli altri concetti matematici.

L'algebra e la statistica di base sono buoni punti di partenza e la base per molti altri campi.

Eccone uno semplice che mi sconcerta quando vedo sviluppatori che non lo capiscono:
- Ordine delle operazioni

Il capitolo 1 di "L'arte della programmazione informatica" mira a fornire esattamente questo.

C'era un libro che mi è stato consigliato... il titolo era qualcosa come Concrete Mathematics.È stato raccomandato in alcune domande.

A scuola, uno dei miei istruttori diceva che per le applicazioni aziendali tutto quello che devi sapere è aggiungere, sottrarre, moltiplicare e dividere.Tutte le altre formule il richiedente le conoscerà e ti informerà di ciò che è necessario.Ora renditi conto che questo serve per finanziare il reporting e la scuola focalizzata sull'applicazione.Fino ad oggi, questo è rimasto vero per me.Non ho mai avuto bisogno di sapere più di questo.

Controlla il libro Fondamenti dell'informatica
Questo libro è scritto da:Al Aho e Jeff Ullman e l'intero libro sono disponibili online.

Questo è ciò che gli autori dicono nella loro Prefazione riguardo allo scopo di questo libro:

"Fondamenti dell'informatica tratta argomenti che spesso si trovano divisi
tra un corso discreto di matematica e una sequenza di informatica del secondo livello
scienza nelle strutture dati.Era nostra intenzione selezionare la matematica
con un occhio rivolto a ciò di cui l'utente del computer ha realmente bisogno, piuttosto che
ciò che un matematico potrebbe scegliere."

un sito per rispolverare la matematica:http://www.khanacademy.org/

Il mio background in matematica è davvero scarso (geologo di formazione), ma ho preso un matematica discreta lezione al liceo e utilizzo i concetti ogni giorno come programmatore.È probabilmente il corso più prezioso che ho seguito in tutta la mia formazione in relazione alla mia attuale professione.

Matematica discreta
Algebra lineare
Combinatoria
Probabilità e statistica
Teoria dei grafi

  • Algebra booleana
  • Insiemistica
  • Matematica discreta

Beh, dipende da quale è il tuo obiettivo.Come qualcuno ha detto, l'algebra lineare, la combinatoria, la probabilità e la statistica e la teoria dei grafi sono importanti se vuoi risolvere problemi difficili.La crescita asintotica delle funzioni (notazione bit-Oh) è molto importante.Dovrai anche padroneggiare somme e serie se hai bisogno di lavorare sull'analisi di alcuni algoritmi più complessi (vedi l'appendice su Cormen&others Intro to Algorithms).

Anche se ti piacciono "Java per le imprese" o "PHP lato server", troverai alcune statistiche e complessità degli algoritmi (quindi calcolo combinatorio, induzione, somme, serie, ecc.) utili quando il tuo capo vuole che tu ottenga il server per funzionare più velocemente e l'aggiunta di nuovo hardware non sembra aiutare.:-) Ci sono già passato una volta.

  • Algebra booleana
  • Insiemistica

Perché tutti includono probabilità e statistica nella lista d'oro senza menzionare il calcolo infinitesimale?Non è possibile capire cosa siano la probabilità e la statistica senza almeno una conoscenza pratica di limiti, derivate, integrali e serie.E tutto sommato, il calcolo infinitesimale (insieme all'algebra lineare) è il cavallo di battaglia di Tutto matematica.

Penso che gli algoritmi e la teoria siano di grande importanza.Essere in grado di inventare un digiuno, e corretto La soluzione è ciò che differenzia i buoni programmatori dagli altri.Inoltre, essere in grado di dimostrare il tuo algoritmo (utilizzando tecniche di dimostrazione standard: induzione, contraddizione, ecc.) è altrettanto importante.

Sì, direi che una conoscenza di base dell'induzione aiuta a capire cosa rappresenta n negli algoritmi.Sono utili anche alcune strutture logiche e discrete.

Probabilità e statistica sono molto utili se mai devi fare qualcosa che assomiglia all'apprendimento automatico.

Parlerò delle nozioni di base nel mio "Calcola la tua abilità" post sul blog in cui discuto il funzionamento del ranking TrueSkill di Xbox Live e dell'algoritmo di matchmaking.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top