it-swarm.dev

Ich bin kein guter Programmierer (logisch). Wie soll ich das beheben?

Ok, hier ist mein Problem:

Ich arbeite für eine große Firma, einige haben einen Job bekommen (ehrlich gesagt, weil das Interview einfach war). Es ist nicht so, dass ich meine Sachen nicht kenne, ich bin ziemlich gut darin, Java, seine Bibliotheken usw. zu verstehen.

Aber wenn ich jemals versuche, ein logisches Problem zu lösen, fällt es mir wirklich schwer, eine Lösung zu finden.

Beispielsweise, conversion of decimal to roman, als ich die Lösung sah, stellte ich fest, dass es ein einfaches Problem ist. Aber ich konnte es nach 1-2 Stunden des Ausprobierens nicht implementieren!

Ich fühle mich dumm und es nicht wert, Softwareentwickler zu sein. Fähigkeiten zum Lösen von Rätseln sollte von Haus aus zu einem großartigen Programmierer werden. Aber wenn ich versuche, einige Rätsel zu lösen, kann ich keine Lösung finden und google sie einfach auf! .... und ich hasse das!

Wenn ich bei der Arbeit ein Problem (wie das Implementieren der xyz-Funktion) bekomme, bin ich ziemlich schnell darin und respektiere das an meinem Arbeitsplatz, aber ich bin überhaupt nicht stolz darauf. Denn wenn ich versuche, ein mathematisch oder logisch herausforderndes Problem zu lösen, fummele ich herum. Ich habe immer noch das Gefühl, dass ich meine Arbeit (als Ingenieur) liebe, aber ich bin wirklich traurig, dass ich einige schwierige logische Probleme, die mir Freunde einfallen lassen, nicht lösen kann.

Ich fühle mich demoralisiert :(

TL; DR: Ich verstehe Dinge aus praktischer Sicht (Implementierung von Funktionen in unserem Produkt), aber wenn ich versuche, Probleme von beispielsweise ProjectEuler aus zu bearbeiten, sauge ich schlecht! Und ich muss mein Gehirn schärfen !

Meine Fragen sind also:

  1. Wie soll ich das Problem beheben? Sollte ich damit beginnen, Projekt-Euler-Probleme zu lösen (und mich dazu zu zwingen)? Auch wenn ich Stunden brauche, um einige grundlegende Probleme zu lösen ?
  2. Oder sollte ich zu den Grundlagen zurückkehren und grundlegende Mathematik lernen?
  3. Ich finde das Lösen von Rätseln nicht wirklich lustig. Aber ich möchte es mir selbst Spaß machen! Und ich denke, wenn ich sie besser verstehe, wird es mir gefallen!

PS: Ich wurde nie in CS ausgebildet (mein Undergrad war elektrisch). Aber das ist keine Entschuldigung, um ein blöder Entwickler zu sein.

Vielen Dank!

50
John

Erstens ist es wunderbar, dass Sie dies als Schwäche Ihrer Fähigkeiten ansehen. Sie wissen tatsächlich, wo Sie sich verbessern müssen, was die Arbeit erheblich erleichtert, und zeigen an, dass Sie besser sind als Sie denken.

Ich glaube, Ihr Hauptproblem, das ich schon oft gesehen habe, ist, dass Sie kein "Toolset zur Problemlösung" haben. Was tun Sie, wenn Sie mit einem Problem konfrontiert werden? Wie lösen Sie es? Ich bin langsam in Mathe, aber weil ich weiß, wie man die kleinen Werkzeuge der Mathe zusammen benutzt, habe ich Kalkül gewonnen.

Sie müssen also nicht nur an der Problemlösung arbeiten, sondern auch prüfen, welche Tools und Fähigkeiten Sie dabei mitbringen. Wenn Sie bei der Arbeit an einer neuen Funktion arbeiten wollten, setzen Sie sich einfach ohne IDE, ohne Debugger, ohne Dokumentation, ohne Internet und ohne Quellcode hin? Natürlich nicht!

Es gibt Tools zum Lösen von Problemen, Sie kennen sie einfach nicht .... noch . Der Wikipedia-Artikel enthält einige Links zu Problemlösungstechniken. Das wichtigste Werkzeug ist jedoch die wissenschaftliche Methode . Der Wikipedia-Artikel enthält einen pragmatischen Ansatz:

  1. Definieren Sie eine Frage
  2. Informationen und Ressourcen sammeln (beobachten)
  3. Bilden Sie eine erklärende Hypothese
  4. Testen Sie die Hypothese, indem Sie ein Experiment durchführen und Daten auf reproduzierbare Weise sammeln
  5. Analysieren Sie die Daten
  6. Interpretieren Sie die Daten und ziehen Sie Schlussfolgerungen, die als Ausgangspunkt für neue Hypothesen dienen
  7. Ergebnisse veröffentlichen
  8. Wiederholungstest (häufig von anderen Wissenschaftlern durchgeführt)

Alle Probleme können auf diese Weise gelöst werden! Viele Leute gehen diese Schritte jedoch nicht durch. Es ist wie bei einem Entwickler, der sich weigert, seinen Code zu testen. Überhaupt. Er wird Probleme haben herauszufinden, ob es überhaupt Fehler gibt.

Schließlich besteht das andere Hauptwerkzeug zur Problemlösung darin, es mit einfachen Schritten aufzuschlüsseln. Zum Beispiel das erste Problem in Beispiele von Projekt Euler :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Wir haben zwei Fakten und hier ein Problem. Fakt eins zeigt uns, wie man ein Vielfaches von drei oder fünf unter 10 definiert. 3 * 1,3 * 2,3 * 3,5 * 1 sind alle gültig. 5 * 2 ist nicht, weil es gleich 10 ist. Dann sagt uns Tatsache zwei, dass wir sie addieren, um 23 zu erhalten.

Wir haben also bereits eine Methode, um Werte zu finden, und wir können sie addieren, um unsere Summe zu erhalten. Natürlich können wir uns die Fakten ansehen und eine einfache Umkehrung der Reihenfolge anwenden. 3, 5, 6 und 9 sind Vielfache von 3 oder 5. Das heißt, 3% 3, 5% 5, 6% 3, 9% 3 ergeben alle einen Mod von Null. Ein anderer Ansatz wäre also, 999 zu 1 zu gehen und jede Zahl mit 3 und 5 zu modulieren. Sammeln Sie die Werteliste und addieren Sie sie.

Ich würde Die Kunst der Unix-Programmierung als hervorragendes Beispiel für die Verwendung kleiner Tools in der Programmierwelt vorschlagen. Wenn Sie sie miteinander verketten, können Sie sehr komplexe Probleme lösen, und ich kann nicht zählen, wie oft mir diese Konzepte geholfen haben.

24
Spencer Rathbun

Viele Programmierer sind auch natürliche "Rätsellöser", aber das Programmieren bietet noch viel mehr. Wenn sich alle Programmierer darauf konzentrieren würden, interessante algorithmische Probleme zu lösen, hätten wir jede Menge Software, die coole Probleme lösen könnte, aber keine von ihnen wäre verwendbar oder wartbar.

Ich finde, dass es in meiner Arbeit relativ wenige Herausforderungen vom Typ "Rätsel lösen" gibt. Bei den meisten Herausforderungen geht es eher darum, alten Code zu studieren, eine neue API zu erlernen und die Architektur einer Komponente so zu gestalten, dass die Leute in drei Jahren nicht mehr darauf schwören werden. All dies ist eine Herausforderung, aber nicht so sehr ein logisches Rätsel. Andererseits habe ich Kollegen, die die meiste Zeit damit verbringen, über Algorithmen zur Compileroptimierung nachzudenken, und die darin sehr gut sind.

Ich denke, es ist wichtig, dass Programmierer ständig darüber nachdenken, wie ich meine Arbeit verbessern kann, aber ein guter Programmierer zu sein, erfordert nicht unbedingt, dass Sie sich hervorragend mit Rätseln auskennen.

Persönlich bekomme ich meine Rätsellösung durch Lösen von "Mystery Geocaches" .

19
JesperE

Lassen Sie mich Sie nur warnen, je mehr Sie wissen, desto mehr erkennen Sie, wie wenig Sie wissen.

Lass dich davon einfach nicht entmutigen. Lernen Sie weiter und versuchen Sie, an Bereichen zu arbeiten, die Ihnen fehlen.

Nun zu Ihrer Frage. Mein Vorschlag wäre, mit der Arbeit an den Problemen an project eule r zu beginnen.

Meine Gründe dafür sind einfach, fangen Sie bei der beliebtesten Frage an, dies sind normalerweise die leichter zu lösenden Probleme.

Wenn Sie mit einem Problem konfrontiert sind, versuchen Sie es zu lösen, arbeiten Sie selbst daran und probieren Sie verschiedene Ansätze aus. Die Funktionsweise von Project Euler ermöglicht es Ihnen, Ihre Antwort zu überprüfen und zu testen.

Wenn Sie feststellen, dass Sie dieses Problem nicht lösen können, beginnen Sie mit der Untersuchung des Problems (ohne nach einer Antwort zu suchen). Nein, versuche es noch einmal.

Sobald Sie das Problem gelöst haben, verfügt Project Euler über einen Abschnitt, in dem die besten Antworten für jede Sprachimplementierung angezeigt werden. Gehen Sie ihre Antwort in Ihrer bevorzugten Sprache durch, verstehen Sie ihre Lösung und das darin enthaltene Denken.

Schließen Sie nun die Antwort, die sie gegeben haben, und versuchen Sie es erneut selbst, bis Sie sie erneut lösen.

Wenn Sie genug üben, werden Ihnen die Logik und das Denken zur Lösung dieser Probleme immer leichter fallen.

9
SetiSeeker

Die meisten Programmierjobs erfordern nicht viel Logik. Aber dies sind möglicherweise nicht die Jobs, die Sie mögen.

Versuchen Sie als allgemeine Richtlinie, Algorithmen und Strukturen zu lernen. Ich kann Skienas Handbuch The Algorithm Design empfehlen. Sobald Sie diese kennen, werden Sie anfangen, Probleme zu kategorisieren. Das sieht dem Problem der reisenden Verkäufer sehr ähnlich, hier kann ich einen Baum verwenden, hier kann ich eine binäre Suche verwenden ...

Project Euler hat eine große Auswahl an Rätseln. Viele davon sind mit mathematischen Grundkenntnissen leicht zu realisieren. Andere sind einfacher zu lösen, wenn Sie einige dieser Algorithmen kennen.

4
Carra

Ich bin der festen Überzeugung, dass Sie gerade erst mit Ihrer Programmierreise begonnen haben. Wenn Sie also einige Zeit brauchen, um sie überhaupt zu verstehen und richtig zu machen, scheint dies kein Problem zu sein. Der einzige Unterschied, den es macht, ist, dass Sie bei jedem Versuch etwas lernen wie WoW!! Das letzte, was ich getan habe, macht überhaupt keinen Sinn, weil ich Dezimal und nicht doppelt brauchte

Wenn Sie das Lösen von Rätseln nicht interessiert, gehen Sie nicht auf Kopfjagd. Sobald Sie Ihre Codebasis kennen, gibt es andere logische Probleme. Sie können sich dafür entscheiden, daran zu arbeiten und Ihrem Mentor oder Lead alle vorgeschlagenen Änderungen vorzulegen . (Machen Sie sich keine Sorgen, wenn Sie einen Fehler machen, der Ihnen hilft, herauszufinden, warum Ihre Methodik fehlerhaft ist. Seien Sie also ein aufmerksamer Beobachter und ein treffender Zuhörer.)

Es wird einige Zeit dauern, bis Sie sich beruhigt haben, und dann können Sie möglicherweise auf alle Zylinder schießen. Vermeiden Sie natürlich den Drang, auf Google oder SO nach einer Lösung zu suchen, unternehmen Sie einige Anstrengungen von Ihrem Ende und starten Sie Ihren Browser nur, wenn Sie Zweifel haben oder absolut ahnungslos sind

2
V4Vendetta

Ich denke, ich sollte dem etwas hinzufügen.

Wie in der gewählten Antwort bereits erwähnt, ist es ein großer Vorteil, Ihre Schwäche zu kennen, und es gibt einige grundlegende Werkzeuge zum Erlernen von Problemlösungstechniken. Was meiner Meinung nach in der Antwort fehlt, ist einfach nur Wege zu finden, um schwierige Probleme zu üben - viel. Seien Sie hartnäckig, wenn Sie jedes Problem, das Sie versuchen, vollständig lösen. Das Lesen von Code, viel Code, ist gut, ebenso wie das Lesen von Büchern zum Thema Problemlösung, aber das Schreiben von Code ist fast wichtiger.

In gewisser Weise teilen wir die gleiche Schwäche (obwohl es nicht so schlimm ist, wie Sie denken). Um meine Fähigkeiten zur Problemlösung zu üben, arbeite ich immer an einem Projekt-Euler- oder HackerRank-Problem. Wenn es ein einfaches Problem ist, wähle ich 7 Programmiersprachen aus und versuche, es in allen zu lösen. Bei schwierigeren Problemen kann ich drei Sprachen auswählen, die sich stark voneinander unterscheiden, um die Zeit, die ich für das Problem aufgewendet habe, angemessen zu halten. Wenn ich für alle Probleme eine Lösung gefunden habe, suche ich nach den Lösungen, die andere gefunden haben, und stelle sicher, dass ich sie verstehe. Wenn Sie eine Lösung nicht verstehen, können Sie jederzeit auf StackOverflow oder wahrscheinlich sogar hier auf Programmers Stack Exchange oder so etwas posten, und ich bin sicher, dass es jemanden auf der Site gibt, der Ihre Frage beantworten kann (es ist selten, dass dies nicht der Fall ist).

Grundsätzlich sollten Sie jedoch sicherstellen, dass Sie üben und nicht nur lesen, und viel üben. Genau wie beim Sport erfordert klares Denken Zeit und Mühe.

Sie können auch helfen, die Art und Weise zu unterstützen, wie Sie über Probleme denken, indem Sie die Testsuite für die Probleme schreiben, die Sie zuerst lösen. Sie können keinen guten Test für ein Problem schreiben, ohne es vorher vollständig verstanden zu haben. Wenn Sie dies für verschiedene Sprachen tun, hat dies den Vorteil, dass Sie gleichzeitig verschiedene Testtechniken lernen.

1
Josiah

Zuallererst ist das Wissen um deine Schwäche eine echte Stärke, daher weißt du, was du lernen musst, um ein besseres Spiel zu erhalten.

Mein Rat wäre, viel Code zu lesen, der logische Probleme löst. Jeder hat seinen eigenen Stil beim Lösen von Rätseln. Das Lesen von Code kann Ihnen einen Hinweis darauf geben, wie Sie dies lernen können. Wenn Sie den Code verstehen können, verweisen Sie wahrscheinlich auch auf die mathematische Theorie, die das Problem beschreibt. Auf diesem Weg lernen Sie auch die zugrunde liegenden Probleme kennen.

Prost, Carlo

1
Carlo Kuip