Wie lerne ich Informatik vollständig selbst? [geschlossen]


46

Als vollständig autodidaktischer Programmierer würde ich es begrüßen, wenn ich den Informatikkurs, der für einen typischen CS-Absolventen unterrichtet wird, selbst lernen könnte.

Es war einfach, im Internet nach verschiedenen Ressourcen zu suchen. Natürlich gibt es MIT Open Course Ware und Coursera-Kurse von Stanford und anderen Universitäten. Es gibt zahlreiche andere offene Ressourcen im Internet und einige gute Bücher, die wiederholt empfohlen werden.

Ich habe viel gelernt, aber mein Studium ist stark fragmentiert, was mich wirklich nervt. Ich würde es lieben, wenn ich irgendwo einen Weg finden könnte, dem ich folgen sollte, und einen Stapel, auf den ich mich beschränken sollte, damit ich sicher sein kann, welche wesentlichen Teile der Informatik ich studiert habe, und mich dann systematisch denen nähern kann, die ich nicht habe.

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

MIT open course ware für Informatik und Elektrotechnik Es gibt eine riesige Liste von Kursen, die Ihnen auch nicht sagen, welche Kurse wesentlich und welche optional sind, je nach Interesse / Anforderung der Person. Ich fand keine Erwähnung einer Reihenfolge, in der man verschiedene Fächer studieren sollte.

Am liebsten würde ich eine Liste erstellen, der ich folgen kann, wie dieser Dummy

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 keine Ahnung, aus welchen spezifischen Fächern die Informatik besteht.

Es wäre sehr hilfreich, auch wenn jemand in einer empfohlenen Reihenfolge auf wichtige Kurse von MIT Course ware (+ wichtige Fächer, die nicht am MIT OCW vorhanden sind) hingewiesen hätte.

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

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - die beste Antwort lautet, dass es sich nicht lohnt, einen Kurs zu belegen

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


Vollständig? Das ganze spaßige theoretische Zeug auch?

Ja, ich mag das lustige theoretische Zeug, ich denke, es wird mein Verständnis für das Thema verbessern (obwohl das in meinem Kreis eine Frage der Debatte ist). Außerdem fühle ich mich allein gelassen, wenn meine CS-Freunde über CS-Dinge diskutieren oder ich sie durch zu viele Fragen irritiere.
Optimus

2
Beachten Sie, dass es im Lehrplan einige Arten von "Inseln" gibt, auf denen die Dinge zusammenhängen. Sie brauchen zB in der Graphentheorie selten eine Lambda-Rechnung. Denken Sie auch daran, dass es schön sein könnte, Mentoren in der Nähe zu haben - wohnen Sie in der Nähe einer geeigneten Bildungseinrichtung?

Eigentlich tue ich das und bin freundlich zu den Profis, aber ich kann sie nicht die ganze Zeit nerven. Sie haben zu viel fragmentiertem Wissen beigetragen, über das ich überhaupt verfüge.
Optimus

3
In diesem Fall können Sie vielleicht einen oder zwei ausgewählte Kurse belegen - so können Sie die Profis die ganze Zeit über nerven.

Antworten:


24

Ich habe Kursmaterial vom MIT gesehen und es war schockierend schlecht . Sie hatten Unterrichtsmaterialien, die VC5 erforderten, Bündel impliziter globaler Variablen, die Farben als "Blau" anstelle von 32-Bit-ARGB übergaben, geschweige denn 4x [0,1] Float, so etwas. Ich würde keinem Lehrplan oder Code vertrauen, nur weil er von einer renommierten Universität stammt.

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

Erstes Jahr:

  1. OOP - die super Grundlagen
  2. Computersystem-Sachen wie binäre Ganzzahldarstellungen.
  3. Grundlegende relationale Datenbanktheorie
  4. Mathematik für CS - einfache 2D- und 3D-Geometrie.
  5. Ein bisschen HTML / JS-kompletter Einsteiger-Kram
  6. Ein ebenso kleines Stück PHP.
  7. Ein bisschen funktionale Programmierung

Zweites Jahr:

  1. Rechtliche Probleme bei der Datenverarbeitung: Gesetze zum Schutz von Benutzerdaten
  2. Programmiersprachen-Chomsky Hierarchie und Lexing wurde behandelt
  3. Betriebssysteme, Netzwerke und das Internet - meistens Dinge wie virtueller Speicher und Paging, IP-Stack
  4. 2D-Computergrafik - meist nur Beweise für die zugrundeliegende Mathematik
  5. AI - Grundlegende Beschreibungen neuronaler Netze, Bayes'scher Glaubenssysteme usw.
  6. Anforderungsanalyse - Kurzer Überblick über UML, funktionale / nicht funktionale Anforderungen.
  7. Team-Projekt

Drittes Jahr:

  1. Meistens Algorithmusanalyse - Komplexitätstheorie
  2. Implementierung von Programmiersprachen - LL / LR-Analysetechniken, CFGs und dergleichen.
  3. Software Project Management - ein Blick auf Waterfall / Agile-Modelle
  4. International Computing-Unicode und andere Lokalisierungsspaß
  5. Fortgeschrittene KI - ehrlich gesagt weiß ich es nicht und ich habe bald eine Prüfung dazu
  6. 3D-Computergrafik - meistens nur Beweise für Rotationsmatrizen und dergleichen
  7. Agentenbasierte Systeme - hauptsächlich über asynchrone Agenten, die kommunizieren, Gruppenentscheidungen treffen usw.
  8. Mikroprozessoranwendungen - digitale Signalverarbeitung
  9. Robotik - umfasst Dinge wie Computer Vision und Entscheidungsfindung für Roboter auf hohem Niveau

Wie Sie feststellen werden, ist so ziemlich alles "die Basis" von etwas und fast nichts wird bis zu einer nützlichen Tiefe abgedeckt.

Das Zeug, das es wirklich wert war, getan zu werden:

  1. OOP- und noch mehr und noch mehr
  2. Funktionale Programmierung - auch mehr. Versuchen Sie, eine Sprache wie C ++ oder C # auszuwählen, in der Sie die Syntax und die Tools usw. nicht neu lernen müssen, um beide Stile abzudecken.
  3. Der teilweise virtuelle Arbeitsspeicher des Betriebssystems sowie der Kernel-Modus und der Benutzermodus sind gut zu kennen. Segmentierung und IP-Stack überspringen.
  4. Anforderungsanalyse - Muss für jedes Projekt nützlich sein
  5. Algorithmusanalyse - es ist wichtig zu wissen, was algorithmische Komplexität ist, wie sie reduziert werden kann und welche Komplexität gemeinsame Operationen haben.
  6. Modelle für das Software-Projektmanagement - viele Geschäfte arbeiten mit Agile und viele ältere mit Modellen im Wasserfall-Stil.
  7. Internationales Computing - Unicode ist unerlässlich

Das Zeug, das sich gelohnt hat, optional:

  1. Programmiersprachen-Chomsky-Hierarchie, die Werkzeuge des Lexierens und Parsens. Überspringen Sie die Theorie hinter LL- oder LR-Parsern - ein LR-Parser kann praktisch jedes realistische, eindeutige CFG akzeptieren, und wenn dies nicht möglich ist, werden Sie in der Dokumentation Ihres Parsergenerators darüber informiert.
  2. 3D-Grafiken. Ich meine nicht "Beweise, dass dies eine Rotationsmatrixformel ist", sondern "Das ist ein Vertex-Shader" oder GPGPU. Das macht Spaß, ist interessant und anders.
  3. Einige der KI-Sachen machen Spaß, wie potenzielle Felder und das Finden von Pfaden.

Dinge, die wichtig sind, aber ich habe sie trotzdem nicht behandelt:

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

Der Rest war reine Zeitverschwendung. Leider kannte ich die meisten dieser neun Punkte bereits oder habe die nützlichen Teile an anderer Stelle aufgegriffen. Wenn Sie über Dinge wie das FizzBuzz-Problem lesen, wird schnell klar, dass Sie nicht allzu viel wissen müssen, um ganz oben auf dem Pack zu sein - was ein Glück ist, da mein Abschluss und viele der Materialien, die ich online gesehen habe für andere Grade unterrichte ich eigentlich gar nicht viel.


3
@ ThorbjørnRavnAndersen: Theorie ist ein Werkzeug zum Schreiben von Code, mehr nicht. Eine Theorie ist nichts wert, wenn Sie sie nicht verwenden können, um besseren Code zu erstellen.
DeadMG

3
@Optimus: Die überwiegende Mehrheit der Theorie kann Ihnen nicht helfen, besseren Code zu erstellen.
DeadMG

3
Die Theorie ist die Grundlage, um zu wissen, welcher Code geschrieben werden kann und welcher nicht.

17
Dieser Beitrag enthält einige sehr gute Ratschläge, aber Sie sind zu dogmatisch, wenn Sie einige Felder als Zeitverschwendung deklarieren. Heutzutage gibt es eine beträchtliche Vielfalt an Programmierjobs, und was für einen Job eine Zeitverschwendung ist, kann für einen anderen Job von entscheidender Bedeutung sein. Anstatt einfach etwas als Zeitverschwendung abzulehnen, wäre es hilfreich, die Art der Entwicklung zu beschreiben, an der Sie beteiligt waren.
Charles E. Grant,

4
Ich habe in den letzten Jahren viel interviewt, und es scheint, als ob die größte Lücke in diesen Tagen im Unterrichten von Datenstrukturen und Algorithmen besteht. Die zweitgrößte Lücke besteht darin, zu verstehen, wie Tools intern implementiert werden. Meiner Meinung nach ist der Unterricht mit einem bestimmten Werkzeug Zeitverschwendung. Es macht wenig Sinn, die C ++ - Syntax zu kennen, wenn Sie nicht erklären können, wann eine Hash-Tabelle und wann ein Baum verwendet werden soll.
Gort the Robot

5

Open Course ware ist nur eine Liste der Kurse, die sie zur Verfügung gestellt haben. Wenn Sie wissen möchten, was ein Student gemacht hätte, schauen Sie auf der Website des MIT (nicht OCW) nach und sehen Sie sich das aktuelle Programm an. Sie haben eine Liste, was erforderlich ist und was als Voraussetzung für was angesehen wird. Hier ist ihre Seite.


Ich prüfe es, aber ich fand ihre Anforderungen ziemlich knapp. und wo ist die lange Liste der Kurse?
Optimus

1
web.mit.edu/catalog/degre.engin.ch6.html Ist die große Liste. CS wird als 6.3
stonemetal

Danke, das wird auch hilfreich sein. Es ist gut zu wissen, welchen Lehrplänen große UniVs folgen
Optimus

1
Ich mache gerade EECS in Berkeley. Wenn das MIT EECS-Programm so aufgebaut ist wie das von Berkeley, werden Sie dort nicht viel Orientierung finden: Wir haben eine kurze Intro-Sequenz und dann wird buchstäblich getan, was Sie wollen, in welcher Reihenfolge Sie wollen, solange Sie eine Mindestanzahl von Fortgeschrittenen machen Kurse. Ich finde es großartig, aber es wird Ihnen wahrscheinlich nicht helfen, herauszufinden, welche Kurse Sie belegen müssen: Ich musste die gleichen Entscheidungen selbst treffen. (Ich hatte Hilfe von meinem Fakultätsberater, aber zufällig riet er, sein Abschlussseminar zu besuchen :)).
Tikhon Jelvis

@TikhonJelvis Es ist einfacher, die Wahl zu treffen, was Sie lernen möchten und was nicht, sobald Sie eine Vorstellung davon haben, was der Umfang des Fachgebiets ist und welcher Umfang zumindest abgedeckt werden sollte. Als Diplom-Bauingenieur habe ich keine Ahnung, was in den Bereichen Informatik und Ingenieurwissenschaften vor sich geht. Field
Optimus

5

Probieren Sie die Empfehlungen zum Informatik-Lehrplan 2001 von ACM / IEEE aus, die hier verlinkt sind: http://www.acm.org/education/curricula-recommendations

zusammen mit den 2008 CS-Updates.

Seite 17 des Berichts von 2001 enthält eine handliche Tabelle, die alle "Kern" -Voraussetzungen unterstreicht und nach wie vor Wahlfächer auflistet.

Ein Bachelor-Programm hätte keine Zeit, auch nur die Kurse abzudecken, die von diesen Empfehlungen als Kern betrachtet werden. Daher werden sie einige der Kategorien zusammenfassen und die Studenten unter ihnen auswählen lassen (z. B. Betriebssysteme, Programmiersprachen und Softwaretechnik) Software und Studenten wählen eine Spur).

Sie finden die erforderlichen Lehrveranstaltungen für so ziemlich jede Schule auf der Website der CS-Abteilung. Diese sollten eine Version davon sein.


Gut, ein bisschen veraltet, aber dennoch werden viele Fächer, die in einem normalen Lehrplan noch zur Auswahl stehen, hier als Kern betrachtet. Es ist schön, eine größere Auswahl an Studienmöglichkeiten zur Verfügung zu haben, wenn Sie nicht mehr über die Dinge verfügen, die Sie in der Warteschlange haben +1.
Optimus

Für die Faulen enthält diese Liste: Diskrete Strukturen (DS) Programmiergrundlagen (PF) Algorithmen und Komplexität (AL) Architektur und Organisation (AR) Betriebssysteme (OS) Net-Centric Computing (NC) Programmiersprachen (PL) Mensch-Computer Interaktion (HC) Grafik und Visual Computing (GV) Intelligente Systeme (IS) Informationsmanagement (IM) Soziale und berufliche Fragen (SP) Software Engineering (SE) Computerwissenschaft und Numerische Methoden (CN).
Damien Roche

-4

Wenn ich darf, möchte ich vorschlagen, dass Sie sich im Rahmen Ihres Lernprozesses bei github.com anmelden .

Dann können Sie nach Code suchen, der eine reale Anwendung enthält, an der Sie interessiert sind, ihn für sich selbst klonen, damit arbeiten, ihn codieren und kennenlernen und schließlich beginnen, Patches an das Quellprojekt zurückzusenden Arbeiten Sie an einem Open-Source-Projekt, an dem Sie ein berechtigtes Interesse haben.

Und natürlich lernst du git kennen, was umso besser ist.


5
-1: Das ist zwar wertvoll, setzt ihn aber nicht den theoretischen Aspekten der Informatik aus, die er kennen muss.
Ken Bloom

Wenn Sie das getan haben, haben wir auch ein persönliches Git-Repo. Wenn Sie mit Github rumhängen, sind Sie ein besserer Programmierer
Optimus,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.