Was ist das eine bisschen Informatiktheorie, das ich wissen sollte? [geschlossen]


27

Als jemand mit einem Electronic Engineering statt Grad Informatik, was ist das ein Bit der Informatik soll ich das wissen , um mich zu einem besseren realen Welt Programmierer?

(Unter realer Welt verstehe ich etwas, das ich in meiner täglichen Arbeit als Programmierer nutzen und davon profitieren werde. Ich würde beispielsweise vorschlagen, dass das Verständnis der Datenbanknormalisierung praktischer ist als das Verständnis einer schnellen Sorte, für die es eine Menge gibt von Bibliotheken).


42
1 (sorry, ich musste)
Haylem

5
oh, oder der bedeutendste! (Ich gehe jetzt ...)
Haylem

Theoretische Informatik Stapelaustausch bestätigt, was alle anderen hier erwähnen: Komplexität, Datenstrukturen und Algorithmen. cstheory.stackexchange.com/tags
chrisaycock

2
Ich habe das Bedürfnis, gegen diese Frage Einwände zu erheben. Es gibt kein „ein Bit“, das zum Lernen ausreichen würde, und außerdem gibt es (IMHO) kein „wichtigstes“ Bit. Es gibt mehrere Aspekte, die (wiederum IMHO) für CS gleichermaßen wichtig sind . Ich denke also, dass die Antworten auf diese Frage vielleicht interessant sind, aber besser formuliert werden könnten.
Konrad Rudolph

1
Wenn Sie nicht schon Ihr Eeng gehabt hätten, hätte ich Boolesche Logik und / oder Theorie der diskreten Zahlen gesagt. Fast jede ifund loopschriftliche Erklärung jemals verwendet eine Teilmenge dieser beiden Bereiche der Studie.
Steven Evers

Antworten:


52

Wenn ich nur ein Bit auswählen muss, was eine schwierige Entscheidung ist, würde ich die Big O-Notation wählen . Das Verstehen der Implikationen von O (n), O (lnn), O (n²), O (2 ^ n), O (n!) Hilft Ihnen, viele teure Fehler zu vermeiden, die in der Regel gut funktionieren Testumgebung, aber katastrophal in der Produktion scheitern.


2
+1 und ich würde sagen, dass es wichtiger ist, nur zu wissen, dass O (n ^ 2) schlechter ist als O (lg n) (zum Beispiel), wie man das Big-O für ein bestimmtes Stück Code ableitet.
Dean Harding

3
Deutlich widersprechen. Dieses Zeug ist relativ trivial und es gibt interessantere Themen in CS. Ich denke auch, dass die meisten Leute über Komplexität intuitiv nachdenken, obwohl sie es möglicherweise nicht Komplexität nennen und sie es möglicherweise nicht quadratisch, exponentiell usw. nennen
Magnus Wolffelt

Magnus: Nach meiner Erfahrung denken die meisten Nicht-Programmierer überhaupt nicht über Komplexität nach, sondern nehmen O (n) intuitiv für alle Probleme an.
user281377

Ich muss das noch formell brauchen.
CaffGeek

1
Chad: Es gibt nichts an der Big O-Notation, was übermäßig formalistisch ist, aber ohne Namen für Dinge kann man kaum über diese Dinge nachdenken, geschweige denn mit Gleichaltrigen darüber sprechen.
user281377

19

Dies ist eine Frage, auf die jeder eine andere Antwort haben wird. Ich würde sagen: Komplexitätstheorie ist das wichtigste Stück, das man als Programmierer sowieso nicht direkt lernt (wie Algorithmen und Datenstrukturen), sondern was sich auf seine Arbeit auswirken kann. Es hilft, wenn ich weiß, dass ein Problem eine kubische Komplexität hat. Ich weiß, dass es schlecht skaliert, wenn die Problemgröße erhöht wird.


Ich würde hinzufügen, dass es sehr hilfreich ist, zu wissen, ob Sie ein Problem lösen, das leicht in einer einfacheren Sprache wiedergegeben werden kann.
Philosodad

Komplexität ist als Konzept wichtig, aber tatsächlich zu berechnen ist es oft nicht. Es ist wichtig zu verstehen, was weniger komplex ist.
Bill

@ Rechnung: Genau. Aber dieser Teil ist das einzige, was Sie nicht unbedingt durch Übung bekommen. Die Theorie ist in diesem Punkt sehr hilfreich.
Mnementh

12

Erfahren Sie mehr über Datenstrukturen, Algorithmen und Komplexität.

Nicht zu viel, nur um zu verstehen, dass eine Maschine keine magische Kiste mit unbegrenzter Kraft ist. Sie können nichts darauf werfen und erwarten, dass es in Millisekunden zerbricht. Es hat Grenzen, die Sie kennen. Sie müssen lernen, sie nicht mit Ihrem Code zu testen.

Sehen Sie sich auch gängige Ansätze an, um bestimmte Designprobleme in der Programmierung zu lösen. Entwurfsmuster nämlich. Bete sie nicht an, nimm einfach die Ideen, die sie kommunizieren.

Kenntnisse in der Datenbankmodellierung sind ebenfalls unerlässlich.

Danach sind es nur noch verschiedene Programmiersprachen, Frameworks und Bibliotheken, mit denen Sie die Kernkonzepte implementieren oder implementieren können. Nimm auf, was du willst und übe damit.


Besonderheiten - es gibt viele Algorithmen und Datenstrukturen.
Jon Hopkins

Nur die Grundlegenden, um sich ein Bild von den Dingen zu machen. Nimm ein nicht zu dickes Buch und arbeite es durch.

1
Das ist ziemlich viel mehr als ein bisschen.

7

Das ist ein bisschen eine schwierige Frage.

Alle Aspekte der Informatik sind auf die eine oder andere Weise wichtig.

In Bezug auf das, was Sie von Tag zu Tag profitieren werden, ist dies wahrscheinlich ein allgemeiner Überblick darüber, wie Ihr Code "unter der Haube" von Code zu CPU funktioniert.

Das Verständnis der Big-O-Notation ist wichtig, und auch das Verständnis, wie Ihr Code ausgeführt werden kann, ist in Situationen der realen Welt sehr wichtig.


7

Ja, das hat mich dazu gebracht, stundenlang nachzudenken.

Dabei musste ich einige der hier bereits gegebenen allgemeinen Antworten entfernen.

KEINE LISTE

  1. Große O (n) -Notation . Schwer auszudrücken, aber nein, wir können intuitiv Ineffizienzen ermitteln und verschiedene Verfahren vergleichen, ohne auch nur aus der Ferne von einer asymptotischen algorithmischen Analyse gehört zu haben.

  2. Funktionale Sprachen Nein, eine einzelne Sprachfamilie ist nur ein Ansatz, um über Probleme nachzudenken. Warum sollte nur dieses Bit eine Rolle spielen?

  3. Anhalten des Problems Einige sind einfach zu spezifisch und die Menschen haben ein Leben geführt, ohne zu wissen, dass es sie gibt.

  4. Hören Wenn Sie nicht zuhören, dann leben Sie in Ihrer eigenen Welt. Nicht unbedingt schädlich!

  5. Software-Entwicklungszyklus Nah! Wir können uns immer noch auf unglaubliche Software oder heldenhafte Alleingänge stürzen.

  6. Komplexitätstheorie Ich denke, das könnte es sein, aber ohne alle Formalismen

Diese eine Idee von Comp Science

Ich würde sagen - " Abstraktionen Abstraktionen Abstraktionen ... ". Erfahren Sie mehr darüber. Sehen Sie sich Beispiele an und lernen Sie, wie Sie damit bauen. Es ist überall. Die gesamte Informatik, Ingenieurwissenschaften und Anwendungen wirken wie Schichten auf Schichten der Abstraktion.

Sobald Sie dies wissen, lernen Sie, sich gut umzusehen.

Wenn Sie jemanden sehen, der list insertionin pythonund verwendet not append, lächeln Sie, weil Sie wissen, dass Python-Listen mit Array-Abstraktion erstellt werden, bei der Einfügungen teuer sind und billiger angehängt werden.

Dies ist nur ein Beispiel.


+1 für eine Antwort, über die Sie offensichtlich viel nachgedacht haben.
Jon Hopkins

Nur ein Kommentar zu Ihrem Kommentar zum Halting-Problem: "Leben ohne Wissen über das Vorhandensein" gilt für JEDES Thema der Informatik.


3

Wettbewerbsfähige Use Cases von Datenstrukturen.

Es gibt Situationen, in denen eine Karte mit rot-schwarzen Bäumen erforderlich ist, um die Leistung zu gewährleisten, und andere Situationen, in denen Sie kein Array verwenden können, um die Leistung zu gewährleisten. Zu wissen, wann zu entscheiden ist, welche Datenstruktur von unschätzbarem Wert ist.


3

Es sind nur drei Zahlen von Bedeutung:

  • Null
  • eins
  • viele

aber bedeutet das nicht, dass '3' auch wichtig ist?
Javier

Es soll null, eins und unendlich sein: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@ Javier: 3 ist eine Untermenge von vielen
Steven A. Lowe

@Thomas: sagt wer?
Steven A. Lowe

@Steven Mein Verständnis ist hier vielleicht nicht 100%, aber ich denke, Sie haben nichts, nichts oder die Anzahl der Dinge, die Sie haben, sollte unbegrenzt sein. Wenn Sie nicht auf eine oder keine Instanz beschränken, sollten Sie die Instanzen nicht einschränken. Ich bin mir jedoch nicht ganz sicher, WARUM dies der Fall ist (ich bin nur vage mit dem Zero / One / Infinity-Konzept vertraut).
Thomas Owens

3

Das Wichtigste, was ich in CS (und als Entwickler über viele Jahre hinweg und als Architekt) gelernt habe, ist die Fähigkeit, ein Problem anhand der Volatilität und nicht anhand der Funktion aufzuschlüsseln . Alle guten Designs isolieren und kapseln die Volatilität. Alle guten Entwickler / Architekten tun dies intuitiv, auch wenn sie es nicht in ihrem Denken formalisiert haben. Ein großer Grund für das Scheitern eines Projekts ist das Versagen, ein Problem auf der Grundlage der Volatilität aufzuschlüsseln und zu verkapseln. Wenn die Volatilität nicht erfasst wird, führt dies zwangsläufig dazu, dass die Komplexität und das Scheitern des Projekts zunichte gemacht werden.


Was genau verstehen Sie unter Volatilität?
Amara

3

Das haltende Problem

Die Tatsache, dass Computerprobleme existieren, die von einem Computer einfach nicht gelöst werden können.


3

Sie sollten genug Automatentheorie kennen, um zu wissen, wo das Problem, mit dem Sie sich befassen, in die Hierarchie der formalen Sprachen fällt. Daraus können Sie einige wichtige praktische Anwendungen ableiten , z. B. warum Sie kein REGEX zum Parsen von HTML verwenden sollten (HTML benötigt eine kontextfreie Grammatik, um es zu beschreiben) und warum das Kompilieren von C ++ so viel länger dauert als das Kompilieren von C ++ Java oder C # (C ++ erfordert eine Turing-Maschine, während Java und C # mit kontextfreien Grammatiken beschrieben werden können).

Die wichtigsten Ebenen formaler Sprachen sind von den schwächsten bis zu den stärksten:

  1. Sprachen, die von endlichen Automaten oder von REGEX analysiert werden können (REGEX-Implementierungen mit Rückverweisen sind leistungsfähiger als diese Kategorie, können jedoch nicht alles in Kategorie 2 analysieren)

  2. Sprachen, die von Automaten mit Stapelspeicher oder einer kontextfreien Grammatik analysiert werden können.

  3. Sprachen, die von einer Turing-Maschine oder von Automaten mit Direktzugriffsspeicher analysiert werden können.


Ähm, nein. Ein regulärer Ausdruck analysiert eine reguläre Grammatik. Das ist genau die Kategorie der Grammatik, die von Automaten mit endlichen Zuständen akzeptiert werden kann. Und eine "Chomsky-Grammatik" bezieht sich nicht ausschließlich auf die kontextfreien Grammatiken, die von Stapelmaschinen verarbeitet werden.
Philosodad

@philosodad - Die kontextfreie Grammatik ist präziser und ich habe den Beitrag aktualisiert, um den Begriff zu verwenden. Ich verstehe Ihr Problem nicht mit dem, was ich über reguläre Ausdrücke gesagt habe.
Dan Monego

@Dan - Mein Problem ist, dass ein regulärer Ausdruck genau so mächtig ist wie ein endlicher Automat. Wenn Sie eine deterministische kontextfreie Grammatik mit einer Maschine analysieren können, können Sie ALLE deterministischen kontextfreien Grammatiken analysieren.
Philosodad

Genauer gesagt: Entweder brauchen Sie einen Stack oder Sie brauchen keinen. Wenn Sie einen Stapel zum Analysieren einer Sprache benötigen, müssen Sie einen Stapel zum Analysieren der Sprache haben. Wenn für eine Sprache daher ein Stapel zum Analysieren erforderlich ist, können Sie diese Sprache analysieren.
Philosodad

@philosodad - Es gibt zwei Arten von regulären Ausdrücken - reguläre Ausdrücke in der Theorie und reguläre Ausdrücke, wie sie in Software implementiert sind. In Bezug auf theoretische reguläre Ausdrücke haben Sie recht, aber die meisten Implementierungen haben einige Merkmale, die über ihre theoretische Grundlage hinausgehen, und können mit einigen nicht regulären Sprachen übereinstimmen, z. B. a ^ n für nicht Primzahl n. Da es sich hier um einen Thread zur Theorie in der Praxis handelt, bemühte ich mich zu erwähnen, dass es einen Unterschied zwischen der formalen Definition und der in der freien Natur verwendeten gibt.
Dan Monego

2

Nun, ich könnte Ihnen eine langweilige Antwort geben: Automatentheorie und Informationstheorie.

Oder ich könnte Ihnen sagen, was ich vor langer Zeit von einem Hardwareberater gelernt habe:

  • "Gut genug" ist nicht gut genug.

1

Der Software Development Life Cycle ist etwas, das ich empfehlen würde, wenn Sie es nicht bereits wissen. Zugegeben, dies wurde in einem zweiten Jahr Informatikkurs eingeführt und wird in Softwareprojekten immer wieder verwendet. Dies kann hilfreich sein, um eine allgemeine Vorstellung davon zu bekommen, wie ein Projekt von Anfang bis Ende abläuft. Wenn Sie jedoch detaillierter vorgehen möchten, gibt es Methoden wie Waterfall oder Agile, die Sie studieren können, um spezifisches Wissen zu erlangen.


2
Murphys Gesetz: Alles, was schief gehen kann, wird schief gehen
Richard

Es ist keine CS-Theorie, aber dies ist eine hervorragende Antwort.
Justkt

1

Programmierung

Aus dem Fachbereich Mathematik und Informatik kommen die Colleges Hobart und William Smith. 124 Einführung in die Programmierung :

Zu den Themen gehören Kontrollstrukturen, Objekte, Klassen, Vererbung, einfache Datenstrukturen und grundlegende Konzepte der Softwareentwicklung.

Wenn Sie nicht programmieren können, sind Sie in der Praxis nicht weit.

Und ja, ich habe festgestellt, dass Sie Programmierer sind. Dies dient dazu, Ihre allgemeinen Kenntnisse der Programmiertheorie zu verbessern und welche anderen Ansätze Ihnen zur Verfügung stehen.

Ist das Programmieren von Informatik so, wie wir es kennen?

Als Antwort auf den Kommentar von @Thomas Owens, der (zu Recht) darauf hinwies, dass Programmierung keine reine Informatik ist, möchte ich aus dem Wikipedia- Artikel über Informatik zitieren :

... der Schwerpunkt der Informatik liegt mehr darauf, die Eigenschaften der Programme zu verstehen, die zur Implementierung von Software wie Spielen und Webbrowsern verwendet werden, und dieses Verständnis dazu zu nutzen, neue Programme zu erstellen oder bestehende zu verbessern ...

So, wie ich es lese, demonstrieren Sie durch Programmieren Ihr Verständnis der Programmiertheorie. Dies soll Ihnen wiederum dabei helfen, einfachen, eleganten Code zu erstellen, mit dem andere gerne arbeiten.


Programmieren ist keine CS-Theorie. Tatsächlich könnte ich leicht behaupten, dass Programmierung überhaupt keine Informatik ist.
Thomas Owens

@ Thomas Owens Ich habe meine Antwort aktualisiert, um meine Behauptung zu bestätigen, dass sie gültig ist. Könnten Sie es überprüfen und mir Ihre Gedanken mitteilen?
Gary Rowe

1
Denken Sie immer noch nicht, dass Programmierung CS ist. Das Programmieren KANN für einen Informatiker nützlich sein, der einen Algorithmus oder eine Datenstruktur implementieren möchte, aber Themen in der CS-Theorie (von meinem Intro bis zum CS-Theory-Buch, daher gibt es wahrscheinlich auch fortgeschrittenere Themen) umfassen Logik, Automatentheorie und Graphentheorie , Berechenbarkeit, rechnerische Komplexität und Analyse von Algorithmen. Ich würde auch sagen, dass Programmiersprachen (die Theorie hinter dem Design und der Implementierung einer Sprache) auch Teil der Informatik sind. Sie müssen jedoch nicht programmieren können, um ein guter Informatiker zu sein.
Thomas Owens

@Thomas Owens Ich verstehe deinen Standpunkt und (setzt puristischen Hut auf) ich stimme zu. Das OP bittet jedoch um ein bisschen CS, das ihm in der realen Welt helfen würde. Ich halte an meiner Meinung fest, dass die Programmiertheorie (wie sie in gutem Code implementiert ist) das eine Bit ist. Ich habe etwas entsprechend bearbeitet.
Gary Rowe

Ja. Von CS aus würde ich sagen, dass das Verstehen von Programmiersprachen und -paradigmen hilfreich sein könnte (insbesondere, wenn Sie DSLs implementieren, aber viele Paradigmen wie prozedurale, funktionale, OO- und Logikkenntnisse nur bei der Softwareentwicklung hilfreich sind). Das Verständnis von Algorithmen und Datenstrukturen hilft Ihnen auch dabei, die richtigen Algorithmen auszuwählen, um Ihr Problem so effizient wie möglich zu lösen. Die Automatentheorie könnte helfen (ich habe einmal mit einem System gearbeitet, das ein riesiger FSM war, aber ich weiß nicht, wie weit verbreitet das ist). Daher würde ich sagen, dass Datenstrukturen, Algorithmen und die PL-Theorie die nützlichsten Dinge sind, die Sie von CS wissen sollten.
Thomas Owens

1

Ich muss Konrad Rudolph widersprechen. Es gibt "ein bisschen" Informatik, von der Sie wissen sollten, dass sie Sie zu einem besseren "Programmierer der realen Welt" macht. Wenn Sie den Antworten, die Sie hier erhalten, nichts anderes nehmen, sollten Sie zumindest Folgendes berücksichtigen: Die Erfüllung der Anforderungen ist NICHT gleichbedeutend mit der Zufriedenstellung des Kunden! Die Endbenutzer werden IMMER versuchen, Ihr Programm auf eine Weise zu verwenden, an die Sie nie gedacht oder die Sie nie gedacht haben. IMMER IMMER IMMER

Um ein besserer Programmierer zu sein, müssen Sie daher zuerst ZUHÖREN. Hören Sie dem Kunden zu. Höre auf ihre Bedürfnisse. Hören Sie auf ihre Wünsche. Und vor allem, hören Sie sich ihre "Technik-Fachkenntnisse" an. Ich kann Ihnen nicht sagen, wie oft ich ein Projekt gesehen habe, das genau das war, was angefordert wurde, aber überhaupt nicht das, was der Kunde tatsächlich benötigte. Alles nur, weil der Programmierer, der die Anfragen sammelte, nicht wirklich zuhörte.

Etwas anderes, das Sie mitnehmen können, ist, wenn Sie keinen Hintergrund im UI-Design haben, jemanden zu beauftragen, das UI zu entwerfen. Ich kann IMMER eine App erkennen, deren Benutzeroberfläche vom Programmierer und nicht von einem Experten entworfen wurde. Was für Sie logisch und sinnvoll ist, ergibt für den Kunden keinen Sinn. Und wenn Ihre Kunden nicht technisch versiert sind (und wer ist das?), Wird Ihre "funktional korrekte, aber ästhetisch hässliche" Lösung bei einer Dinnerparty mit der Wärme von Stinktier erfüllt.


3
Diese Antwort behandelt nicht die CS-Theorie, nach der Hopkins gefragt hat.
James

1

Funktionssprachen!

Wenn Sie funktionale Sprachen lernen, denken Sie eher in Ausdrücken als in Schritten und benannten veränderlichen Zuständen (Variablen). Dies hat erhebliche Auswirkungen auf Ihre Fähigkeit, die alltäglichen Programmierprobleme effektiv zu bewältigen - insbesondere jetzt, wo fast jede gängige Sprache über funktionale Funktionen verfügt.

Algorithmen und Komplexitätstheorien sind ebenfalls wichtig, aber etwas weniger interessant, da Sie damit meistens Namen für Dinge vergeben können, die Sie normalerweise bereits kannten und die Sie ableiten konnten.


0

Dass Computer im Wesentlichen Pattern Matcher sind, mehr nicht. Alles läuft auf die Turing-Maschine hinaus - das klassische Konzept der Informatik zur Erklärung der Musterbearbeitung.


-2

Problemlösung und der Wunsch, weiter zu lernen!

Sie dienen mir weitaus besser als das Wissen über schnelle Sortierung und Datenbanknormalisierung.


6
Das ist keine Informatiktheorie, sie gelten gleichermaßen für die Elektronik (oder so ziemlich jede andere Form von Ingenieurwesen).
Jon Hopkins

So wie ich es sehe, ist es einfach nicht hilfreich, Ihr Beispiel in Betracht zu ziehen, wenn Sie wissen, wie man schnell sortiert. Zu wissen, dass es existiert und was das Besondere ausmacht, ist hilfreich, aber es ist auch nur eine Google-Suche entfernt, wenn ich nichts darüber wusste. Es ist auch nicht hilfreich, einen Algorithmus zu kennen. Es ist jedoch wichtig zu wissen, wie man einen erstellt und interpretiert! Wenn ich meine Antwort ändern könnte, ist die Komplexität wahrscheinlich die wichtigste.
Bryan Harrington

1
Sie können nicht nach etwas suchen, wenn Sie nicht wissen, dass Sie es brauchen oder dass es existiert. In Ihrer Antwort sind wichtige Eigenschaften aufgeführt, die ein Entwickler haben muss, die gestellte Frage wird jedoch nicht beantwortet.
Adam Lear
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.