coding-interview-university/translations/README-de.md

140 KiB
Raw Blame History

Coding Interview University

Ursprünglich habe ich dies als eine kurze To-Do Liste von Studienthemen angefangen um Software Engineer 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 brauchst, 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 Vorstellungsgepräch bei so gut wie jeder Software Firma vorbereiten, so bei den Giganten: Amazon, Facebook, Google oder Micrososft.

Viel Glück!

Übersetzungen:
Übersetzungen in Bearbeitung:

Worum es geht

Das ist mein mehrmonatiger Lernplan um vom Web Developer (Selbststudium, kein Abschluss in Informatik) zum Software Engineer bei einer großen Firma zu wechseln.

Coding at the whiteboard - from HBO's Silicon Valley

Dies ist gedacht für neue Software Engineure 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 Software Engineer zu haben, erwartet einen ein hartes Vorstellungsgespräch.

Falls du schon mehrere Jahre Erfahung in der Software/Webenteicklung 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 Sortieralgorithmuss 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/master

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 wohl fü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 eineige 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 wohl fü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.

Buchliste

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änzugen.

Wenn du dich durch eins davon durchgelsen hast, solltest du genügende Wissen über Datenstrukturen und Algorithmen haben um Coding Probleme lösen zu können. Man kann alle Videolektionen in diesen 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 die selben 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 stundelang 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 nochmal 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 Smart Phone 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 erhaä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 dir deine kostbare Zeit stehlen können. Fokussiert und konzentriert zu bleiben ist schwer.

Was hier nicht behandelt wird

Das sind weit verbreitete 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 and 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 sicher zu gehen, dass ich richitg 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 brauchst nicht alles davon. Man braucht nur eine Sprache für das Vorstellungsgeprä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

Algorithmic complexity / Big-O / Asymptotic analysis

Algorithmic complexity / Big-O / Asymptotic analysis

Datenstrukturen

Datenstrukturen

More Knowledge

More Knowledge

Trees

Trees

Sorting

Sorting

As a summary, here is a visual representation of 15 sorting algorithms. If you need more detail on this subject, see "Sorting" section in Additional Detail on Some Subjects

Graphen

Graphen

Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.

Even More Knowledge

Even More Knowledge

System Design, Scalability, Data Handling

System Design, Scalability, Data Handling

You can expect system design questions if you have 4+ years of experience.


Final Review

Final Review
This section will have shorter videos that you can watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.

Coding Question Practice

Coding Question Practice

Now that you know all the computer science topics above, it's time to practice answering coding problems.

Coding question practice is not about memorizing answers to programming problems.

Why you need to practice doing programming problems:

  • problem recognition, and where the right data structures and algorithms fit in
  • gathering requirements for the problem
  • talking your way through the problem like you will in the interview
  • coding on a whiteboard or paper, not a computer
  • coming up with time and space complexity for your solutions
  • testing your solutions

There is a great intro for methodical, communicative problem solving in an interview. You'll get this from the programming interview books, too, but I found this outstanding: Algorithm design canvas

No whiteboard at home? That makes sense. I'm a weirdo and have a big whiteboard. Instead of a whiteboard, pick up a large drawing pad from an art store. You can sit on the couch and practice. This is my "sofa whiteboard". I added the pen in the photo for scale. If you use a pen, you'll wish you could erase. Gets messy quick.

my sofa whiteboard

Supplemental:

Read and Do Programming Problems (in this order):

See Book List above

Coding exercises/challenges

Coding Question Practice

Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.

Coding Interview Question Videos:

Challenge sites:

Challenge repos:

Mock Interviews:

Once you're closer to the interview

Your Resume

  • See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed

Be thinking of for when the interview comes

Think of about 20 interview questions you'll get, along with the lines of the items below. Have 2-3 answers for each. Have a story, not just data, about something you accomplished.

  • Why do you want this job?
  • What's a tough problem you've solved?
  • Biggest challenges faced?
  • Best/worst designs seen?
  • Ideas for improving an existing product.
  • How do you work best, as an individual and as part of a team?
  • Which of your skills or experiences would be assets in the role and why?
  • What did you most enjoy at [job x / project y]?
  • What was the biggest challenge you faced at [job x / project y]?
  • What was the hardest bug you faced at [job x / project y]?
  • What did you learn at [job x / project y]?
  • What would you have done better at [job x / project y]?

Have questions for the interviewer

Some of mine (I already may know answer to but want their opinion or team perspective):
  • How large is your team?
  • What does your dev cycle look like? Do you do waterfall/sprints/agile?
  • Are rushes to deadlines common? Or is there flexibility?
  • How are decisions made in your team?
  • How many meetings do you have per week?
  • Do you feel your work environment helps you concentrate?
  • What are you working on?
  • What do you like about it?
  • What is the work life like?

Once You've Got The Job

Congratulations!

Keep learning.

You're never really done.


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

Everything below this point is optional.
By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.

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

Additional Books

Additional Books
  • The Unix Programming Environment

    • an oldie but a goodie
  • The Linux Command Line: A Complete Introduction

    • a modern option
  • TCP/IP Illustrated Series

  • Head First Design Patterns

    • a gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriented Software

    • aka the "Gang Of Four" book, or GOF
    • the canonical design patterns book
  • UNIX and Linux System Administration Handbook, 5th Edition

  • Algorithm Design Manual (Skiena)

    • As a review and problem recognition
    • The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview.
    • This book has 2 parts:
      • class textbook on data structures and algorithms
        • pros:
          • is a good review as any algorithms textbook would be
          • nice stories from his experiences solving problems in industry and academia
          • code examples in C
        • cons:
          • can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
          • chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
          • don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material.
      • algorithm catalog:
        • this is the real reason you buy this book.
        • about to get to this part. Will update here once I've made my way through it.
    • Can rent it on kindle
    • Answers:
    • Errata
  • Introduction to Algorithms

    • Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently.
    • aka CLR, sometimes CLRS, because Stein was late to the game
  • Computer Architecture, Sixth Edition: A Quantitative Approach

    • For a richer, more up-to-date (2017), but longer treatment
  • Programming Pearls

    • The first couple of chapters present clever solutions to programming problems (some very old using data tape) but that is just an intro. This a guidebook on program design and architecture, much like Code Complete, but much shorter.

Additional Learning

Additional Learning

These topics will likely not come up in an interview, but I added them to help you become a well-rounded software engineer, and to be aware of certain technologies and algorithms, so you'll have a bigger toolbox.


Additional Detail on Some Subjects

Additional Detail on Some Subjects
I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?

Videoreihen

Lehn dich zurück und genieße. "Netflix and skill" :P

Videoreihen

Computer Science Courses

Paper (Wissenschaftliche Artikel)

Paper (Wissenschaftliche Artikel)

Lizenz

CC-BY-SA-4.0