Tipps oder Techniken, die Sie verwenden sollten, wenn Sie nicht wissen, wie man etwas codiert? [geschlossen]

8

Ich habe einen Hintergrund als UI-Designer. Und mir wurde klar, dass es für mich ein bisschen schwierig ist, ein Stück Logik zu schreiben. Manchmal verstehe ich es richtig, aber meistens habe ich etwas Hackiges (und es dauert normalerweise viel Zeit). Und ist es nicht so, dass ich nicht gerne programmiere? Tatsächlich fange ich an, es genauso zu mögen wie Design. Es ist nur so, dass ich manchmal denke, dass ich besser mit Farben und Formen umgehen kann als mit Zahlen und Logik (aber das möchte ich ändern).

Normalerweise suche ich die Lösung im Internet, kopiere das Beispiel und füge es in meine App ein (ich weiß, dass dies keine sehr gute Vorgehensweise ist).

Ich habe gehört, dass ein Tipp darin bestand, die Logik in allgemeinem Englisch als Kommentar zu schreiben, bevor der eigentliche Code geschrieben wurde.

Welche anderen Tipps und Techniken kann ich verwenden?

janoChen
quelle
@ Yannis Rizos Danke, wow, sie sind viel. Sollte ich sie alle ausprobieren oder gibt es einige, die beim Programmieren besonders effektiv sind?
janoChen

Antworten:

17

Kleine Schritte.

Teilen Sie ein großes Problem in kleinere Probleme auf. Dann lösen Sie die kleineren Probleme.

Bonuspunkte, wenn Sie Ihre Lösungen für kleinere Probleme mit automatisierten Komponententests sichern können.

Jim G.
quelle
10

Normalerweise schreibe ich Dinge auf Papier, während ich überlege. Auf diese Weise kann ich Pseudocode schreiben oder Zeichnungen machen (normalerweise beides), und ich muss mich nicht um die Einschränkungen der Zeichensoftware kümmern oder darum, was in einen Kommentar passen kann.

Ich finde, wenn ich etwas zumindest leicht Kompliziertes mache, muss ich die Dinge wirklich zuerst auf Papier bringen, sonst bekomme ich etwas Hackiges, wie Sie erwähnt haben.

Wenn ich am Ende etwas Hackiges habe, funktioniert es häufig fast . Manchmal kann ich es hacken, bis es endlich funktioniert, manchmal nicht. Wenn ich mir die Zeit nehme, es auf Papier auszuarbeiten, funktioniert es oft ohne allzu große Probleme.

Michael Shaw
quelle
2
+1 zum Nachdenken vor dem Codieren. Dies führt fast immer zu einer besseren Lösung.
Paul Hiemstra
4

Ich denke, dass Sie Ihre eigene Frage irgendwie beantwortet haben, und ich meine das nicht schlecht - es ist ein allgemeiner Ratschlag, dass der beste Weg, das Codieren zu lernen, einfach das Codieren ist. Ich persönlich würde versuchen, das Kopieren von Code direkt aus einer Quelle zu vermeiden, es sei denn, es ist absolut klar, was los ist (das heißt, es gibt nicht unbedingt einen anderen guten Weg, etwas zu tun), obwohl viele dieser Probleme auftreten sind syntaktisch. Nehmen Sie sich die Zeit, um zu verstehen, was los ist und wie Sie (oder jemand anderes) es umsetzen.

In der Zeit, in der ich gelernt habe, wie man sich entwickelt, habe ich festgestellt, dass die Arbeit mit MVC-Technologien eine großartige Möglichkeit ist, um zu verstehen, wie man Design macht, wie z. B. Rails (mit dem ich gerade arbeite) oder iOS / Cocoa Touch . Da Sie in einer solchen objektorientierten Designumgebung arbeiten, denken Sie auch darüber nach, wie Modelle und deren Logik von der Ansicht getrennt sind (wobei Controller der Klebstoff sind, der sie verbindet) Sie können Ihre Objekte auf logische, aber (hoffentlich!) unkomplizierte Weise abstrahieren.

Dies basiert natürlich auf meinen eigenen Erfahrungen, aber ich hoffe, dass meine Gedanken zu Ihrer Frage hilfreich sein können.

Paul
quelle
3

Zusätzlich zu den bereits gegebenen Antworten besteht eine der besten Möglichkeiten, um sofort loszulegen, darin, von einer Anwendung zu lernen, die einfach ist und in der der Quellcode verfügbar ist.

Hier leuchten solche sozialen Repositories wie Github. Ein unglaublicher Ort, um nach Beispielen zu suchen. Und wenn Sie eine finden, können Sie sie sofort als Ihre eigene aufteilen und mit der Anwendung tun, was Sie wollen. Sobald Sie sie haben:

  • Sie können es ausführen
  • Optimieren Sie es hier und da und sehen Sie, wie sich die Dinge ändern
  • Wenn Sie es sich bequemer machen, nehmen Sie größere Änderungen vor
  • Sie werden bald feststellen, dass Sie wirklich lernen

Eine andere Möglichkeit besteht darin, die klassischen Beispielreferenzimplementierungen zu verwenden, die an so vielen verschiedenen Stellen dokumentiert sind. Das Spring Framework von Java verwendet beispielsweise das ehrwürdige Beispiel "Pet Store". Ich denke, Sie können dieses Beispiel sogar auf Github finden.

Andere Frameworks / Technologien wie das Groovy's Grail-Framework verwenden andere Klassiker wie eine Buchanwendung zum Speichern und Anzeigen von Büchern und Autoren usw.

Die letzte Option, die ich ausprobiert habe, besteht darin, einem guten Programmierbuch zu folgen und die Beispiele von Hand einzutippen und in ein Repository wie Github zu stellen. Dies hat mindestens zwei Vorteile: 1) Es gibt eine Referenz für Sie mit Ihren eigenen Notizen, die Ihnen helfen, sich an coole Dinge auf eine Weise zu erinnern, an die Sie sich erinnern werden, und 2) wenn Sie in schwierige Situationen geraten, können Sie leicht Freunde oder Kollegen dazu bringen Sehen Sie sich Ihren Code an und geben Sie Ratschläge.

Wissenschaft und insbesondere Programmierung bauen wirklich auf den Erfahrungen anderer auf. Im übertragenen Sinne hilft das Kopieren / Einfügen und anschließende Optimieren, bis Sie verstanden haben, Entwicklern, Ingenieure zu werden.

Johnnie
quelle
2
Das blinde Kopieren von Code kann gefährlich sein, wenn Sie nicht verstehen, was er tut. Besonders in der Wissenschaft ist blindes Kopieren sehr schlecht. Wenn Sie kopieren, können Sie die Idee des Codes übernehmen, ihn aber dennoch von Grund auf neu schreiben. Auf diese Weise werden Sie es besser verstehen. Ähnlich wie bei den Übungen am Ende eines Statistikkapitels, um zu sehen, ob Sie wirklich verstanden haben, was los ist.
Paul Hiemstra
Seien Sie vorsichtig mit Referenzimplementierungen. Sie zeigen häufig Techniken, die verwendet werden könnten, aber für die aktuelle Implementierung nicht wirklich anwendbar sind.
BillThor
Völlig einverstanden. Ich benutze 'Kopieren' als Euphemismus ... wir alle beginnen durch Nachahmung zu lernen. Und Sie haben Recht - wir müssen vorsichtig sein und uns gut genug verstehen, um zu wissen, wann wir uns im Lern- / Nachahmungsmodus befinden. Vielen Dank für den Hinweis.
Johnnie
2

Stellen Sie sich vor, Sie müssen jemand anderem einen Bericht über Ihr Problem erstellen.
Analysieren Sie das Problem. Versuchen Sie es so klar wie möglich zu formulieren. Pseudocode schreiben, Diagramme zeichnen.
Überlegen Sie, was das Problem verursachen könnte und warum Ihr Ansatz falsch ist.
Fragen Sie sich, ob es andere Perspektiven gibt, aus denen Sie Ihr Problem betrachten können.
Tun Sie das nicht nur in Ihrem Kopf, sondern schreiben Sie es auf Papier (oder ein Dokument auf Ihrem Computer).

Wenn Ihnen nichts davon sofort hilft, versuchen Sie, eine Weile nicht über das Problem nachzudenken. Gute Nachtruhe. Immer noch keine Lösung? Versuchen Sie, Ihr Problem zu googeln oder SO nach einer Lösung zu suchen.

Wenn alles andere fehlschlägt, stellen Sie eine Frage zu SO (oder zu SE-Programmierern, wenn dies für Ihre spezielle Frage besser geeignet ist). Stellen Sie sicher, dass Sie Ihren "Bericht" (oder die wichtigen Teile davon) tatsächlich angeben, wenn Sie die Frage stellen.
Wenn Sie eine Antwort erhalten, fragen Sie sich, warum Ihr Ansatz nicht funktioniert hat und was Ihnen hätte helfen können, selbst zur Lösung zu kommen. Dies könnte Ihnen helfen, eine Lösung für ein Problem zu finden, auf das Sie in Zukunft stoßen und das einen ähnlichen Ansatz erfordert.

Ich kann lernen
quelle
1

Ich bin damit einverstanden, auf Papier zu denken. In der Regel identifiziere ich zuerst alle Informationen, die ich benötige und woher sie kommen. Es muss nicht elegant sein, nur genau. Geschäftslogikfragen und Entwurfsstrategien kommen normalerweise während dieses Prozesses.

Als Java-Entwickler, der Ende an Ende an einer Anwendung arbeitet, teile ich die Dinge weiter nach Ebenen ein: Präsentation, Web, Geschäftslogik und Datenzugriffsschicht. Wenn ich Zeit habe, schreibe ich normalerweise meine Klassennamen während dieses Teils auf.

Zuletzt bemühe ich mich immer, Tests für das Backend durchzuführen, bevor ich Code schreibe. Sie können alles elegant verkabeln, aber wenn Sie das Back-End nicht erreichen können: Datenbank oder Webdienst zum Beispiel, funktioniert es nicht!


quelle
1

Einige der Prinzipien der testgetriebenen Entwicklung helfen hier sehr.

Eine der besten Möglichkeiten, komplexe Probleme zu lösen, besteht darin, sie für bestimmte Anwendungsfälle zu lösen und dann eine Verallgemeinerung zu finden. Die Verwendung von TDD fördert genau das. Sie erstellen einen einfachen Testfall und bringen ihn zum Laufen, erstellen dann einen weiteren Testfall und bringen ihn zum Laufen. Schließlich sehen Sie, ob Sie eine Verallgemeinerung vornehmen können, mit der Sie beide Testfälle mit derselben Logik behandeln können. Wenn Sie können, werden wahrscheinlich auch viele andere Testfälle behandelt. Da Sie alle Ihre Testfälle jederzeit ausführen können, können Sie Ihre Logik verbessern, ohne sich Gedanken darüber machen zu müssen, ob etwas kaputt geht. Auf diese Weise muss eine hackige Lösung nicht hackig bleiben.

Testgetriebene Entwicklung fördert auch

  • Aufteilen großer Probleme in kleinere, so dass es einfacher ist, eine gute Testabdeckung zu erhalten.
  • Überlegen Sie sich im Voraus, was Sie wirklich erreichen möchten, bevor Sie sich mit den Details der Implementierung befassen.
  • Vermeiden Sie Überentwicklung, indem Sie versuchen, die Tests so einfach wie möglich zu bestehen. Einfache Lösungen sind normalerweise die besten.
Vaughn Cato
quelle
Hier ist ein Gegenargument: TDD ist kein guter Weg, um etwas zu lösen, mit dem Sie nicht vertraut sind. Sehen Sie sich das berüchtigte Wie man ein Sudoku nicht löst, bei dem der TDD- "Experte" Ron Jeffries peinlicherweise keine Lösung bietet, während er blind TDD verwendet, und Peter Norvig löst es mit altmodischem "Wissen über das Thema" und "Nachdenken". Sie können eine algorithmische Lösung nicht aus TDD-Fällen verallgemeinern, es sei denn, sie ist trivial oder Sie kennen Ihr Ziel bereits im Voraus.
Andres F.
@AndresF.: Es ist definitiv ein interessantes Beispiel. Ich denke, das Problem hier ist jedoch "blind". Ich denke, Sie möchten immer einen Schritt zurücktreten und einen Blick darauf werfen, wie sich Ihr Code entwickelt, um einen Einblick in das Problem zu erhalten. Ich hatte viele Male, in denen ich zunächst keine allgemeine Lösung sehen konnte, aber nachdem ich mir angesehen hatte, wie man einige einfache Testfälle löst, wurde die allgemeinere Lösung klar.
Vaughn Cato
Einverstanden, dass "blind" der wahrscheinlichste Schuldige ist. Aber wenn Ron Jeffries , ein Experte für TDD und Mitbegründer von XP, es nicht richtig machen kann, wer kann es dann? : P Im Ernst, ich denke, die anderen Antworten auf diese Frage sind relevanter als TDD: Das Problem in kleinere Teile zu zerlegen und darüber nachzudenken, Pseudocode zu schreiben, einen Proof auf Papier zu schreiben usw. sind alle wichtiger als testgetriebenes Design und "zuerst testen". Wenn das Problem algorithmischer Natur und nicht trivial ist, hilft Ihnen TDD nicht (so viel). TDD hilft Ihnen jedoch beim Schreiben von CRUDs.
Andres F.
@AndresF.: Das mag wahr sein. Ich hatte vom OP nicht den Eindruck, dass dies schwierige algorithmische Probleme waren. Es schien mit den verschiedenen Logikelementen in Zusammenhang zu stehen, die in Benutzeroberflächen auftauchen, die oft ziemlich triviale Lösungen haben, aber leicht falsch zu verstehen sind. Dies ist möglicherweise nicht die tatsächliche Situation des OP. Ich würde jedoch sagen, dass das Aufarbeiten von Testfällen selbst bei schwierigen algorithmischen Problemen ein großer Vorteil für das Verständnis sein kann. Um Code inhärent testbar zu machen, muss er in kleinere und besser handhabbare Teile zerlegt werden.
Vaughn Cato
Oh, Testfälle sind definitiv Teil der Problemlösung. Bei TDD geht es jedoch nicht nur um Testfälle. Ich bin nicht einverstanden mit TDD, nicht mit Tests! Ich bin mit dem Designteil von TDD nicht einverstanden . (Obwohl ich Ihnen jetzt zustimme, trifft das Algorithmus-Szenario möglicherweise nicht auf die Situation des OP zu.)
Andres F.
0

Es gibt tatsächlich ein Buch, das genau diese Frage beantwortet:

Entwerfen von Programmen - Eine Einführung in das Programmieren und Rechnen von Matthias Felleisen, Robert Bruce Findler, Matthew Flatt und Shriram Krishnamurthi

Derzeit arbeiten sie an einer zweiten Ausgabe und danach an einem zweiten Band (How to Design Components).

Das wirklich Coole an diesem Buch ist, dass es Ihnen eine Reihe von Rezepten zum Entwerfen von Programmen gibt. Mit anderen Worten, es gibt Ihnen Schritt-für-Schritt-Anweisungen, die Sie (halb-) gedankenlos befolgen können, um ein Programm zu entwerfen.

Oder anders ausgedrückt: Es enthält eine Reihe von Programmen zum Schreiben von Programmen, sodass Sie nicht herausfinden müssen, wie ein Programm geschrieben wird: Die Autoren haben es für Sie herausgefunden!

Jörg W Mittag
quelle
0

Zusätzlich zu den obigen Antworten geht es manchmal nicht darum, die Logik selbst zu kennen, sondern den Rahmen und die Sprache zu kennen, mit denen Sie arbeiten. Jedes Framework oder jede Sprache hat ihre eigenen Eigenschaften und es ist eine große Hilfe, sich damit vertraut zu machen.

arfo
quelle