Welche Konzepte in der Informatik haben Sie Ihrer Meinung nach zu einem besseren Programmierer gemacht?
Mein Abschluss war Maschinenbau. Nachdem ich Programmierer geworden bin, fehlen mir die Grundlagen. Es gibt einige Standard-CS-Konzepte, die ich kürzlich gelernt habe und die mir ein viel tieferes Verständnis dafür vermitteln, was ich tue, insbesondere:
Sprachmerkmale
- Zeiger & Rekursion (Danke Joel!)
Datenstrukturen
- Verknüpfte Listen
- Hashtabellen
Algorithmen
- Bubble Sorts
Offensichtlich ist die Liste im Moment etwas kurz, also hoffte ich auf Vorschläge für:
- Welche Konzepte sollte ich verstehen,
- Alle guten Ressourcen, um sie richtig zu verstehen (da Wikipedia manchmal etwas dicht und akademisch sein kann).
computer-science
Jon Artus
quelle
quelle
Antworten:
Schauen Sie sich diesen Blog-Beitrag von Steve Yegge (früher bei Amazon, jetzt bei Google) an:
Es werden einige Details zu den fünf wichtigsten Konzepten behandelt, die Entwickler kennen sollten:
quelle
Sie sollten auf jeden Fall die Big-O- Notation und die Big-O-Schätzungen von Algorithmen verstehen - was es ist, wie es verwendet wird, warum es wichtig ist, wie Sie zwei Algorithmen anhand ihrer Big-O-Schätzungen vergleichen, wie Sie Big-O-Schätzungen erstellen für die einfachen Algorithmen.
quelle
Ich finde es ein bisschen lustig, dass Sie nach Informatikfächern suchen , aber Wikipedia zu akademisch finden: D.
Wie auch immer, hier geht es in keiner bestimmten Reihenfolge:
quelle
Einige Konzepte, die meiner Entwicklung geholfen haben (Intellekt und Code):
Dies sind ganze Bereiche der diskreten Mathematik, aber für CS ist eine ernsthafte Einführung erforderlich:
Obwohl Vorträge und Artikel von Mark Jason-Dominus häufig an Perl-Hacker gerichtet sind, denke ich, dass jeder Programmierer von seiner klaren Präsentation und seinem echten Code profitieren würde, insbesondere in Perl höherer Ordnung .
quelle
Ich würde sagen, dass heutzutage ein Verständnis der objektorientierten Programmierung ein Muss ist, auch wenn Sie es nicht täglich verwenden müssen.
Daraus würde ich auch sagen, dass das Verstehen der häufigsten Muster ebenfalls hilfreich sein kann.
quelle
Ich sehe mehrere gute CS-Konzepte identifiziert, aber wenig über Mathematik gesprochen.
Ich schlage vor, dass Sie sich mit diskreter Mathematik befassen . Es gibt eine Vielzahl nützlicher Probleme, beginnend mit logischen Beweisen, mit denen Sie Bedingungen in Code schreiben können. Graphentheorie und Kombinatorik helfen auch bei der komplexen Problemlösung und Algorithmusoptimierung.
Während wir uns mit Mathematik befassen, ist die lineare Algebra in der Regel eine Voraussetzung für fortgeschrittene Computergrafikkurse.
quelle
Die Programmiererkompetenzmatrix hat dies ausführlich behandelt, aber ich werde ein paar hervorheben:
quelle
Ich finde Grafiken und einige angewandte Algorithmen wie Tiefe zuerst, Atem zuerst suchen, kürzeste Wege usw. sehr nützlich. Objektorientierung ist auch ein sehr verbreitetes Konzept.
quelle
Regel 1: Software ist Knowledge Capture . Software bedeutet etwas. Wenn Sie sich über die Bedeutung nicht sicher sind, sprechen Sie mehr mit den Benutzern, um zu verstehen, was sie tun.
Algorithmen und Datenstrukturen sind zwei Seiten derselben Medaille. Der Algorithmus hängt von der Datenstruktur ab, die Datenstruktur hängt vom Algorithmus ab.
Verlernen Sie das Sortieren von Blasen so schnell wie möglich. Ernsthaft. Alle modernen Sprachen (Java, Python usw.) verfügen über Sammlungsklassen, die eine bessere Sortierung als die Blasensortierung implementieren. Es gibt absolut keine Umstände, unter denen Sie jemals die Blasensortierung für irgendetwas verwenden sollten. Sie sollten nach einer Sammlungsklasse suchen, die eine Sortiermethode enthält. Besser, Sie sollten nach einem Algorithmus suchen, der das Sortieren vollständig vermeidet.
Sie müssen mehrere Sprachen lernen.
Programmiersprache (Java, Python usw.)
Shell-Sprache.
Datenbanksprache (SQL)
Präsentationssprachen (HTML und CSS)
Andere Datenrepräsentationssprachen (XML, JSON)
Sie müssen mehrere Datenstrukturen lernen.
Sequenzen (Listen, Tupel, Dateien)
Hierarchisch (wie XML- und HTML-Dokumente sowie das grundlegende Dateisystem)
Relational (wie Datenbanken und das Dateisystem mit eingebauten Hard- und Softlinks)
Karten (oder Indizes oder assoziative Arrays), einschließlich Hash-Karten und Baumkarten
Sets
Plus einige algorithmische Komplexitätsanalyse. Manchmal auch "Big O" genannt. Warum eine Blasensortierung schlecht ist, ist, dass es O ( n ^ 2) ist, wobei eine Quicksortierung O ( n log n ) ist.
quelle
Nun, die Dose mit Würmern ist jetzt offen! :)
Ich habe in der Elektrotechnik angefangen.
Relationales Datenbankdesign: Das Verfolgen von Daten ist wie bei Arnold in "Kindergarden Cop".
Es kann totales Chaos sein. Es muss kontrolliert werden.
So bewahren Sie Ihre Daten an den wenigsten Orten mit den wenigsten doppelten Informationen auf. So halten Sie Ihre Daten leicht und leicht zugänglich. So steuern Sie das Datenwachstum und die Integrität.
Design der Benutzeroberfläche : Auf diese Weise muss der Benutzer auf die Daten zugreifen, die wir verfolgen.
Die meisten Benutzeroberflächen werden von Entwicklern entworfen. Daher entsprechen die meisten Benutzeroberflächen leider dem Datenbankdesign. Benutzer interessieren sich überhaupt nicht für das Daten-Design. Sie wollen einfach, was sie wollen. Sie wollen es leicht bekommen. In der Regel erfordert dies eine starke Trennung vom Datenentwurf und der Benutzeroberfläche. Lernen Sie, das "Engineering" von der "südlichen Gastfreundschaft" zu trennen.
Objektorientierte Programmierung: Viele Sprachen beschränken sich auf dieses Format.
Parallele Verarbeitung - Multithreading: Viele Prozessoren machen die Arbeit schnell!
Parallele Computer gibt es schon seit Jahrzehnten. Sie sind schon seit einiger Zeit auf unseren Desktops. Beim "Cloud Computing" ist eine massive Parallelverarbeitung nicht nur obligatorisch, sondern auch vorzuziehen. Es ist unglaublich mächtig! Parallelentwickler haben viel Jobpotential.
Grundlegendes zu Geschäftsregeln: Auf diese Weise können Sie einen Großteil Ihrer Logik tabellenbasiert gestalten.
Viele IFblock-Bedingungen können in Geschäftsregel-Tabellen enthalten sein. Um die Logik zu ändern, ändern Sie einfach die Informationen in einer Tabelle. Wenig / keine Neukodierung. Wenig / kein Neukompilieren.
Events Supervise ... Methoden erledigen die Arbeit:
Halten Sie die Dinge in Ihrem Code getrennt. Es erleichtert anderen, in Zukunft Aktualisierungen vorzunehmen. Es ist auch etwas parallel zum Model / View / Controller (MVC) Framework.
PJ
quelle
Für mich hat der folgende Kurs an der Uni viel gebracht
Dinge, die ich gerne an der Uni getan hätte
quelle
LOGIK - Ich übertreibe nur die Bedeutung der Logik bei der Programmierung. Sie sagten, Sie haben Maschinenbau gemacht, also müssen Sie wissen, wie viel Mathematik Ihnen das Leben erleichtern kann.
Aussagenlogik , Logik erster Ordnung , zweiter Ordnung Logic : Das sind sehr mächtige Werkzeuge. Wahrscheinlich die wichtigsten (und einzigen) Dinge, die ich an der Universität gelernt habe. Logik ist wie die schwere Artillerie eines Programmierers - viele sehr komplexe Probleme (sowie die weniger komplexen) werden viel einfacher, wenn Sie sie in eine organisierte, logische Form gebracht haben. Es ist wie die lineare Algebra für Maschinenbauingenieure.
quelle
Ich denke, ein gutes Verständnis der Funktionsweise eines Compilers ist gut zu wissen. Aho hat das klassische Buch über Konzepte, die beim Erstellen eines Compilers verwendet werden. Der Titel lautet Compiler: Prinzipien, Techniken und Werkzeuge. Sein Spitzname ist das Drachenbuch. Um dieses Buch wirklich zu verstehen, sollten Sie die formalen Sprachen verstehen. Hopcroft hat ein gutes Buch darüber - Einführung in die Automatentheorie, Sprachen und Berechnung.
quelle
Verkapselung
In der Informatik bedeutet Kapselung das Verstecken der internen Mechanismen und Datenstrukturen einer Softwarekomponente hinter einer definierten Schnittstelle, sodass Benutzer der Komponente (andere Softwareteile) nur wissen müssen, was die Komponente tut und was nicht machen sich abhängig von den Details, wie es es tut
quelle
Viele gute Antworten wurden hier bereits erwähnt, aber ich wollte eine Teilmenge dessen hinzufügen, was wichtig ist, wurde aber bisher nicht behandelt.
Nach 15 Jahren professioneller Softwareentwicklung nach dem Studium stelle ich fest, dass ich regelmäßig einige der folgenden Konzepte aus der Schule verwende:
Wenn Ihre Sprache / Plattform Garbage Collection nicht unterstützt, sind Speicherzuweisung und Bereinigung von entscheidender Bedeutung und werden der Liste hinzugefügt.
quelle
Ich stimme diskreter Mathematik zu. Informatik ist Abstraktion. Es ist sehr hilfreich zu lernen, wie ein Mathematiker zu denken.
Ich wollte auch hinzufügen, was S.Lott über Sprachen sagte. Es ist auch wichtig, eine Reihe von Arten von Sprachen zu lernen. Nicht nur kompiliert gegen Scripting. Aber funktionaler (ML, Lisp, Haskell) logischer (Prolog) objektorientierter (C ++, Java, Smalltalk) Imperativ (C, Pascal, FORTRAN sogar).
Je mehr Programmierparadigmen Sie kennen, desto einfacher ist es, neue Sprachen zu lernen, wenn die heiße neue Sprache kommt!
quelle
Einige der Betriebssystemkonzepte
[ein gutes Buch " Moderne Betriebssysteme , 2. Auflage, Andrew S. Tanenbaum"]
Grundkenntnisse in Computernetzwerken
[ein gutes Buch von Tanenbaum
OOPS-Konzepte
Endliche Autometa
Eine Programmiersprache (ich habe zuerst C gelernt, dann C ++)
Algorithmen (Zeit \ Raum Komplexität, Sortieren, Suchen, Bäume, verknüpfte Liste, Stapel, Warteschlange)
[ein gutes Buch Einführung in Algorithmen ]
quelle
Streben Sie nach geringer Kopplung und hoher Kohäsion .
(Ich habe dieses Bild von der oben verlinkten Website gestohlen)
quelle
Versuchen Sie, alle Programmierebenen zu verstehen. Von der untersten Ebene (Montage) zur höchsten Ebene.
Nehmen Sie zum Beispiel die Rekursion, die eine einfache Funktion ist :) Versuchen Sie, die Assemblierung zu lernen und ein Programm zu erstellen, das die Rekursion in der Assemblierung verwendet.
quelle
Algorithmen.
Das Erlernen des absteigenden Gebrauchs einer Programmiersprache können Sie im Laufe der Zeit lernen, aber es ist praktisch unmöglich, alle weit verbreiteten Algorithmen selbst zu erfinden. Man sollte sich zumindest bewusst sein, was getan werden kann und was nicht mit einigen Problemen.
Zum Beispiel kann man einige Programme mit Bubble-Sort einfach nicht schreiben und erwartet, dass sie als gut angesehen werden, egal wie fein der Code ist.
Um es zusammenzufassen - werfen Sie einen Blick auf Einführung in Algorithmen
Keine Notwendigkeit, es zu meistern, nur wissen, was los ist ...
quelle
Als Absolvent eines Informatikstudiums würde ich Folgendes empfehlen:
Wie in verschiedenen Beiträgen erwähnt Big O-Notation
OO Design
Datenstrukturen und Algorithmen (ich kann mich nicht an den genauen Titel des Buches erinnern, das ich verwendet habe, wird aktualisiert, wenn ich mich erinnere)
Betriebssysteme http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
NP-Probleme
quelle
Es ist eindeutig ein gutes Verständnis der objektorientierten Programmierung, guter Leitprinzipien wie SOLID-Prinzipien und der Befolgung etablierter Muster und Praktiken.
Wenn Sie sich SOA oder DDD ansehen, greifen alle letztendlich auf irgendeine Form von OOP-Konzepten zurück.
Ich würde Ihnen empfehlen, sich ein paar gute OOP-Bücher zu besorgen und sich zunächst eine reichhaltige Sprache wie C # oder Java auszusuchen
OOP von Grady Booch
(PHP, Ruby Jungs, bitte stimmen Sie mich nicht ab, ich gebe nur einige Beispiele für ihn, Sie können hier Ihre eigenen Antworten und Vorschläge geben)
quelle
Struktur und Interpretation von Computerprogrammen . Wenn Sie dieses Buch verstehen, kann alles andere leicht auf dieser Grundlage aufgebaut werden. Wenn Sie Probleme mit den Konzepten in diesem Buch haben, sind Sie möglicherweise ein Softwareentwickler, aber kein Informatiker.
quelle
Ich werde Ihnen keine spezifischen Konzepte zum Lernen nennen, sondern würde Ihnen stattdessen empfehlen, viel Licht über eine Vielzahl von Themen zu lesen. Machen Sie sich keine Sorgen um ein tiefgreifendes Verständnis der einzelnen Themen, über die Sie gelesen haben. An dieser Stelle ist es wichtiger, dass Sie erkennen können, um welche Art von Problem es sich handelt, damit Sie einige Probleme lösen können. In-Time-Lernen, wenn Sie tatsächlich damit konfrontiert sind. Mit anderen Worten, es ist in Ordnung, wenn Sie nicht wissen, wie Sie ein Kombinatorikproblem lösen können, solange Sie genug wissen, um nach "Kombinatorik" zu suchen, wenn Sie sehen möchten, auf wie viele Arten Sie eine Gruppe von Objekten anordnen oder eine Teilmenge auswählen können .
Wikipedia ist eine ziemlich gute Ressource für diese Art des umfassenden Browsens, insbesondere wenn Sie zunächst nur überfliegen. Ein noch besseres ist das C2-Wiki , insbesondere wenn Sie Wikipedia als zu akademisch oder unzugänglich empfinden . (Dies ist interessanterweise das ursprüngliche Wiki, das von Ward Cunningham erfunden wurde).
quelle
Ich denke, es ist wichtig, die grundlegende Theorie hinter Multithreading zu verstehen. Ohne diese Theorie kann es schwierig sein zu erkennen, dass es ein Problem geben kann, bis Sie an einem Sonntagmorgen um 4 Uhr auf einem Live-Server debuggen.
Semaphoren, kritische Abschnitte und Ereignisse.
quelle
Nein, keine Blasensortierung, Quicksort. Es ist die Big-O-Ding-Blasensortierung im Durchschnitt O (n ^ 2), Quicksort ist O (n * log (n)).
quelle
Ich würde sagen, unten sind die wichtigsten Dinge
Gehen Sie dann zu bestimmten sprachbezogenen Themen. Ich hoffe das ist hilfreich !!
quelle
Ich würde mit dem Zitat beginnen:
Das wichtigste Prinzip, IMO, ist es, viele verschiedene Programmierparadigmen und -sprachen zu kennen und sich gut über die Tools zu informieren, die Ihnen zur Verfügung stehen. Jedes Problem kann in fast jeder Sprache gelöst werden, die Sie wählen, sei es in der Mainstream-Sprache mit ihrer riesigen Standardbibliothek oder in einer kleinen Spezialsprache wie AutoHotKey. Die erste Aufgabe des Programmierers besteht darin, zu bestimmen, was gemäß der Spezifikation des Problems verwendet werden soll. Einige Konzepte bieten eine bessere Herangehensweise an das Thema, unabhängig von Ihrem Hauptziel - Raffinesse, Verschleierung, Leistung, Portabilität, Wartung, kleine Codegröße ...
Andernfalls werden Sie wie einige Programmierer fertig, die verzweifelt versuchen, etwas in einer von ihnen spezialisierten Sprache zu tun, während das Problem in einem anderen Programmierkontext trivial zu lösen sein könnte.
Dieser Rat geht mit der heutigen Tendenz zu mehrsprachigen Projekten einher (z. B. Webanwendungen, die mehrere Sprachen in einer einzigen Anwendung umfassen können, z. B. C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... und sogar verschiedene Programmierparadigmen (zum Beispiel hat C # kürzlich einige Konzepte aus funktionalen Programmierparadigmen, Lambdas, eingeführt).
Das Grundlegende ist also ständiges Lernen für immer :)
quelle
Ich denke, 3D-Grafik sollte jeder lernen. Oder zumindest, wie man homogene Vektoren und Matrixtransformationen richtig einsetzt.
Es kann nicht nur beim Erstellen von 3D-Anwendungen hilfreich sein, sondern auch in mechanischen Bereichen wie der inversen Kinematik von Robotern, dem Berechnen von Momenten und vielen anderen Dingen.
Ich habe die lineare Algebra erst vollständig verstanden, als ich 3D-Grafiken gelesen hatte, einen der besten Kurse, die ich je besucht habe, obwohl unser Lehrer schlecht war.
quelle
Da Maschinen mit mehreren Kernen (sowohl CPU als auch GPU) zum Standard werden, würde ich sagen, verteilte Algorithmen (von mehreren Threads zu mehreren Maschinen) einzuschließen. Es ist wichtig, Multithreading und verteilte Verarbeitung zu verstehen. Entschuldigung, dass der Link nicht wirklich viel Hilfe bietet.
quelle