Quali concetti di informatica dovrei conoscere? [chiuso]


94

Quali concetti in Informatica pensi ti abbiano reso un programmatore migliore?

La mia laurea era in Ingegneria Meccanica quindi, essendo finito come programmatore, mi mancano un po 'le basi. Ci sono alcuni concetti CS standard che ho imparato di recente che mi hanno dato una comprensione molto più profonda di ciò che sto facendo, in particolare:

Caratteristiche del linguaggio

  • Puntatori e ricorsione (Grazie Joel!)

Strutture dati

  • Elenchi collegati
  • Hashtables

Algoritmi

  • Ordina bolla

Ovviamente, la lista è un po 'corta al momento quindi speravo in suggerimenti su:

  1. Quali concetti dovrei capire,
  2. Qualsiasi buona risorsa per comprenderli correttamente (poiché Wikipedia può essere un po 'densa e accademica a volte).

5
Tipo di bolle? Stai il più lontano possibile da loro! Piuttosto impara come funzionano quicksort / heapsort.
Carra

18
Sì, impara BubbleSort. Scopri perché è terribile. Impara quicksort, mergesort e tutto il resto, comprese le loro debolezze individuali. Ma non scriverli nel codice di produzione: chiama le funzioni di ordinamento fornite da qualunque piattaforma ti trovi.
Brian Ensink,

@Roger Pate - +1 per te, dovresti sapere a cosa serve un algoritmo o una struttura dati e cosa fa schifo. Sia Quicksort che Bubblesort hanno le stesse prestazioni nel caso peggiore [O (n ^ 2)], ma per tipi di input molto diversi, e Bubblesort ha prestazioni nel caso migliore di O (n), dove QS è ancora O (n log n). Ovviamente, se stai considerando Bubblesort, potresti optare invece per l'ordinamento per inserzione.
Andre Artus

Risposte:


60

Dai un'occhiata a questo post del blog di Steve Yegge (ex Amazon, ora Google):

Entra in alcuni dettagli sui cinque concetti più importanti che gli sviluppatori dovrebbero essere tenuti a conoscere:

  1. Programmazione di base (inclusa ricorsione, I / O di file, output formattato, loop, ecc.)
  2. Progettazione orientata agli oggetti (inclusi modelli di progettazione ecc.) Dovresti essere in grado di produrre progetti OO ragionevoli e di comprendere i concetti.
  3. Scripting e regex.
  4. Strutture dati - elenchi, insiemi, tabelle hash, alberi, grafici e così via - così come notazione Big O e complessità algoritmica.
  5. Bit, byte e numeri binari: come sono rappresentati i numeri nel computer e come manipolarli.

Bel collegamento. Un po 'concentrato sul lato unix, (.NET completamente mancante) ma comunque carino.
Toon Krijthe

Ottimo collegamento: c'è molto da lavorare su cui lavorare, vorrei solo che avesse alcuni collegamenti a buone pagine che spiegassero queste cose.
Jon Artus,

Il collegamento mi sarà molto utile per controllarmi e mettermi al passo con i fondamentali. Grazie ..
rpr

D'accordo, ottimo collegamento. Sebbene molte delle possibili soluzioni identificate siano basate su Unix, i concetti generali coinvolti sono molto indipendenti dalla lingua / piattaforma. Per la maggior parte dei programmatori, cose come la ricorsione, la scrittura di ADT come gli alberi e le operazioni bit per bit sono piuttosto rare, tuttavia sono una base importante.
Zach Burlingame

4
Sono d'accordo con tutto tranne le espressioni regolari. Questi sono un bel bonus, ma la maggior parte delle cose sono le basi del livello base, le basi su cui tutto è costruito ... le espressioni regolari sono fantastiche, ma conosco molti grandi programmatori che non le usano mai e non ne hanno mai bisogno.
Beska

35

Sicuramente si dovrebbe capire i Big-O stime notazione e Big-O di algoritmi - che cos'è, come viene utilizzata, perché è importante, come si confrontano due algoritmi dato loro stime Big-O, come si costruisce stime Big-O per gli algoritmi semplici.


1
Puoi iniziare con un articolo di Wikipedia a cui ho collegato: è abbastanza semplice e matematicamente corretto.
punta di diamante

3
Devi avere un'opinione piuttosto bassa della matematica avanzata. L'ho capito nel mio primo anno di college, quando ero solo a metà del calcolo.
GoatRider

1
Non dimenticare il concetto di NP e quando un problema è contenuto al suo interno, uno sviluppatore che cerca di codificare un TSP (Travelling Salesman) in ogni transazione di database per uno scopo di ricerca o qualche altra idiozia del genere è un grosso problema =]
Ed James

2
Dovresti anche sapere che la grande O non ti dice quale algoritmo impiega meno tempo. Qualcosa che la maggior parte dei laureati in CS non capisce
Martin Beckett,

3
In un certo senso lo fa. Ti dice quale ha il miglior caso peggiore, non necessariamente quale è "più veloce" in quanto dipende dall'input impostato.
Ed James,

30

Trovo un po 'divertente che tu stia cercando materie di informatica , ma trovi wikipedia troppo accademico: D

Comunque, ecco qui, in nessun ordine particolare:


2
+1 perché hai citato i database, spesso trascurati in questi tipi di elenchi, ma un concetto molto importante da conoscere per qualsiasi laureato in CS a tutto tondo.
Brian Ensink,

14

Alcuni concetti che hanno aiutato il mio sviluppo (intelletto e codice):

  • Lexing, Parsing, String matching, Regex
  • Memoizzazione
    • incapsulamento / scoping / chiusure
    • caching
  • Ricorsione
  • Iteratori / generatori
  • Programmazione funzionale - L'incredibile articolo di John Hughes mi aveva spiegato "perché"

Questi sono interi domini di matematica discreta, ma per CS è necessaria un'introduzione seria:

  • Matrice / Algebra lineare
  • Teoria dei grafi

Sebbene le lezioni e gli articoli di Mark Jason-Dominus siano spesso diretti agli hacker Perl, penso che qualsiasi programmatore trarrebbe vantaggio dalla sua presentazione chiara e dal codice reale, specialmente in Perl di ordine superiore .


10

Direi che oggigiorno una comprensione della programmazione orientata agli oggetti è un must, anche se non è necessario utilizzarla quotidianamente.

Da questo direi anche che la comprensione degli schemi più comuni può aiutare.


10

Vedo diversi buoni concetti di CS identificati, ma poco parlare di matematica.

Suggerisco di esaminare la matematica discreta . Ha una vasta gamma di problemi utili a partire da prove logiche che aiutano a scrivere le condizioni nel codice. La teoria dei grafi e la combinatoria aiutano anche con la risoluzione di problemi complessi e l'ottimizzazione degli algoritmi.

Mentre siamo in tema di matematica, l'algebra lineare è tipicamente un prerequisito per lezioni di computer grafica avanzate.


1
Se dovessi sceglierne solo uno, sarebbe matematica discreta. È praticamente CS 101. Mi è difficile pensare a un'area o un paradigma nella programmazione generale che non sia toccato in qualche modo da DM.
Andre Artus

6

La matrice delle competenze del programmatore ha trattato questo aspetto in dettaglio, ma ne evidenzierò un paio:

  • Strutture dati
    • Strutture dati avanzate come B-tree, cumuli binomiali e di Fibonacci, alberi AVL / Red Black, Splay Trees, Skip List, tentativi ecc.
  • Algoritmi
    • Tree, Graph, semplici algoritmi greedy e divide and conquer, è in grado di comprendere la rilevanza dei livelli di questa matrice.
  • Programmazione dei sistemi
    • Comprende l'intero stack di programmazione, hardware (CPU + memoria + cache + interrupt + microcodice), codice binario, assembly, collegamento statico e dinamico, compilazione, interpretazione, compilazione JIT, garbage collection, heap, stack, indirizzamento della memoria ...
  • Controllo della versione del codice sorgente
    • Conoscenza dei sistemi VCS distribuiti. Ha provato Bzr / Mercurial / Darcs / Git
  • Costruisci automazione
    • Può impostare uno script per costruire il sistema e anche documentazione, programmi di installazione, generare note di rilascio e taggare il codice nel controllo del codice sorgente
  • Test automatizzati
    • Comprende ed è in grado di configurare test funzionali, carico / prestazioni e dell'interfaccia utente automatizzati
  • Decomposizione del problema
    • Utilizzo di strutture e algoritmi di dati appropriati e produzione di codice generico / orientato agli oggetti che incapsula aspetti del problema soggetti a modifiche.
  • Decomposizione dei sistemi
    • In grado di visualizzare e progettare sistemi complessi con più linee di prodotti e integrazioni con sistemi esterni. Inoltre dovrebbe essere in grado di progettare sistemi di supporto alle operazioni come monitoraggio, reporting, failover ecc.

5

Trovo molto utili i grafici e alcuni algoritmi applicati come la profondità prima, la ricerca del respiro, i percorsi più brevi ecc. Anche l'orientamento agli oggetti è un concetto molto comune.


4

Regola 1: il software è acquisizione della conoscenza . Il software significa qualcosa. Se non sei chiaro sul significato, dedica più tempo a parlare con gli utenti per capire cosa fanno.

Algoritmi e strutture dati sono due facce della stessa medaglia. L'algoritmo dipende dalla struttura dei dati, la struttura dei dati dipende dall'algoritmo.

Disimpara l'ordinamento delle bolle il più rapidamente possibile. Sul serio. Tutti i linguaggi moderni (Java, Python, ecc.) Hanno classi di raccolta che implementano un ordinamento migliore rispetto al Bubble sort. Non ci sono assolutamente circostanze in cui dovresti mai usare il Bubble Sort per qualcosa. Dovresti cercare una classe di raccolta che includa un metodo di ordinamento. Meglio, dovresti cercare un algoritmo che eviti completamente l'ordinamento.

Devi imparare diverse lingue.

  • Linguaggio di programmazione (Java, Python, ecc.)

  • Linguaggio shell.

  • Linguaggio database (SQL)

  • Linguaggi di presentazione (HTML e CSS)

  • Altri linguaggi di rappresentazione dei dati (XML, JSON)

Devi imparare diverse strutture di dati.

  • Sequenze (elenchi, tuple, file)

  • Gerarchico (come documenti XML e HTML, nonché il file system di base)

  • Relazionale (come i database e il file system con collegamenti fisici e virtuali)

  • Mappe (o indici o array associativi) incluse mappe hash e mappe ad albero

  • Imposta

Più alcune analisi della complessità algoritmica. A volte chiamato "Big O". Il motivo per cui un bubble sort è cattivo è che è O ( n ^ 2), dove un quicksort è O ( n log n ).


Per la cronaca, non userei mai un bubble sort! Ho appena scoperto che imparare come funziona è un'esperienza interessante e ho pensato che ci sono alcuni altri algoritmi simili che le persone dovrebbero capire abbastanza bene da poter scrivere nella loro lingua preferita.
Jon Artus

Esistono innumerevoli algoritmi. La maggior parte di loro è cattiva. Alcuni di loro sono buoni. Bubble Sort è semplicemente cattivo. Acquista QUALSIASI libro sugli algoritmi e vai avanti.
S.Lott

Solo pignoleria, ma Quicksort è il caso peggiore O (n ^ 2). Lo faccio notare solo perché penso che capire perché questo è vero sia un prezioso esercizio educativo quando si studiano algoritmi fondamentali.
Brian Ensink,

Per quicksort, sì, un esercizio importante. Per il Bubble Sort, l'unica cosa è vedere quanto sia veramente cattivo un algoritmo. In generale, è importante comprendere il tipico e il caso peggiore.
S.Lott

4

Bene, il barattolo di vermi è aperto ora! :)
Ho iniziato in ingegneria elettrica.

Progettazione di database relazionali: tenere traccia dei dati è come Arnold in "Kindergarden Cop".
Può essere il caos totale. Deve essere controllato.
Come conservare i tuoi dati, nel minor numero di posizioni, con il minor numero di duplicazioni di informazioni. Come mantenere i tuoi dati leggeri e facilmente accessibili. Come controllare la crescita e l'integrità dei dati.

Design dell'interfaccia utente (UI): questo è il modo in cui l'utente deve accedere ai dati di cui teniamo traccia.
La maggior parte delle interfacce utente sono progettate dagli sviluppatori. Pertanto, la maggior parte delle interfacce utente, sfortunatamente, parallelamente alla progettazione del database. Gli utenti non si preoccupano affatto del design dei dati. Vogliono semplicemente quello che vogliono. Vogliono ottenerlo facilmente. Di solito questo richiede una grande separazione dal design dei dati e dall'interfaccia utente. Impara a separare il te "ingegneristico" dalla te "ospitalità del sud".

Programmazione orientata agli oggetti: molti linguaggi si riducono a questo formato.

Elaborazione parallela - Multi-Threading: molti processori velocizzano il lavoro!
I computer paralleli esistono da decenni. Sono sui nostri desktop da un po 'di tempo ormai. Con l'evento del "cloud computing", l'elaborazione parallela massiccia non è solo obbligatoria ma anche preferibile. È incredibilmente potente! C'è molto potenziale lavorativo per gli sviluppatori paralleli.

Comprensione delle regole aziendali: questo ti aiuta a creare gran parte della tua logica, basata su tabelle.
Molte condizioni IFblock possono trovarsi nelle tabelle delle regole di business. Per cambiare la logica, basta cambiare le informazioni in una tabella. Poca / nessuna ricodifica. Poca / nessuna ricompilazione.

Supervisione degli eventi ... I metodi fanno il lavoro:
mantieni le cose separate nel tuo codice. Rende più facile per altri fare aggiornamenti in futuro. Inoltre è in qualche modo parallelo al framework Model / View / Controller (MVC).

PJ


3

Per me ho ottenuto molto dal corso successivo all'università

  • Gestione di progetto
  • Interazione uomo-computer (aiuta i geek a creare schermi più intuitivi)
  • Progettazione di database (compreso il funzionamento dei database, i registri delle transazioni, il blocco, ecc.)
  • Data warehousing
  • Grafica (OpenGL)
  • Algoritmi avanzati
  • Strutture dati

Cose che avrei voluto fare all'università

  • Costruzione del compilatore
  • Modelli di progettazione
  • Teoria degli automi

3

LOGICA - Ho appena sopravvalutato l'importanza della logica nella programmazione. Hai detto di fare ingegneria meccanica, quindi devi sapere quanto la matematica può semplificarti la vita.

Logica proposizionale , Logica del primo ordine , Logica del secondo ordine : questi sono strumenti molto potenti. Probabilmente le cose più (e uniche) importanti che ho imparato all'università. La logica è come l'artiglieria pesante di un programmatore: molti problemi molto complessi (così come quelli meno complessi) diventano molto più semplici una volta inseriti in una forma logica e organizzata. È come ciò che è l'algebra lineare per gli ingegneri meccanici.


3

Penso che una buona comprensione di come funziona un compilatore sia utile. Aho ha il classico libro sui concetti usati nella creazione di un compilatore. Il titolo è Compilatori: principi, tecniche e strumenti. Il suo soprannome è Dragon Book. Per capire veramente quel libro, dovresti avere una comprensione dei linguaggi formali. Hopcroft ha un buon libro su questo: Introduzione alla teoria, ai linguaggi e al calcolo degli automi.



2

Molte buone risposte sono già state menzionate qui, ma volevo aggiungere un sottoinsieme di ciò che è importante, ma non è stato trattato finora.

Dopo 15 anni di sviluppo di software professionale post-laurea, scopro di utilizzare regolarmente alcuni dei seguenti concetti a scuola:

  • Concetti generali di OO e funzionalità del linguaggio di programmazione moderno (classi, occultamento dei dati, ecc.).
  • Metriche delle prestazioni dell'algoritmo (notazione Big O). Quando si progetta un algoritmo, si esegue un'analisi Big O per determinare il costo dell'algoritmo e si cercano alternative più efficienti nelle aree dei colli di bottiglia.
  • Elenchi collegati e altre strutture di dati complesse.
  • Ordinamento veloce e diversi concetti di ordinamento.
  • Alberi e manipolazione veloce degli alberi.

Se la tua lingua / piattaforma non supporta la Garbage Collection, l'allocazione e la pulizia della memoria sono fondamentali e verrebbero aggiunte all'elenco.


2

Apprezzo la matematica discreta. L'informatica è astrazione. imparare a pensare come un matematico è molto utile.

Volevo anche aggiungere qualcosa a ciò che S.Lott ha detto sulle lingue. È importante anche imparare un sacco di TIPI di lingue. Non solo compilato vs scripting. Ma funzionale (ML, Lisp, Haskell) logico (Prolog) orientato agli oggetti (C ++, Java, Smalltalk) imperativo (C, Pascal, FORTRAN anche).

Più paradigmi di programmazione conosci, più facile è imparare nuovi linguaggi quando arriva il nuovo linguaggio caldo!


2

Alcuni dei concetti del sistema operativo

 ( memory, IO, Scheduling, process\Threads, multithreading )

[un buon libro " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]

Conoscenza di base delle reti di computer

[un buon libro di Tanenbaum

Concetti OOPS

Autometa finita

Un linguaggio di programmazione (ho imparato prima C poi C ++)

Algoritmi (complessità tempo \ spazio, ordinamento, ricerca, alberi, elenco collegato, pila, coda)

[un buon libro Introduzione agli algoritmi ]


meta auto? - sicuramente "automi" come per la prima modifica.
Tom Duckering,

Ops! impantanato per il controllo ortografico immagino. Lo correggerò. Grazie.
aJ.


1

Cerca di comprendere tutti i livelli di programmazione. Dal livello più basso (assemblaggio) al livello più alto.

Prendiamo ad esempio la ricorsione che è una caratteristica facile :) Prova ad imparare l'assembly e crea un programma che userà la ricorsione in assembly.


1

Algoritmi.

Imparare a usare un linguaggio di programmazione in modo discendente è qualcosa che puoi imparare mentre procedi, ma è praticamente impossibile inventare tutti gli algoritmi ampiamente usati da solo .. Si dovrebbe davvero almeno essere consapevoli di ciò che si può e non si può fare con alcuni problemi.

Ad esempio, uno semplicemente non può scrivere alcuni programmi con bubble-sort e aspettarsi che sia considerato buono, non importa quanto sia fine il codice.

Per riassumere, dai un'occhiata a Introduzione agli algoritmi

Non c'è bisogno di padroneggiarlo, basta sapere cosa sta succedendo ...



1

È chiaramente una buona comprensione della programmazione orientata agli oggetti, dei buoni principi guida come i Principi SOLIDI e il rispetto di modelli e pratiche consolidati.

Se guardi SOA o DDD, alla fine ricadono tutti su una qualche forma di concetti OOP.

Ti consiglierei di procurarti dei buoni libri OOP e anche di scegliere un linguaggio ricco come C # o Java per cominciare

OOP di Grady Booch

(PHP, ruby ​​ragazzi per favore non votatemi, sto solo dando alcuni esempi per lui per cominciare, potete fornire le vostre risposte e suggerimenti qui)



1

Non ti parlerò di concetti specifici da studiare, ma ti consiglierei invece di fare molte letture leggere su una vasta gamma di argomenti. Non preoccuparti di ottenere una comprensione approfondita di ogni argomento di cui leggi: a questo punto, è più importante che tu sia in grado di riconoscere che tipo di problema stai affrontando, in modo da poter fare solo un po 'di ... studiando nel tempo quando ti trovi effettivamente di fronte a esso. In altre parole, va bene se non sai come risolvere un problema di calcolo combinatorio, a patto che tu ne sappia abbastanza per cercare "calcolo combinatorio" quando hai bisogno di vedere in quanti modi puoi organizzare un insieme di oggetti o scegliere un sottoinsieme .

Wikipedia è una risorsa abbastanza buona per questo tipo di navigazione ad ampio raggio, soprattutto se stai solo scremando per cominciare. Uno ancora migliore, soprattutto se trovi Wikipedia troppo accademica o inaccessibile, è il wiki C2 . (Questo è, abbastanza interessante, il wiki originale inventato da Ward Cunningham).


0

Penso che sia essenziale comprendere la teoria di base dietro il multi-threading, senza questo può essere difficile persino vedere che ci può essere un problema, fino a quando non esegui il debug su un server live alle 4 di domenica mattina.

Semafori, sezioni critiche ed eventi.


0

No, non bubble sort, quicksort. È la cosa grande-O: l'ordinamento delle bolle media O (n ^ 2), l'ordinamento rapido è O (n * log (n)).


0

Direi che di seguito sono le cose più importanti

  • Programmazione orientata agli oggetti
  • Concetti del sistema operativo
    • Processo e filo
    • Algoritmi di pianificazione
  • Struttura dati
    • Tipo di archiviazione e raccolta dei dati, tipi (lista collegata, hash, array, ecc.)
    • Algoritmi di ordinamento
    • Complessità degli algoritmi

Quindi vai a materiale relativo alla lingua specifica. Spero che questo sia utile!!


0

Comincerei con la citazione:

"se l'unico strumento che hai è un martello, tratti tutto come un chiodo". (Abraham Maslow)

Il principio più importante, IMO, è conoscere molti paradigmi e linguaggi di programmazione diversi e informarsi bene sugli strumenti a disposizione. Qualsiasi problema può essere risolto in quasi tutte le lingue che scegli, sia che si tratti di un linguaggio tradizionale in piena regola con la sua enorme libreria predefinita o di un piccolo linguaggio specializzato come AutoHotKey. Il primo lavoro del programmatore è determinare cosa usare in base alle specifiche del problema. Alcuni concetti forniscono un approccio migliore all'argomento, qualunque sia il tuo obiettivo principale: raffinatezza, offuscamento, prestazioni, portabilità, manutenzione, dimensioni del codice ridotte ...

Altrimenti finirai come alcuni programmatori che cercano disperatamente di fare qualcosa in un linguaggio da loro specializzato, mentre il problema potrebbe essere banale da risolvere in diversi contesti di programmazione.

Questo consiglio va di pari passo con la tendenza odierna per i progetti multilingue (prendi ad esempio le applicazioni web, che possono coinvolgere più linguaggi in una singola applicazione, come C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... e persino diversi paradigmi di programmazione (ad esempio, C # ha introdotto recentemente alcuni concetti dai paradigmi di programmazione funzionale, lambda).

Quindi, la cosa fondamentale è l'apprendimento costante, per sempre :)


0

Penso che la grafica 3D sia qualcosa che tutti dovrebbero imparare. O almeno come usare correttamente vettori omogenei e trasformate di matrice.

Può essere utile non solo per la creazione di applicazioni 3D, ma anche in campi meccanici come la cinematica inversa su robot, il calcolo di momenti e molte altre cose.

Non ho compreso appieno l'algebra lineare fino a quando non ho letto la grafica 3D, uno dei migliori corsi che abbia mai seguito anche se il nostro insegnante era pessimo.


0

Poiché le macchine con più core (sia CPU che GPU) stanno diventando lo standard, direi di includere gli algoritmi distribuiti (da più thread a più macchine). È fondamentale comprendere il multi-threading e l'elaborazione distribuita. Ci dispiace che il collegamento non fornisca molto aiuto.

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.