Lösen Sie Programmierprobleme oder führen Sie Übungen durch? (Der Unterschied ist wichtig.)

Menschen neigen dazu, die Begriffe „Probleme“ und „Übungen“ synonym zu verwenden. Aber es gibt einen Unterschied - und es ist wichtig.

Professor Paul Zeitz macht den Unterschied.

Nehmen Sie 5 × 5. Das ist einfach und das ist eine Übung. Es ist also 5.490.900 × 496. Es ist etwas schwieriger und Sie brauchen mehr Zeit zum Lösen, aber Sie wissen, was zu tun ist. Das ist der entscheidende Punkt.

„Eine Übung ist eine mathematische Frage, die Sie sofort beantworten können“, erklärt Zeitz in einer Vorlesungsreihe zur Problemlösung. "Sie können es möglicherweise nicht richtig beantworten, tatsächlich werden Sie es möglicherweise nie richtig beantworten ... aber es besteht kein Zweifel darüber, wie Sie vorgehen sollen."

Nicht so bei Problemen. Ein Problem ist laut Zeitz „eine mathematische Frage, die Sie zumindest anfangs nicht beantworten können.“

Er definiert Probleme und Übungen durch die Linse der mathematischen Problemlösung, aber sie sind auch auf die Programmierung anwendbar.

Jeden Tag setzen wir unsere Fähigkeiten zur Problemlösung als Programmierer ein: Debuggen von Code, Erlernen eines neuen Themas oder sogar Lösen eines Problems. Übungen haben ihren Platz, aber als Programmierer gibt es keinen Ersatz für die Lösung von Problemen.

Übung mit Übungen

Es gibt zwei Möglichkeiten, wie Sie von Übungen profitieren können. Erstens sind sie hilfreich, wenn Sie ein neues Thema lernen.

Ich lerne gerade JavaScript und verwende dazu eine Mischung aus Übungen und Problemen. Die Übungen helfen mir, Muster zu erkennen und mich mit Konzepten und Syntax vertraut zu machen.

Hier ist ein Beispiel einer Übung aus einem Projekt, bei dem ich gebeten wurde, eine Funktion zu schreiben, für die eine Reihe von Autos benötigt wurden.

const cars = [ { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 }, { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 }, { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 }, ... ] 

Ich musste die Anordnung der Objekte nach dem car_modelSchlüssel in aufsteigender Reihenfolge sortieren .

Es ist nicht zu sagen, dass diese Übung ein Kinderspiel war - es war nicht. Ich habe Zeit gebraucht und viele Fehlermeldungen erhalten.

Es ist jedoch eine Übung, da ich von Anfang an wusste, was ich tun musste.

Ich hatte kürzlich etwas über Arrays in JavaScript gelernt. Ich war aus meiner Erfahrung mit Python mit dem Sortieren von Daten vertraut, musste jedoch untersuchen, wie dies in JavaScript funktioniert. Auch die expliziten Anweisungen halfen.

Aber die Konzepte waren noch neu. Ich musste üben, sie zusammenzusetzen, weshalb diese Übung wertvoll war. Wiederholung schafft Vertrautheit, und die Konzepte begannen sich in meinem Kopf zu verfestigen.

Behalten Sie bei, was Sie gewonnen haben

Übungen helfen auch dabei, gelernte Informationen auf dem neuesten Stand zu halten.

Wenn ich JavaScript lerne, möchte ich nicht alles vergessen, was ich über die erste Sprache gelernt habe, die ich gelernt habe, Python. Also benutze ich Anki, ein Kartenprogramm, mehrmals am Tag.

In diesem Zusammenhang helfen Ihnen Übungen dabei, einen Berg an Material gerade zu halten, Sie an wichtige Konzepte zu erinnern und sich mit einer bestimmten Datenstruktur oder einem bestimmten Ansatz wohler zu fühlen. Es sind Wartungsarbeiten an dem Wissen, das Sie bisher erworben haben.

Ich habe über 1.000 Karten, die mit Material gefüllt sind, das ich schon oft gesehen habe. Einige Karten haben Fragen zur Syntax. Andere bitten mich, SQL-Abfragen oder Befehlszeilen- oder Git-Befehle zu schreiben. Viele andere sind mit Übungen gefüllt, wie „eine Liste von Zahlen um einen Stellenwert nach rechts drehen“.

Es ist wichtig zu beachten, dass diese Übung einmal ein Problem für mich war. Wenn Sie ein Problem genug machen, kann es zu einer Übung werden. Gleichzeitig können Sie eine Übung zu einem Problem machen, indem Sie eine Einschränkung hinzufügen.

Übungen sind ein rutschiger Hang. Einerseits sind sie für Lernzwecke nützlich. Auf der anderen Seite ist es einfach, sich wohl zu fühlen, wenn man sich ausschließlich an Übungen hält.

Das ist der Nachteil: Bleiben Sie in Ihrer Komfortzone.

Der Umgang mit Mehrdeutigkeit

Beim Programmieren geht es um Problemlösung. Und die Lösung von Problemen werden Sie außerhalb Ihrer Komfortzone. Das ist eine gute Sache.

Probleme haben für mich zwei unterschiedliche Eigenschaften. Das erste ist Mehrdeutigkeit. Bei der Problemlösung geht es hauptsächlich darum, wie man effektiv mit Mehrdeutigkeiten umgeht.

  • Bei jeder Ausführung Ihres Programms wird eine Fehlermeldung angezeigt. Warum? Was ist los? Wo ist der Fehler? Wie können Sie das beheben?
  • Sie rufen eine neue Problemstellung auf. Sie lesen es und lesen es erneut. Auf den ersten Blick haben Sie keine Ahnung, was los ist, geschweige denn, was Sie tun müssen, um es zu lösen. Möglicherweise bekommen Sie sogar das Gefühl „Hirsch im Scheinwerferlicht“, das von einer Grube im Magenboden begleitet wird. (Du hast ein gutes Problem ausgewählt!)
  • Sie müssen sich mit relationalen Datenbanken vertraut machen. Das ist ziemlich breit. Wie wirst du vorgehen? Worauf sollte man sich zuerst konzentrieren? Was am wichtigsten ist? Was müssen Sie jetzt wirklich wissen ?

Diese Beispiele beinhalten alle Mehrdeutigkeiten. Und alle erfordern das Lösen von Problemen , egal ob es darum geht, einen Fehler zu finden und zu beheben, ein tatsächliches Problem zu lösen oder ein neues Thema zu lernen.  

Um Fortschritte zu erzielen, recherchieren, experimentieren, ziehen Sie die Fakten heraus, erstellen Sie einen Plan und wenden Sie eine Vielzahl von Problemlösungstaktiken an. Kurz gesagt, Sie lernen es herauszufinden. Je mehr Zeit Sie mit einem Problem verbringen und je mehr Perspektiven Sie gewinnen, desto mehr Ebenen werden sichtbar und desto näher kommen Sie dem „Aha“ -Moment.

Umarme den Kampf

Der andere Unterschied bei Problemen ist der Kampf. Es ist echt.

Das Lösen von Problemen wird Ihre geistige Ausdauer und Geduld auf die Probe stellen. Fortschritte können langsam und der Prozess langwierig sein. Ich habe mich stunden-, tag- und sogar wochenlang mit Problemen beschäftigt.

Es ist nicht zu sagen, dass Übungen Sie nicht herausfordern werden. Sie können. Es ist eine Sache, wenn Sie wissen, dass Sie eine bestimmte Methode anwenden müssen; Sie müssen es nur zum Laufen bringen. Das ist eine Herausforderung, die manchmal geradezu frustrierend sein kann.

Aber es ist etwas ganz anderes, wenn Sie von Anfang an keine Ahnung haben, was zu tun ist. Dies kann bei der Lösung eines Problems mehrmals vorkommen. Probleme sind für mich ein Kampf.

Die beste Lösung ist, es zu ertragen und sich zu lösen. Nach meiner Erfahrung bedeutet der Kampf, dass ich viel lerne und der Durchbruch normalerweise vor der Tür steht.

Wenn Sie die mentalen Beschwerden überwinden, werden Sie kreativ denken und Lösungen finden, an die Sie noch nie gedacht haben. (Sie überraschen und beeindrucken sich selbst - Sie wissen mehr als Sie denken!) Sie werden ein stärkerer Programmierer.

Sie werden sogar Spaß haben. Das Lösen von Problemen ist zwar eine Herausforderung und manchmal sogar frustrierend. Aber es ist auch unglaublich lohnend.

It’s like crossing the finish line of a half-marathon. No doubt the past 13.1 miles were grueling, but crossing the finish line was worth it and I’d do it again. Solving a problem feels the same way.

Which Is It: Problems or Exercises?

When you crack open your laptop, are you going to solve problems or complete exercises?  

Exercises have benefits, and it’s fine to incorporate them into your programming sessions. I use exercises as a warm-up prior to a programming session. I’ll flip through an Anki flashcard deck for ten or fifteen minutes and work through some exercises. If I’m learning something new, like JavaScript, I may have an entire programming session devoted to exercises.

However, I devote time each day to solving problems—no matter what else I’m learning or building. Even on the days when I allocate a large chunk of time to exercises, I allocate plenty of time to solving problems, too.  

So when you’re about to start a programming session, be aware what you’re setting out to do: exercises or problems. And no matter what, make time for solving problems.

Problem-solving is a skill that takes a lot of practice and time to develop. The only way to get better is to work at it each day. It’s that important, and for good reason.

We solve problems each day as programmers, and in a variety of ways. Making time to problem-solve is a no-brainer; our work as programmers depends on it.

I write about learning to program, and the best ways to go about it (amymhaddad.com).