Wie kann ich Informatik im Selbststudium studieren?

Da ich mir das Programmieren selbst beigebracht habe, wäre es schön, wenn ich mich verbessern könnte, indem ich mir den Informatikkurs eines typischen CS-Absolventen selbst beibringe.

Die Suche nach verschiedenen Ressourcen im Internet war einfach, es gibt natürlich MIT open course ware, und es gibt Coursera-Kurse von Stanford und anderen Universitäten. Es gibt zahlreiche andere offene Ressourcen, die im Internet verstreut sind, und einige gute Bücher, die immer wieder empfohlen werden.

Ich habe viel gelernt, aber mein Studium ist stark fragmentiert, was mich wirklich stört. Ich fände es toll, wenn ich irgendwo einen Pfad finden könnte, dem ich folgen sollte, und einen Stapel, auf den ich mich beschränken sollte, damit ich mir sicher sein kann, welche essentiellen Teile der Informatik ich studiert habe, und dann systematisch an diejenigen herangehen kann, die ich nicht studiert habe.

Das Problem mit Wikipedia ist, dass sie einem nicht sagt, was wesentlich ist, sondern darauf besteht, eine vollständige Referenz zu sein.

Die MIT open course ware für Informatik und Elektrotechnik hat eine riesige Liste von Kursen, die auch nicht sagt, welche Kurse essentiell und welche optional sind, je nach Interesse/Anforderungen der Person. Ich habe keinen Hinweis auf eine Reihenfolge gefunden, in der man die verschiedenen Fächer studieren sollte.

Ich würde gerne eine Liste erstellen, an der ich mich orientieren kann, z. B. diese Dummy-Liste

SUBJECTS                                                        DONE

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

Wie Sie deutlich sehen können, habe ich wenig Ahnung von den einzelnen Fächern der Informatik.

Es wäre sehr hilfreich, wenn mir jemand die wesentlichen Kurse aus dem MIT Course Ware ( + wesentliche Fächer, die nicht im MIT OCW vorhanden sind) in einer empfohlenen Reihenfolge aufzeigen würde.

Ich werde die Posts auflisten, die ich bereits durchgesehen habe (und ich habe dort nicht das gefunden, wonach ich gesucht habe)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - die erste Antwort sagt, dass es sich nicht lohnt, cse zu studieren

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - verweist auf 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

Lösung

Ich habe einige Kursmaterialien des MIT gesehen, und sie waren schockierend schlecht. Sie hatten Lehrmaterial, das VC5, Bündel von impliziten globalen Variablen, die Übergabe von Farben als "Blue" anstelle von 32bit ARGB, geschweige denn 4x [0,1] Floats, diese Art von Dingen erforderlich. Ich würde einem Lehrplan oder Code nicht trauen, nur weil er von einer renommierten Universität kommt.

Mein CS-Abschluss (von einer Universität, die zu den Top 10 in Großbritannien für CS gehört) bestand aus:

Erstes Jahr:

  1. OOP - die wichtigsten Grundlagen
  2. Computersysteme - Dinge wie binäre Ganzzahlendarstellungen.
  3. Grundlegende relationale Datenbanktheorie
  4. Mathematik für CS - einfache 2D- und 3D-Geometrie.
  5. Ein bisschen HTML/JS - kompletter Anfängermodus
  6. Ein ebenso kleines bisschen PHP.
  7. Ein bisschen funktionale Programmierung

Zweites Jahr:

  1. Rechtliche Fragen in der Informatik - z.B. Gesetze rund um den Schutz von Benutzerdaten
  2. Programmiersprachen - Chomsky-Hierarchie und Lexing wurden behandelt
  3. Betriebssysteme, Netzwerke und das Internet - hauptsächlich Themen wie virtueller Speicher und Paging, IP-Stack
  4. 2D-Computergrafik - meist nur Beweise für Theoreme der zugrunde liegenden Mathematik
  5. KI - Grundlegende Beschreibungen von neuronalen Netzen, Bayes'schen Glaubenssystemen, usw.
  6. Anforderungsanalyse - kurzer Überblick über UML, funktionale/nichtfunktionale Anforderungen.
  7. Teamprojekt

Drittes Jahr:

  1. Algorithmenanalyse - Komplexitätstheorie, hauptsächlich
  2. Implementierung von Programmiersprachen - LL/LR-Parsing-Techniken, CFGs, und solche Dinge.
  3. Software-Projektmanagement - ein Blick auf Wasserfall-/Agile-Modelle
  4. Internationales Computing - Unicode und andere Lokalisierungsmöglichkeiten
  5. Fortgeschrittene KI - ich weiß es nicht, ehrlich gesagt, und ich habe bald eine Prüfung darüber
  6. 3D-Computergrafik- meistens wieder nur Theoreme beweisen für Rotationsmatrizen und dergleichen
  7. Agentenbasierte Systeme - hauptsächlich über asynchrone Agenten, die kommunizieren, Gruppenentscheidungen treffen, usw.
  8. Mikroprozessoranwendungen - digitale Signalverarbeitung
  9. Robotik- deckt Dinge wie Computer Vision und Roboterentscheidungen Entscheidungsfindung auf hohem Niveau

Wie Sie feststellen werden, handelt es sich bei so gut wie allem um die Grundlagen und fast nichts wird in einer sinnvollen Tiefe behandelt.

Die Dinge, die es tatsächlich wert waren, getan zu werden, waren wesentlich:

  1. OOP - und dann noch etwas mehr, und noch etwas mehr
  2. Funktionale Programmierung - und noch ein bisschen mehr. Versuchen Sie, eine Sprache wie C++ oder C# zu wählen, bei der Sie die Syntax und die Werkzeuge usw. nicht neu erlernen müssen, um beide Stile abzudecken.
  3. Der Teil über das Betriebssystem - virtueller Speicher ist gut zu wissen, ebenso wie der Kernel-Modus im Vergleich zum Benutzer-Modus. Überspringen Sie die Segmentierung und den IP-Stack.
  4. Anforderungsanalyse - muss für jedes Projekt nützlich sein.
  5. Algorithmusanalyse - es ist wichtig zu wissen, was die algorithmische Komplexität ist, wie sie reduziert werden kann und wie die Komplexität der üblichen Operationen ist.
  6. Software-Projektmanagementmodelle - viele Unternehmen arbeiten mit Agile und viele ältere mit Waterfall-Modellen.
  7. Internationales Rechnen - Unicode ist unerlässlich

Die Dinge, die es wert waren, getan zu werden, optional:

  1. Programmiersprachen - Chomsky-Hierarchie, die Werkzeuge des Lexings und Parsings. Überspringen Sie die Theorie hinter LL- oder LR-Parsern - ein LR-Parser kann praktisch jede realistische, eindeutige CFG akzeptieren, und wenn er das nicht kann, werden Sie in der Dokumentation Ihres Parsergenerators darüber informiert.
  2. 3D-Grafiken. Ich meine nicht "Beweisen Sie, dass dies eine Rotationsmatrixformel ist" Zeitverschwendung, ich meine eigentliches "Dies ist ein Vertex Shader" Zeug, oder GPGPU. Das macht Spaß, ist interessant und anders.
  3. Einige der KI-Sachen machen Spaß - wie Potenzialfelder und Pfadfindung.

Dinge, die essentiell sind, aber ich habe sie sowieso nicht behandelt:

  1. Gleichzeitigkeit - ein Muss, zumindest die Grundlagen, für jeden im Jahr 2012.

Der Rest war reine Zeitverschwendung. Leider kannte ich die meisten dieser neun Punkte entweder schon, oder ich habe die nützlichen Teile woanders aufgeschnappt. Wenn man über Dinge wie das FizzBuzz-Problem liest, wird schnell klar, dass man eigentlich gar nicht so viel wissen muss, um auf dem Laufenden zu sein - was ein Glück ist, denn mein Abschluss und viele der Materialien, die ich online für andere Abschlüsse gesehen habe, vermitteln wirklich nicht viel.

Kommentare (26)

Open Course Ware ist nur eine Liste von Kursen, die sie zur Verfügung gestellt haben. Wenn Sie wissen wollen, welche Kurse ein Student belegt hat, besuchen Sie die MIT-Website (nicht OCW) und sehen Sie sich das eigentliche Programm an. Dort finden Sie eine Liste mit den erforderlichen Kursen und den Voraussetzungen, die für die jeweiligen Kurse erfüllt werden müssen. Hier ist ihre Seite.

Kommentare (5)

Wenn ich darf, würde ich gerne vorschlagen, github.com als Teil Ihres Lernprozesses beizutreten.

Dann können Sie nach Code suchen, der eine reale Anwendung hat, an der Sie interessiert sind, ihn für sich selbst klonen, damit arbeiten, daran programmieren und es kennenlernen, und schließlich damit beginnen, Patches an das Quellprojekt zu übermitteln, und im Laufe der Zeit an einem Open-Source-Projekt arbeiten, an dem Sie ein echtes Interesse haben.

Und natürlich werden Sie sich mit Git vertraut machen, was natürlich umso besser ist.

Kommentare (2)