Wie wichtig ist es, zu wissen, wie man für TCS programmiert?


66

Ich komme aus einem mathematischeren Umfeld und habe nie wirklich gelernt, wie man programmiert. Ich beginne eine Promotion in TCS und viele Leute waren überrascht, wie wenig ich über Programmierung (und über Computer im Allgemeinen) wusste. Ich kann Algorithmen in Pseudocode schreiben, kenne aber keine Programmiersprache.

Ich kann mir vorstellen, dass ich eines Tages einige Algorithmen für meine Arbeit implementieren muss, aber kann ich dann auf diesen Moment warten? Oder gibt es noch etwas mehr?

Wie wichtig ist es, zu wissen, wie man in TCS codiert (in Bereichen, in denen die Programmierung nicht direkt involviert ist): Gibt es Gründe, die einen CC-Theoretiker (zum Beispiel) dazu bringen könnten, zu wissen, wie man codiert? Lohnt es sich, viel Zeit damit zu verbringen, das Programmieren zu lernen? Und wenn ja, gibt es eine Kategorie (funktional, imperativ, objektorientiert ...) von Programmiersprachen, die besser geeignet wäre?


12
Sie sollten einige programmiert haben, um aussagekräftigen, dh eindeutigen und Laufzeit-reflektierenden Pseudocode zu schreiben. Mathematiker tun oft beides nicht. Auch, wenn Sie wollen , um tatsächlich nutzen die Theorie Sie entwickeln, die Chancen sind Sie haben etwas zu implementieren. In Bezug auf Sprachen ist es wahrscheinlich besser, wenn Sie etwas Funktionales lernen. C ist gut für die Leistung, aber schwer zu überlegen und in vielen Aspekten chaotisch. (Wie Sie sehen können, YMMW)
Raphael

6
Ich stimme mit "Mathematiker tun oft beides nicht." Ein einfacher Test für die Frage, ob ein Mathematiker, der einen Algorithmus beschreibt, jemals wirklich programmiert hat, lautet: "Was genau meinen Sie mit 'Gegeben ein X ...'?"
Jeffs

4
Programmierung, was ist das? Theoreme sind meine Programme. Ein Garvorgang unterscheidet sich von der Kochkunst. Entschuldigung, in mehr als 20 Jahren kann ich keinen Programmcode lesen. Eigentlich hasse ich dieses Durcheinander "auf dem PC realisiert". (Schon diese Notation macht krank.) Euklid konnte nicht programmieren. Dennoch machte er Programme für Jahrhunderte.
Stasys

6
@StasysJukna: Euclid war wirklich ein wirklich beschissener Programmierer. Er hat seine Algorithmen nicht nur nie implementiert, sondern sie auch nie in mäßig komplizierten Testfällen von Hand ausgeführt.
Jeffs

3
@ Jɛ ɛ E: Ja, Euclid war ein beschissener Programmierer, genau das wollte ich sagen. Wir bei TCS neigen dazu, nicht zwischen Kochbüchern und Spannkunst zu unterscheiden. Euklid konnte. Ich habe großen Respekt vor Leuten, die KÖNNEN zu programmieren. Aber ich denke nicht, dass diese Funktion "ein CAN in TCS" bedeutet. Es wird einfach nicht weh tun.
Stasys

Antworten:


55

Die theoretische Informatik ist ein weites Feld, und die Bedeutung der Programmierung hängt davon ab, was Sie in TCS tun. Ich werde zwei Möglichkeiten erwähnen, wie Ihnen die Programmierung helfen kann, ohne zu implizieren, dass dies die einzigen Möglichkeiten sind.

Erstens, wenn Sie Algorithmen für Probleme von praktischer Bedeutung entwerfen, kann die Implementierung Ihrer Algorithmen und die Bereitstellung des Codes für andere von großem Vorteil sein. Beispielsweise tritt das Problem der konvexen Hülle in vielen Bereichen auf, und die Leute verwenden Softwarepakete wie cdd von Komei Fukuda und lrs von David Avis, um dieses Problem zu lösen. Wenn sie ihre Algorithmen nur in Artikeln veröffentlicht hätten, hätten wahrscheinlich weniger Menschen ihre Algorithmen verwendet. Mehr Benutzer bedeuten mehr Feedback und wahrscheinlich auch mehr Möglichkeiten zur Zusammenarbeit, was von unschätzbarem Wert ist.

Zweitens hilft Ihnen das Schreiben eines einmaligen Codes, selbst wenn Sie nicht mit Algorithmen arbeiten, eine einfache Vermutung zu testen, wenn die Vermutung für die numerische Berechnung geeignet ist. Wenn Sie sich zum Beispiel fragen, ob das Produkt von drei positiv bestimmten Matrizen immer eine positive Spur hat, können Sie leicht einen Code schreiben, um einige zufällige Auswahlen von 2 × 2 oder 3 × 3 positiv bestimmten Matrizen zu testen und ein Gegenbeispiel zu finden. Obwohl Sie nicht annoncieren, dass Sie ein Programm zum Testen der Vermutung geschrieben haben, kann die Programmierung die Zeit sparen, die vergeblich für den Nachweis einer falschen Aussage aufgewendet worden wäre.

Die zu wählende Programmiersprache hängt davon ab, was Sie mit der Programmierung anfangen möchten. Meiner Meinung nach kann sie ein Thema für ein ganzes Buch sein. Wenn Sie jedoch Algorithmen entwerfen und diese implementieren möchten, damit andere Benutzer die Implementierung verwenden können, ist ein wichtiger Faktor die Verfügbarkeit. Obwohl Sie davon ausgehen können, dass die meisten potenziellen Benutzer Ihres Codes Zugriff auf einen C-Compiler haben, können Sie nicht davon ausgehen, dass dieselben Personen Zugriff auf einen Haskell-Compiler haben. Bei einmaligen Programmen basiert die Auswahl eher auf den verfügbaren Bibliotheken und schließt Umgebungen wie Matlab ein.

Das Programmieren kann übrigens auch Spaß machen.


2
@SureshVenkat: Wenn das Programmieren Spaß macht, ist die Frage „Wie wichtig ist das Programmieren?“ Möglicherweise nicht sehr relevant. Aber dann wird der größte Teil meiner Antwort irrelevant. Wie traurig! :)
Tsuyoshi Ito

Ich habe vorher nicht an Ihr zweites Argument gedacht, in der Tat scheint es eine wirklich gute Idee zu sein, eine Vermutung mit einem kurzen Programm zu testen! Was das Programmieren angeht, kann es anscheinend Spaß machen, aber ich muss noch über all die langen Wochenendstunden hinwegsehen =).
Gopi

@Gopi: Das heißt, viele Vermutungen passen nicht in dieses "Test mit einem einfachen Programm" -Framework. Zum Beispiel können wir normalerweise kein asymptotisches Verhalten testen (zumindest nicht mit einem einfachen Programm). Aber wenn Sie eine Vermutung haben, die getestet werden kann, kann ein wenig Programmierung ein mächtiges Werkzeug sein. Zum Spaß, ja, ich verstehe. Ich wollte den „lustigen“ Standpunkt einfach nicht ignorieren, indem ich nur einige Motivationen aus der Sicht des „Nützlichen“ auflistete.
Tsuyoshi Ito

3
Knuths Notizen zu einem Problemlösungskurs haben ein wunderbares Beispiel für das Zusammenspiel von Vermutungen und Code (siehe Problem 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (Mir gefällt besonders das Bild von jemandem Klassenzimmer rauschen in einen Haufen von Ausdrucken Lager)
Suresh Venkat

47

Ich fühle mich gezwungen, Doron Zeilberger zu zitieren:

Meinung 37 : Programmieren macht noch mehr Spaß als beweisen, und, was noch wichtiger ist, es gibt so viel, wenn nicht mehr, Einsicht und Verständnis.

Lesen Sie die Meinung, es ist voll von Edelsteinen (aber er neigt dazu, absichtlich provokativ zu sein). Zum Beispiel: "Der beste Weg, etwas zu verstehen, besteht darin, es zu lehren. Aber noch besser als es den Menschen beizubringen, ist es, es einem Computer beizubringen."

Meine persönliche Erfahrung ist, dass Sie auch bei rein theoretischer Arbeit einige Computerwerkzeuge benötigen. Ich vermeide viele mühsame algebraische Routine-Manipulationen mit Mathematica. Ich teste meine halbherzigen Vermutungen, indem ich kleine Instanzen auf Matlab oder Python brachial erzwinge. Ich habe einen Artikel mitgeschrieben, der reine Kombinatorik ist, und das ist die Arbeit, die am meisten davon profitiert hat, umfangreiche Computerexperimente durchzuführen, um zu verstehen, was vor sich geht. Euler erstellte riesige Tabellen mit langwierigen Berechnungen, um einen Einblick in Probleme zu erhalten. Wir sind es ihm schuldig, diesen Prozess mit unseren Werkzeugen zu automatisieren, wenn wir Mathematik machen.

Wenn Sie an Algorithmen und Datenstrukturen arbeiten, bietet die Programmierung darüber hinaus eine unersetzliche Perspektive in Bezug auf Effizienz und Benutzerfreundlichkeit. Meine Meinung hier unterscheidet sich von anderen etwas. Ich denke, das Erlernen einer funktionalen Sprache, damit Sie Beweise schreiben können, die richtig geschrieben sind, ist Zeitverschwendung (ich denke, es ist ein großartiger Punkt, dass Leute, die Erfahrung mit einer stark getippten Sprache haben, wahrscheinlich dazu neigen, sorgfältig strukturierte Beweise zu schreiben; ich schreibe nur Ich glaube nicht, dass es Ihre Zeit wert ist, diese Übung durchzuarbeiten. Die funktionale Programmierung verschleiert Probleme beim Algorithmus-Design und bei der Laufzeit und betont Fragen der Logik und Semantik (und natürlich ist das Erlernen der funktionalen Programmierung wahrscheinlich ein Muss und eine Selbstverständlichkeit, wenn Sie sich für Logik / PL-Semantik interessieren). Ähnlich, Ich denke, dass der Einstieg in die OO-Details von Java und C ++ auch nicht die optimale Art ist, Ihre Zeit zu verbringen, da der Zweck von OO darin besteht, modular wiederverwendbaren Code zu schreiben. Dies ist der richtige Weg, um Code für andere zu erstellen. Für den Fall, dass Sie einen Einblick in die Effizienz und die Laufzeit erhalten möchten und sich für wirklich effiziente Algorithmen und Datenstrukturen interessieren, schlage ich C vor. So können Sie in der Nähe der Maschine bleiben und dennoch ein angemessenes Maß an Abstraktion erzielen . Auf diese Weise bekommen Sie ein Gefühl dafür, was schnell und was langsam ist, was eine vernünftige Datenstruktur ist usw. Für den Fall, dass Sie einen Einblick in die Effizienz und die Laufzeit erhalten möchten und sich für wirklich effiziente Algorithmen und Datenstrukturen interessieren, schlage ich C vor. So können Sie in der Nähe der Maschine bleiben und dennoch ein angemessenes Maß an Abstraktion erzielen . Auf diese Weise bekommen Sie ein Gefühl dafür, was schnell und was langsam ist, was eine vernünftige Datenstruktur ist usw. Für den Fall, dass Sie einen Einblick in die Effizienz und Laufzeit erhalten möchten und sich für wirklich effiziente Algorithmen und Datenstrukturen interessieren, schlage ich vor, C zu untersuchen. Dadurch können Sie in der Nähe der Maschine bleiben und dennoch ein angemessenes Maß an Abstraktion erzielen . Auf diese Weise bekommen Sie ein Gefühl dafür, was schnell und was langsam ist, was eine vernünftige Datenstruktur ist usw.


10
"Funktionale Programmierung verschleiert Probleme beim Algorithmus-Design und der Laufzeit und betont logische und semantische Probleme." Kampf Worte :)
Suresh Venkat

3
"Funktionale Programmierung verschleiert Probleme beim Algorithmus-Design und der Laufzeit und hebt logische und semantische Probleme hervor." Aus diesem Grund ist es eine gute Wahl, wenn Sie auf der Logik- oder Semantikseite von TCS arbeiten. :)
Radu GRIGore


3
@Sasho: Alle gewöhnlichen Techniken funktionieren immer noch in funktionalen Sprachen. Das einzige "Problem" besteht darin, dass die funktionale Programmierung einen Programmierstil und ein Datenstrukturdesign fördert, für die gewöhnliche Techniken der algorithmischen Analyse nicht ausreichend gerüstet sind. (ZB, was ist das große O der Funktionszusammensetzung? Die Operation ist trivial , aber sie widerspricht vollständig den Annahmen der asymptotischen Komplexität - es gibt keine einfache numerische Metrik der Größe für eine funktionale Eingabe.)
Neel Krishnaswami

3
@SashoNikolov: Wann immer ich einen Abschluss in Datenstrukturen unterrichte, wünschte ich mir wirklich, ich könnte davon ausgehen, dass jeder über eine funktionale Programmiererfahrung verfügt. Anstatt drei 90-minütige Vorträge zu verbringen, um die Persistenz zu erklären, könnte ich einfach sagen: "Hey, haben Sie bemerkt, dass Ihre Datenstrukturen bereits DIESES tun?"
Jeffs

33

Sie können ein ziemlich erfolgreicher theoretischer Informatiker sein, ohne zu programmieren. Für einige Leute ist das Programmieren ziemlich schwierig, und wenn Sie einer von ihnen sind, sollten Sie nicht verzweifeln und die Felder wechseln.

Für die meisten Absolventen der Mathematik- und Informatikwissenschaften ist das Erlernen des Programmierens jedoch nicht besonders schwierig und eine Fähigkeit, die sehr nützlich ist. Sie sollten eine Programmiersprache lernen und wenn Sie Spaß daran haben, sollten Sie versuchen, genug Übung zu bekommen, um einigermaßen kompetent darin zu werden. Dann, wenn der Punkt kommt (und es wird), dass es für Ihre Forschung nützlich sein wird, ein Programm zu schreiben, werden Sie in der Lage sein, es zu tun.

Wenn Sie jetzt nicht programmieren lernen, ist es sehr wahrscheinlich, dass Sie, wenn Sie irgendwann ein Programm schreiben müssen, keine Zeit zum Lernen haben und es daher möglicherweise nicht wirklich schreiben und am Ende weniger effektiv in Ihrem Programm sind Forschung. Während es nicht allzu schwierig ist, einen Studenten oder ein Undergraduierten dazu zu bewegen, dies für Sie zu tun, ist es in vielen Fällen viel einfacher und weniger zeitaufwendig, es selbst zu tun, anstatt ihnen das Problem zu erklären.

Welche Sprache solltest du lernen? Ich würde eine objektorientierte Sprache empfehlen, da dies die derzeit am häufigsten verwendeten sind und ich vermute, dass dies in Zukunft wahrer sein wird. Vielleicht Python oder Java - beide sind objektorientierte Sprachen, und obwohl sie in der Praxis weniger verwendet werden als C ++, ist mein Eindruck, dass sie beide viel, viel einfacher zu erlernen sind. (Vorbehalt: Ich kenne C ++ nicht, obwohl ich bei Bell Labs gearbeitet habe, also liege ich vielleicht falsch.)


2
Ich sehe die Wahrheit in deinem dritten Absatz :).
Gopi

1
"Für die meisten Menschen ist das Erlernen des Programmierens jedoch nicht besonders schwierig" - meine Erfahrung führt dazu, dass ich dem nicht zustimme, aber die meisten Menschen sind keine TCS-Forscher.
Max

2
Mit dem Aufstieg von Sage ist es möglich, mit einer schönen, beliebten Sprache wie Python zu arbeiten, während mathematische Bibliotheken im Mathematica / Maple / Matlab-Stil sofort verfügbar sind.
András Salamon

1
C ++ hat das fortschrittlichste Typ- / Metaprogrammiersystem aller gängigen Allzweck-Programmiersprachen, die ich gesehen habe, mit Ausnahme der Familie der Lisp-Sprachen. Wenn Sie sich also mit Typentheorie, Sprachdesign oder Compilertheorie oder allgemeiner mit formaler Semantik beschäftigen, möchten Sie sich vielleicht damit auskennen. Neben C ++ sind Java und C # ein Muss, wenn Sie experimentelle Informatik erforschen oder eine Stelle als Programmierer oder Softwareentwickler in der Branche anstreben. Python sollte an Gymnasien unterrichtet werden: D
Antonio Valerio Miceli-Barone

4
@ AntonioValerioMiceli-Barone: Zumindest in Bezug auf Typentheorie, Sprachdesign, formale Semantik und Programmiersprachtheorie (PLT) muss ich nicht zustimmen: C ++ ist nicht die Sprache, die man in diesen Bereichen lernen kann. TT und formale Semantik beziehen sich fast ausschließlich auf funktionale Programmierung, während die PL-Community vielfältiger ist, aber elegantere Sprachen als C ++ bevorzugt. Haskell ist die "Mainstream" -Sprache mit dem fortschrittlichsten Typsystem, gefolgt von Scala (weniger fortgeschritten, etwas mehr Mainstream). C ++ hat interessante Funktionen, ist aber für den modernen Geschmack zu niedrig.
Blaisorblade

33

Es gibt eine andere Antwort, die niemand wirklich hervorgebracht hat. Programmierung kann tatsächlich zu einer interessanten Theorie führen. Viele der jüngsten Entwicklungen beim Hashing (insbesondere beim Tabellierungs-Hashing) beruhen nicht auf theoretischen Überlegungen an sich, sondern auf der Tatsache, dass die theoretisch optimalen Algorithmen in der Praxis nicht so gut sind. Das wissen Sie natürlich nur, wenn Sie Code schreiben können.

Selbst im Bereich der exakten exponentiellen Zeitalgorithmen sind Algorithmen eine Motivation, die tatsächlich funktionieren können. SAT-Löser sind das kanonische Beispiel dafür.

Kurz gesagt, die Fähigkeit zum Codieren ermöglicht es Ihnen, Mängel und Schwächen in Bezug auf möglicherweise optimale theoretische Ergebnisse zu erkennen, was wiederum neue theoretische Forschungsrichtungen eröffnet.


Ihre Antwort könnte vielleicht bei der Frage nach empirischen Ergebnissen bei TCS helfen .
Gopi

vielleicht: aber dieser thread ist schon lange ausgestorben :)
Suresh Venkat

Tatsächlich habe ich mir das Datum nicht angeschaut, es war im letzten Newsletter, den ich erhalten habe, in der Rubrik "Größte Hits der vergangenen Wochen" =).
Gopi

18

Drei Punkte:

1) Es gibt einen mathematischen Ansatz namens Experimental Mathematics (siehe auch Wikipedia: // Computer Aided Proof ), bei dem Sie mithilfe von Computerprogrammen Muster und Strukturen von Objekten untersuchen, um analytische Beweise für diese Objekte zu erhalten. Für diesen Ansatz sollten Sie besser programmieren können. Sie können sicher sein, dass Sie diesen Ansatz benötigen, um sehr theoretische Aussagen zu beweisen. Ich glaube, dass sich Snobismus gegen die Programmierung in der TCS-Forschung oft als wenig hilfreich herausstellt.

AL(X,Y)BL(Y,C)

3) Wenn Sie "programmieren" sagen, meinen Sie dann auch " linear programmieren " oder " semidefinit programmieren "? :)


2
Niemand, den ich kenne, verwendet "zum Programmieren" für "zum linearen Programm" oder "zum semidefiniten Programm". Sie würden stattdessen "ein lineares Programm konstruieren / lösen" sagen.
Peter Shor

2
@PeterShor Punkt 3 war nicht ernst
Alessandro Cosentino

3
Und natürlich, Sie sollten auch auf lineares Programm lernen und Programm semidefinite ... beid nützliche Fähigkeiten.
Peter Shor

3
+1 für Punkt 2, ich habe tatsächlich ein wenig OCaml gelernt, als ich noch nicht abgeschlossen war, obwohl ich es nur ein Jahr lang benutzt habe, habe ich mir angewöhnt, die Art meiner Beweise zu überprüfen.
Gopi

4
Ich programmiere dynamisch !
Jeffs

16

Danke Gopi für diese Frage. Ich möchte die vielen interessanten Antworten in einer anderen Dimension erweitern, die noch nicht erwähnt wurde.

Forschung ist nicht das Einzige, was wir an der Universität tun: Wenn Sie in der Wissenschaft bleiben wollen, müssen Sie irgendwann unterrichten. Wenn Sie Glück haben, müssen Sie Kurse unterrichten, die weit von Ihrem Fachgebiet entfernt sind. Sehr wahrscheinlich werden Ihnen Kurse mit einer umfangreichen Programmierkomponente zugewiesen. Hier hilft auch eine moderate Programmierfähigkeit erheblich: Sie sind viel besser als Lehrer, wenn Sie programmieren können. In erster Linie werden Sie sich mit dem Material besser auskennen, die Fragen der Schüler besser beantworten können und die Schwierigkeiten verstehen, die die Schüler beim Programmierenlernen haben, da Sie diesen Lernprozess selbst erlebt haben. Darüber hinaus können Sie besseres Unterrichtsmaterial erstellen. Zum Beispiel können Sie selbst Programmierübungen testen, bevor Sie sie den Schülern geben.

Es gibt noch eine weitere pragmatische Dimension: Das Unterrichten umfasst verschiedene sich wiederholende Aufgaben, die ein erfahrener Programmierer oft automatisieren kann, beispielsweise das schnelle Erstellen einer Website, auf der die Kursteilnehmer Kursarbeiten einreichen können, und deren automatische Bewertung (entsprechend der Anzahl der durch den Code bestandenen automatisierten Tests).


"Wenn Sie Glück haben, müssen Sie Kurse unterrichten, die weit von Ihrem Fachgebiet entfernt sind." Ist das Glück ...?
Tsuyoshi Ito

3
@ Tsuyoshi: Nun, es zwingt dich, dich mit einem neuen Themenbereich vertraut zu machen. Kurzfristig bedeutet dies eine Menge Arbeit (die sich auf lange Sicht amortisiert, da Sie dieses Material wahrscheinlich mehr als einmal unterrichten werden). Gleichzeitig erweitert es Ihren intellektuellen Horizont erheblich.
Martin Berger

@ TsuyoshiIto: Ja!
Jeffs

13

Das Programmieren ist ein guter Weg, um Ihr Verständnis für verschiedene Konzepte zu verbessern, aber es ist auch eine gefährliche Zeitsenke.

Ein typisches Argument gegen die Programmierung ist, dass Sie Zeit mit unwichtigen Details verbringen müssen. Ein typisches Argument für die Programmierung ist, dass Sie erkennen, dass Details, die Sie für unwichtig hielten, tatsächlich wichtig sind. Gute Programmierkenntnisse bedeuten vor allem, dass Sie in der Lage sind, die unwichtigen Teile schnell zu bearbeiten. Gut zu werden dauert lange .

Was das Erlernen der Programmiersprache angeht: "Alle von ihnen" ist meine (humoristische) Antwort.


2
Endlich ein Argument gegen die Programmierung :).
Gopi

1
@Gopi, ich denke, dass das Programmieren eine Menge Spaß machen kann und dass es sehr wichtig ist, dass Sie besser verstehen, was Sie erreichen. Die anderen Antworten geben großartige Beispiele dafür, wie das Programmieren zum Verständnis beiträgt. Deshalb möchte ich Sie ermutigen, Programmieren zu lernen und nicht aufzugeben, wenn sich das Unternehmen nicht schnell auszahlt.
Radu GRIGore

6
Das Beweisen von Theoremen ist auch ein guter Weg, um Ihr Verständnis für verschiedene Konzepte zu verbessern, aber es ist auch eine gefährliche Zeitsenke.
Jeffs

@ Jɛ ɛ E, meine Meinung bleibt durch die Substitution [Pseudocode-> Proof auf Papier, Code-> Proof in einem Proofassistenten] erhalten.
Radu GRIGore

12

Ich bin zu spät zur Party und das sind alles tolle Antworten, aber ich habe einen anderen Grund:

Visualisierung.

Ja, oft werden Sie mit Dingen arbeiten, die nicht visualisiert werden können, aber oft werden Sie mit Dingen arbeiten, die es können. Programmierkenntnisse sind für diese Aufgabe unabdingbar, und die Visualisierung bietet Ihnen einen umfassenden Einblick in ein Problem.


3
Ich kann programmieren und bin absolut hoffnungslos bei der Visualisierung. Ich vermute auch, dass es Tools gibt, mit denen Sie Dinge visualisieren können, ohne viel programmieren zu müssen. Wenn nicht, sollte und wird es vielleicht in ein paar Jahren sein.
Peter Shor

@PeterShor: Weil du kein C ++ verwendest! (Nur ein Scherz)
Tsuyoshi Ito

1
@PeterShor: Ich beziehe mich nicht auf eine bestimmte Sprache oder Umgebung. MATLAB zählt hier. Aber wenn Sie wissen, wie man programmiert, erhalten Sie Visualisierungen, die ansonsten unglaublich unpraktisch wären. Zum Beispiel ist der Raum von zweidimensionalen positiv definierten Matrizen dreidimensional, und ich wollte eine Konstruktfamilie in diesem Raum visualisieren. Ich musste mir eine Transformation einfallen lassen und sie dann codieren, um meine Objekte wirklich zu sehen.
John Moeller

@ John ... du hast recht, ich glaube nicht, dass du das anders hättest machen können.
Peter Shor

7

Nur ein kurzer Punkt: Wenn ich weiß, wie man programmiert, habe ich ein zusätzliches Werkzeug in der Theorieforschung. Wenn ich einen Algorithmus habe, von dem ich denke, dass er funktioniert, kann ich ihn, wenn er einfach genug ist, verschlüsseln und prüfen, ob er tatsächlich funktioniert. Wenn meine Idee in der Praxis nicht (sogar) funktioniert, ist es unwahrscheinlich, dass sie in der Theorie funktioniert, und dieser Ansatz erspart mir oft enorm viel Zeit, um zu versuchen, etwas zu beweisen, das falsch ist.


Tsuyoshi Ito schrieb ein ähnliches Argument in seine Antwort (zweiter Punkt :)).
Gopi

Ups, du hast recht - ich habe es verpasst.
Lev Reyzin

5

Niemand hier hat sich mit den praktischen Fragen befasst, warum jemand, der TCS studiert, Programmieren lernen sollte.

Wenn Sie planen, in einem Fachbereich Informatik in TCS zu promovieren, stehen die Chancen gut, dass Sie einige nicht-theoretische Kurse belegen müssen, und diese sind mit ziemlicher Sicherheit sehr programmierintensiv. Je nachdem, in welchem ​​Programm Sie sich befinden, benötigen Sie möglicherweise auch Kenntnisse in nicht-theoretischen Fächern, um Ihre Eignungsprüfungen zu bestehen.

Wenn Sie Ihre Promotion abgeschlossen haben, sind die meisten Stellenangebote für TCS im akademischen Bereich. Wenn Sie im akademischen Bereich arbeiten, wird von Ihnen erwartet, dass Sie unterrichten, und von Ihnen wird möglicherweise erwartet, dass Sie eine CS-Klasse für Anfänger unterrichten, die mehr Programmieren als Theorie ist. Selbst wenn Sie eine Theorieklasse für Studenten unterrichten, wie zum Beispiel Algorithmen, können Sie davon ausgehen, dass Ihre Schüler mehr über Programmieren als über Theorie wissen, und ohne zu wissen, was Ihre Schüler wissen, wird es für Sie schwierig sein, die Lücken in ihrem Verständnis zu schließen . Ich schaudere bei dem Gedanken, dass CS-Studenten von jemandem unterrichtet werden, der keine Programmierkenntnisse hat!

Wenn Sie sich nicht für diese praktischen Belange interessieren, können Sie wahrscheinlich Recherchen durchführen, ohne wirklich etwas über Programmierung zu wissen. Sicherlich haben Sie eine Menge Gesellschaft in der TCS-Community, aber die Anzahl der Kilometer hängt davon ab, in welchem ​​Bereich der Theorie Sie gerade arbeiten. Wenn Sie beispielsweise eine Theorie der reinen rechnerischen Komplexität betreiben, beweisen Sie, dass Klassenuntergrenzen bestehen, die niemand hat Wenn Sie schon einmal davon gehört haben, ist es wahrscheinlich, dass die Programmierung für Sie keinen Nutzen hat. Aber wenn Sie etwas Algorithmischeres tun, dann glaube ich, dass es Ihre Intuition stärkt, wenn Sie in der Lage sind, sauberen Code zu schreiben.

Ich empfehle C zu lernen (nicht C ++). Nehmen Sie eine Kopie von K & R und lesen Sie sie von vorne nach hinten. C bietet nicht viele der ausgefallenen Funktionen moderner Sprachen, verfügt jedoch über eine einfache, aber elegante Syntax und Semantik, die Sie vollständig erlernen sollten. Selbst wenn Sie die Sprache vollständig verstehen, ist es immer noch üblich, einen guten, eleganten, fehlerfreien Code in C zu schreiben. Wenn Sie jedoch das Codieren in C beherrschen, können Sie jede Programmiersprache beherrschen, die Ihnen begegnet. Darüber hinaus hilft Ihnen diese Disziplin beim Überlegen, wie die Hardware denkt, was beim Entwerfen von Algorithmen von Vorteil ist.

Ideen wie Zeiger sind für jeden, der Algorithmusdesign betreibt, sehr wichtig, aber leider verbergen Sprachen wie Java und Python sie vor Ihnen. Deshalb empfehle ich sie nicht als Muttersprache für jemanden mit mathematischem Hintergrund. OOP ist wichtiger für Leute, die riesige Softwareprojekte warten müssen, nicht für jemanden, der Algorithmen entwirft.


0

Ich würde vorschlagen, dass Sie den Beginn Ihres Kurses nicht abwarten, da die Informatik auf jeder Ebene die Implementierung von Algorithmen über einen Computer umfasst, um alle Theorien zu erfüllen, zu verifizieren und zu lösen, die Sie während Ihres Kurses konfrontiert werden, INSBESONDERE auf Ihrer Ebene.

Ich musste zuerst in der 10. Klasse (Gymnasium) programmieren, und ich wusste bereits, wie man eine Befehlszeile verwendet, und das hat mir sehr geholfen (dies soll Ihnen zeigen, wie "grundlegende" Programmierfähigkeiten in CS berücksichtigt werden).

Das Erstaunen Ihrer Kollegen ist begründet, da Pseudocode und Algorithmen zu den ersten Dingen gehören, die man lernen muss, um zu programmieren.

Sie sollten sich jedoch in Ihrem nächsten Kurs nicht völlig verlaufen, da Sie Ihre (eigenen) erweiterten mathematischen Fähigkeiten nutzen können, um das objektorientierte Programmieren zu überspringen und schneller eine funktionierende Programmiersprache zu erlernen.

  • Funktionale Programmierung ist SEHR mathematisch orientiert, gilt als schwieriger zu erlernen für den erforderlichen mathematischen Hintergrund und als sehr leistungsfähig (auf "einfache", mathematische Weise, um schwierige Probleme mit eleganten und "sauberen" Mitteln zu lösen).
  • Objektorientierung ist gut, wenn Sie die zugrunde liegenden Algorithmen und Implementierungsprinzipien nicht verstehen und bereits vorhandene Objekte einfach "wiederverwenden" möchten.

Ich denke, Sie könnten Haskell angehen (normalerweise keine Muttersprache), weil es rein mathematisch und funktional ist und im Grunde alles kann, was Sie wollen. Wenn Sie Haskell lernen, werden Sie auf ein Niveau gebracht, auf dem Sie nicht viel mehr lernen müssen, um mitzuhalten, und Sie werden sogar in eine Situation der Kontrolle und Macht über Ihren Kurs versetzt. Wenn Sie sich für Statistik interessieren, ist das Erlernen von R ein Plus, aber nicht so viel wie bei Haskell. Ich habe Berichte von Mathematikern gesehen, aus denen hervorgeht, wie überrascht sie über die Nähe zu Mathematik waren und wie sie ihre Denkweise annahmen.

Eine Herausforderung, die es wert ist, angegangen zu werden (um sich schnell an eine Programmierumgebung zu gewöhnen), wäre auch, Linux zu installieren und zu verwenden (Ubuntu Linux wird es tun). Vertrauen Sie mir, Sie werden viel lernen, indem Sie damit spielen ...

Diese Ratschläge sind der beste Weg, um schnell und sicher einen Mathematiker in der Informatik zu finden. Außerdem ist die Open-Source-Community sehr freundlich und hilfsbereit, und wenn Sie nicht weiterkommen, ist IRC die direkteste Möglichkeit, über spezialisierte Kanäle über ein Thema zu sprechen (auf FreeNode verbinden). Denken Sie daran: Fragen sind die einzige Möglichkeit, Fragen zu beantworten, sei es für Sie selbst, ein Forum, eine Suchmaschine oder in Chatrooms.


4
Ich weiß nicht, wie oft Sie die ursprüngliche Frage beantworten: Ich habe nicht gefragt, wie ", sondern wofür".
Gopi

0

Ein Beispiel für eine C ++ - Implementierung eines interaktiven Proofsystems ist das folgende Papier: Zeitoptimale interaktive Proofs für die Schaltkreisbewertung von Justin Thaler. Es ist unter http://people.seas.harvard.edu/~jthaler/ verfügbar . Dies scheint ein Schritt in Richtung des Ziels zu sein, eine praktische Implementierung von interaktiven Allzweck-Proofsystemen zu entwickeln.

Ähnliche Veröffentlichungen und zugehörige Quellcodes finden Sie auf der oben genannten Website.


3
Würden Sie erklären, wie dieses Papier mit der Frage zusammenhängt, dh wie wichtig es ist, zu wissen, wie man für TCS programmiert ?
Scaaahu

Selbst wenn es ein Beispiel für ein theoretisches Ergebnis wäre, das von der Programmierung profitiert, würde es die ursprüngliche Frage nicht beantworten?
Jeremy

In der Frage wird gefragt, ob ein Komplexitätstheoretiker die Codierung kennen muss. Das oben erwähnte Papier verwendet eindeutig experimentelle Ergebnisse, um theoretische Konzepte zu ergänzen. Dies erfordert Codierung. Auf jeden Fall habe ich sehr lange gebraucht, um ein Programmierprojekt zu finden, das so eng mit einem zentralen Konzept in der theoretischen Informatik verwandt ist. Ich hoffe, dieser Beitrag könnte für jemanden nützlich sein, der eine ähnliche Suche durchführt.
Lgidwani
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.