You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 KiB

Coding Interview University

Ursprünglich habe ich dies als eine kurze To-do Liste von Studienthemen angefangen, um Softwareingenieur zu werden, aber es ist zu der riesigen Liste herangewachsen, die man heute sehen kann. Nachdem ich diesen Lehrplan durchgezogen habe, wurde ich als Software Entwickler bei Amazon eingestellt! Wahrscheinlich wirst du nicht so viel lernen müssen wie ich. Aber egal, alles was man braucht, findest man hier.

Ich habe ungefähr 8-12 Stunden am Tag gelernt, und das für mehrere Monate. Hier ist meine Geschichte: Why I studied full-time for 8 months for a Google interview

Die Einträge in dieser Liste werden dich gut auf ein Vorstellungsgespräch bei so gut wie jeder Software Firma vorbereiten, so bei den Giganten: Amazon, Facebook, Google oder Microsoft.

Viel Glück!

Übersetzungen:
Übersetzungen in Bearbeitung:

Worum es geht

Das ist mein mehrmonatiger Lehrplan um sich vom Web Developer (Selbststudium, kein Abschluss in Informatik) zum Softwareingenieur bei einer großen Firma zu entwickeln.

Coding at the whiteboard - from HBO's Silicon Valley

Dies ist gedacht für neue Softwareingenieure oder solche die von der Software/Web Entwicklung zum Software Engineering wechseln wollen (wobei Informatikkenntnisse benötigt werden). Falls man behauptet mehrere Jahre an Erfahrung als Softwareingenieur zu haben, erwartet einen ein hartes Vorstellungsgespräch.

Falls du schon mehrere Jahre Erfahrung in der Software/Webentwicklung hast, muss dir klar sein, dass große Software Unternehmen wie Google, Amazon, Facebook oder Microsoft Software Engineering und Software Entwicklung als unterschiedliche Dinge ansehen, und sie setzen Informatikkenntnisse voraus.

Falls du ein Reliability Engineer oder Operations Engineer werden möchtest, solltest du dir besonders die optionale Liste (Netzwerke, Sicherheit) ansehen.


Inhaltsverzeichnis

---------------- Alles unter der Linie ist optional ----------------

Zusätzliche Materialien

Warum solltest du das hier lesen?

Als ich dieses Projekt angefangen habe, konnte ich einen Stack nicht von einem Heap unterscheiden, wusste nichts von Groß-O, nichts über Bäume, oder wie man einen Graphen durchläuft. Wenn ich einen Sortieralgorithmus hätte schreiben sollen, dann wäre der nicht besonders gut geworden, so viel kann ich dir sagen. Jede Datenstruktur die jemals benutzt habe war direkt in der Programmiersprache eingebaut, und ich hatte keine Ahnung wie sie funktioniert haben. Ich muss niemals Speichermanagement betreiben, außer einer der Prozesse, die ich ausgeführt hatte hat einen "out of memory" Fehler gehabt. Und wenn das passiert ist, musste ich einen Umweg finden. Ich habe ein paar mehrdimensionale Arrays in meinen Leben benutzt und ein paar Tausend assoziative Arrays, aber ich habe nie selbst eine Datenstruktur von Grund auf neu geschrieben.

Es ist ein großer Plan. Es könnte mehrere Monate dauern. Falls dir schon vieles von dem bekannt ist, wird es dich viel weniger Zeit kosten.

Wie man dies hier benutzt

Wie man dies hier benutzt

Alles hier drunter ist ein Umriss, und du solltest die Aufgaben von oben nach untern abarbeiten.

Ich benutze GitHub's spezielle Version von Markdown, das beinhält Aufgabenliste, um den Fortschritt zu prüfen.

Erstelle einen neuen Branch. Damit du Einträge abhaken kannst, füge einfach nur ein x in eckigen Klammern ein: [x]

Erstelle einen Fork dieses Projekts und gib die folgenden Kommandos ein

git checkout -b progress

git remote add jwasham https://github.com/jwasham/coding-interview-university

git fetch --all

Hake alle Kästchen mit x ab, nachdem du die Änderungen vollzogen hast

git add .

git commit -m "Marked x"

git rebase jwasham/main

git push --force

Mehr über die Markdown Version von GitHub

Halt dich nicht für dümmer als du bist

Über Videoquellen

Auf manche Videos kann man nur zugreifen, indem man sich bei einem Coursera- oder EdX-Kurs einschreibt. Das sind so genannte MOOCS. Manchmal werden die Kurse gerade nicht angeboten und man muss ein paar Monate warten. Man hat dann keinen Zugriff darauf.

Ich würde mich sehr freuen, wenn du mir dabei hilfst kostenlose und immer verfügbare öffentliche Quellen hinzuzufügen,
wie z.B. YouTube Videos, um die Online Kurse zu ergänzen.
Ich benutze gerne Vorlesungen von Hochschulen.

Ablauf von Vorstellungsgesprächen und allgemeine Vorbereitung darauf

Ablauf von Vorstellungsgesprächen und allgemeine Vorbereitung darauf

Wähle eine Sprache für das Vorstellungsgespräch

Man sollte eine Sprache wählen mit der man sich wohlfühlt beim Codingteil des Vorstellungsgesprächs. Aber für große Firmen sind das valide Optionen:

  • C++
  • Java
  • Python

Man könnte auch diese verwenden, aber pass auf. Es könnte einige Vorbehalte geben:

  • JavaScript
  • Ruby

Hier ist ein Artikel den ich über die Auswahl der Programmiersprache für das Vorstellungsgespräch geschrieben habe: Pick One Language for the Coding Interview

Du musst dich mit der Sprache wohlfühlen und auskennen.

Hier kannst du mehr über die Wahl lesen:

Siehe language resources

Unten sind ein paar Materialien zu C, C++ und Python zu finden, weil ich das gerade lerne. Es gehören einige Bücher dazu, siehe unten.

Literaturliste

Die Liste ist kürzer als die, die ich tatsächlich benutzt habe. Ich habe es etwas abgekürzt, um euch Zeit zu sparen.

Vorbereitung auf das Vorstellungsgespräch

Wenn man extrem viel Zeit hat:

Such dir eins aus:

Rechnerarchitektur

  • Write Great Code: Volume 1: Understanding the Machine
    • Das Buch wurde 2004 veröffentlicht und ist etwas veraltet, aber es ist eine hervorragende Quelle, um Computer in Kürze zu verstehen.

    • Der Autor hat HLA erfunden, also sollte man die Erwähnungen und Beispiele in HLA mit Vorsicht genießen. Nicht weit verbreitet, aber ein nettes Beispiel wie Assembly Code aussehen kann.

    • Diese Kapitel sind es wert zu lesen um euch eine gute Grundlage zu geben:

      ......
      • Kapitel 2 - Numeric Representation
      • Kapitel 3 - Binary Arithmetic and Bit Operations
      • Kapitel 4 - Floating-Point Representation
      • Kapitel 5 - Character Representation
      • Kapitel 6 - Memory Organization and Access
      • Kapitel 7 - Composite Data Types and Memory Objects
      • Kapitel 9 - CPU Architecture
      • Kapitel 10 - Instruction Set Architecture
      • Kapitel 11 - Memory Architecture and Organization

Sprachspezifisch

Man muss sich für das Vorstellungsgespräch für eine Programmiersprache entschieden haben (siehe oben).

Hier sind meine Empfehlungen geordnet nach Sprache. Ich habe nicht für alle Sprachen Material. Ich begrüße Ergänzungen.

Wenn du dich durch eins davon durchgelesen hast, solltest du genügende Wissen über Datenstrukturen und Algorithmen haben, um Coding Probleme lösen zu können. Man kann alle Videolektionen in diesem Projekt überspringen, außer du willst eine Auffrischung.

Zusätzliches sprachspezifisches Material hier.

C++

C++

Ich habe diese beiden zwar nicht gelesen, aber sie sind gut bewertet und von Sedgewick geschrieben. Er ist super.

Wenn du eine bessere Empfehlung für C++ hast, bitte lass es mich wissen. Ich suche nach umfassenden Material.

Java

Java

ODER:

  • Data Structures and Algorithms in Java
    • von Goodrich, Tamassia, Goldwasser
    • wird bei der UC Berkeley als Zusatzmaterial für den Informatik Einstieg benutzt
    • siehe Zusammenfassung zur Python Version, dieses Buch behandelt dieselben Themen.

Python

Python

Bevor du anfängst

Diese Liste ist über mehrere Monate gewachsen. Und ja, sie ist etwas aus dem Ruder gelaufen.

Hier einige Fehler die ich gemacht habe, damit ihr ein besseres Erlebnis haben könnt.

1. Du wirst dich nicht an alles erinnern können

Ich habe stundenlang Videos gesehen und reichlich Notizen geschrieben. Monate später gab es viel, an das ich mich nicht mehr erinnern konnte. Ich habe 3 Tage damit verbracht meine Notizen durchzugehen und daraus Lernkarten zu erstellen, damit ich alles noch mal wiederholen konnte.

Bitte lesen damit ihr nicht meine Fehler wiederholt:

Retaining Computer Science Knowledge

2. Benutz Lernkarten

Um das Problem zu lösen, habe ich eine kleine Webseite erstellt, wo ich 2 Arten von Lernkarten anlegen kann: Allgemein und Code. Jede Karte hat ihr eigenes Format.

Ich habe eine mobile-first Webseite gemacht, damit ich auf meinen Smartphone oder Tablet lernen kann, egal wo ich mich befinde.

Erstell kostenlos deine eigenen Lernkarten:

Achtung, ich habe es übertrieben und Lernkarten über alles erstellt, von Assembly und Python Trivia bis hin zu Machine Learning und Statistik. Das ist viel mehr als eigentlich notwendig.

Anmerkung zu Lernkarten: Wenn man sich einmal an eine Antwort erinnert, sollte man das nicht als Wissen ansehen. Man muss sich die Karte mehrmals ansehen und richtig beantworten, bevor man es tatsächlich weiß. Wiederholung wird das Wissen tiefer in euren Verstand verankern.

Eine Alternative zu Lernkarten ist Anki, was mir schon öfters empfohlen wurde. Es benutzt ein Erinnerungssystem um einen dabei zu helfen sich zu erinnern. Es ist benutzerfreundlich, auf allen Plattformen erhältlich und kann sich mit der Cloud synchronisieren. Es kostet 25$ auf iOS, aber es ist kostenlos für andere Plattformen.

Meine Lernkarten Sammlung im Anki Format: https://ankiweb.net/shared/info/25173560 (Danke @xiewenya)

3. Wiederholen, wiederholen , wiederholen

Ich behalte eine Reihe von Spickzetteln über ASCII, OSI Stack, Groß-O Notation, und mehr. Ich lerne sie in meiner Freizeit.

Nimm dir eine Pause vom Programmieren für eine halbe Stunde und gehe deine Lernkarten durch.

4. Fokus

Es gibt eine Menge Ablenkungen, die deine kostbare Zeit stehlen können. Fokussiert und konzentriert zu bleiben ist schwer.

Was hier nicht behandelt wird

Das sind weitverbreitete Technologien aber nicht Teil des Lehrplans:

  • SQL
  • Javascript
  • HTML, CSS, und andere Front-end Technologien

Der Tagesplan

Einige der Themen brauchen einen Tag, für andere braucht man mehrere Tage. Manche sind reines Lernen ohne das man was implementiert.

Jeden Tag nehme ich mir ein Thema aus der Liste unten vor, schaue Videos über das Thema, und schreibe eine Implementierung in:

  • C - mit structs und Funktionen die ein struct Pointer und und etwas anderes als Argumente benutzen.
  • C++ - ohne vorgefertigte Typen
  • C++ - mit vorgefertigte Typen, wie STL's std::list für verkettete Listen
  • Python - mit vorgefertigte Typen (um Python weiterhin zu üben)
  • und ich schreibe Tests um sicherzugehen, dass ich richtig liege, manchmal sind das nur einfache assert() Statements
  • Du könntest auch Java oder etwas anderes machen. Das ist nur das, was ich tue.

Man braucht nicht alles davon. Man braucht nur eine Sprache für das Vorstellungsgespräch.

Warum ich in all diesen Sprachen programmiere?

  • Üben, üben, üben, bis ich kotzen muss und es im Schlaf beherrsche (manche Probleme haben viele Sonderfälle und Wissen, an das man sich erinnern muss)
  • Unter erschwerten Voraussetzungen arbeiten können (Speicher allokieren/freigeben ohne die Hilfe einer Garbage Collection (Ausnahmen sind Python oder Java))
  • Vorgefertigte Typen verwenden damit ich Erfahrung im Umgang für echte Anwendungsfälle haben (ich werde sich meine eigene verkettete Liste im Alltag implementieren)

Vielleicht habe ich nicht die Zeit, um das alles für jedes Thema zu machen, aber ich werde es versuchen.

Man findet meinen Code hier:

Man muss sich nicht bei jeden Algorithmus an alle Details erinnern können.

Schreib Code auf einer Tafel oder auf Papier, aber nicht am Computer. Teste mit ein paar einfachen Eingaben. Dann kannst du es am Computer testen.

Voraussetzungen

Voraussetzungen

Algorithmische Komplexität / Big-O (Groß-O Notation) / Asymptotische Analyse

Algorithmische Komplexität / Big-O (Groß-O Notation) / Asymptotische Analyse

Datenstrukturen

Datenstrukturen
  • Arrays (Felder)

    • implementiere einen automatisch mitwachsenden Vektor
    • Beschreibung:
    • Implementiere ein Vektor (veränderbares Array, das automatisch seine Größe verändert):
      • Übe Arrays und Pointer (Zeiger) zu coden, und benutze Pointerberechnung, um ein Element aus einem Array auszuwählen statt den Index zu benutzen.
      • neues Rohdaten-Array mit allokierten Speicher
        • man kann intern ein int Array dafür verwenden, aber nicht die Features davon
        • fang an mit der Größe 16, oder wenn die Startnummer schön größer ist, benutze Zweier-Potenzen - 16, 32, 64, 128
      • size() - Anzahl der Elemente
      • capacity() - Anzahl der Elemente die es enthalten kann
      • is_empty()
      • at(index) - gibt das Element an der gegebenen Index zurück, explodiert wenn der Index außerhalb der Grenzen ist
      • push(item)
      • insert(index, item) - fügt ein Element an der Index-Position ein, schiebt den ursprünglichen Wert vom Index und alle nachfolgenden Elemente eins nach rechts weiter
      • prepend(item) - ist dasselbe wie oben mit Index 0
      • pop() - entfernt das letzte Element und gibt dessen Wert zurück
      • delete(index) - lösche das Element an der Indexposition und verschiebe jedes Element danach eins nach links
      • remove(item) - sucht den Wert und entfernt den Index, der ihn enthält (auch wenn es mehrere Stellen sind)
      • find(item) - sucht den Wert und gibt den ersten Index mit diesen Wert, -1 wenn der Wert nicht gefunden wird
      • resize(new_capacity) // private Funktion
        • wenn man die Kapazität erreicht hat, verdopple die Kapazität
        • wenn du ein Element löscht und die Größe ist nur 1/4 der Kapazität, halbiere die Kapazität
    • Zeit
      • O(1) um am Ende etwas hinzuzufügen/zu löschen (amortisiert bei Verwendung von zusätzlichen Speicher), Indexzugriff, oder update
      • O(n) um an eine andere Stelle hinzuzufügen oder zu löschen
    • Speicher
      • zusammenhängend im Speicher, Nähe hilft der Performance
      • benötigter Speicher = (Array Kapazität, welche >= n ist) * Größe eines Elements, aber selbst bei 2n, immer noch O(n)
  • Linked Lists (verkettete Listen)

    • Erklärung:
    • C Code (video) - nicht das ganze Video nur die Teile über Knotenstruktur und Speicherverwaltung.
    • Linked Lists vs Arrays:
    • why you should avoid linked lists (video)
    • Achtung: du brauchst Wissen über Pointer auf Pointer: (für den Fall, dass man einen Pointer an eine Funktion übergibt und die Funktion die Adresse verändern kann, zu der der Pointer zeigt) Diese Seite ist dafür Pointer auf Pointer grob zu verstehen. Ich würde diese Art der Listentraversierung nicht empfehlen. Lesbarkeit und Wartbarkeit leiden darunter wenn man versucht clever zu sein.
    • Implementierung (ich habe es mit Tail-Pointern gemacht und ohne):
      • size() - gibt Anzahl der Datenelemente in der Liste zurück
      • empty() - bool gibt true zurück wenn leer
      • value_at(index) - gibt den Wert an der Stelle index zurück (angefangen bei 0 für das erste Element)
      • push_front(value) - fügt ein Element an den Anfang der List ein
      • pop_front() - löscht das erste Element und gibt dessen Wert zurück
      • push_back(value) - fügt ein Element ans Ende ein
      • pop_back() - löscht das letzte Element und gibt dessen Wert zurück
      • front() - hole den Wert des ersten Elements
      • back() - hole den Wert des letzten Elements
      • insert(index, value) - fügt Wert an der Indexposition ein, das neue Element an der Stelle zeigt auf das aktuelle Element an der Stelle
      • erase(index) - löscht das Element an der gegebenen Stelle
      • value_n_from_end(n) - gibt den Wert an der n-ten Position von hinten zurück
      • reverse() - kehrt die Liste um
      • remove_value(value) - entfernt das erste Element aus der Liste mit diesen Wert
    • Doubly-linked List (doppelt verkettete Listen)
  • Stack (Stapel)

  • Queue (Warteschlangen)

    • Queue (video)
    • Circular buffer/FIFO
    • [Review] Queues in 3 minutes (video)
    • Implementierung mittels verketteten Listen, mit Tail-Pointer:
      • enqueue(value) - fügt Wert am Ende ein
      • dequeue() - gibt das älteste Element (am Anfang der Liste) zurück und löscht es
      • empty()
    • Implementierung mittels Arrays fester Größe:
      • enqueue(value) - fügt ein Element am Ende des verfügbaren Speicherplatzes ein
      • dequeue() - gibt das älteste Element zurück und löscht es
      • empty()
      • full()
    • Kosten:
      • eine schlechte Implementierung wo man am Kopf einreiht und am Schwanz ausreiht wäre O(n) weil man das vorletzte Element braucht, wodurch man die Liste komplett durchgehen muss
      • enqueue: O(1) (amortisiert, verkettete Liste und Array)
      • dequeue: O(1) (verkettete Liste und Array)
      • empty: O(1) (verkettete Liste und Array)
  • Hash table (Hash-Tabelle)

Mehr

Mehr

Trees (Bäume)

Trees (Bäume)

Sortierung

Sortierung

Als Zusammenfassung ist hier eine grafische Darstellung von 15 Sortieralgorithmen. Falls du noch mehr zu dem Thema wissen willst, schau dir "Sortierung" unter Weitere Details für ausgewählte Themen an

Graphen

Graphen

Graphen können genutzt werden, um damit viele verschiedene Probleme in der Informatik darzustellen. Deswegen ist dieser Abschnitt so lang wie Bäume und Sortierung.

Noch mehr

Noch mehr

Systementwurf, Skalierbarkeit, Datenverarbeitung

Systementwurf, Skalierbarkeit, Datenverarbeitung

Man kann mit Fragen über Systementwurf rechnen, falls man 4+ Erfahrung hat.


Finaler Rückblick

Finaler Rückblick
Dieser Abschnitt enthält kürzere Videos, die man sich ziemlich schnell anschauen kann, um die wichtigsten Konzepte noch mal zu wiederholen.
Das ist ganz gut, falls man sein Wissen öfter mal auffrischen möchte.

Übungen zu Programmieraufgaben

Übungen zu Programmieraufgaben

Jetzt da ihr alle Informatikfragen von oben kennt, wird es Zeit Antworten auf Codingfragen zu üben.

Bei den Übungen geht es nicht darum sich die Antworten zu merken.

Warum du üben musst Programmieraufgaben zu lösen:

  • Probleme wiedererkennen, und welche Datenstrukturen und Algorithmen sich dazu eignen
  • Anforderungen an das Problem sammeln
  • das Problem zu besprechen wie man es im Vorstellungsgespräch tun würde
  • auf der Tafel oder dem Papier zu entwickeln, nicht auf den Computer
  • die Zeit- und Speicherkomplexität zu ermitteln
  • seine Lösung zu testen

Es gibt eine großartige Einführung für das methodische, kommunikative Problem lösen in einem Vorstellungsgespräch. Das kann man auch von Büchern über Vorstellungsgespräche lernen, aber das fand ich herausragend: Algorithm Design Canvas

Keine Tafel zu Hause? Macht Sinn. Ich bin ein Spinner und habe eine große Tafel. Anstelle einer Tafel hol dir ein großes Zeichenbrett aus dem Kunstladen. Du kannst auf dem Sofa sitzen und üben. Das ist meine "Sofatafel". Ich habe auf den Foto ein Stift dazu gelegt, um die Größenverhältnisse darzustellen. Wenn man mit Stift schreibt, wünscht man sich, man könnte löschen. Wird schnell sehr unordentlich.

meine Sofatafel

Zusatz:

Lese und löse Programmieraufgaben (in dieser Reihenfolge):

Siehe Literaturliste oben

Programmieraufgaben/Wettbewerbe

Programmieraufgaben/Wettbewerbe

Nachdem du dir die grauen Zellen weg gelernt hast, lass die grauen Zellen arbeiten. Nimm jeden Tag eine Herausforderung an, so viele wie du kannst.

Videos über Codingfragen im Vorstellungsgespräch:

Wettbewerbsseiten:

Wettbewerbsrepos:

Mock Interviews:

Wenn das Vorstellungsgespräch bald ansteht

Dein Lebenslauf

  • Siehe Lebenslaufvorbereitung in Cracking The Coding Interview und den hinteren Teil von Programming Interviews Exposed

Denk dran wenn das Vorstellungsgespräch kommt

Rechne mit 20 Interviewfragen die dir gestellt werden, zusammen mit den unteren Zeilen. Bereite 2 - 3 Antworten für jede vor. Bereite eine Geschichte vor, nicht nur ein paar Infos, über etwas das du erreicht hast.

  • Warum möchtest du den Job?
  • Was ist ein schweres Problem das du gelöst hast?
  • Die größte Herausforderung vor der du standest?
  • Bester/schlechtester Entwurf den du gesehen hast?
  • Ideen um ein bestehendes Produkt zu verbessern.
  • Wie arbeitest du am Besten, als Individuum und als Teil eines Teams?
  • Welche deiner Fertigkeiten und Erfahrungen würden dir in der Rolle helfen und warum?
  • Was hat dir am meisten Spaß gemacht an [Job x / Projekt y]?
  • Was war die größte Herausforderung im [Job x / Projekt y]?
  • Was war der schwerste Bug den du bearbeitet hast in [Job x / Projekt y]?
  • Was hast du in [Job x / Projekt y] gelernt?
  • Was hättest du gerne besser gemacht in [Job x / Projekt y]?

Stell Fragen an den Interviewer

Einige von meinen (ich weiß vielleicht schon die Antwort aber möchte gerne ihre Meinung oder die Meinung des Teams hören):
  • Wie groß ist das Team?
  • Wie sieht der Entwicklungszyklus aus? Macht ihr Wasserfall/Sprints/agil?
  • Wird oft zu Abgabeterminen gehetzt? Oder seid ihr flexibel?
  • Wie werden Entscheidungen in eurem Team getroffen?
  • Wie viele Meetings habt ihr pro Woche?
  • Hilft dir die Arbeitsumgebung dich zu konzentrieren?
  • Woran arbeitet ihr gerade?
  • Was gefällt dir daran?
  • Wie ist das Arbeitsleben so?

Wenn du den Job bekommst

Gratulation!

Lerne weiter.

Man ist nie wirklich fertig.


*****************************************************************************************************
*****************************************************************************************************

Alles unterhalb hiervon ist optional.
Wenn man das studiert, bekommt man mehr Wissen zu Informatikkonzepten, und wird besser auf
einen Softwareingenieur Job vorbereitet. 
Man ist dann ein abgerundeterer Softwareingenieur.

*****************************************************************************************************
*****************************************************************************************************

Zusätzliche Bücher

Zusätzliche Bücher
  • The Unix Programming Environment

    • alt aber gut
  • The Linux Command Line: A Complete Introduction

    • eine moderne Variante
  • TCP/IP Illustrated Series

  • Head First Design Patterns

    • eine behutsame Einführung zu Design Patterns
  • Design Patterns: Elements of Reusable Object-Oriented Software

    • auch bekannt als das "Gang Of Four" Buch, oder GOF
    • das anerkannte Buch zu Design Patterns
  • UNIX and Linux System Administration Handbook, 5th Edition

  • Algorithm Design Manual (Skiena)

    • Als ein Rückblick und zur Problemerkennung
    • Der Katalog an Algorithmen ist weit über den Schwierigkeitsgrad, den man in Vorstellungsgesprächen hat.
    • Dieses Buch besteht aus 2 Teilen:
      • Textbuch über Datenstrukturen und Algorithmen
        • Vorteile:
          • guter Rückblick wie jedes Algorithmen Textbuch es wäre
          • nette Erfahrungsberichte wie er Probleme gelöst hat aus der Industrie oder in der akademischen Welt
          • Codebeispiele in C
        • Nachteile:
          • kann so vollgestopft und unzugänglich sein wie CLRS, und bei einigen Themen wäre CLRS die bessere Wahl
          • Kapitel 7, 8, 9 sind extrem schwer zu folgen, weil einige Dinge nicht gut erklärt werden oder ich einfach zu dumm bin
          • versteh mich nicht falsch: Ich mag Skiena, seine Art zu unterrichten, seine Eigenheiten, aber ich mag nicht das Stony Brook Material.
      • Algorithmenkatalog:
        • Das ist der eigentliche Grund, weswegen ich dieses Buch gekauft habe.
        • muss mich noch einlesen. Werde das hier ergänzen, sobald ich durch bin.
    • kann man auf den Kindle ausleihen
    • Antworten:
    • Korrekturverzeichnis
  • Introduction to Algorithms

    • Wichtig: Das Buch zu lesen ist nur eingeschränkt von Nutzen. Das Buch ist ein toller Rückblick auf Algorithmen und Datenstrukturen, aber man lernt dadurch nicht guten Code zu schreiben. Man muss in der Lage sein effizient vernünftigen Code zu schreiben.
    • aka CLR, manchmal CLRS, weil Stein erst später dazu kam
  • Computer Architecture, Sixth Edition: A Quantitative Approach

    • Für eine tiefere, aktuellere (2017), aber auch längere Behandlung
  • Programming Pearls

    • Die ersten paar Kapitel beinhalten clevere Lösungen auf Programmieraufgaben (einige sehr alte mit Datenkasetten) aber es reicht aus für eine Einführung. Das ist ein Ratgeber zu Programmentwurf und -architektur, vergleichbar mit Code Complete, aber viel kürzer.

Zusätzliches Wissen

Zusätzliches Wissen

Diese Themen werden vermutlich nicht in einen Vorstellungsgespräch aufkommen, aber ich habe sie trotzdem hinzugefügt um euch dabei zu helfen ein vollständiger Softwareingenieur zu werden und damit ihr über bestimmte Technologien und Algorithmen Bescheid wisst, sodass ihr eine größere Auswahl an Werkzeugen habt.


Weitere Details zu ausgewählten Themen

Weitere Details zu ausgewählten Themen
Ich habe das hinzugefügt, um einige Ideen weiter oben zu verstärken, aber ich wollte sie nicht 
oben hinzufügen, weil es sonst zu viel wäre. Es ist leicht es mit einen Thema zu übertreiben.
Ihr wollt doch noch in diesem Jahrhundert eingestellt werden, oder?

Videoreihen

Zurücklehnen und genießen. "Netflix and skill" :P

Videoreihen

Informatikkurse

Paper (Wissenschaftliche Veröffentlichtungen)

Paper (Wissenschaftliche Veröffentlichtungen)

Lizenz

CC-BY-SA-4.0