Prozess, um vom Problem zum Code zu gelangen. Wie hast du gelernt?

8

Ich lehre / helfe einem Schüler zu programmieren.

Ich erinnere mich, dass der folgende Prozess mir immer geholfen hat, als ich anfing; Es sieht ziemlich intuitiv aus und ich frage mich, ob jemand anders einen ähnlichen Ansatz verfolgt hat.

  1. Lies das Problem und verstehe es (natürlich).
  2. Identifizieren Sie mögliche "Funktionen" und Variablen.
  3. Schreib wie würde ich es Schritt für Schritt (Algorithmus)
  4. machen
  5. Übersetze es in Code, wenn es etwas gibt, was du nicht tun kannst, erstelle eine Funktion, die es für dich tut, und bewege dich weiter.

Mit der Zeit und der Übung habe ich anscheinend vergessen, wie schwer es war, von der Problembeschreibung zu einer Kodierungslösung überzugehen, aber mit dieser Methode konnte ich lernen, wie man programmiert.

Also für eine Projektbeschreibung wie:

  

Ein System muss den Preis eines Artikels basierend auf den folgenden Regeln berechnen (eine Beschreibung der Regeln ... Kunde, Rabatte, Verfügbarkeit usw. .. etc.)

Ich muss zuerst verstehen, was das Problem ist.

Identifizieren Sie dann das Element, die Regeln, die Variablen usw.

Pseudocode etwas wie:

%Vor%

Und dann übergeben Sie es an die Programmiersprache ..

%Vor%

Hattest du einen ähnlichen Ansatz? Hat jemand dir einen ähnlichen Ansatz beigebracht oder hast du dich selbst entdeckt (wie ich es getan habe :()

    
OscarRyz 26.09.2008, 02:13
quelle

13 Antworten

3

Ich habe etwas ähnliches gemacht.

  • Ermitteln Sie die Regeln / Logik.
  • Finde die Mathematik heraus.
  • Dann versuchen Sie es zu codieren.

Nach ein paar Monaten wird es nur noch internalisiert. Sie erkennen nicht, dass Sie es tun, bis Sie auf ein komplexes Problem stoßen, bei dem Sie das Problem lösen müssen.

    
J.J. 26.09.2008, 02:17
quelle
11

Ich gehe über den testgetriebenen Ansatz.

1. Ich schreibe eine Liste von Tests oder Spezifikationen auf (in Papier- oder Klartext-Editor), die den Bedürfnissen des Problems entsprechen.

%Vor%

2. Suchen Sie nach den Elementen, die am einfachsten zu implementieren sind, und schreiben Sie einen Test dafür. ZB einzelne Artikel sieht einfach aus

Das Beispiel mit Nunit und C #.

%Vor%

Implementiere das mit:

%Vor%

Dann gehe zu den zwei Punkten.

%Vor%

Die Implementierung besteht den Test noch immer, also fahren Sie mit dem nächsten Test fort.

3. Seien Sie immer auf der Suche nach Vervielfältigungen und entfernen Sie sie. Sie sind fertig, wenn alle Tests bestanden sind und Sie nicht mehr an einen Test denken können.

Dies garantiert nicht, dass Sie den effizientesten Algorithmus erstellen, aber solange Sie wissen, was getestet werden soll und alles erfolgreich ist, garantiert es, dass Sie die richtigen Antworten erhalten.

    
jop 26.09.2008 02:52
quelle
5

der OO-Weg der alten Schule:

  • notieren Sie eine Beschreibung des Problems und seiner Lösung
  • umkreist die Substantive, dies sind Kandidatenobjekte
  • Zeichnungsfelder um die Verben herum, dies sind Kandidatennachrichten
  • gruppiere die Verben mit den Substantiven, die die Aktion "tun" würden; listet alle anderen Substantive auf, die benötigt werden, um
  • zu helfen
  • sehen Sie, ob Sie die Lösung mit dem Formular nomen.verb (andere Substantive)
  • wiederholen können
  • code es

[diese Methode geht den CRC-Karten voraus, aber es war so lange (über 20 Jahre), dass ich mich nicht mehr erinnere, wo ich es gelernt habe]

    
Steven A. Lowe 26.09.2008 03:29
quelle
4

Beim Programmieren denke ich nicht, dass TDD hilfreich ist. TDD ist später gut, wenn Sie ein Konzept haben, um was es beim Programmieren geht, aber für den Anfang ist das Wichtigste, eine Umgebung zu haben, in der Sie Code schreiben und die Ergebnisse in der schnellstmöglichen Zeit sehen.

Ich würde sofort von der Problembeschreibung zum Code wechseln. Hack es herum. Helfen Sie dem Schüler, verschiedene Möglichkeiten zum Erstellen von Software / Strukturierungsalgorithmen zu sehen. Bringen Sie dem Schüler bei, seine Meinung zu ändern und den Code zu überarbeiten. Versuchen Sie, etwas über die Codeästhetik zu lernen.

Sobald sie Code umgehen können .... dann führen Sie die Idee der formellen Umstrukturierung in Bezug auf Refactoring ein. Dann stellen Sie die Idee von TDD als eine Möglichkeit vor, den Prozess etwas robuster zu machen. Aber nur einmal, wenn sie sich wohl fühlen, Code zu manipulieren, um das zu tun, was sie wollen. In der Lage zu sein, Tests zu spezifizieren, ist dann etwas einfacher. Der Grund ist, dass es bei TDD um Design geht. Beim Lernen interessiert dich Design nicht so sehr, sondern was du kannst, mit welchen Spielzeugen musst du spielen, wie funktionieren sie, wie kombinierst du sie miteinander? Sobald Sie ein Gefühl dafür haben, dann wollen Sie über Design nachdenken und das ist, wenn TDD wirklich einsetzt.

Von da an begann ich, Mikromuster einzuführen, die zu Designmustern führen

    
Keith Nicholas 26.09.2008 03:42
quelle
3

Ich fange oben an und arbeite mich nach unten. Grundsätzlich beginne ich damit, eine Prozedur auf hoher Ebene zu schreiben, skizziere die Details darin und fange dann an, die Details auszufüllen.

Angenommen, ich hatte dieses Problem (aus dem Projekt euler)

  

Die Summe der Quadrate des ersten   zehn natürliche Zahlen sind 1 ^ 2 + 2 ^ 2 +   ... + 10 ^ 2 = 385

     

Das Quadrat der Summe der ersten zehn   natürliche Zahlen sind, (1 + 2 + ... +   10) ^ 2 = 55 ^ 2 = 3025

     

Daher der Unterschied zwischen der Summe   der Quadrate der ersten zehn   natürliche Zahlen und das Quadrat des   Summe ist 3025 385 = 2640.

     

Finde den Unterschied zwischen der Summe von   die Quadrate der ersten hundert   natürliche Zahlen und das Quadrat des   Summe.

Also fange ich so an:

%Vor%

Nun gibt es in Scheme keine Summe von Quadraten, Quadrat von Summen oder Listenfunktionen. Der nächste Schritt wäre also, jeden davon zu bauen. Beim Aufbau jeder dieser Funktionen muss ich vielleicht mehr abstrahieren. Ich versuche, die Dinge einfach zu halten, so dass jede Funktion nur eine Sache macht. Wenn ich eine funktionsfähige Komponente baue, die testbar ist, schreibe ich einen Komponententest dafür. Wenn ich anfange, eine logische Gruppierung für einige Daten und die Funktionen, die auf sie wirken, zu bemerken, kann ich sie in ein Objekt schieben.

    
Jonathan Arkell 26.09.2008 03:40
quelle
3

Ich habe TDD schon immer genossen, seit es mir vorgestellt wurde. Hilft mir, meinen Code zu planen, und es bringt mich einfach, alle meine Tests mit "Erfolg" zurückzugeben, jedes Mal, wenn ich meinen Code ändere, lass mich wissen, dass ich heute pünktlich nach Hause gehe!

    
Tablet 26.11.2008 23:34
quelle
2

Wunschdenken ist wahrscheinlich das wichtigste Werkzeug, um komplexe Probleme zu lösen. Nehmen Sie im Zweifelsfall an, dass eine Funktion existiert, um Ihr Problem zu lösen (erstellen Sie zuerst einen Stub). Sie werden später darauf zurückkommen, um es zu erweitern.

    
Martin Cote 26.09.2008 02:21
quelle
2

Ein gutes Buch für Anfänger, die nach einem Prozess suchen: Test Driven Development: Mit Beispiel

    
Nescio 26.09.2008 03:04
quelle
2

Mein Vater hatte eine Reihe von Flow-Chart-Schablonen, mit denen er mich benutzen konnte, als er mir zum ersten Mal etwas über das Programmieren beibrachte. Bis heute zeichne ich Quadrate und Diamanten, um einen logischen Prozess zur Analyse eines Problems aufzubauen.

    
Nathan Feger 26.09.2008 03:48
quelle
2

Ich denke, es gibt ungefähr ein Dutzend verschiedener Heuristiken, die ich kenne, wenn es um das Programmieren geht, und daher tendiere ich dazu, die Liste mit dem, was ich versuche, zu tun. Am Anfang ist es wichtig zu wissen, was das gewünschte Endergebnis ist und dann versuchen, rückwärts zu arbeiten, um es zu finden.

Ich erinnere mich an eine Algorithmus-Klasse, die einige dieser Möglichkeiten abdeckt:

  • Reduziere es auf ein bekanntes Problem oder ein triviales Problem
  • Teilen und erobern (MergeSort ist hier ein klassisches Beispiel)
  • Verwenden Sie Datenstrukturen mit den richtigen Funktionen (HeapSort ist hier ein Beispiel)
  • Rekursion (triviale Lösungen kennen und auf diese reduzieren können)
  • Dynamische Programmierung

Organisieren einer Lösung sowie Testen derselben für ungerade Situationen, z.B. Wenn jemand denkt, dass L eine Nummer sein sollte, würde ich normalerweise die Idee im Pseudocode ausprobieren, bevor ich es schreibe.

Entwurfsmuster können ein praktischer Satz von Werkzeugen sein, die für bestimmte Fälle verwendet werden können, z. B. wo ein Adapter benötigt wird oder Dinge in einer Zustands- oder Strategie-Lösung organisiert werden.

    
JB King 26.11.2008 23:59
quelle
1

Ja .. gut TDD existierte nicht (oder war nicht so populär), als ich anfing. Wäre TDD der Weg von Problembeschreibung zu Code zu gehen? ... Ist das nicht ein bisschen fortgeschritten? Ich meine, wenn ein "zukünftiger" Entwickler kaum versteht, was eine Programmiersprache ist, wäre das nicht kontraproduktiv?

Wie wäre es mit hamcrest den Übergang vom Algorithmus zum Code machen?

    
OscarRyz 26.09.2008 03:16
quelle
1

Ich denke, es gibt eine bessere Möglichkeit, Ihr Problem zu benennen.

Anstatt es als "ein System" zu definieren, definieren Sie, was in Bezug auf Benutzereingaben und -ausgaben erwartet wird.

"In einem Fenster sollte ein Benutzer ein Element aus einer Liste auswählen und ein Feld sollte ihm anzeigen, wie viel es kostet."

Dann können Sie ihm einige der Faktoren geben, die die Kosten bestimmen, einschließlich der Beispielartikel und was ihre Kosten sein sollten.

(das ist auch sehr viel eine TDD-ähnliche Idee)

    
kyoryu 26.09.2009 02:01
quelle
-3

Denken Sie daran, wenn Sie 5% Rabatt bekommen, dann weitere 5% Rabatt, erhalten Sie keine 10% Rabatt. Sie zahlen 95% von 95%, also 90,25% oder 9,75%. Also sollten Sie den Prozentsatz nicht hinzufügen.

    
stalepretzel 26.09.2008 02:59
quelle

Tags und Links