Allgemeine Programmiertechniken zur Beschleunigung der Codierungszeit

20

Ich bereite mich auf einen Programmierwettbewerb vor, bei dem wir in C ++ programmieren müssen, und es geht darum, Arbeitscode in kurzer Zeit zu produzieren. Ein Beispiel wäre, ein Makro zu verwenden, um das Minimum von zwei Ints zu erhalten, oder Memsets zu verwenden, um Arrays zu initialisieren (aber mir wurde gesagt, dass Sie keines von beiden hier verwenden sollten ).

Dies führt zu der Frage, welche Art von Codierungstechniken für einen echten Job zur Verfügung stehen.

marktani
quelle
26
Ich würde vermuten, dass die Techniken, die Sie in einem Codierungswettbewerb verwenden, möglicherweise nichts mit den Techniken zu tun haben, die Sie bei einem echten Job verwenden würden.
Doug T.
1
Ich habe nicht in einem richtigen Job nach Techniken gefragt, ich habe in einem Codierungswettbewerb nach Techniken gefragt.
Marktani
1
@DougT. Ich bin damit einverstanden, dass Tricks für einen Codierungswettbewerb nicht zum Thema gehören, aber ich denke, Sie können auch erweitern, um über Produktivität in einer Arbeitsumgebung zu sprechen, und wie Sie die für Affencode aufgewendete Zeit am besten reduzieren
James
1
Warum sollten Sie Memsets nicht verwenden, um dynamische Arrays zu initialisieren?
James
3
Verwenden Sie kein c ++. Verwenden Sie die höchstmögliche Sprache.
Kevin

Antworten:

52

Der Weg, um Arbeitscode schnell zu produzieren , ist ... langsamer zu werden. Mach sehr kleine Schritte. Stellen Sie sicher, dass Sie wissen, wozu jeder Schritt dient. Stellen Sie sicher, dass Ihr Code nach jedem Schritt kompiliert und ausgeführt wird.

Verwenden Sie am besten Test-Driven Development. Schreiben Sie einen nicht bestandenen Test. Schreiben Sie gerade genug Code, um den Test zu bestehen. Refactor, um den Code sauber zu machen und sicherzustellen, dass er alle Tests noch besteht. Wiederholen.

Wenn Sie dies nicht tun, ist es sehr einfach, einen großen Stapel Code zu schreiben, der nicht funktioniert. Dann werden Sie sehr lange brauchen, um herauszufinden, warum es nicht funktioniert.

Dima
quelle
21
Sind Sie im Ernst? TDD für Programmierwettbewerb?
Codism
1
@Codism: Die Fragen wurden um Techniken erweitert, die für die normale Softwareentwicklung anwendbar sind.
Dima
2
TDD hilft definitiv dabei, meinen Code zu verbessern, aber es hat mir nie geholfen, den Code schneller zu schreiben. Eine interaktive Programmierumgebung (z. B. Groovy-Konsole, Lisp REPL usw.) hat meiner Erfahrung nach die meiste Zeit gespart.
Erturne
3
-1 für TDD. Das ist sinnvoll, wenn es sich um ein langfristiges Projekt handelt, nicht um einen kurzen Hackathon.
TheLQ
1
@TheLQ Nur weil Sie lieber Ihre ganze Zeit mit einem Debugger verbringen möchten, bedeutet dies nicht, dass TDD ein schlechter Vorschlag ist.
Bis zum
29

Überprüfen Sie die Standardbibliotheken intensiv, insbesondere die STL-Algorithmen. Dadurch sparen Sie viele Codezeilen und viel Zeit. Der Schlüssel zum Gewinn von Programmierwettbewerben liegt in der Programmierung auf einem möglichst hohen Niveau. In C ++ ohne externe Bibliotheken bedeutet dies STL-Aufrufe anstelle von for-Schleifen.

Kevin Cline
quelle
+1 - Dem stimme ich voll und ganz zu. In solchen Wettbewerben ist es enorm wichtig zu wissen, wie man schnell Code in STL schreibt.
Jordan Parmer
23

Ich nehme regelmäßig an ACM-Wettbewerben teil. Hoffentlich helfen Ihnen einige dieser Tipps:

  • Wie bereits erwähnt, sollten Sie sich mit der Sprache vertraut machen. In C ++, insbesondere der STL, gibt es sowohl allgemeine Funktionen, die Sie verwenden möchten (binary_search, min, max), als auch robuste Datenstrukturen, um Zeit zu sparen (Stack, um eine direkte Rekursion zu vermeiden) , Warteschlange für BFS, sogar priority_queue für Dijkstra (wenn Sie es so mögen).

  • Identifizieren Sie die Kategorie des Problems, wenn es sich um mathematische, dynamische Programmierung, Graphentheorie usw. handelt. Fragen Sie sich: Wie vertraut sind Sie mit dieser Art von Problem? Danach sollten Sie entscheiden, in welcher Reihenfolge Sie sie lösen möchten , was mit dem nächsten Punkt Hand in Hand geht ...

  • Sie möchten das Problem vollständig verstehen, bevor Sie tippen, das richtige Problem lösen . Bei meinen ersten Wettbewerben dachte ich, wenn ich nicht tippen würde, würde ich meine Zeit verschwenden. Ich fand später, dass dies ein Fehler war.

  • Denken Sie nicht , Kommentare Zeitverschwendung sind, zumindest in „clever“ Code, Sie wollen nicht gehen Debug - line-by-line zu sehen , was falsch gelaufen ist (die eine echte Zeitverschwendung), Wert Klarheit .

  • Viel Spaß .

lccarrasco
quelle
6
+1, damit Sie das Problem vollständig verstehen, bevor Sie tippen. Andernfalls verschwenden Sie die Zeit
Ihres
Gute Antwort. :)
Jared Farrish
13

Nun, es hört sich für mich so an, als ob Sie nur C und überhaupt nicht C ++ kennen. Diese Fragen können leicht von jemandem beantwortet werden, der über grundlegende Sprachkenntnisse verfügt.

Ein Beispiel wäre die Verwendung eines Makros, um mindestens zwei Zoll zu erhalten

Verwenden Sie einfach eine Funktion? std::minist bereits vorhanden.

oder Verwenden von Memsets zum Initialisieren von Arrays

std::array<T, N> initialisiert bereits den Inhalt.

Welche Art von Codierungstechniken gibt es für einen echten Job?

Der erste Schritt besteht darin, die von Ihnen verwendete Sprache zu kennen.

DeadMG
quelle
Ich versuche die Sprache, die ich benutze, kennenzulernen, deshalb habe ich diese Frage gestellt! Danke für den Input dazu .
Marktani
7
Oh. Ich muss Ihre Frage dann falsch verstanden haben. Ich würde ein Buch empfehlen . Wir stellen freundlicherweise nur die Bücher vor, die es wert sind, gelesen zu werden, anstatt der Bücher, die C-Müll lehren.
DeadMG
10

Kennen Sie nicht nur die Sprache, sondern auch Ihre Tools, insbesondere Ihren Editor. Ich programmiere seit über 15 Jahren professionell und habe gesehen, dass großartige Programmierer langsamer wurden, weil die einzigen Editor-Befehle, die sie verwenden, Cursortasten und Strg-x / c / v sind.

Unterstützt Ihr Editor einen einzigen Tastendruck zum Löschen einer Zeile? Eine Zeile erneut einrücken? Zwischen Funktionen / Methoden wechseln? Block auswählen / einfügen? Lesezeichen? Wort für Wort bewegen? Kann der Editor automatisch Klassen / Methoden / Funktionen generieren? Unterstützt es Vorlagen, die Sie im Voraus erstellen können? Schnelles Refactoring? Makroaufnahme?

Wenn Sie Ihren Editor kennen, können Sie die Entwicklungszeit erheblich verkürzen.

Garion911
quelle
1
Amen. Ich arbeite nur mit einem neuen Mann, der sehr schnell ist ... und vim benutzt. Es funktioniert für ihn, weil er sich die Zeit genommen hat, um zu lernen, wie man es benutzt.
gbjbaanb
Auch ... wenn Ihr Editor nicht alle hier aufgeführten Funktionen unterstützt - suchen Sie sich einen besseren Editor.
Abhi Beckert
interview in google docs ... schlimmste erfahrung aus diesem grund.
UmNyobe
6

Denk nach bevor du handelst. Es ist besser, vor dem Schreiben einer Klassenimplementierung nachzudenken und zu planen, als nach drei fehlgeschlagenen. Denken Sie auch, während Sie handeln - kleine Schritte vereinfachen den Entwicklungsprozess erheblich.

Schreiben Sie nur den Code, den Sie gerade brauchen. Beginnen Sie also nicht damit, Code mit folgender Mentalität zu schreiben: " Ich benötige diese Funktionen später, damit ich ihre Prototypen auch schreiben kann, während ich dabei bin. " Dinge ändern sich, Pläne ändern sich. Sie werden mit Code enden, der möglicherweise nicht einmal verwendbar ist. Es ist Zeitverschwendung.

Weißt du was du tust? Es gibt nichts Schlimmeres, als sich daran zu erinnern, wie grundlegende Funktionen und Merkmale der Sprache und / oder Bibliothek funktionieren. Machen Sie sich mit den von Ihnen verwendeten Tools vertraut.

zxcdw
quelle
+1 für YAGNI .
Setzen Sie Monica am
4

Es gab bereits viele Antworten, dennoch möchte ich meine Meinung hinzufügen.

Um Ihre Codierung zu beschleunigen, werden Sie ein Touch-Typist mit einer solchen Geschwindigkeit, dass Sie sich während der Eingabe sowohl auf die Logik als auch auf den Code konzentrieren können. Es gibt viele Programme, mit denen Sie das Tippen lernen können (z. B. Typing Master, Rapid Typing, KTouch, gTypist)

Ich habe viele erfahrene Programmierer gesehen, die immer noch Zwei-Finger-Typisten sind. Dies führt zu bösem Code ohne Dokumentation und wirklich kryptischem Code mit Makros und abgekürzten Typnamen.

Sarvex
quelle
Abgestimmt mit einem Zeigefinger :)
mlvljr
Gute Antwort. Ich füge hinzu, dass Leute, die auf die Tastatur anstatt auf den Bildschirm schauen, oft Müll eingeben, bevor sie es bemerken und zurückverfolgen müssen. Oder sie tippen in das falsche Fenster. Und das Traurige ist, dass sie nicht wissen, wie sehr sie das verlangsamt.
Dave Markle
2

Die Softwareentwicklung ist eine dieser klassischen 80-20 Aktivitäten - dh die ersten 80% der Arbeit nehmen 20% der Zeit ein und die letzten 20% der Arbeit nehmen 80% der Zeit ein.

Der Schlüssel zur Beschleunigung Ihrer Arbeit im Allgemeinen besteht daher darin, an der Verbesserung Ihrer Leistung zu arbeiten, die 20% des Aufwands ausmacht. Dies ist in der Regel die Debugging-Phase und die Arbeit, um alles zusammenzufügen und nutzbar zu machen.

Sie können dies verbessern, indem Sie im Frühstadium mehr Sorgfalt walten lassen. Planungs- und Entwurfsarbeiten zu Beginn eines Projekts mögen wie Zeitverschwendung erscheinen, wenn Sie versucht sind, in die Hardcore-Programmierung einzutauchen, aber sie können später viel Zeit sparen.

Die Leute werden über spezifische Methoden wie TDD oder BDD sprechen. Diese sind großartig, aber wenn Sie sie jetzt nicht machen, brauchen Sie ein wenig Zeit, um sich daran zu gewöhnen, also sind sie wahrscheinlich nicht etwas, mit dem Sie für einen Programmierwettbewerb anfangen möchten. Aber wenn Sie aufhören zu planen, was Sie tun, bevor Sie eintauchen, und dies tun, wird sich das auszahlen, egal was passiert. Und sie sind sowieso die ersten Schritte in Richtung TDD und BDD. Hier möchten Sie beginnen.

DEZA
quelle
-2

Verwenden Sie C ++ nicht, wenn es sich um einen tatsächlichen Programmierwettbewerb handelt. Verwenden Sie eine schnelle, interaktive RAD-Skriptsprache. Dies ist etwas, was VB6 absolut beherrscht. Bereiten Sie sich auf Bibliotheken vor, die Sie vorab geschrieben haben. String-Aufteilung, Array-Umkehrung, Suche, Sortierung, rudimentäre Grafik, Konsolensteuerung.

Wenn es für die Arbeit ist, machen Sie genau das Gegenteil. Erfahren Sie, was es gibt, verwenden Sie eine feste Sprache (C ++ ist in Ordnung), kommentieren Sie alles und so weiter. Die beiden Arten von Umgebungen könnten nicht weiter voneinander entfernt sein.

Bryan Boettcher
quelle
3
Ich war nicht einer der Downvoter, aber ich nehme an, dass sie Ihnen wahrscheinlich -1 gegeben haben, weil die Frage nach einer schnelleren Programmierung in C ++ lautete .
Gordon Gustafson
9
VB6? Ernst? Kommst du aus der vergangenheit
Konamiman
2
@Konamiman: heh, ja das bin ich. Ich konnte nicht sagen, ob er meinte "Ich bereite mich in C ++ auf einen Programmierwettbewerb vor" oder "Ich bereite mich auf einen C ++ - Programmierwettbewerb vor". Na ja, Chips liegen da, wo sie dürfen. Nichts ist besser als eine sehr schnelle RAD-Umgebung für Programmierwettbewerbe, in der buchstäblich jede Sekunde zählt.
Bryan Boettcher
Ich habe die Frage zur Klärung bearbeitet.
Marktani
Auf RAD: Delphi 6 ist dann möglicherweise die beste Wahl.
mlvljr