Was sollte jeder Programmierer über Programmierung wissen?

52

Bitte bleiben Sie bei technischen Fragen , vermeiden Sie Verhaltens-, Kultur-, Karriere- oder politische Probleme.

bigown
quelle
7
Siehe hierzu auch stackoverflow.com/questions/132798/…
pramodc84
Diese Art von Frage nervt mich wirklich. Es kann nur aus dem Kopf von jemandem kommen, der die Welt in Schwarz-Weiß sieht. Nicht jeder Programmierer hat den gleichen Job, und wenn es sich um den kleinsten gemeinsamen Nenner handelt, den Sie suchen, zeigen die folgenden Antworten, dass Sie am Ende nur eine Liste mit Tierärzten haben.
Captain Sensible

Antworten:

92
  1. Der Fehler befindet sich in Ihrem Code, nicht im Compiler oder in den Laufzeitbibliotheken.

  2. Wenn Sie einen Fehler sehen, der möglicherweise nicht auftreten kann, überprüfen Sie, ob Sie Ihr Programm ordnungsgemäß erstellt und bereitgestellt haben. (Insbesondere, wenn Sie eine komplizierte IDE oder ein Build-Framework verwenden, das versucht, die unübersichtlichen Details vor Ihnen zu verbergen ... oder wenn Ihr Build viele manuelle Schritte umfasst.)

  3. Gleichzeitige / Multithread-Programme sind schwer zu schreiben und schwerer zu testen. Es ist am besten, so viel wie möglich an parallele Bibliotheken und Frameworks zu delegieren.

  4. Das Schreiben der Dokumentation ist Teil Ihrer Arbeit als Programmierer. Überlassen Sie es nicht "jemand anderem".

BEARBEITEN

Ja, meine Nummer 1 ist übertrieben. Sogar die am besten entwickelten Anwendungsplattformen haben ihren Anteil an Fehlern, und einige der weniger gut entwickelten sind mit ihnen weit verbreitet. Aber auch so ist , sollten Sie Ihren Code immer den Verdacht zuerst , und starten Sie nur Compiler / Bibliothek Fehler Schuld , wenn Sie haben klare Hinweise darauf , dass der Code nicht fehlerhaft ist.

In den Tagen, in denen ich C / C ++ - Entwicklung durchgeführt habe, erinnere ich mich an Fälle, in denen vermeintliche Optimierungsfehler darauf zurückzuführen waren, dass ich / ein anderer Programmierer Dinge getan hatte, von denen die Sprachspezifikation sagt, dass sie undefinierte Ergebnisse haben. Dies gilt auch für vermeintlich sichere Sprachen wie Java. Schauen Sie sich beispielsweise das Java-Speichermodell (JLS, Kapitel 17) genau an.

Stephen C
quelle
17
Ich sage lieber "Der Fehler ist wahrscheinlich in Ihrem Code", da ich einige Male auf Fehler in Laufzeitbibliotheken gestoßen bin. Ich habe jedoch noch keinen Compiler-Fehler gefunden. +1 sowieso.
Chinmay Kanchi
29
Wenn Sie noch nie einen echten Fehler im Compiler gefunden haben, sind Sie mit Ihrer Codierung bei weitem nicht abenteuerlich genug. ;)
Mason Wheeler
8
@Chinmay, @ spudd86, @Mason - ja ... und ich habe auch meinen Anteil an Compiler- und Bibliotheksfehlern in meinen über 30 Jahren Programmierarbeit entdeckt. Aber meiner Erfahrung nach sind 99% der Fehler (zumindest teilweise) die Schuld meines Codes. Meine Antwort überbewertet dies absichtlich, um den Punkt zu verdeutlichen, dass Sie immer zuerst Ihren Code vermuten sollten .
Stephen C
5
Ich habe nicht die irrationale Angst, die die Leute mit Multithread-Programmierung haben. Ich vermute, dass die Leute, die diese Ansicht beibehalten, nicht viel Multithread-Code programmieren. Es ist einfach nicht so schwer. +1 für alles andere.
Steven Evers
4
Wenn Sie am Compiler arbeiten, dann ist der Fehler wahrscheinlich sowohl in Ihrem Code als auch im Compiler;)
Legooolas
84
  • Wie man den Code anderer Leute liest.
  • Code ist nicht vorhanden, wenn er im Versionskontrollsystem nicht aktiviert ist.
pramodc84
quelle
8
+10000 wenn ich das zur Versionskontrolle kommentieren könnte. Verlauf und Änderungsprotokollierung sind absolut unverzichtbar und der Grund, warum Sie von Anfang an alles in die Versionskontrolle einbeziehen sollten.
Legooolas
2
... und das Repository wurde mit mindestens einem anderen Speicherort synchronisiert. Wichtig bei DVCS, aber auch bei zentralem VCS.
In diesem Fall gibt es keinen Code, es sei denn, ein Arbeitselement ist vorhanden, das den Entwickler zum Schreiben berechtigt.
Jesse C. Slicer
2
Ich werde eins hinzufügen, um zu lernen, wie man den Code anderer Leute liest. Es ist schwieriger, dass die meisten von uns erkennen, aber ein wesentlicher Teil der erfolgreichen Programmierung.
Bogeymin
plus eins, um zu lernen, wie man den Code anderer Leute liest.
itsaboutcode
76

Gleitkommaberechnungen sind nicht präzise.

Chinmay Kanchi
quelle
Wenn jemand nicht weiß, wovon ich spreche, lies den Link von @ Adam. Es ist eine hervorragende Zusammenfassung der Fallstricke der Gleitkommaberechnung.
Chinmay Kanchi
1
Und wenn sie nicht wissen, können sie zu den Leuten gehören, die täglich nach Stackoverflow fragen.
Brian R. Bondy
1
@ Brian: Also wahr. Ich wünschte, es gäbe eine Möglichkeit, Fragen zu identifizieren, die durch Gleitkomma-Arithmetik erklärt werden. Sie könnten eine Stapel-App erstellen, die jeden Tag eine andere Gleitkomma-Frage anzeigt!
Adam Paynter
63

Hör nicht auf zu lernen.

Systempuntoout
quelle
1
Verwandte: Hören Sie nicht auf zu glauben.
Fishtoaster
3
Verwandte: Hören Sie nicht auf, an morgen zu denken.
ocodo
7
Verwandte: Stoppen Sie nicht die Musik.
Adamk
1
Related: Hör nicht auf, dich zu bewegen! Es ist dein Leben, beweg dich weiter, mach es richtig, du musst es richtig machen!
ocodo
44

Das Wichtigste, was Sie tun können, um die Qualität und Wartbarkeit Ihres Codes zu verbessern, ist REDUCE DUPLICATION.

Chris Holmes
quelle
4
TROCKEN, ja! Wie kann ich vergessen? ;-)
Maniero
Dies ist so wichtig ich damit beantwortet wieder .
Ich würde eher sagen: BEDINGUNGEN REDUZIEREN. Jedes while / if / for ist ein potentieller Fehler.
zvrba
1
Wissen Sie, das Lustige an DRY ist, dass es überall wiederholt wird. :) +1
Billy ONeal
39

Fähigkeiten zur Fehlerbehebung und zum Debuggen

Sie verbringen kaum Zeit mit diesem Thema in einem der von mir belegten Programmierkurse, und meiner Erfahrung nach ist dies einer der wichtigsten Faktoren für die Produktivität eines Programmierers. Ob es Ihnen gefällt oder nicht, Sie verbringen viel mehr Zeit in der Wartungsphase Ihrer App als in der neuen Entwicklungsphase.

Ich habe mit soooooo vielen Programmierern zusammengearbeitet, die nach dem Zufallsprinzip Änderungen vorgenommen haben, ohne die Strategie, das Problem überhaupt zu finden. Ich habe dieses Gespräch Dutzende Male geführt.

Anderer Programmierer: Ich denke, wir sollten versuchen, zu sehen, ob es das behebt.
Ich: Okay, vorausgesetzt, das behebt es. Was sagt Ihnen das darüber, wo die Ursache des Problems liegt?
Anderer Programmierer: Ich weiß es nicht, aber wir müssen etwas ausprobieren .

JohnFx
quelle
2
Ich wollte das posten. Der größte Teil der Arbeit eines Programmierers besteht darin, Fehler zu beheben, und viele Leute sind dazu in der Regel nicht in der Lage (insbesondere im Code anderer).
Dov
+1 Ich bin von Javascript / PHP auf C # umgestiegen und habe mich in das Durchgehen von Code verliebt. Ich wünschte, dynamisch getippte Sprachen könnten dies viel besser machen.
Evan Plaice
Ein anderes seltsames Verhalten ist der Programmierer, der darauf besteht, dass jeder Teil seines Programms korrekt ist, während das Ergebnis fehlerhaft ist. "-Sie müssen das Array nicht auf der Konsole ausdrucken, um zu überprüfen, ob es sortiert ist, da die Zeile darüber array.sort () lautet." "Nun ... du weißt, es funktioniert nicht. Irgendwo muss etwas nicht stimmen. Du kannst deinen Code jetzt nicht nur verteidigen!"
Gawi
2
Ich denke, der Punkt des Debuggens, um Ihre Annahmen in Ihrem Programm zu validieren. Manchmal muss man nach Hinweisen fischen gehen. Dies muss systematisch erfolgen. Es es durchaus möglich , etwas zu versuchen , das könnte man etwas Neues erzählen. Ich mache es oft.
Gawi
37
  1. Sei nicht schlau. klar sein.
  2. Vor erneuter Verwendung verwenden.
  3. Namen sind wichtig.
  4. Eine Funktion macht 1 Sache und macht es gut.
  5. Klein ist besser als groß.
KevBurnsJr
quelle
2
Können Sie "Verwendung vor Wiederverwendung" klären? Ich habe das noch nie gehört.
Tjaart
34

Die Grundlagen. Derzeit lernen Programmierer Technologien und keine Konzepte. Es ist falsch.

clrod
quelle
Ja und nein. Sie klingen wie jeder Professor, den ich jemals an der Universität hatte. Alle haben in ihrem ganzen Leben noch nie einen Leckerbissen an Software gemacht. Wissen ohne Fähigkeiten ist in unserem Beruf nutzlos.
Steven Evers
4
+1, also wahr. Ja, das ist etwas, was Elfenbeinturmtypen gerne sagen, aber es macht es nicht weniger wahr für den Rest von uns in den Schützengräben.
MAK
2
Grundlagen wie Rechtschreibung? Its wrongsollte it's wrongzum Beispiel sein.
Konerak
2
Nein, Grundlagen wie Tippfehler interessieren nicht, aber Programmierprobleme.
Clrod
5
Es ist einfach, die Schritte zu lernen, um etwas zu tun, und oft schwer herauszufinden, wann Sie es verwenden sollten und was noch wichtiger ist, wann Sie es verwenden könnten, aber nicht sollten. Lehrbücher zeigen besonders schlecht das Wie, aber nicht das Warum (und warum nicht).
HLGEM
27

Jeder Programmierer sollte wissen, dass er ständig Annahmen in den Code einfügt, z.

Und er sollte wissen, dass er sich darauf vorbereiten sollte, wenn diese Annahmen brechen.

LennyProgrammierer
quelle
6
speziell diejenigen mit assert()angeben - überall. assert()wird Ihnen helfen, Ihre Annahmen zu dokumentieren und Sie zu retten, wenn Sie sich irren.
Dustin
@Dustin +1 Es gibt keine Möglichkeit, sich alle Ihre Annahmen zu merken - dokumentieren Sie sie programmgesteuert, und Sie erfahren genau, wann sie sich als falsche Annahmen herausstellen.
Skilldrick
1
... sofern nicht mit NDEBUG kompiliert.
19

Jeder Programmierer sollte über das Testen Bescheid wissen.

Tom Duckering
quelle
6
Es funktioniert nur, wenn Sie es getestet haben.
JD Frias
17

Konzepte lernen . Sie können die Syntax googeln.

pramodc84
quelle
Theoretisch gut, außer dass Google schrecklich ist, wenn es darum geht, eine bestimmte Syntax zu finden: Nach Begriffen wie "Objektreferenz" oder "dies" zu suchen, wenn eine Unmenge von Ergebnissen vorliegen, und nach Redewendungen wie "$?" gib überhaupt keine Ergebnisse.
l0b0
16

Kritisches und logisches Denken. man kann nichts Gutes ohne es tun.

Mladen Prajdic
quelle
14

Unit Testing. Dies ist eine großartige Möglichkeit, Ihre Annahmen zur Verwendung des Codes zu kodifizieren.

btlog
quelle
13

Das ist schwieriger als du denkst.

Während es einfach ist, etwas zusammenzustellen, das bei normaler Verwendung funktioniert, ist die Bewältigung fehlerhafter Eingaben, aller Rand- und Eckfälle, möglicher Fehlermodi usw. zeitaufwändig und wird wahrscheinlich der schwierigste Teil der Arbeit sein.

Dann muss die Anwendung auch noch gut aussehen.

ChrisF
quelle
3
Ich denke, das ist die Quelle des alten Sprichworts '90% der Arbeit nimmt 90% der Zeit in Anspruch. Die letzten 10% dauern die restlichen 90% der Zeit. '
GSto
Ich denke, viele Leute neigen dazu, die Komplexität immer wieder zu unterschätzen. "Wie schwer kann X sein?" - berühmte letzte Worte: /
Roman Starkov
@GSto Ich möchte nicht in 180% der Fälle arbeiten, 100% sind in Ordnung für mich!
Adamk
13

Fachwissen. Die Spezifikation ist nie 100%; Die Kenntnis der tatsächlichen Domäne, für die Sie sich entwickeln, wird IMMER die Qualität des Produkts verbessern.

Steven Evers
quelle
11

Zeiger natürlich. :)

Laurynas Biveinis
quelle
3
Zeiger sind in einer Teilmenge von Sprachen nur für eine kleine Teilmenge von Aufgaben wirklich notwendig. Für die meisten Aufgaben können (und sollten) Sie programmieren, als ob das Konzept eines Zeigers nicht existiere.
Chinmay Kanchi
14
@ Chinay Kanchi Nein. Zeiger sollten von jedem verstanden werden.
Alternative
5
Das hängt wirklich davon ab, was Sie mit Zeiger meinen. Wenn Sie Zeiger im C-Stil meinen, die Sie manipulieren können (was ich angenommen habe), würde ich argumentieren, dass ein Java / C # / Python-Programmierer nichts über sie wissen muss. Wenn Sie einen Zeiger wie in Javas "Referenzen" meinen, dh einen Zeiger, mit dem man nicht herumspielen kann, dann ist ein gewisses Wissen darüber notwendig, schon um zu verhindern, dass Sie verrutschen.
Chinmay Kanchi
@mathepic Sie werden bis ins Mark erschüttert sein, wenn Sie erfahren, wie viele CS-Studenten jedes Jahr einen Abschluss haben, die das Erste, was mit Zeigern zu tun hat, nicht verstehen. Wenn ich mir nicht die Mühe gemacht hätte, jeden Sommer ein Praktikum zu machen, hätte ich nicht einmal etwas über Hinweise in C oder Referenzen in Java gelernt ...
Mike B
5
@Chinmay: Ein Python / Java / C # -Programmierer, der das Konzept der Zeiger nicht versteht, geht verloren. L = [[]] * 2; L[0].append(42) Verschiedene Sprachen verwenden unterschiedliche Namen, aber die Umleitung ist überall wichtig.
11

Code Complete 2 - Deckblatt zu Deckblatt

Kyle Ballard
quelle
Sie sollten dies wirklich wissen, bevor Sie Geld zum Programmieren akzeptieren. Wenn Sie etwas finden, das Sie nicht kennen, sollten Sie entweder eine berufliche Veränderung oder eine intensive Phase des selbstgesteuerten Lernens in Betracht ziehen, um alles zu vermitteln. Und dann entschuldigen Sie sich bei Ihren Mitarbeitern. Und es werden nur die Grundlagen der Programmierung behandelt.
Tim Williscroft
11

Daten sind wichtiger als Code.

Wenn Ihre Daten intelligent sind, kann der Code dumm sein.

Dummer Code ist leicht zu verstehen. Das gilt auch für intelligente Daten.

Fast jede algorithmische Trauer, die ich jemals hatte, war darauf zurückzuführen, dass Daten am falschen Ort waren oder ihre wahre Bedeutung missbraucht haben. Wenn Ihre Daten eine Bedeutung haben , geben Sie diese Bedeutung in das Typensystem ein .

Gonzales
quelle
2
Sie hatten mich den ganzen Weg, bis Sie "Typ System" sagten.
10

Welche Sprache und Umgebung ist für den Job am besten geeignet? Und es ist nicht immer dein Favorit.

Dan Diplo
quelle
10

Teilen und Erobern. In der Regel ist dies der beste Weg, um alle praktischen Probleme von der Planung bis zum Debuggen zu lösen.

Rick Minerich
quelle
8

Echte Fähigkeiten spiegeln sich in der Fähigkeit wider, ein einfaches Design gut auszuführen, und nicht in der Fähigkeit, ein kompliziertes Design überhaupt zum Laufen zu bringen.

Diese Fähigkeit beruht auf einer größeren Beherrschung der Grundlagen, nicht auf der Beherrschung des Arkanen. Ein hochkarätiger Programmierer zeichnet sich nicht durch seine Fähigkeit aus, das zu codieren, was andere nicht können (mit Funktionen höherer Ebene, erweiterter funktionaler Programmierung, What-Have-You), sondern durch seine Fähigkeit, die profane Codierung perfekt zu verfeinern. Auswahl der geeigneten Aufteilung der Funktionalität zwischen Klassen; in Robustheit bauen; mit defensiven Programmiertechniken; und mit Mustern und Namen, die zu einer größeren Selbstdokumentation führen, sind dies die Basis für eine hochkarätige Programmierung.

Es ist von entscheidender Bedeutung, guten Code zu schreiben, auf den Sie oder eine andere Person in einer Woche pro Monat oder Jahr zurückgreifen können, um zu verstehen, wie dieser Code verwendet, geändert, erweitert oder erweitert wird. Das spart Ihnen Zeit und Mühe. Es schmiert die Räder der Produktivität, indem es Straßensperren beseitigt, über die Sie zuvor gestolpert wären (möglicherweise unterbricht es Ihren Gedankengang oder nimmt Ihnen Stunden oder Tage der Anstrengung von anderen Arbeiten usw.). Es erleichtert die Konzentration auf die schwierigen Probleme und manchmal lassen die schweren Probleme nach.

Mit einem Wort: Eleganz. Jede Klasse, jede Methode, jede Bedingung, jeder Block, jeder Variablenname: Streben nach Eleganz.

Keil
quelle
8

Beschuldigen Sie niemals den Benutzer, was mit einer saubereren Benutzererfahrung oder einer besseren Dokumentation behoben werden könnte. Oft nehmen Programmierer automatisch an, dass der Benutzer ein Idiot ist, der nichts richtig machen kann, wenn das Problem eine schlechte Gesamterfahrung oder mangelnde Kommunikation ist. Programme sind dazu gedacht, benutzt zu werden, und um den Benutzer mit Verachtung zu behandeln, ist es an erster Stelle, den Programmierpunkt zu verfehlen.

user8
quelle
6

Jeder Programmierer sollte wissen, wie man den Debugger benutzt und wie man ihn gut benutzt .

Brian R. Bondy
quelle
5

Datenstrukturen

Maniero
quelle
5

Wie benutze ich Google?

bruno077
quelle
4

Kurzschlussauswertung, obwohl sie eines der ersten Dinge ist, die Sie über boolesche Operatoren lernen.

Federico Klez Culloca
quelle
4

Wie Sie genau abschätzen können, wie lange die Implementierung eines Features dauern wird. Noch wichtiger ist, wie Sie vermitteln können, dass Sie nicht blödsinnig sind, wenn Sie diese Schätzung einreichen.

Wheaties
quelle
2
oder lernen, wie man gut zu Gast ist und vermittelt, dass man nicht zu Gast ist ...;)
Billy Coover
4

Auf den Codierungsstil kommt es an:

  • Konsistente Einrückungsfragen,
  • Die konsequente Nutzung von Leerzeichen (z. B. um Operatoren) ist wichtig.
  • konsequente Platzierung der Angelegenheiten,
  • gut gewählte identifikatoren sind wichtig,
  • usw.

... und gutes Design ist wichtig.

Idealerweise lernt der Programmierer diese Dinge vor (oder während) seiner ersten Codeüberprüfung. Im schlimmsten Fall lernt der Programmierer sie, wenn der Chef ihn / sie auffordert, in Eile einige nicht triviale Änderungen an einem schrecklichen Code vorzunehmen.

Stephen C
quelle