Wie oft führen Sie Ihren Code während der Programmierung aus und testen ihn? [geschlossen]

16

Besonders wenn ich neuen Code in C von Grund auf neu schreibe, schreibe ich Code stundenlang, sogar tagelang, ohne den Compiler für irgendetwas anderes als eine gelegentliche Syntaxprüfung auszuführen.

Ich neige dazu, größere Codestücke sorgfältig zu schreiben und erst dann gründlich zu testen, wenn ich überzeugt bin, dass der Code das tut, was er tun soll, indem ich den Fluss in meinem Kopf analysiere. Verstehen Sie mich nicht falsch - ich würde nicht 1000 Zeilen schreiben, ohne zu testen (das wäre ein Glücksspiel), aber ich würde eine ganze Unterroutine schreiben und sie testen (und nötigenfalls korrigieren), wenn ich denke, dass ich fertig bin.

Auf der anderen Seite habe ich vor allem Neulinge gesehen, die ihren Code nach jeder Eingabe in den Editor ausführen und testen und der Meinung sind, dass Debugger ein Ersatz für Sorgfalt und Vernunft sein können. Ich halte dies für eine große Ablenkung, sobald Sie die Sprachsyntax gelernt haben.

Was ist Ihrer Meinung nach die richtige Balance zwischen den beiden Ansätzen? Der erste erfordert natürlich mehr Erfahrung, aber wirkt er sich positiv oder negativ auf die Produktivität aus? Hilft Ihnen der zweite, Fehler auf einer feineren Ebene zu erkennen?

Blagovest Buyukliev
quelle
3
Es dauert Stunden oder Tage, um ein ganzes Unterprogramm zu schreiben?
1
@Thorbjorn Das Unterprogramm ist ungefähr 999 Zeilen lang und verschleiert: #define h for(int c=y-3; y; c++/(randomTypeIDefinedEarlier)s*(float)4*(lol)sin((helloWorld)mysub(2,1,++a,*(r+z))); goto xkcd)Und das ist nur eine Zeile.
Mateen Ulhaq
1
Compiler können manchmal lange brauchen, um ein Programm zu kompilieren, weshalb es nicht ratsam ist, immer zu kompilieren. nach jeder funktion ist gute übung. Ich kompiliere neu, nachdem ich neue Funktionen oder einen schwierigen Code hinzugefügt habe. Ich benutze es nur als Syntax-Checker. Es gibt keinen Ersatz dafür, Ihren Code sorgfältig zu überprüfen und versteckte Fehler und zufälliges Verhalten zu vermeiden.
Ross

Antworten:

6

Es hängt WIRKLICH von dem Aspekt des Projekts ab, an dem Sie arbeiten.

  • Wenn ich irgendetwas mit OpenGL mache (das wie eine Zustandsmaschine funktioniert), kompiliere und starte ich ständig, um sicherzustellen, dass ich nichts versehentlich vermasselt habe. Wenn Sie einen Wert festlegen, ohne daran zu denken, ihn am Ende einer Funktion zurückzusetzen, kann die Anwendung auf einfache Weise nur einen schwarzen Bildschirm rendern.

  • Für größere "under the hood" -Entwicklungen versuche ich, so viele Tests wie möglich vorher zu machen. Da die Tests mir leichter sagen können, was kaputt gegangen ist, kann ich eine Weile warten, ohne auf die normalerweise lange Kompilierung warten zu müssen.

  • Für das UX-Design verwende ich eine Art visuellen Designer, der immer so aussieht, wie er ausgeführt wird (oder in der Nähe davon). Es kompiliert im Wesentlichen immer den Designcode.

sharoz
quelle
63

Persönlich muss ich in kleinen Blöcken arbeiten, weil ich nicht klug genug bin, stundenlange Codierung in meinem biologischen L1-Cache zu speichern. Aufgrund meiner begrenzten Möglichkeiten schreibe ich kleine, zusammenhängende Methoden und Designobjekte, um eine sehr lockere Kopplung zu erzielen. Leistungsfähigere Tools und Sprachen vereinfachen das längere Programmieren, ohne etwas zu erstellen, aber für mich gibt es immer noch Grenzen.

Ich bevorzuge es, ein kleines Stück zu schreiben und zu überprüfen, ob es wie erwartet funktioniert. Dann kann ich theoretisch die Details dieses Stücks vergessen und es so weit wie möglich als Black Box behandeln.

dss539
quelle
12
Positiv bewertet für "... nicht schlau genug ..." Ich habe mich schon seit einiger Zeit so gefühlt.
leed25d
4
Was ist mit deinem L2-Cache?
Mateen Ulhaq
Ich wollte dem zustimmen, aber die Punktzahl liegt bei 42 ...
Wayne Werner
Die neueren Modelle haben viel größere L1-Caches. Wann hast du deine gekauft? Möglicherweise möchten Sie ein Hardware-Update durchführen.
Peter Ajtai
Nun, es ist nicht das Alter des Modells, sondern die Tatsache, dass es die "Budget" -Linie war. :(
dss539
17

Ich schreibe gerne meinen Test, bevor ich meinen Implementierungscode schreibe. Ich mag das aus drei Gründen:

  1. Wenn ich meinen Testcode vorab schreibe, kann ich überlegen, wie mein Code verwendet werden soll. Es hilft mir, mir Randfälle vorzustellen, an die ich bei der ursprünglichen Entwicklung meines Programms nicht gedacht habe.
  2. Ich weiß, dass ich mit dem Schreiben des Implementierungscodes fertig bin, wenn alle meine Testfälle bestanden sind.
  3. Wenn Sie sich angewöhnen, Tests vor dem Schreiben von Code zu schreiben, können Sie auch nachweisen, dass Ihr Code keine neuen Fehler enthält (vorausgesetzt, Sie haben gute Testfälle geschrieben).
David Weiser
quelle
2
"Ich weiß, dass ich mit dem Schreiben des Implementierungscodes fertig bin, wenn alle meine Testfälle bestanden sind." - Wie stellen Sie fest, ob Sie alle erforderlichen Testfälle geschrieben haben?
dss539
1
Das ist eine gute Frage. Meiner Meinung nach können Sie nie ganz sicher sein, dass Ihr Code korrekt funktioniert, es sei denn, Sie haben einen formellen Beweis dafür. Ich betrachte Unit-Tests als Beweis dafür, dass Ihr Code eher das tut, wofür Sie es meinen. Je mehr Funktionen Sie hinzufügen, desto größer wird wahrscheinlich auch die Anzahl der Testfälle, die Sie schreiben. Bitten Sie im Zweifelsfall eine andere Person, sich Ihre Testfälle anzusehen und sie nach Fällen zu fragen, an die Sie nicht gedacht haben.
David Weiser
4
@David - wie beweisen Sie formal, dass Ihr formaler Beweis keine Fehler aufweist? Wie können Sie formal nachweisen, dass die von Ihnen wahrgenommenen Anforderungen mit den Anforderungen in der Realität übereinstimmen? Sie können formal nachweisen, dass eine Beschreibung mit der anderen übereinstimmt, aber es ist durchaus möglich, dass beide Beschreibungen auf dieselbe Weise falsch sind - insbesondere, wenn beide Beschreibungen von derselben Person geschrieben wurden. Das Schreiben von Dingen in mathematischer Notation macht Menschen nicht unfehlbar. Unzählige mathematische "Beweise" haben sich (nach langen, sehr detaillierten Überprüfungsperioden) als falsch erwiesen.
Steve314
1
@ Steve314: AFAIK, wenn Sie formal die Korrektheit eines Algorithmus beweisen, geben Sie genau und präzise an, was die erwartete Korrektheit ist. Sie bringen einen guten Punkt aber, dass die Definition von „Korrektheit“ möglicherweise nicht wirklich korrekt sein.
David Weiser
1
@ dss539, stammt aus den Anwendungsfällen, die das Programm implementieren soll.
4

Ich schreibe Code stundenlang, sogar tagelang, ohne den Compiler für etwas anderes als eine gelegentliche Syntaxprüfung auszuführen.

Stunden bis Tage - das ist ein klares Zeichen dafür, dass Sie die Möglichkeit verpassen, Ihren Code in kleinere Teile zu zerlegen, die einzeln überprüft und getestet werden können. Daran sollten Sie unbedingt arbeiten.

Ich neige dazu, größere Codestücke sorgfältig zu schreiben und erst dann gründlich zu testen, wenn ich überzeugt bin, dass der Code das tut, was er tun soll, indem ich den Fluss in meinem Kopf analysiere.

Anstatt größere - und damit komplizierte - Codestücke zu schreiben, die Stunden benötigen, um in Ihrem Kopf analysiert zu werden, sollten Sie versuchen, kleinere, nicht so große Bausteine ​​zu erstellen. Dies baut genannt Abstraktionen - und das ist der Kern der guten Programmierung, definitiv kein Zeichen für einen Neuling beeing.

Exzellentes Programmieren ist wie exzellentes Billardspielen - ein guter Spieler spielt keine harten Schläge. Stattdessen spielt er so, dass die Bälle nach jedem Schlag an einer Stelle anhalten, an der der nächste Schlag wieder leicht fällt. Und ein Programmierer ist nicht gut, weil er komplizierten Code schreiben kann - er ist gut, weil er komplizierten Code vermeiden kann.

Doc Brown
quelle
3

Ich kompiliere und teste, ob eine der folgenden Bedingungen erfüllt ist:

  • Letzte Kompilierung war vor 15 Minuten
  • Letzte Kompilierung war vor 25 Zeilen
  • Neue Funktion / Unterprogramm wurde implementiert
  • Große Änderung
  • Neues Feature (oder ein als Feature getarnter Bug)
  • Bugfix (ein "Feature" wurde entfernt)
  • Ich langweile mich
Mateen Ulhaq
quelle
1

Wie oft ich Code ausführe und teste, hängt davon ab, in welcher Sprache ich gerade arbeite. Wenn ich eine gespeicherte Prozedur codiere, warte ich normalerweise, bis alles da ist.

Auf der anderen Seite, wenn ich in Lisp programmiere, werde ich jede Funktion ausprobieren, nachdem ich sie eingegeben habe.

Wenn ich in Haskell codiere, werde ich in der Regel nach jeder Funktion eine Kompilierung durchführen, um alle Typfehler abzufangen, und den Code ausführen, nachdem alles erledigt ist.

Larry Coleman
quelle
1

Ich schreibe gerade genug Code, um den Test auf Grün zu bringen. Das heißt, ich führe alle paar Minuten einen Test durch. Das ist mein C ++ - Stil. In Ruby verwende ich jedoch den Autotest. Jedes Mal, wenn ich auf Speichern drücke, erhalte ich ein Test-Feedback über ein nettes Popup. Ich höre nicht einmal auf, Code zu schreiben, es passiert einfach im Hintergrund.

Nazgob
quelle
1

Dreimal in der Stunde, ob es nötig ist oder nicht.

Wir führen die Erstprogrammierung durch und übertragen nur den Arbeitscode in das VCS. Der Smoulderbot checkt alle 20 Minuten das Repo aus und führt die Testsuite aus. Alle Fehler werden sofort an das gesamte Programmierteam zur sofortigen Behebung gesendet.

Andy Lester
quelle
1

Für mich geht es nicht darum, wie viel ich schreibe. Ich kann Tausende von Zeilen einfachen Codes schreiben, ohne ihn testen zu müssen. Wenn ich jedoch schwierigeren Code schreibe, neige ich dazu, jede Funktion einzeln zu testen, nachdem ich einen zusammenhängenden Satz von ihnen geschrieben habe.

Manchmal ist es jedoch ein großer Motivationsschub, den Code laufen zu sehen, wenn Sie eine Weile nichts ausgeführt haben.

dan_waterworth
quelle
0

Für mich: -
Kurze Zeitspanne (nicht viel Zeit zum Nachdenken) - Code schreiben, kompilieren, testen. Debuggen
Ausreichende Zeit - während (erledigt) {kleinen Code schreiben, kompilieren}, testen, debuggen

Manoj R
quelle
Ich finde, dass Ersteres länger dauert als Letzteres: Sie müssen mehr debuggen, wenn Sie eine sehr kleine Test- / Schreibschleife haben.
Frank Shearar
Könnte sein. Aber eine kurze Zeitleiste bedeutet, dass Arsch in Flammen steht und der Manager einen Bericht benötigt, der besagt, dass eine Aufgabe zu 100% erledigt ist.
Manoj R
0

Ich teste für jedes Codierungskonzept. Manchmal ist dies eine Funktion oder Klasse und manchmal nichts anderes als eine if-Anweisung. Sobald das Konzept funktioniert, fahren Sie mit dem nächsten fort.

Dave
quelle
0

Ich versuche, Tests vor dem Code zu schreiben. Ich führe meine Tests vor einem Commit mindestens zweimal durch. Anschließend wird es erneut mit dem Continuous Integration-Server ausgeführt.

dietbuddha
quelle