Ressourcen zum Selbststudium der theoretischen Informatik für Programmierer

14

Ich bin ein ziemlich erfahrener Softwareentwickler, aber ich kenne nicht viel Theorie. Ich möchte mehr Theorie lernen. Bestimmte Themen, die mich interessieren, sind: Komplexität der Berechnungen, formale Sprachen und Typentheorie. Aber ich bin ratlos, wie ich anfangen soll, über diese Felder zu lernen.

Welche Ressourcen würden Sie jemandem empfehlen, der mehr Theorie durch Selbststudium lernen möchte? Gibt es Anleitungen zum theoretischen Selbststudium in der Informatik für Software-Ingenieure?

Henry H.
quelle
3
Es kommt darauf an, was Sie lernen möchten. Arora-Barak gibt eine gründliche Einführung in die Theorie der rechnerischen Komplexität (und ist online frei verfügbar). Das ist also ein guter Anfang.
Thomas unterstützt Monica
4
Haben Sie an einem College / einer Universität Theoriekurse wie Datenstrukturen, Algorithmen usw. belegt? Wenn Sie nicht die normalerweise erforderlichen theoretischen Grundkurse belegt haben, sind Lehrbücher für diese Kurse ein guter Ausgangspunkt. Danach können Sie einen Blick auf Wikipedia - Artikel haben, unsere Liste der Bücher und Liste der Videos , Online - Kurse bei Coursera / Udacity / EDX / ... Coursera hat recht nette Theorie - Kurse.
Kaveh
Was hast du am College studiert?
Omar Shehab
In welchen Sprachen programmieren Sie? Ein Großteil des theoretischen CS kann zusammen mit etwas Konkretem erlernt werden. Wenn Sie beispielsweise mehr über formale Sprachen lernen möchten, sind reguläre Sprachen / Ausdrücke (dh reguläre Ausdrücke) ein guter Ausgangspunkt, ebenso wie das Lernen für Compiler. Für die Typentheorie möchten Sie möglicherweise mit einer statisch typisierten Sprache wie haskell, F # oder ML spielen.
Baby Dragon
Probieren Sie New Turing Omnibus von Dewdney als einen breiten / zugänglichen Intro-Ref / Survey / Querschnitt. siehe auch pop science books, die TCS inspirieren
vzn

Antworten:

7

Es ist ein weites Feld mit ein paar ganz unterschiedlichen Bereichen.

Ich würde mit einigen der grundlegendsten Ideen darüber beginnen, was Computer sind: Hopcroft und Ullman, "Einführung in die Automatentheorie, Sprachen und Berechnungen".

Der Grund, warum ich das besonders empfehlen würde, ist ihre Betonung auf Beweisen. Sie führen Sie durch eine rigorose Denkweise. Das ist der Unterschied zwischen dem Schreiben von Programmen und dem wissenschaftlichen Arbeiten.

Kate F
quelle
1
Vielen Dank! Ich weiß nicht, ob dies irgendetwas ändert, aber ich habe tatsächlich einen Hintergrund in der beweisbasierten Mathematik (das hätte ich wahrscheinlich in der Frage erwähnen sollen). Ich habe beweisbasierte Realanalyse, Punkt-Set-Topologie und abstrakte Algebra durchgeführt.
Henry H.
Dann werden Sie es sehr schnell durcharbeiten können :)
Kate F
Es ist ein Unterschied, aber nicht der Unterschied. CS beinhaltet viele andere Prinzipien usw.
vzn
Ich glaube nicht, dass das Bedürfnis nach Strenge wirklich einen Unterschied zwischen Programmierung und Mathematik ausmacht. Das Programmieren und Beweisen von Theoremen ist eine sehr verwandte Aufgabe (vgl. Curry-Howard-Isomorphismus), und kaum eine nicht-mathematische Aufgabe erfordert mehr Strenge als das Programmieren. Compiler verzeihen Fehler viel weniger als Menschen, die Beweise lesen.
Jan Johannsen
2
@ JanJohannsen Ich würde dem nicht zustimmen - siehe z. B. Undefiniertes Verhalten für C.
Kate F
9

Es gibt verschiedene Möglichkeiten, die Typentheorie kennenzulernen. Für einen arbeitenden Programmierer ist Types and Programming Languages von B. Pierce ein guter Anfang. Praktische Grundlagen für Programmiersprachen von R. Harper könnten ebenfalls gut sein. Wenn Sie leicht lesbare Hintergrundinformationen zur operativen Semantik wünschen, empfehle ich G. Winskels, Die formale Semantik von Programmiersprachen: Eine Einführung . Mit T. Nipkow, G. Klein, Concrete Semantics, eine Variante von Winskels Buch wurde für den interaktiven Proofassistenten Isabelle / HOL formalisiert. Ich vermute, es ist wirklich schwierig, einen Prüfer nur aus diesem (oder irgendeinem) Buch heraus in den Griff zu bekommen. Man möchte, dass ein Experte in der Nähe Fragen stellt. Wenn Sie eine mathematischere Herangehensweise an die Typentheorie suchen, können Sie JR Hindley, JP Seldin, Lambda-Kalkül und Kombinatoren: Eine Einführung oder H. Barendregts , Lambda-Kalkül mit Typen betrachten . Obwohl ich es nicht empfehlen würde, von Barendregt aus zu starten.

Wenn Sie eine einzige Empfehlung wünschen, würde ich sagen, dass Sie alles von Pierce mit Ausnahme von Teil VI (Systeme höherer Ordnung) lesen und die in diesem Buch behandelten Spielzeugsprachen implementieren. Sie werden eine solide Grundlage in der Typentheorie haben und wahrscheinlich auch einen besseren Programmierer.

Martin Berger
quelle
2

Ich empfehle Berechenbarkeit, Komplexität und Sprachen von Martin Davis, Ron Sigal und Elaine Weyuker.

valepert
quelle
Das ist ein wunderschönes Buch für old-skool TCS. Mit Ausnahme des Teils der domänentheoretischen Semantik, der übersprungen werden kann.
Martin Berger
1

Ich bin ein großer Fan von Theorie und Algorithmen. Ich hatte einmal die Gelegenheit, Theoretische Informatik am Indian Institute of Technology in Madras (IIT-M), Indien, zu besuchen. Ich habe dort am IIT-M viele Theoretiker kennengelernt. Als ich dorthin ging, hatte ich keine Ahnung, was Theorie ist, aber heute bin ich total verliebt in sie.

Dank @Kate F für den Zeiger, ja, Hopcroft und Ullman sind ein ausgezeichneter Ausgangspunkt.

Aber hier ist, wie ich angefangen habe,

  1. Lesen Sie die Einführung in Algorithmen von Cormen. <\ Br> Dies ist ein ausgezeichneter Ausgangspunkt. Versuchen Sie beim Lernen, jeden Beweis so ausführlich wie möglich zu verstehen. Wenn Sie den Beweis gut verstehen, versuchen Sie, dieselbe Logik in einer Sprache Ihrer Wahl zu codieren. (Es dauert ein bisschen länger, aber es ist einen Versuch wert)

  2. Folgen Sie den Top - Konferenzen in Theorie wie
    FOCS
    SODA
    STOC
    EC (Elektronischer Handel) - Algorithmische Spieltheorie
    COLT (Konferenz für Lerntheorie) - Lerntheorie
    CRYPTO - Kryptographie
    SOCG (Symposium für Computational Geometry) - Computational Geometry
    CCC (Konferenz für Computational Complexity) - Komplexitätstheorie

Auch wenn Sie nicht viel verstehen, versuchen Sie, so viel wie möglich zu lesen und zu DENKEN . Sie müssen so viele Beweise wie möglich machen.

  1. Dies ist ein wunderbarer Ort, wenn Sie insbesondere an die Komplexität von Computern denken ( Dies ist von Stanford ).
  2. Folgen Sie Prof. Sanjeev Arora, Boas Barak, Jelani Nelson, Madhu Sudan
  3. Hier ist eine Reihe von synthetisierten Informationen im Bereich der Computational Complexity
Jaugust
quelle