Wenn Du am Programmieren interessiert bist, hast Du dieses Zitat vielleicht schon einmal gehört:

Jeder in diesem Land sollte lernen, einen Computer zu programmieren, weil man dabei lernt zu denken. - Steve Jobs

Du hast dich wahrscheinlich auch gefragt, was es genau bedeutet, wie ein Programmierer zu denken? Und wie man das macht??

Im Wesentlichen geht es um einen effektiveren Weg um  Probleme zu lösen.

In diesem Artikel ist es mein Ziel, Dir dies beizubringen.

Am Ende wirst Du genau wissen, welche Schritte Du unternehmen musst, um ein besserer Problemlöser zu werden.

Warum ist das wichtig?

Problemlösung ist die Meta-Kompetenz.

Wir alle haben Probleme. Große und kleine. Wie wir mit ihnen umgehen, ist manchmal, naja.... ziemlich willkürlich.

Wenn du kein System hast, dann "löst" du wahrscheinlich so Probleme (das ist, was ich getan habe, als ich mit dem Programmieren anfing):

  1. Eine Lösung ausprobieren.
  2. Wenn das nicht funktioniert, eine andere probieren.
  3. Wenn das nicht funktioniert, Schritt 2 wiederholen, bis Du Glück hast.

Schau', manchmal hast du Glück damit. Aber dies ist der schlechteste Weg, um Probleme zu lösen! Und es ist eine riesige, riesige Zeitverschwendung.

Der beste Weg besteht darin, a) einen Orientierungsrahmen zu haben und b) ihn zu befolgen.

"Fast alle Arbeitgeber sehen Problemlösungskompetenzen als wichtigste Fähigkeit an."
Problemlösungskompetenzen sind fast einstimmig die wichtigste Qualifikation, nach der Arbeitgeber suchen.....wichtiger als Programmiersprachenkenntnisse, Debugging und Systemdesign.
Der Vorweis von computergestütztem Denken oder die Fähigkeit, große, komplexe Probleme zu lösen, ist genauso wertvoll (wenn nicht sogar wertvoller) als die grundlegenden technischen Fähigkeiten, die für einen Job erforderlich sind." - Hacker-Rank (2018 Developer Skills Report)

Einen Orientierungsrahmen haben

Um den richtigen Orientierungsrahmen zu finden, habe ich die Ratschläge in Tim Ferriss' Buch zum Thema Lernen befolgt, "Der 4-Stunden-(Küchen-)Chef".

Dies veranlasste mich, zwei wirklich beeindruckende Personen zu interviewen: C. Jordan Ball (Platz 1 oder 2 von 65.000+ Nutzern auf Coderbyte) und V. Anton Spraul (Autor des Buches "Think Like a Programmer: An Introduction to Creative Problem Solving").

Ich habe sie die gleichen Fragen gestellt, und Du glaubst es kaum! Ihre Antworten waren ziemlich ähnlich!

Bald wirst auch du sie kennen.

Nebenbemerkung: Das bedeutet nicht, dass sie alles auf die gleiche Weise gehandhabt haben. Jeder Mensch ist anders. Bei Dir wird es anders sein. Aber wenn man mit Prinzipien anfängt, denen wir alle zustimmen, kommt man viel schneller viel weiter.

"Der größte Fehler, den ich bei neuen Programmierern sehe, ist, dass sie sich auf das Erlernen der Syntax konzentrieren, anstatt zu lernen, wie man Probleme löst." - V. Anton Spraul

Also, was solltest Du tun, wenn Du auf ein neues Problem stößt?

Hier sind die Schritte:

1) Verstehen
Du musst genau wissen, was gefragt wird. Die meisten schwierigen Probleme sind schwer, weil man sie nicht versteht (aus diesem Grund ist dies der erste Schritt).

Woher weißt Du, ob Du ein Problem verstehst? Wenn du es erklären kannst, auf gut Deutsch.

Kannst Du dich erinnern bei einem Problem nicht weitergekommen zu sein? Man beginnt, das Problem zu erklären, und man erkennt sofort die Löcher in seiner Logik, die man vorher nicht gesehen hat?

Die meisten Programmierer kennen dieses Gefühl.

Deshalb solltest du dein Problem aufschreiben, ein Diagramm kritzeln oder jemand anderem davon erzählen (oder so.... einige Leute benutzen eine Gummiente).

"Wenn man etwas nicht einfach erklären kann, versteht man es nicht." - Richard Feynman

2) Planen
Tauche nicht sofort ohne Plan in die Lösungsfindung ein (und hoffe irgendwie, dass du dich durchwursteln kannst). Plane Deine Lösung!

Nichts wird Dir helfen, wenn Du nicht die genauen Schritte aufschreiben kannst.

Beim Programmieren bedeutet das, dass Du nicht sofort mit dem Hacken beginnen solltest. Gib deinem Gehirn Zeit, das Problem zu analysieren und die Informationen zu verarbeiten.

Um einen guten Plan zu bekommen, beantworte die folgende Frage:

"Bei Input X, welche Schritte sind notwendig, um Output Y heraus zu bekommen?"

Nebenbemerkung: Programmierer haben ein großartiges Hilfsmittel, um dies zu erleichtern.... Kommentare!

3) Teilen
Passt auf. Dies ist der wichtigste Schritt überhaupt.

Versuche nicht, ein einzelnes großes Problem zu lösen. Du wirst es bereuen.

Versuche es stattdessen in Teilprobleme zu zerlegen. Es ist viel einfacher diese Teilprobleme zu lösen.

Dann löst Du jedes Teilproblem einzeln. Beginn' mit dem Einfachsten. Am einfachsten bedeutet, dass Du die Lösung kennst (oder nah an der Lösung bist).

Als nächstes bedeutet am einfachsten, dass die Lösung dieses Teilproblems nicht von der Lösung anderer abhängt.

Sobald Du jedes Teilproblem gelöst hast, verbindest Du die Punkte.

Die Verknüpfung all Deiner "Teillösungen" liefert Dir die Lösung für das ursprüngliche Problem. Glückwunsch!

Diese Methode ist ein Eckpfeiler bei der Problemlösung. Behalt' Dir das (lies' diesen Schritt noch einmal, wenn du musst).

"Wenn ich jedem angehenden Programmierer eine Problemlösungskompetenz beibringen könnte, dann wäre es die 'Verkleinere-das-Problem-Technik'.
Angenommen, Du hast gerade begonnen zu programmieren und wirst aufgefordert, ein Programm zu schreiben, das zehn Zahlen einliest und herausfindet, welche Zahl die dritthöchste ist. Für einen unerfahrenen Programmierer kann das eine schwierige Aufgabe sein, auch wenn man dafür nur einfache Programmiersyntax benötigt.
Wenn Du nicht weiter kommst, solltest Du das Problem auf etwas Einfacheres reduzieren. Statt der dritthöchsten Zahl, wie wäre es mit der Suche nach der höchsten Zahl? Immer noch zu schwer? Wie wäre es damit die größte von drei Zahlen zu finden? Oder die größere von zweien?
Reduziere das Problem bis zu dem Punkt, an dem du weißt, wie man es löst und formuliere die Lösung. Dann erweiterst Du das Problem etwas und schreibst die Lösung entsprechend um, und machst weiter, bis Du wieder da bist, wo Du angefangen hast." - V. Anton Spraul

4) Du kommst nicht weiter?
Inzwischen sitzt du wahrscheinlich schon da und denkst: "Hey Richard... Das ist cool und so, aber was ist, wenn ich feststecke und nicht einmal ein Teilproblem lösen kann?"

Zuerst einmal tief durchatmen. Zweitens, das ist ehrlich.

Aber keine Sorge, mein Lieber. Das passiert jedem!

Der entscheidende Unterschied ist, dass die besten Programmierer/Problemlöser eher neugierig auf Bugs/Fehler sind als genervt.

In diesem Fall gibt es drei Dinge, die man ausprobieren sollte, wenn man sich dem Problem stellt:

  • Debuggen: Geh Schritt für Schritt durch Deine Lösung und versuche herauszufinden, was Du falsch gemacht hast. Programmierer nennen dies Debugging (tatsächlich ist das alles, was ein Debugger tut).
"Die Kunst des Debuggens besteht darin, herauszufinden, was Du Deinem Programm wirklich gesagt hast, was es tun soll, im Gegensatz zu dem, was Du gedacht hast, was Du ihm gesagt hast." - Andrew Singer
  • Überprüfen: Geh einen Schritt zurück. Betrachte das Problem aus einer anderen Perspektive. Gibt es etwas, das auf einen allgemeineren Ansatz abstrahiert werden kann?
"Manchmal verlieren wir uns so sehr in den Details eines Problems, dass wir allgemeine Grundsätze übersehen, die das Problem auf einer allgemeineren Ebene lösen würden. […]
Das klassische Beispiel dafür ist natürlich die Addition einer langen Liste von aufeinanderfolgenden ganzen Zahlen, 1 + 2 + 3 + ...+ n, was wie der junge Gauß schnell erkannt hat einfach n(n+1)/2 war, und wodurch der Aufwand für die Addition entfällt." - C. Jordan Ball

Nebenbemerkung: Eine weitere Möglichkeit der Neubewertung besteht darin, neu zu beginnen. Lösch' alles und beginn' von Neuem. Das meine ich ernst. Du wirst verblüfft sein, wie viel das bringt.

  • Recherche: Ahh, Google mein Freund. Das hast Du richtig gelesen. Egal welches Problem du hast, es hat wahrscheinlich schon jemand gelöst. Finde diese Person/Lösung. In der Tat solltest Du dies auch tun, wenn Du das Problem selbst gelöst hast! (Man kann viel von den Lösungen anderer lernen).

Warnung: Suche dabei nicht nach einer Lösung für das große Problem. Such' nur nach Lösungen für Teilprobleme. Warum? Wenn du dich nicht bemühen musst (auch wenn es nur ein wenig ist), wirst du nichts lernen. Und wenn du nichts lernst, hast du deine Zeit verschwendet.

Übung
Erwarte nicht, schon nach einer Woche sehr gut zu sein. Wenn du ein guter Problemlöser sein willst, löse viele Probleme!

Üben. Üben. Üben. Es wird nur eine Frage der Zeit sein, bis Du merkst, dass "dieses Problem leicht gelöst werden könnte mit <Konzept hier einfügen>".

Wie übt man am besten? Es gibt scheiß viele Optionen!

Schachrätsel, mathematische Probleme, Sudokus, Go, Monopoly, Videospiele, Kryptokitties, bla... bla... bla....

Tatsächlich ist ein häufiges Muster unter erfolgreichen Menschen ihre Gewohnheit, " Mikroproblemlösung " zu praktizieren. Zum Beispiel spielt Peter Thiel Schach, und Elon Musk spielt Videospiele.

"Byron Reeves sagte: 'Wenn Du sehen willst, wie Unternehmensführung in drei bis fünf Jahren aussehen könnte, schau Dir an, was in Online-Spielen passiert.'
Im Schnellvorlauf bis heute. Elon [Musk], Reid [Hoffman], Mark Zuckerberg und viele andere sagen, dass Spiele die Grundlage für ihren Erfolg beim Aufbau ihrer Unternehmen waren." - Mary Meeker (2017 internet trends report)

Soll das bedeuten, dass du einfach nur Videospiele spielen solltest? Ganz und gar nicht.

Aber worum geht es in Videospielen? Genau, um Problemlösung!

Also, was du tun solltest, ist, einen Weg zu finden zum Üben. Etwas, das es Dir ermöglicht, viele Mikroprobleme zu lösen (idealerweise etwas, das Dir Spaß macht).

Zum Beispiel machen mir Coding Challenges Spaß. Jeden Tag versuche ich, mindestens eine Challenge zu lösen (normalerweise auf Coderbyte).

Wie gesagt, haben alle Probleme ähnliche Muster.

Fazit
Wir sind alle nur Menschen!

Und Du kannst dir nun besser vorstellen, was es bedeutet, "wie ein Programmierer zu denken".

Außerdem weißt Du nun, dass Problemlösung eine unglaubliche Fähigkeit ist, die es Wert ist zu kultivieren (die Meta-Kompetenz).

Als ob das noch nicht genug wäre, bedenke auch, dass Du jetzt auch weißt, was zu tun ist, um Dich in Problemlösung zu üben!

Puh.... Ziemlich cool, oder?

Zum Schluss wünsche ich Dir, dass Du auf viele Probleme stößt.

Das hast Du richtig gelesen. Zumindest weißt du jetzt, wie du sie lösen kannst! (auch, Du wirst lernen, dass Du Dich mit jeder Lösung verbesserst).

"Gerade wenn Du denkst, dass Du eine Hürde erfolgreich genommen hast, taucht eine neue auf. Aber gerade das ist, was das Leben interessant macht.
Das Leben ist ein Prozess des Durchbruchs dieser Hindernisse - eine Reihe von Festungsanlagen, die wir durchbrechen müssen.
Jedes Mal wirst du etwas lernen.
Jedes Mal wirst du stärker, weiser und weitsichtiger.
Jedes Mal fällt es ein wenig leichter. Bis alles, was übrig ist, nur Du bist: die beste Version von Dir." - Ryan Holiday (Das Hindernis ist der Weg)

Jetzt geh und lös' ein paar Probleme!

Und viel Glück?

Besonderer Dank gilt C. Jordan Ball und V. Anton Spraul. Alle guten Ratschläge hier stammen von ihnen.

Auch all die Programmierkenntnisse, die ich mir in so kurzer Zeit angeeignet habe, wären ohne die Lambda School nicht möglich gewesen. Ich kann ihnen nicht genug danken/sie empfehlen.

Danke fürs Lesen! ? Wenn der Artikel Dir gefallen hat, teste, wie oft Du in 5 Sekunden ? drücken kannst. Das ist ein großartiges Cardio-Programm für Deine Finger UND hilft anderen Menschen, den Artikel zu finden.

                                                                     “Hallo!


Dieser Artikel wurde aus dem Englischen übersetzt. Das Original kann hier nachgelesen werden:

How to think like a programmer — lessons in problem solving
by Richard Reis How to think like a programmer — lessons in problem solving By Richard Reis [https://twitter.com/richardreeze]If you’re interested in programming, you may well have seen this quote before: &gt; “Everyone in this country should learn to program a computer, because it teaches you to thi…