Frage

In der Klasse haben wir gelernt, über das Halteproblem, Turing-Maschinen, Reduzierungen etc. Viele Mitschüler sagen, das sind alles abstrakt und nutzlos Konzepte, und es gibt keinen wirklichen Sinn, sie zu wissen (dh, können Sie sie einmal vergessen der Kurs ist vorbei und nichts verlieren).

Warum ist Theorie sinnvoll? Betreiben Sie die Sie jemals in Ihrem Tag-zu-Tag-Codierung?

War es hilfreich?

Lösung

Als ich das College abgeschlossen, nahm ich an, dass ich auf einer Stufe mit jedem war anders. „Ich habe einen BS in CS, und so viele anderen Menschen zu tun, und wir können alle im Wesentlichen die gleichen Dinge“ Ich entdeckte schließlich, dass meine Annahme falsch war. Ich stand und mein Hintergrund hatte eine Menge damit zu tun -. Besonders meinen Grad

Ich wusste, dass es eine „leichte“ Unterschied war, dass ich ein „B. S.“ hatte in CS, weil mein College war eine der ersten (angeblich # 2 in 1987) in der Nation Akkreditierung für sein CS-Grad-Programm zu erhalten, und ich graduierte in der zweiten Klasse, die Akkreditierung zu haben. Damals dachte ich nicht, dass es viel zählte.

hatte ich auch während der High School und im College bemerkt, dass ich bei CS besonders gut tat - viel besser als meine Kollegen und sogar besser als viele meiner Lehrer. Ich war für die Hilfe viel gefragt, hätte einige Nachhilfe, gefragt wurde, mit einem Forschungsprojekt zu helfen, und durfte unabhängige Studie tun, wenn niemand sonst war. Ich war glücklich, helfen zu können, aber ich glaube nicht, viel über den Unterschied.

Nach dem College (USAFA), verbrachte ich vier Jahre in der Air Force, von denen zwei meine CS Grad angewandt hat. Es fiel mir auf, dass nur sehr wenige meiner Mitarbeiter Grad hatten oder sogar Ausbildung im Zusammenhang mit Computern. Die Air Force schickte mich zu fünf Monaten des Zertifizierungs-Training, wo ich wieder einen Mangel an Grad oder Ausbildung gefunden. Aber hier habe ich angefangen, den Unterschied zu bemerken - es ist völlig klar wurde, dass viele der Menschen, die ich angetroffen haben nicht wirklich wissen, was sie taten, und das enthielt, die Menschen mit einer Ausbildung oder Grad. Gestatten Sie mir bitte erläutern.

In meiner Air Force Zertifizierungs-Training waren insgesamt dreizehn Menschen (mich eingeschlossen). Als Luftwaffenoffiziere oder gleichwertig, hatten wir alle BS Grad. Ich war in der Mitte bezogen auf Alter und Rang (ich war eine O-2 unter sechs O-1s und sechs O-3-Fettsäuren und höher). Am Ende dieser Ausbildung, die Air Force gewunken uns alle als gleichermaßen kompetent zu erwerben, bauen, Design, Wartung und betreiben jeden Computer oder Kommunikationssystem für einen Teil des Department of Defense.

Doch die dreizehn von uns, nur sechs hatte jede Form von Computer-bezogenen Graden; die anderen sieben Grad hatte Chemie / Biologie Psychologie aus der Luftfahrt zu reichen. Von den sechs von uns mit CS Graden, erfuhr ich, dass zwei nie ein Programm jeglicher Art geschrieben hatte, und hatte noch nie einen Computer mehr als beiläufig (Schreibpapiere, Spiele, etc.) verwendet. Ich erfuhr, dass zwei weitere von uns geschrieben hatte genau ein Programm auf einem einzelnen Computer während ihrer CS-Grad-Programm. Nur eine andere Person und ich mehr als ein Programm geschrieben hatte, oder mehr als eine Art von Computer verwendet -. In der Tat fanden wir, dass wir zwei viele Programme geschrieben und verwendet, um viele Arten von Computern

Gegen Ende unserer fünfmonatigen Ausbildung wurde unsere Klasse ein Programmierprojekt zugeordnet und wir wurden in vier Gruppen aufgeteilt getrennt, um es übernehmen. Unsere Lehrer aufgeteilt, die Klasse, um die „Programmierung Talent“ ziemlich verbreitet, und sie zugewiesenen Rollen von Teamleiter, technischer Projektleiter und Entwickler. Jede Gruppe wurde in der Woche gegeben umzusetzen (Ada) eine Vollbild, textbasierte Benutzeroberfläche (das war 1990) für einen Flugsimulator oben auf eine Instruktor bereitgestellten Flugmechanik Bibliothek. Ich wurde als Tech-Führung für mein Team von vier zugeordnet.

Mein Teamleiter (die keinen Computer Grad hatte) gebeten, die anderen drei von uns, das Projekt in Aufgaben aufzuteilen und dann ein Drittel von ihnen für jeden von uns zugewiesen. Ich beendete meine Drittel der Aufgaben, die von der Mitte des ersten Tages, dann den Rest des Tages verbrachte meine anderen beiden Teamkollegen zu helfen, im Gespräch mit meinem Teamleiter (Büssing; ^)., Und spielen auf meinem Computer

Am nächsten Morgen (Tag zwei), meine Teamleiter privat mich darüber informiert, dass unsere beiden anderen Mitspieler keine Fortschritte gemacht hatte (man konnte nicht wirklich eine „if“ Anweisung schreiben, die kompilieren würde), und er hat mich gebeten, zu nehmenauf ihre Arbeit. Ich beenden das gesamte Projekt bis Mitte Nachmittag, und mein Team verbrachte den Rest des Tages den Simulator fliegen.

Der andere Mann mit dem vergleichbaren CS Grad wurde auch als Tech-Führung für sein Team zugewiesen, und sie bis zum Ende des dritten Tages beendet. Sie begannen auch ihre Simulator fliegen. Die beiden anderen Teams hatten noch nicht fertig oder sogar erhebliche Fortschritte bis Ende der Woche gemacht. Wir waren andere Teams nicht erlaubt zu helfen, wurde dabei so gelassen.

Inzwischen von der Mitte des Tages drei, hatte ich bemerkt, dass der Flugsimulator schien nur „falsch“ zu verhalten. Da einer meiner Mitschüler in der Luftfahrt ein gewisses Maß hatte, fragte ich ihn danach. Er war verwirrt, gestand dann, dass er eigentlich nicht wissen, was ein Flugzeug gemacht fliegen!?! Ich war sprachlos! Es stellt sich heraus, dass seine gesamte Studiengang war über Sicherheit und Crash-Untersuchungen - keine wirkliche Mathematik oder Naturwissenschaften hinter Flug. Auf der anderen Seite hatte ich vielleicht eine kleine in der Luftfahrt (erinnern USAFA?), Aber wir hatten Flügel und durchgeführt realen Windkanaltests entworfen. Deshalb verbrachte ich ruhig den Rest der Woche Umschreiben der Lehrer bereitgestellten Flugmechanik Bibliothek, bis der Simulator „rechts“ flog.

Seitdem habe ich fast zwei Jahrzehnte als Auftragnehmer und gelegentlich als Mitarbeiter ausgegeben, immer Software-Entwicklung zu tun und damit verbundene Tätigkeiten (DBA, Architekten usw.). Ich habe weiterhin mehr von den gleichen zu finden, und schließlich gab ich auf meiner jugendlichen Annahme auf.

Also, was genau habe ich entdeckt? Nicht jeder ist gleich, und das ist in Ordnung - ich bin kein besserer Mensch, weil ich effektiv programmieren kann, aber ich bin noch nützlicher, wenn das ist, was Sie von mir brauchen. Ich erfuhr, dass mein Hintergrund wirklich wichtig:     Aufwachsen in einer Familie von Elektriker und Elektroingenieure,     Gebäude Elektronik-Kits,     BUCHSTäBLICH jeden Computer Buch in der Schule / öffentliche Bibliotheken zu lesen, weil ich keinen Zugang zu einem echten Computer,     dann in eine neue Stadt zu bewegen, wo meine High-School-Computer hatte,     dann meinen eigenen Computer als Geschenk bekommen,     gehen an die Schulen, die Computer von vielen verschiedenen Größen und Arten (PCs bis zu Großrechnern) hatte,     einen anerkannten Abschluss an einer sehr guten Ingenieurschule bekommen,     mit vielen Programmen in verschiedenen Sprachen auf verschiedene Arten von Computern zu schreiben,     mit zu harten Programme schreiben (wie meine eigene virtuelle Maschine mit einer benutzerdefinierten Assembly-Sprache oder einer Huffman-Komprimierung Implementierung, etc.),     mit mir zu beheben,     Aufbau meiner eigenen Computer aus Teilen und ALL der Installation der Software,     etc.

Schließlich erfuhr ich, dass meine Fähigkeiten auf einem Fundament gebaut werden, zu wissen, wie Computer von der elektrischen Ebene arbeiten auf bis - diskreten elektronischen Bauteilen, Schaltungen, Subsysteme, Schnittstellen, Protokolle, Bits, Bytes, Prozessoren, Geräte, Treiber, Bibliotheken, Programme, Systeme, Netzwerke, auf bis zu den massiven Enterprise-Klasse Konglomeraten, die ich routinemäßig jetzt arbeiten. Also, wenn das verdammte Ding schlecht benimmt, ich weiß genau, wie und warum. Und ich weiß, was nicht so gut gemacht werden, wie das, was kann. Und ich weiß viel über das, was geschehen ist, was versucht wurde, und was übrig ist relativ unerforscht.

Am wichtigsten ist, nachdem ich alles gelernt habe, habe ich gelernt, dass ich nicht weiß, ein verdammte Ding. Angesichts all das, was es möglicherweise zu wissen, ist mein Wissen miniscule.

Und ich bin ganz zufrieden damit. Aber ich empfehle, dass Sie versuchen.

Andere Tipps

Eine wahre Geschichte:

Als ich meinen ersten Job als Programmierer stieg aus Graduate School, die Jungs, die das Unternehmen im Besitz, die ich gearbeitet waren Piloten. Ein paar Wochen, nachdem ich eingestellt wurde, einer von ihnen fragte mich, diese Frage:

  

Es gibt 106 Flughäfen in Arkansas.   Könnten Sie ein Programm schreiben, das wäre   findet die kürzesten Router notwendig   Land bei jedem von ihnen?

Ich dachte ernsthaft er mich auf meine Kenntnis des Reiseproblem und NP-Vollständigkeits quizzing. Aber es stellt sich heraus, dass er nicht war. Er wusste nichts darüber. Er wollte wirklich ein Programm, das den kürzesten Weg finden würde. Er war überrascht, als ich erklärte, dass es 106-faktoriellen Lösungen und die Suche nach dem besten ein bekannten rechnerisch unlösbares Problem war.

Das ist also ein Beispiel.

Sicher, es ist nützlich.

Stellen Sie sich einen Entwickler auf einer Template-Engine arbeiten. Sie kennen die Art der Sache ...

Blah blah blah ${MyTemplateString} blah blah blah.

Es beginnt einfach, mit einem kleinen, frechen regulären Ausdruck die Ersetzungen peform.

Aber allmählich die Vorlagen bekommen ein wenig mehr Phantasie und der Entwickler enthält Funktionen für Listen und Karten von Strings templatizing. Um das zu erreichen, schreibt er eine kleine, einfache Grammatik und erzeugt einen Parser.

Ankommen sehr schlau, könnte die Template-Engine umfasst schließlich eine Syntax für die bedingte Logik, die auf den Werten der Argumente abhängig verschiedene Textblocks angezeigt werden soll.

Jemand mit einem theoretischen Hintergrund in CS würde erkennen, dass die Template-Sprache langsam Turing vollständig immer, und vielleicht wäre das Interpreter-Muster ein guter Weg, es zu implementieren.

einen Interpreter für die Vorlagen gebaut haben, könnte ein Computerwissenschaftler feststellen, dass die Mehrheit der Templat-Anfragen Duplikate sind, die gleichen Ergebnisse immer und immer wieder zu regenerieren. So ein Cache entwickelt wird, und alle Anfragen werden über den Cache geleitet, bevor die teure Transformation durchgeführt wird.

Auch einige Vorlagen sind viel komplexer als andere und viel länger dauern zu machen. Vielleicht hat jemand auf die Idee kommt, die Ausführung jeder Vorlage zu schätzen, bevor es zu machen.

Aber warten !!! Jemand im Team weist darauf hin, dass, wenn die Template-Sprache wirklich Turing abgeschlossen ist, dann ist die Aufgabe, die Ausführungszeit jedes Wiedergabebetriebs der Schätzung ist eine Instanz des Halting Problem !! Huch, tun Sie das nicht !!!

Die Sache mit der Theorie, in der Praxis ist, dass alle die Praxis auf der Theorie basiert. Theoretisch.

Die Dinge, die ich verwenden die meisten:

  • Rechenkomplexität Algorithmen zu schreiben, die elegant skalieren
  • zu verstehen, wie Speicherzuweisung, Paging und CPU-Caching arbeiten, so kann ich effizienten Code schreiben
  • Verständnis von Datenstrukturen
  • Verständnis von Gewinden, Locking und die damit verbundenen Probleme

In Bezug auf das Zeug auf Turing-Maschinen etc. Ich denke, es ist wichtig, weil es die Zwänge, unter denen definiert wir alle arbeiten. Das ist wichtig, zu schätzen wissen.

Es ist der Unterschied zwischen Algebra lernen und gelehrt, wie man einen Rechner verwenden

Wenn Sie Algebra wissen, merkt man, dass das gleiche Problem in verschiedenen Formen manifestieren kann, und Sie verstehen, die Regeln für die Umwandlung des Problems in eine prägnante Form

, wenn Sie nur wissen, wie man einen Rechner verwenden, können Sie eine Menge Zeit Stanzen Tasten auf einem Problem verschwenden, die entweder (a) bereits gelöst, (b) nicht gelöst werden kann, oder (c) ist wie ein anderes Problem (gelöst oder ungelöst), dass Sie nicht erkennen, weil es in einer anderen Form

vorgeben, für einen Moment, dass Informatik ist Physik ... würde die Frage dumm erscheinen?

Ein Freund von mir ist auf einer Sprache mit einigen Vorlagen tun Arbeit. Ich wurde gebeten, in eine wenig Beratung zu tun. Ein Teil unserer Diskussion war auf der Vorlagenfunktion, denn wenn die Vorlagen wurden Turing abgeschlossen ist, würden sie wirklich VM-ish Eigenschaften und wie / ob ihre Compiler unterstützen würde haben prüfen.

Meine Geschichte ist zu diesem Punkt: Automatentheorie noch gelehrt wird, weil es immer noch Relevanz hat. Das Halteproblem besteht nach wie vor und stellt eine Grenze, was Sie tun können.

Nun, diese Dinge zu tun haben Relevanz für eine Datenbank Jockey Hämmer aus C # -Code? Wahrscheinlich nicht. Aber wenn Sie zu einem höheren Niveau bewegen beginnen, möchten Sie Ihre Wurzeln und Grundlagen verstehen.

Obwohl ich nicht direkt gelte sie in Tag-zu-Tag der Arbeit, ich weiß, dass meine Ausbildung auf formale Informatik meinen Denkprozess beeinflusst hat. Ich vermeide sicherlich gewisse Fehler von Anfang an, weil ich die Lehren aus den formalen Ansätzen in mir eingeflößt habe.

Es könnte scheinen nutzlos, während sie es noch lernen; aber ich wette, Ihre Mitschüler wird schließlich über ein Problem kommt, wo sie werden verwenden, was sie gelehrt wurden, oder zumindest die Denkmuster dahinter ...

Wax auf ... Wax off ... Wachs auf ... Wax off ... Was hat das mit Karate zu tun hat, überhaupt?

An einem Job wurde mir die Aufgabe unserer elektrischen Verteilungsmodell des Netzwerks Tracing Verbesserung zugewiesen Algorithmus als die, die sie war unter Verwendung zu langsam. Das 3-Phasen-Netz wurde im wesentlichen drei n-Bäume (da Schleifen nicht in elektrischen Netzen erlaubt). Die Netzknoten waren in der Datenbank und einige des ursprünglichen Teams konnten nicht herausfinden, wie ein In-Memory-Modell zu bauen, so dass die Verfolgung durch aufeinanderfolgende Tiefe SELECTs auf der Datenbank durchgeführt wurde, auf jeder Phase Filterung. So verfolgen Sie einen Knoten zehn Knoten von der Unterstation erfordern würden mindestens 10 Datenbankabfragen (die ursprünglichen Teammitglieder waren Datenbank flitzt, aber es fehlten einen anständigen Hintergrund in Algorithmen).

Ich schrieb eine Lösung, die die 3-n-Baum-Netzwerke von Knoten aus der Datenbank in eine Datenstruktur umgewandelt, wobei jeder Knoten einmal in einer Knotenstruktur-Array und die n-Baum-Beziehung wurde zu drei Binärbäume umgewandelt gespeichert wurde mit doubly- verknüpften Zeiger innerhalb des Arrays, so dass das Netzwerk leicht in beiden Richtungen verfolgt werden könnte.

Es war mindestens zwei Größenordnungen schneller, drei auf wirklich lange Downstream-Spuren.

Das Traurige daran war, dass ich hatte praktisch eine Klasse in n-Bäume zu lehren, binäre Bäume, Zeiger und doppelt verkettete Listen mit mehreren der anderen Programmierer, die auf Datenbanken und VB, um ausgebildet worden war, für sie zu verstehen, die Algorithmen.

Es ist eine klassische Dichotomie zwischen „Wie“ und „Was“. Ihre Mitschüler betrachten „wie“ Software zu programmieren, und sie sind sehr konzentriert auf dem nahen Fokus; Aus dieser Perspektive scheint die Perspektive der Umsetzung, es ist wie Dinge wie zu stoppen Zustände und Turing-Maschinen sind unwichtig zu wissen.

„Wie“ ist nur sehr wenig von der eigentlichen Arbeit, die Sie erwartet bekommen mit Informatik zu tun, wenn. In der Tat erfolgreichsten Ingenieure ich weiß, wäre es wahrscheinlich bei weniger als 20 Prozent der tatsächlichen Arbeit setzen. „Was“ zu tun ist bei weitem wichtiger; und dafür sind die Grundlagen der Informatik kritisch. „Was“ Sie wollen, bezieht sich viel mehr zu gestalten als Umsetzung; und gutes Design ist ... na ja, nennen wir es einfach „nicht trivial“.

"Es gibt zwei Möglichkeiten, eine Software-Design-Konstruktion: Eine Möglichkeit ist es so einfach zu machen, dass es offensichtlich keine Mängel sind, und die andere Art und Weise ist es so kompliziert zu machen, dass es keine offensichtliche Mängel Die erste Methode weitaus schwieriger ist " -.. CAR Hoare

Viel Glück mit Ihrem Studium!

Ich denke, das Verständnis der grundlegenden Rechenmodelle ist nützlich: sicher, dass Sie nie eine Turing-Maschine in ein Register Maschine in der Praxis in der Lage sein müssen, zu übersetzen, aber lernen, wie man sehen, dass zwei sehr unterschiedliche Probleme wirklich Instanzen des gleichen Konzepts sind ist eine kritische Fähigkeit.

Die meisten Wissen ist nicht „praktisch“, sondern hilft Ihnen, Punkte in einer Weise verbinden, dass man nicht voraussehen kann, oder gibt Ihnen eine reichere Vokabular zur Beschreibung komplexer Ideen.

Es ist nicht die spezifischen Probleme, die Sie studieren, dass Angelegenheiten, die Grundsätze ist, dass Sie durch das Studium ihnen lernen. Ich benutze Konzepte über Algorithmen, Datenstrukturen, Programmiersprachen und Betriebssysteme jeden Tag an meinem Job. Wenn Sie als Programmierer arbeiten werden Sie Entscheidungen treffen, die ganze Zeit, die Systemleistung beeinträchtigen. Sie benötigen eine solide Grundlage in den Grund abstrakte Konzepte, um die richtigen Entscheidungen zu treffen haben.

Wenn Sie in einem Unternehmen arbeiten, die Arbeit ist wegweisend, ist es wichtig, zu Architekten kommunizieren kann und Entwickler, was die Vorteile sind. Es gibt eine Menge Hype über alle Arten von Technologien und sich selbst positionieren kann schwierig sein. Wenn Sie Ihre Innovation in der wissenschaftlichen und theoretischen Begriffe Rahmen sind Sie auf jeden Fall im Vorteil und Kunden spüren Sie die reale Sache sind. Ich kann Leute sagen: Es gibt eine neue Art und Weise ist mit Zustand, Codierung und Nicht-Determinismus zu beschäftigen (das heißt Komplexität) und man kann auf jeden Fall produktiver sein als heute.

Wenn Sie die lange Sicht in Ihrer Karriere nehmen über Theorie lernen, werden Sie Tiefe geben, die Tiefe müssen Sie wachsen. Der Return on Investment in der 5. oder 6. Programmiersprache lernen wird viel weniger dann 2. und 3. Lernen. Die Exposition gegenüber Theorie gibt Ihnen ein Gefühl für echten Engineering, darüber, wo die Freiheitsgrade sind und wie Sie die richtigen Kompromisse machen.

Die wichtige Begriffe 1) Zustand, 2) Encoding, 3) Nichtdeterminismus. Wenn Sie sie nicht wissen, dass sie Ihnen nicht helfen. Welche Theorie sollten Sie bietet mit ist das große Bild und ein Gefühl dafür, wie Grundbegriffe zusammenpassen. Es sollte Ihnen helfen, Ihre Intuition zu schärfen.

Beispiel: das Halteproblem und Turing-Maschinen einige der Antworten oben erwähnt. Als ich auf Turings Papier in der Schule kam habe ich überhaupt nicht das Gefühl erleuchtet. Eines Tages stieß ich auf Gödels Unvollständigkeitssatz und Gödel insbesondere Nummerierung. Die Dinge begannen viel Sinn zu machen. Jahre später las ich über Georg Cantor in einer Buchhandlung. Jetzt wirklich begann ich Turing-Maschinen und das Halteproblem zu verstehen. Versuchen Sie selbst und schauen „Cantors Diagonal Argument“ auf Wikipedia. Es ist eine der eindrucksvollsten Dinge intellektuell werden Sie jemals begegnen.

Stoff zum Nachdenken: Eine typische Turing-Maschine ist nicht der einzige Weg, um eine Zustandsübergangsmaschine zu entwerfen. Eine Turing-Maschine mit zwei statt einem Band würden Sie für eine Reihe von Algorithmen viel mehr Geschwindigkeit. http://www.math.ucla.edu/~ynm/papers/ eng.ps

Sie können sich diese Erkenntnisse aussetzen effizienter dann habe ich durch dieses Buch zu lesen. Link am Ende dieses Beitrags. (Zumindest, überprüfen Sie das Inhaltsverzeichnis auf Amazon aus einen Geschmack davon zu bekommen, was das alles ist):

Ich fand das Buch von Rosenberg sensationell. http://www.amazon.com/The-Pillars-Computation-Theory-Nondeterminism/ dp / 0387096388 Wenn Sie nur ein Buch über die Theorie haben IMHO sollte dies der einzige sein.

Nachdem ich von CS absolvierte dachte ich ähnlich: die ganze Reihe von Theorien, die wir sind völlig nutzlos in der Praxis untersucht. Dies erwies sich als richtig für einen kurzen Zeitraum sein, aber, sobald Sie mit komplexen Aufgaben bewältigen, Theorie ist auf jeden Fall mehr wert als Praxis. jeder nach wenigen Jahren der Codierung kann einige Programme schreiben, dass „Arbeit“ aber nicht jeder in der Lage ist zu verstehen, wie. egal, was die meisten von uns an einem bestimmten Punkt mit Performance-Problemen, Netzwerkverzögerungen, precission, Skalierbarkeit usw. In diesem Stadium ist die Theorie kritisch befassen. um eine gute Lösung zu finden, wenn komplexe Systeme ist sehr wichtig zu wissen, wie die Speicherverwaltung, die Konzepte von Prozess und Threads funktioniert, wie Speichern, die sie zugewiesen wird, oder effiziente Datenstrukturen für die Leistung und so weiter.

Eine Zeit zum Beispiel war ich an einem Projekt arbeiten viele mathematische Berechnungen einschließlich und an einem bestimmten Punkt unserer Software ist fehlgeschlagen. während des Debuggen herausgefunden ich, dass ich nach einiger mathematischen Operation 1,000000000002 eine Zahl als DOUBELTE einen Wert erhalten, aber aus der mathematischen Perspektive könnte nicht> 1 sein, die in dem Programm zu einem späteren Zeitpunkt der legendäre NaN Ausnahme . Ich verbrachte einige Zeit, dies herauszufinden, aber wenn ich hatte mehr Aufmerksamkeit auf die bezahlt „ Angleichung des Doppels und Float “ Lektion würde ich diese Zeit nicht verschwendet hat.

ich es nicht auf einer täglichen Basis verwendet werden. Aber es gab mir viel Verständnis, die mir jeden Tag helfen.

Ich fand, dass alles, was ich für die tägliche Glück aus der CS theoretischen Welt brauche die Äußerung des Mantras „Low-Kopplung und hohe Kohäsion“ ist. Roger S. Pressman es vor gelehrten gemacht Steve McConnell es Mode gemacht.

Ya, ich Zustandsdiagramme im Allgemeinen die Form und Ablauf des Programms zu entwerfen. Sobald es in der Theorie funktioniert, beginne ich Codierung und Tests, die Zustände Abhaken, wie ich gehen.

Ich finde, dass sie auch ein nützliches Werkzeug, um das Verhalten eines Prozesses zu anderen Menschen zu erklären.

Einfach. Zum Beispiel:. Wenn ich mit RSACryptoServiceProvider Ich würde gerne wissen, was das ist und warum ich kann ihm vertrauen

Weil C ++ Vorlagen tatsächlich eine Art von Lambda-Kalkül sind. Siehe www.cs.nott.ac.uk/types06/slides/michelbrink_types_06.pdf

Ich lerne für mein Verteilte Algorithmen Kurs jetzt. Es gibt ein Kapitel über Fehlertoleranz und es enthält einige Beweise über die obere Grenze für wie viele Prozesse fehlschlagen können (oder schlecht benehmen), so dass die verteilten Algorithmus es richtig verarbeiten kann.

Für viele Probleme, die gebundenen Prozesse für misbehaving ist bis zu einem Drittel der Gesamtzahl der Prozesse. Das ist ganz meiner Meinung nach nützlich, weil Sie wissen, dass es sinnlos ist, zu versuchen, einen besseren Algorithmus zu entwickeln (unter den gegebenen Annahmen).

Auch wenn theoretische Kurse werden nicht direkt verwendet werden, es könnte Ihnen helfen, besser denken an etwas.

Sie wissen nicht, was Ihr Chef wird Sie fragen zu tun, können Sie etwas verwenden, die Sie dachten, es wird nicht hilfreich sein, wie Jeffrey L Whitledge sagte.

Um ehrlich zu sein, ich irgendwie mit viel die Antworten nicht einverstanden sind hier. Ich schrieb meine erste Compiler (für Spaß, I wirklich haben zu viel Kaffee / Freizeit), ohne einen Kurs in der Compiler genommen zu haben; im Grunde scannte ich nur den Code für einen anderen Compiler und folgte dem Muster. Ich konnte einen Parser in C aus der Spitze von meinem Kopf schreiben, aber ich glaube nicht, ich könnte daran erinnern, wie ein Kellerautomaten zu ziehen, wenn mein Leben davon abhinge.

Als ich beschloss, wollte ich Typinferenz in meinem Spielzeug (Imperativ) Programmiersprache setzen, sah ich zuerst wahrscheinlich fünf Papiere über, starrte auf etwas namens „Lambda-Kalkül getippt“ gehen, was .... die .... * *** ....? Zuerst habe ich versucht, etwas mit „generic Variablen“ und „nicht-generischen Variablen“ zur Durchführung und hatte keine Ahnung, was los war. Dann verschrottet ich alles und setzte sich dort mit einem Notebook, herauszufinden, wie ich es praktisch für all die Dinge, mit Unterstützung implementieren könnte ich brauchte (sub-Typisierung, First-Class-Funktionen, parametrisierte Typen, etc.) mit ein paar Tagen des Denkens & Schreiben Testprogramme, blies ich weg mehr als eine Woche im wert zu versuchen, den theoretischen Mist herauszufinden.

die Grundlagen der Informatik Wissen (das heißt, wie virtuelle Speicher funktioniert, wie Dateisystemen arbeiten, Einfädeln / Scheduling, SMP, Datenstrukturen) sind alle sehr nützlich erwiesen. Komplexitätstheorie und Big-O Zeug hat manchmal als nützlich erwiesen (besonders nützlich für Dinge wie RDBMS Design). Das Halteproblem und Automaten / Turing-Maschine Theorie? Niemals.

Ich weiß, das ist alt, aber meine kurze Antwort auf diejenigen, die behaupten, dass die Theorie ‚nutzlosen‘ ist und dass sie ihren Beruf ausüben können, ohne es dies:

Ohne die zugrunde liegende Theorie gibt es nicht Praxis.

  

Warum ist Theorie nützlich?

Theorie ist das zugrunde liegende Fundament oben auf der anderen Dinge gebaut werden. Wenn Theorie ist angewandt , die Praxis ist das Ergebnis.

Betrachten wir heute Computer. Der gemeinsame Computer heute modelliert und auf der Oberseite der Turing-Maschine gebaut, die es einfach zu halten, ist ein abstraktes / theoretisches Modell für die Berechnung. Dieses theoretische Modell liegt am Stiftung von Computing, und alle EDV-Geräte nutzen wir heute, von High-End-Servern auf Taschentelefone, Arbeit, weil die zugrunde liegende Fundament ist solide.

Betrachten Algorithmus Analyse. In einfachen Worten, Algorithmus-Analyse und zeitKomplexitätsTheorie verwendet wurden, um Probleme (zB P, NP, EXP, usw.) sowie, wie die Algorithmen zur Klassifizierung haben wir verhalten wenn sie versuchen, verschiedene Probleme in verschiedenen Klassen zu lösen.

Nehmen wir an einen Ihrer Freunde an einem Ort X einen Job bekommt und, während es, ein Manager ein paar einfache Anfragen, wie diese Beispiele machen:

  

Ex 1: Wir haben eine große Flotte von Lieferfahrzeugen, die verschiedenen Städten in verschiedenen Staaten besuchen. Wir brauchen Sie ein System zu implementieren, was für jedes Fahrzeug der kürzeste Weg ist, um herauszufinden, und wählen Sie die optimal eine von allen Möglichkeiten. Können Sie es tun?

, um die Theorie zu denken ist ‚nutzlose‘ Ihre Freunde wissen nicht, dass sie gerade gegeben worden, ohne einen zweiten Gedanken das Reisen Salesman Problem (TSP) und starten Sie das System entwerfen, nur ihren naiven Versuch zu entdecken, em zu überprüfen < > alle die Möglichkeiten, wie ursprünglich angefordert werden ihr System so langsam ist für alle praktischen Zwecke unbrauchbar.

In der Tat, sie haben keine Ahnung, warum arbeitet das System in einem „akzeptablen“ Niveau, wenn 5 Städten Überprüfung wird noch sehr langsam in 10 Städten und friert nur, wenn sie nur 40 Städte steigen . Sie argumentieren, dass es nur „2x und 8x mehr Städte als die 5-Stadt-Test“ und frage mich, warum das Programm einfach nicht erfordert „2x und 8x mehr Zeit“ bzw. ...

, um die Theorie zu verstehen erlaubt hätte sie folgendes zu realisieren, zumindest auf einen Blick:

  1. Es ist die TSP
  2. Die TSP ist NP-hard
  3. Ihr Algorithmus, um das Wachstums ist O (n!)

Die Zahlen sprechen für sich:

+--------------+-------+-----------------------------------------------------------------+
|  No. Cities  | O(N!) |  Possibilities                                                  |
+--------------+-------+-----------------------------------------------------------------+
|       5      |   5!  | 120                                                             |
|      10      |  10!  | 3,628,800                                                       |
|      40      |  40!  | 815,915,283,247,897,734,345,611,269,596,115,894,272,000,000,000 |  <-- GG
+--------------+-------+-----------------------------------------------------------------+

Sie haben von Anfang an klar konnte, dass ihr System war nicht zur Arbeit gehen, wie sie es sich vorgestellt, es wäre. Das System wurde später nicht sinnvoll angesehen und nach einer erheblichen Menge an Zeit, Mühe abgebrochen und andere Ressourcen hatten, zugeteilt worden und letztlich verschwenden, das Projekt --und alles, weil das Denken „Theorie ist nutzlos“.

Also nach diesem Fehler, denken die Manager „Nun, vielleicht ist das System unterschätzt wurde, schließlich, da ist eine Menge von Städten in unserem Land und unsere Computer sind einfach nicht so schnell, wie wir sie brauchen für unser vor kurzem zu sein abgesagt System gewesen zu sein, ein Erfolg“.

Das Management-Team verantwortlich macht langsamen Rechner als Ursache für das Scheitern des Projektes. Schließlich sind sie nicht Experten in CS Theorie, brauchen nicht zu sein, und diejenigen, die angeblich sind die Experten über das Thema zu sein und sie haben könnte informiert, nicht.

Aber sie haben ein anderes Projekt im Auge behalten. Ein einfacher man eigentlich. Sie kommen in der Woche später und stellen folgendes sagen:

  

Ex 2: Wir haben nur ein paar Server und wir haben Programmierer, die Einreichung Programme halten, die, aus unbekannten Gründen, in unendlichen Zyklen am Ende und den Server hogging nach unten. Wir brauchen Sie ein Programm zu schreiben, das den Code zu sein Unter verarbeitenmitted und erkennt, ob das vorgelegte Programm wird eine unendliche Zyklus während seines Laufs oder nicht, verursachen und entscheiden, ob die eingereichten Programme auf dieser Basis laufen gelassen werden sollen. Können Sie es tun?

Ihr lieber Freund nimmt die Herausforderung wieder und geht sofort an die Arbeit. Nach einigen Wochen der Arbeit, es gibt keine Treffer sind, dann ist dein Freund betont, und nicht weiß, was zu tun ist. Noch ein weiterer Ausfall ... Ihr Freund jetzt fühlt sich „dumm“ für nicht in der Lage gewesen dieses "einfaches Problem zu lösen" ... nachdem alle, die Anforderung selbst machte es Ton einfach.

Leider ist Ihr Freund, während darauf besteht, dass „Theorie nutzlos ist“ nicht erkennen, dass die angeblich einfache, Anfrage tatsächlich ein unlösbares Problem zu decidability war (dh das Halteproblem selbst), und dass es keine bekannte Lösung für es. Es war eine unmögliche Aufgabe.

Daher auch Arbeit, das bestimmte Problem zu lösen beginnen waren ein vermeidbarer und vermeidbare Fehler. Hatte den theoretischen Rahmen zu verstehen, was an Ort und Stelle gewesen angefordert wurde, konnten sie nur eine andere vorgeschlagen haben, und erreichbar , Lösung ... wie ein Überwachungsprozess implementieren, einfach kill -SIGTERM <id> von jeder kann < em> Benutzer Prozess (gemäß einer Liste von Benutzern), die die CPU für einig willkürliches / angemessenes Intervall unter bestimmten Annahmen monopolisiert (zB wir jeden Programmablauf wissen sollte innerhalb von 10 Minuten beendet hat, so läuft jede Instanz für 20 + Minuten sollte killed) werden.

Abschließend Praxis ohne Theorie ist wie ein Gebäude ohne Fundament . Früher oder später die richtige Menge an Druck aus dem rechten Winkel wird es kollabiert in sich zusammen . Keine Ausnahmen.

  

Verwenden Sie es jemals in den Tag-zu-Tag-Codierung?

Ja, aber nicht direkt . Vielmehr setzen wir auf sie indirekt . Der Nachteil dabei ist, dass verschiedene theoretische Konzepte werden mehr oder weniger anwendbar auf den Problembereich in Abhängigkeit Sie arbeiten passieren werden.

Sicher, wir:

  1. verwenden Computer täglich, die auf Rechenmodellen beruht (z Turingmaschinen)
  2. Schreibcode, der auf Berechenbarkeit Theorie beruht (zum Beispiel was noch berechenbar) und Lambda-Kalkül (beispielsweise für Programmiersprachen)
  3. verlassen sich auf Farbtheorie und Modelle (zum Beispiel RGB- und CMYK-Farbmodelle) für Farbdisplays und Druck, etc.
  4. Eulersche Theoreme in der Computergrafik, so dass Matrizen eingebaut werden können Objekte über beliebige Achsen zu drehen, und so weiter ...

Es ist eine Tatsache, dass jemand, der einfach verwenden ein Flugzeug zu reisen muß nicht die Theorie zu verstehen, dass auch erlaubt Ebene gebaut und in erster Linie fliegen werden ... aber wenn jemand erwartet, dass bauen die Maschinen und sie arbeiten ... kann man wirklich von jemandem ein gutes Ergebnis erwarten, die nicht einmal die Grundlagen des Fliegens nicht versteht?

War es wirklich ein Zufall, dass für die meisten der Geschichte, niemand in der Lage war, eine Flugmaschine zu bauen (und einige starben sogar testen ihre), bis die Brüder Wright bestimmte theoretische Konzepte über die Flucht verstanden und es geschafft, sie in die Praxis umzusetzen ?

Es ist kein Zufall. Wir haben eine Menge von heute arbeiten Technologie, weil die Menschen, die sie gebaut haben verstanden und angewendet, die theoretischen Grundlagen, die sie in erster Linie arbeiten dürfen.

Ich denke, es hängt davon ab, welches Feld Sie in gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top