Come posso studiare autonomamente Informatica? [chiuso]


46

Essendo un programmatore completamente autodidatta, mi piacerebbe se potessi migliorare me stesso imparando da autodidatta il corso di informatica impartito ad un tipico laureato in CS.

Trovare diverse risorse su Internet è stato facile, c'è ovviamente un programma aperto del MIT e ci sono corsi Coursera di Stanford e di altre università. Ci sono numerose altre risorse aperte sparse su Internet e alcuni buoni libri che sono ripetutamente raccomandati.

Ho imparato molto, ma il mio studio è fortemente frammentato, il che mi dà davvero fastidio. Mi piacerebbe se da qualche parte potessi trovare un percorso da seguire e uno stack a cui dovrei limitarmi, in modo da poter essere sicuro di quali parti essenziali dell'informatica ho studiato e quindi avvicinarmi sistematicamente a quelle che non ho.

Il problema con Wikipedia è che non ti dice ciò che è essenziale ma insiste per essere un riferimento completo.

Open course MIT per l'informatica e l'elettrotecnica. ha un vasto elenco di corsi che non ti dicono quali sono i corsi essenziali e quali facoltativi secondo l'interesse / requisito della persona. Non ho trovato alcuna menzione di un ordine in cui si dovrebbero studiare materie diverse.

Ciò che mi piacerebbe è creare un elenco che posso seguire, come questo manichino

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

Come puoi vedere chiaramente, ho poca idea di quali siano le materie specifiche dell'informatica.

Sarebbe di grande aiuto, anche se qualcuno indicasse corsi essenziali dal MIT Course ware (+ materie essenziali non presenti al MIT OCW) in un ordine di studio raccomandato.

Elencherò i messaggi che ho già passato (e non ho ottenuto quello che cercavo lì)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - la risposta migliore dice che non vale la pena studiare cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - indica MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming


Completamente? Tutta la roba teorica divertente anche?

Sì, in realtà mi piacciono le cose teoriche divertenti, penso che aumenteranno la mia comprensione dell'argomento (anche se è una questione di dibattito nella mia cerchia). Inoltre, mi sento lasciato solo quando i miei amici CS hanno discussioni su argomenti CS o li irrito facendo troppe domande.
Optimus,

2
Si noti che ci sono alcuni tipi di "isole" nel curriculum in cui le cose si uniscono. Ad esempio, raramente hai bisogno del calcolo lambda nella teoria dei grafi. Considera anche che potrebbe essere bello avere dei mentori in giro: vivi vicino a un'istituzione educativa adatta?

È un dato di fatto che lo faccio, e sono amichevole con i prof, ma non posso infastidirli continuamente. Hanno contribuito a molte conoscenze frammentate che ho in primo luogo.
Optimus,

3
In tal caso, potresti essere in grado di seguire uno o due corsi selezionati, il che ti consente di correggere continuamente i prof.

Risposte:


24

Ho visto del materiale didattico del MIT ed è stato incredibilmente male . Avevano materiale didattico che richiedeva VC5, mazzi di variabili globali implicite, passando i colori come "Blu" invece di ARGB a 32 bit, e tanto meno 4x [0,1] galleggianti, quel genere di cose. Non mi fiderei di un curriculum o codice solo perché proviene da un'università di grandi nomi.

La mia laurea in CS (presso un'università che è tra le prime 10 nel Regno Unito per CS) consisteva in:

Primo anno:

  1. OOP- le basi super
  2. Sistemi informatici - cose come, rappresentazioni di interi binari.
  3. Teoria di base del database relazionale
  4. Matematica per CS - geometria semplice 2D e 3D.
  5. Un po 'di HTML / JS: roba completa per principianti
  6. Un pezzetto di PHP altrettanto piccolo.
  7. Un po 'di programmazione funzionale

Secondo anno:

  1. Questioni legali in informatica, come le leggi che ruotano attorno alla protezione dei dati degli utenti
  2. Linguaggi di programmazione: la gerarchia e il lessico di Chomsky erano coperti
  3. Sistemi operativi, reti e Internet, principalmente roba come memoria virtuale e paging, stack IP
  4. Computer grafica 2D - per lo più solo dimostrando teoremi della matematica sottostante
  5. AI: descrizioni di base di reti neurali, sistemi di credenze bayesiane, ecc.
  6. Analisi dei requisiti: breve panoramica di UML, requisiti funzionali / non funzionali.
  7. Progetto di squadra

Terzo anno:

  1. Analisi dell'algoritmo - teoria della complessità, per lo più
  2. Implementazione di linguaggi di programmazione - tecniche di analisi LL / LR, CFG e simili.
  3. Software Project Management: uno sguardo ai modelli Waterfall / Agile
  4. International Computing - Unicode e altri divertimenti di localizzazione
  5. AI avanzato: non lo so, onestamente, e presto avrò un esame
  6. Computer grafica 3D - per lo più, ancora una volta, solo dimostrando teoremi per matrici di rotazione e simili
  7. Sistemi basati su agenti - principalmente su agenti asincroni che comunicano, raggiungono decisioni di gruppo, ecc.
  8. Applicazioni a microprocessore - elaborazione del segnale digitale
  9. Robotica: copre cose come la visione artificiale e il processo decisionale dei robot ad alto livello

Come noterai, praticamente tutto è "le basi" di qualcosa e quasi nulla è coperto da una profondità utile.

Le cose che valeva davvero la pena fare, essenziali:

  1. OOP- e poi ancora un po ', e poi ancora un po'
  2. Programmazione funzionale - anche di più. Prova a scegliere una lingua come C ++ o C # in cui non è necessario riapprendere la sintassi e gli strumenti, ecc., Per coprire entrambi gli stili.
  3. La parte di memoria virtuale del sistema operativo è buona da sapere, così come la modalità kernel vs la modalità utente. Salta la segmentazione e lo stack IP.
  4. Analisi dei requisiti - Deve essere utile per qualsiasi progetto
  5. Analisi dell'algoritmo: è importante sapere cos'è la complessità algoritmica, come ridurla e quale è la complessità delle operazioni comuni.
  6. Modelli di gestione dei progetti software: molti negozi fanno Agile e molti altri ancora fanno modelli in stile Cascata.
  7. Informatica internazionale - Unicode è essenziale

Le cose che valeva la pena fare, facoltativamente:

  1. Linguaggi di programmazione - Gerarchia di Chomsky, gli strumenti del lexing e dell'analisi. Salta la teoria dietro i parser LL o LR: un parser LR può accettare praticamente qualsiasi CFG inequivocabile realistico e, quando non può, la documentazione del tuo generatore di parser te ne parlerà.
  2. Grafica 3D. Non intendo "Dimostrare che si tratta di una formula a matrice di rotazione" sprechi di tempo, intendo dire roba "Questo è uno shader di vertice", o GPGPU. È divertente, interessante e diverso.
  3. Alcune cose dell'IA sono divertenti come potenziali campi e percorsi.

Roba che è essenziale ma non l'ho coperta comunque:

  1. Concorrenza: un must, almeno le basi, per chiunque nel 2012.

Il resto era una completa perdita di tempo. Sfortunatamente, la maggior parte di questi nove punti che già conoscevo o prendeva le parti utili altrove. Se leggi cose come il problema di FizzBuzz , diventa subito chiaro che in realtà non hai bisogno di sapere così tanto per essere in cima al pacchetto, il che è una fortuna, dal momento che la mia laurea e molti dei materiali che ho visto online per altri gradi davvero non insegnano molto.


3
@ ThorbjørnRavnAndersen: Theory è uno strumento per scrivere codice, niente di più. Una teoria non vale nulla se non puoi usarla per creare codice migliore.
DeadMG

3
@Optimus: la stragrande maggioranza di tutta la teoria non può aiutarti a creare un codice migliore.
DeadMG

3
La teoria è la base per sapere quale codice può essere scritto e cosa no.

17
Ci sono alcuni ottimi consigli in questo post, ma sei troppo dogmatico nel dichiarare alcuni campi una perdita di tempo. Al giorno d'oggi esiste una notevole varietà di lavori di programmazione e ciò che è una perdita di tempo per un lavoro può essere essenziale per un altro lavoro. Piuttosto che semplicemente liquidare qualcosa come una perdita di tempo, sarebbe utile descrivere il tipo di sviluppo in cui sei stato coinvolto.
Charles E. Grant,

4
Ho fatto molte interviste negli ultimi anni e sembra che il divario più grande di questi tempi nei college sia l'insegnamento di strutture dati e algoritmi. Il secondo grande divario è nella comprensione di come gli strumenti vengono implementati internamente. Secondo me, le lezioni sull'uso di un determinato strumento sono una perdita di tempo. Non ha molto senso conoscere la sintassi C ++ se non puoi spiegare quando usare una tabella hash e quando usare un albero.
Gort the Robot il

5

Gli articoli Open Course sono solo un elenco di corsi che hanno reso disponibili. Se vuoi sapere cosa avrebbe preso uno studente, passa al sito Web del MIT (non OCW) e guarda il programma attuale. Hanno un elenco di ciò che è richiesto e ciò che è considerato un prerequisito per cosa. Ecco la loro pagina.


Ci sto esaminando, ma ho trovato i loro requisiti piuttosto concisi. e dov'è la lunga lista di corsi?
Optimus,

1
web.mit.edu/catalog/degre.engin.ch6.html È la grande lista. CS è indicato come 6.3
stonemetal

grazie, anche questo sarà utile, è bene sapere quale curriculum stanno seguendo i grandi univs
Optimus

1
Sto facendo EECS a Berkeley in questo momento. Se il programma MIT EECS è strutturato in modo simile a Berkeley, allora non otterrai molte indicazioni lì: abbiamo una breve sequenza di introduzione e quindi fa letteralmente tutto quello che vuoi nell'ordine che vuoi finché fai un numero minimo di avanzato corsi. Penso che sia fantastico, ma probabilmente non ti aiuterà a capire quali corsi prendere: ho dovuto prendere le stesse decisioni da solo. (Ho avuto l'aiuto del mio consulente di facoltà, ma in una coincidenza completa il suo consiglio era di prendere il suo seminario di laurea :)).
Tikhon Jelvis l'

@TikhonJelvis È più facile fare le scelte su cosa vorresti imparare e cosa no, una volta che hai un'idea di quale sia il campo di applicazione e quale ambito dovrebbe almeno essere coperto. Io, essendo un laureato in ingegneria civile, ho poca idea di cosa succede in Informatica e Engg. Campo
Optimus,

5

Prova le raccomandazioni del curriculum Informatica 2001 di ACM / IEEE, collegate qui: http://www.acm.org/education/curricula-recommendations

insieme agli aggiornamenti CS del 2008.

La pagina 17 della relazione del 2001 presenta un utile diagramma che sottolinea tutte le conoscenze "fondamentali" ed elenca ancora gli elettivi.

Un programma di laurea non avrebbe il tempo di coprire anche i corsi considerati fondamentali da queste raccomandazioni, quindi raggrupperanno alcune delle categorie insieme e lasceranno che gli studenti scelgano tra loro (ad esempio, Sistemi operativi, Linguaggi di programmazione e Ingegneria del software vengano inclusi in Software e studenti scelgono una traccia).

Puoi trovare i corsi richiesti sul sito web del dipartimento CS praticamente per qualsiasi scuola e dovrebbero essere una versione di questo.


bene, un po 'obsoleto, ma ancora molte materie lasciate a scelta in un normale curriculum sono considerate fondamentali qui, è bello avere una scelta più ampia di studio disponibile se esaurisci le cose che hai messo in coda +1.
Optimus,

Per i più pigri, tale elenco contiene: Discrete Structures Structures (DS) Programming Fundamentals (PF) Algorithms and Complexity (AL) Architecture and Organization (AR) Sistemi operativi (OS) Net-Centric Computing (NC) Linguaggi di programmazione (PL) Human-Computer Interazione (HC) Grafica e Visual Computing (GV) Sistemi intelligenti (IS) Gestione delle informazioni (IM) Questioni sociali e professionali (SP) Ingegneria del software (SE) Scienze computazionali e metodi numerici (CN).
Damien Roche,

-4

Se posso, vorrei suggerire di unirti a github.com come parte del tuo processo di apprendimento.

Quindi puoi cercare il codice che ha qualche applicazione del mondo reale che ti interessa, clonarlo per te stesso, lavorarci sopra, codificarlo e conoscerlo e infine iniziare a inviare le patch al progetto di origine e, in linea di principio, stai lavorando a un progetto open source a cui hai un interesse acquisito.

E, naturalmente, imparerai a usare git, il che è ancora meglio.


5
-1: Sebbene prezioso, ciò non lo espone agli aspetti teorici dell'informatica che deve conoscere.
Ken Bloom,

ci sono già stato, abbiamo anche un repository git personale, In giro con github ti rende un programmatore migliore comunque
Optimus,
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.