web-dev-qa-db-de.com

Welche Informatikkonzepte sollte ich kennen?

Welche Konzepte der Informatik haben Sie Ihrer Meinung nach zu einem besseren Programmierer gemacht?

Mein Abschluss war Maschinenbau. Nachdem ich also als Programmierer gelandet bin, fehlen mir ein bisschen die Grundlagen. Es gibt einige Standard-CS-Konzepte, die ich kürzlich kennengelernt habe und die mir ein viel tieferes Verständnis für meine Arbeit vermitteln:

Sprachfunktionen

  • Zeiger & Rekursion (Danke Joel!)

Datenstrukturen

  • Verknüpfte Listen
  • Hashtables

Algorithmen

  • Bubble Sorts

Offensichtlich ist die Liste im Moment ein wenig kurz, also habe ich auf Vorschläge gehofft, um:

  1. Welche Konzepte sollte ich verstehen,
  2. Irgendwelche guten Ressourcen, um sie richtig zu verstehen (da Wikipedia manchmal etwas dicht und akademisch sein kann).
91
Jon Artus

Schauen Sie sich diesen Blog-Beitrag von Steve Yegge (ehemals von Amazon, jetzt bei Google) an:

Es wird ausführlich auf die fünf wichtigsten Konzepte eingegangen, die Entwickler kennen sollten:

  1. Grundlegende Programmierung (einschließlich Rekursion, Datei-E/A, formatierte Ausgabe, Schleifen usw.)
  2. Objektorientiertes Design (einschließlich Entwurfsmustern usw.). Sie sollten in der Lage sein, sinnvolle OO Entwürfe zu erstellen und die Konzepte zu verstehen.
  3. Skripte und reguläre Ausdrücke.
  4. Datenstrukturen - Listen, Mengen, Hashtabellen, Bäume, Diagramme usw. - sowie Big-O-Notation und algorithmische Komplexität.
  5. Bits, Bytes und Binärzahlen - wie Zahlen im Computer dargestellt werden und wie man sie manipuliert.
59
jammycakes

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 für die einfachen Algorithmen erstellen.

35
sharptooth

Ich finde es ein bisschen komisch, dass Sie nach Informatikfächern suchen, aber Wikipedia für zu akademisch halten: D

Sowieso hier geht, in keiner bestimmten Reihenfolge:

30
Rik

Einige Konzepte, die meiner Entwicklung geholfen haben (Intellekt und Code):

  • Lexing, Parsing, String Matching, Regex
  • Memoization
    • kapselung/Scoping/Verschlüsse
    • caching
  • Rekursion
  • Iteratoren/Generatoren
  • Funktionale Programmierung - John Hughes 'erstaunliches Artikel hatte mich im "Warum"

Dies sind ganze Bereiche der diskreten Mathematik, aber für CS ist eine ernsthafte Einführung erforderlich:

  • Matrix/Lineare Algebra
  • Graphentheorie

Obwohl Vorträge und Artikel von Mark Jason-Dominus häufig an Perl-Hacker gerichtet sind, würde meiner Meinung nach jeder Programmierer von seiner klaren Darstellung und seinem echten Code profitieren, insbesondere in Perl höherer Ordnung .

14
bubaker

Ich sehe mehrere gute CS-Konzepte identifiziert, aber wenig Gerede über Mathematik.

Ich schlage vor, Sie untersuchen diskrete Mathematik. Es gibt eine Vielzahl nützlicher Probleme, angefangen bei logischen Beweisen, mit denen Sie Bedingungen in Code schreiben können. Graphentheorie und Kombinatorik helfen auch bei der Lösung komplexer Probleme und der Optimierung von Algorithmen.

Während wir uns mit Mathematik befassen, ist die lineare Algebra in der Regel eine Voraussetzung für fortgeschrittene Computergrafikkurse.

10
Berkshire

Ich würde sagen, dass heutzutage ein Verständnis der objektorientierten Programmierung ein Muss ist, auch wenn Sie es nicht täglich benötigen.

Aus diesem Grund würde ich auch sagen, dass das Verstehen der gängigsten Muster ebenfalls hilfreich sein kann.

10
Jeremy French

Programmer Competency Matrix behandelt dies im Detail, aber ich werde ein paar hervorheben:

  • Datenstrukturen
    • Erweiterte Datenstrukturen wie B-Bäume, Binomial- und Fibonacci-Haufen, AVL/Rot-Schwarz-Bäume, Splay-Bäume, Skip-Listen, Versuche usw.
  • Algorithmen
    • Tree, Graph, einfache Gier- und Divide- und Conquer-Algorithmen sind in der Lage, die Relevanz der Ebenen dieser Matrix zu verstehen.
  • Systemprogrammierung
    • Versteht den gesamten Programmierstapel, Hardware (CPU + Speicher + Cache + Interrupts + Mikrocode), Binärcode, Assembly, statische und dynamische Verknüpfung, Kompilierung, Interpretation, JIT-Kompilierung, Garbage Collection, Heap, Stack, Speicheradressierung ...
  • Versionskontrolle des Quellcodes
    • Kenntnisse über verteilte VCS-Systeme. Hat Bzr/Mercurial/Darcs/Git ausprobiert
  • Build-Automatisierung
    • Kann ein Skript einrichten, um das System und auch die Dokumentation zu erstellen, Installationsprogramme, Versionshinweise zu generieren und den Code in der Quellcodeverwaltung zu markieren
  • Automatisiertes Testen
    • Versteht und kann automatisierte Funktions-, Lade-/Leistungstests und UI-Tests einrichten
  • Problemzersetzung
    • Verwendung geeigneter Datenstrukturen und -algorithmen und Entwicklung von generischem/objektorientiertem Code, in dem Aspekte des Problems zusammengefasst sind, die sich ändern können.
  • Systemzerlegung
    • Kann komplexe Systeme mit mehreren Produktlinien und Integrationen mit externen Systemen visualisieren und entwerfen. Es sollte auch in der Lage sein, betriebliche Unterstützungssysteme wie Überwachung, Berichterstellung, Failover usw. zu entwerfen.
6
cgp

Ich finde Graphen und einige angewandte Algorithmen wie Tiefensuche, Breitensuche, kürzeste Wege usw. sehr nützlich. Objektorientierung ist auch ein sehr verbreitetes Konzept.

5
Mork0075

Regel 1: Software ist Knowledge Capture. Software bedeutet etwas. Wenn Sie sich nicht sicher sind, wenden Sie mehr Zeit auf, um mit den Benutzern zu sprechen und 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.

Blasensortierung so schnell wie möglich vergessen. Ernsthaft. Alle modernen Sprachen (Java, Python usw.) verfügen über Auflistungsklassen, die eine bessere Sortierung als die Blasensortierung implementieren. Es gibt absolut keine Umstände, unter denen Sie jemals eine Blasensorte für irgendetwas verwenden sollten. Sie sollten nach einer Auflistungsklasse 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 eingebundenen Hard- und Softlinks)

  • Karten (oder Indizes oder assoziative Arrays), einschließlich Hash-Karten und Baumkarten

  • Setzt

Plus einige algorithmische Komplexitätsanalyse. Manchmal auch "Big O" genannt. Warum eine Blasensorte schlecht ist, ist, dass es O ( n ^ 2) ist , wobei eine Quicksortierung O ( n log n ).

4
S.Lott

Für mich hat der folgende Kurs an der Uni viel gebracht

  • Projektmanagement
  • Mensch-Computer-Interaktion (Hilft uns Geeks, benutzerfreundlichere Bildschirme zu erstellen)
  • Datenbankdesign (einschließlich Funktionsweise von Datenbanken, Transaktionsprotokollen, Sperren usw.)
  • Data Warehousing
  • Grafik (OpenGL)
  • Fortgeschrittene Algorithmen
  • Datenstrukturen

Dinge, die ich gerne an der Uni getan hätte

  • Compiler-Aufbau
  • Designmuster
  • Automatentheorie
3
uriDium

Ich finde es gut zu wissen, wie ein Compiler funktioniert. 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.

3
zooropa

[~ # ~] Logik [~ # ~] - Ich übertreibe nur die Bedeutung der Logik in der Programmierung. Sie sagten, Sie hätten Maschinenbau gemacht, also müssen Sie wissen, wie viel Mathematik Ihnen das Leben erleichtern kann.

Aussagenlogik , Logik erster Ordnung , Logik zweiter Ordnung : Dies sind sehr mächtige Werkzeuge. Wahrscheinlich das Wichtigste, was ich an der Universität gelernt habe. Logik ist wie die schwere Artillerie eines Programmierers - viele sehr komplexe Probleme (wie auch die weniger komplexen) werden viel einfacher, wenn Sie sie in eine organisierte, logische Form bringen. Es ist wie das, was lineare Algebra für Maschinenbauingenieure ist.

3
Tamas Czinege

Einige der Betriebssystemkonzepte

 ( memory, IO, Scheduling, process\Threads, multithreading )

[ein gutes Buch " Modern Operating Systems , 2. Auflage, Andrew S. Tanenbaum"]

Grundkenntnisse in Computernetzwerken

[ein gutes Buch von Tanenbaum

OOPS-Konzepte

Finite autometa

Eine Programmiersprache (ich habe zuerst C und dann C++ gelernt)

Algorithmen (Komplexität von Zeit und Raum, Sortieren, Suchen, Bäume, verknüpfte Liste, Stapel, Warteschlange)

[Ein gutes Buch Einführung in Algorithmen ]

2
aJ.

Viele gute Antworten wurden hier bereits erwähnt, aber ich wollte eine Untergruppe von dem hinzufügen, was wichtig ist, wurde aber bisher noch nicht behandelt.

Nach 15 Jahren professioneller Softwareentwicklung nach dem Abschluss des Studiums stelle ich fest, dass ich in der Schule regelmäßig einige der folgenden Konzepte verwende:

  • Allgemeine OO Konzepte und moderne Programmiersprachenfunktionen (Klassen, Verstecken von Daten usw.).
  • Algorithmusleistungsmetriken (Big O-Notation). Beim Entwurf eines Algorithmus muss eine Big-O-Analyse durchgeführt werden, um die Kosten des Algorithmus zu ermitteln, und es müssen effizientere Alternativen in Engpassbereichen untersucht werden.
  • Verknüpfte Listen und andere komplexe Datenstrukturen.
  • Schnelles Sortieren und verschiedene Sortierkonzepte.
  • Bäume und schnelle Baumbearbeitung.

Wenn Ihre Sprache/Plattform die Garbage Collection nicht unterstützt, sind die Speicherzuweisung und die Bereinigung von entscheidender Bedeutung und werden der Liste hinzugefügt.

2
pearcewg
2
David Basarab

Nun, die Dose mit Würmern ist jetzt offen! :)
Ich habe in der Elektrotechnik angefangen.

Relational Database Design: Den Überblick über Daten zu behalten 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 Vervielfältigungen von Informationen auf. So bleiben Ihre Daten leicht und leicht zugänglich. So steuern Sie das Wachstum und die Integrität von Daten.

ser Interface (UI) Design: So greift der Benutzer muss auf die Daten zu, die wir verfolgen.
Die meisten Benutzeroberflächen wurden von Entwicklern entworfen. Daher laufen die meisten Benutzeroberflächen leider parallel zum Datenbankdesign. Benutzer interessieren sich überhaupt nicht für das Datendesign. Sie wollen einfach, was sie wollen. Sie wollen es einfach bekommen. Dies erfordert in der Regel eine starke Trennung von Datendesign und Benutzeroberfläche. Lerne, das "Ingenieurwesen" von der "Gastfreundschaft des Südens" zu trennen.

Objektorientierte Programmierung: Viele Sprachen laufen auf dieses Format hinaus.

Parallelverarbeitung - Multi-Threading: Viele Prozessoren machen die Arbeit schnell!
Parallelrechner gibt es schon seit Jahrzehnten. Sie sind schon seit einiger Zeit auf unseren Desktops. Beim "Cloud Computing" ist eine massive Parallelverarbeitung nicht nur zwingend, sondern auch vorzuziehen. Es ist unglaublich mächtig! Für Parallelentwickler gibt es viel Arbeitspotenzial.

Geschäftsregeln verstehen: Dies hilft Ihnen dabei, einen großen Teil Ihrer Logik tabellenbasiert zu gestalten.
Viele IFblock-Bedingungen können in Geschäftsregeltabellen gespeichert werden. Um die Logik zu ändern, ändern Sie einfach die Informationen in einer Tabelle. Wenig/keine Neukodierung. Wenig/keine Neukompilierung.

Ereignisse überwachen ... Methoden erledigen die Arbeit:
Halten Sie die Dinge in Ihrem Code getrennt. Dies erleichtert es anderen, in Zukunft Aktualisierungen vorzunehmen. Es entspricht auch etwas dem Model/View/Controller-Framework (MVC).

PJ

2
PJ

Strebe niedrige Kopplung, hohe Kohäsion an.

low coupling, high cohesion

(Ich habe dieses Bild von der oben verlinkten Website gestohlen)

2
Joe Phillips

Ich stimme Diskrete Mathematik zu. Informatik ist Abstraktion. zu lernen, wie ein Mathematiker zu denken, ist sehr hilfreich.

Ich wollte auch hinzufügen, was S.Lott über Sprachen gesagt hat. Es ist auch wichtig, ein paar Arten von Sprachen zu lernen. Nicht nur kompiliert gegen Scripting. Aber funktionales (ML, LISP, Haskell) logisches (Prolog) objektorientiertes (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 auftaucht!

2
Brian Postow

Versuchen Sie, alle Ebenen der Programmierung zu verstehen. Von der untersten Ebene (Baugruppe) zur höchsten Ebene.

Nehmen Sie zum Beispiel die Rekursion, die eine einfache Funktion ist :) Versuchen Sie, Assembly zu lernen, und erstellen Sie ein Programm, das die Rekursion in Assembly verwendet.

1
Chrys

Es ist eindeutig ein gutes Verständnis für objektorientierte Programmierung, gute Leitprinzipien wie SOLID Principles und das Befolgen festgelegter Muster und Praktiken.

Wenn Sie sich SOA oder DDD ansehen, greifen alle letztendlich auf eine Form von OOP - Konzepten zurück.

Ich würde Ihnen empfehlen, ein paar gute OOP Bücher zu kaufen, und wählen Sie zu Beginn auch eine umfangreiche Sprache wie C # oder Java)

OOP von Grady Booch

(PHP, Ruby Leute, bitte stimmen Sie mich nicht ab, ich gebe nur ein paar Beispiele für ihn, Sie können hier Ihre eigenen Antworten und Vorschläge einreichen)

1
Srikar Doddi

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 darüber im Klaren sein, was getan werden kann und was nicht mit einigen problemen.

Zum Beispiel kann man einfach keine Programme mit Blasensortierung schreiben und erwarten, 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 zu wissen, was los ist ...

1
Liran Orevi

Als Absolvent eines Informatikstudiums empfehle ich Folgendes:

1
CodeMonkey

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.

1
lambdabunny

Ich werde Ihnen keine spezifischen Konzepte für das Studium nennen, sondern Ihnen empfehlen, über eine Vielzahl von Themen hinweg viel zu lesen. Machen Sie sich keine Sorgen über ein tiefgreifendes Verständnis jedes Themas, über das Sie lesen. An dieser Stelle ist es wichtiger, dass Sie erkennen können, welche Art des Problems, auf das Sie gerade stoßen, so dass Sie einige Just-in-Time-Studien durchführen können, wenn Sie tatsächlich damit konfrontiert sind. Mit anderen Worten, es ist in Ordnung, wenn Sie nicht wissen, wie Sie ein Kombinatorik-Problem lösen können, solange Sie genug wissen, um "Kombinatorik" nachzuschlagen, wenn Sie sehen möchten, wie viele Möglichkeiten Sie eine Gruppe von Objekten anordnen oder eine Teilmenge auswählen können .

Wikipedia ist eine ziemlich gute Ressource für diese Art von breit gefächertem Browsen, besonders wenn Sie nur überfliegen. Noch besser, besonders wenn Sie Wikipedia für zu akademisch oder unzugänglich halten, ist das C2-Wiki . (Dies ist interessanterweise das von Ward Cunningham erfundene Original-Wiki).

1
John Hyland

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.

0
Jim T

Nein, keine Blasensortierung, Quicksortierung. Es ist die Big-O-Ding-Blasensortierung, die einen Durchschnitt von O (n ^ 2) und eine Quicksortierung von O (n * log (n)) ergibt.

0
GoatRider

Wenn Sie big-O unterrichten möchten, erklären Sie zumindest, dass es beschreibt, wie die Zeit für einen Algorithmus mit größeren Eingaben skaliert wird. Dies bedeutet nicht, dass ein Algorithmus weniger Zeit benötigt.
Zum Beispiel ist das Bauen von Pyramiden O (n), während das Sortieren von Fotos von ihnen bestenfalls O (n ln n) ist. Es ist also schneller, eine neue Pyramide zu bauen, als Ihre Urlaubsfotos aufzuräumen.

Die Schüler müssen eine Vorstellung davon haben, wie lange eine Operation in einem Register, im Cache, im Hauptspeicher, auf der Festplatte oder im Netz dauert. Viele, die nur auf sehr hohen Niveaus unterrichtet werden, haben kein Konzept.

(Dies war ein Kommentar, den jemand diskutieren wollte)

0
Martin Beckett

Alles andere als Bubble Art:

  • Haufen sortieren
  • Schnelle Sorte

Und was am wichtigsten ist: Big O-Notation, damit Sie wissen, warum Sie eine dieser Notationen anstelle einer Bubble-Sortierung verwenden sollten.

0
Carra

Software Development Life Cycle - Erfassung, Entwurf und Analyse der Anforderungen, Implementierung, Test sowie Ablauf von Support und Wartung. Dies ist zusammen mit Methoden wie Waterfall und Agile, bei denen diese Schritte in die Praxis umgesetzt werden, ebenfalls wichtig zu lernen.

0
JB King

Ich würde sagen, unten sind die wichtigsten Sachen

  • Objekt orientierte Programmierung
  • Betriebssystemkonzepte
    • Prozess und Thread
    • Scheduling-Algorithmen
  • Datenstruktur
    • Art der Datenspeicherung und -erfassung, Arten (LinkedList, Hash, Array etc.)
    • Sortieralgorithmen
    • Komplexität von Algorithmen

Gehen Sie dann zu bestimmten sprachbezogenen Themen. Ich hoffe das ist hilfreich !!

0
Mutant

Ich würde mit dem Zitat beginnen:

"Wenn Sie nur einen Hammer haben, behandeln Sie alles wie einen Nagel". (Abraham Maslow)

Das wichtigste Prinzip, IMO, ist es, viele verschiedene Programmierparadigmen und Sprachen zu kennen und sich über die Werkzeuge zu informieren, die Ihnen zur Verfügung stehen. Jedes Problem kann in fast jeder Sprache gelöst werden, sei es in der Mainstream-Sprache mit ihrer großen Standardbibliothek oder in einer kleinen Fachsprache 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 ...

Ansonsten werden Sie wie einige Programmierer enden, die verzweifelt versuchen, etwas in einer Sprache zu tun, auf die sie sich spezialisiert haben, während das Problem in einem anderen Programmierkontext trivial zu lösen sein könnte.

Dieser Rat geht einher mit der heutigen Tendenz zu mehrsprachigen Projekten (z. B. Webanwendungen, die mehrere Sprachen in einer Anwendung umfassen können, z. B. C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... und sogar verschiedene Programmierparadigmen (C # hat beispielsweise kürzlich einige Konzepte aus funktionalen Programmierparadigmen, Lambdas, eingeführt).

Die grundlegende Sache ist also ständiges Lernen für immer :)

0
majkinetor

Ich denke, 3D-Grafik sollte jeder lernen. Oder zumindest, wie man homogene Vektoren und Matrixtransformationen richtig einsetzt.

Es kann hilfreich sein, nicht nur 3D-Anwendungen zu erstellen, sondern auch in mechanischen Bereichen wie der inversen Kinematik von Robotern, der Berechnung 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, an denen ich je teilgenommen habe, obwohl unser Lehrer schlecht war.

0
TheDude

Da Maschinen mit mehreren Kernen (sowohl CPU als auch GPU) zum Standard werden, würde ich Verteilte Algorithmen (von mehreren Threads zu mehreren Maschinen) einschließen. Es ist wichtig, Multithreading und verteilte Verarbeitung zu verstehen. Entschuldigung, dass der Link nicht wirklich viel Hilfe bietet.

0
Erich Mirabal