Was * sind * die Programmierkonzepte, die ich beherrschen sollte, um ein tiefes Verständnis für mein Handwerk (Programmierung) zu haben? [geschlossen]

13

In der Reihenfolge der Wichtigkeit, wenn dies möglich ist und nicht möglich ist, welche sind die wichtigsten Grundlagen für das Wissen, wie man programmiert. Algorithmen, Iteration, Rekursion usw.?

Beachten Sie, dass dort, wo ich usw. stelle, meine Frage liegt. Ich habe kürzlich einen Internet-Post gelesen, in dem 9 von 10 Programmierern nicht nach Luft schnappen können !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Ich möchte ein tiefes Wissen darüber haben, was ich beim Programmieren eigentlich zu erreichen versuche, und ein umfassendes Verständnis der grundlegenden Werkzeuge, die mir zur Verfügung stehen. Grundsätzlich möchte ich mit allen Farben des Windes malen können.

Kewigro
quelle
3
In Jeff Atwoods Post geht es nicht wirklich um tiefgreifende Programmierkenntnisse ... Es geht um die Tatsache, dass vielen Menschen grundlegende Einsichten in das Programmieren fehlen und dass das Fehlen dieser grundlegenden Einsichten sie daran hindert, signifikante Programmierfähigkeiten zu entwickeln.
Robert Harvey
2
Ich verstehe nicht, warum diese Frage geschlossen wurde. Diese Frage wurde 5 Mal mit einem Stern ausgezeichnet und hat viele hilfreiche Antworten. Auf diese Art von Informationen möchte ich stoßen - nur weil es keine einfache Antwort gibt, heißt das nicht, dass die Informationen nicht von gutem Wert sind. Vielleicht muss programmers.stackexchange.com die Kriterien für das Schließen von Fragen neu bewerten.
Rocklan
@LachlanB Ich stimmte für die Wiedereröffnung ... braucht 4 weitere Stimmen, um erfolgreich zu sein
Michael Brown
Ich halte dies für eine gute Frage, aber jede vernünftige Antwort ist für das Format dieser Website zu lang. Jeder gute Universitätslehrplan deckt diese Konzepte ab, und die Tatsache, dass ein solcher Lehrplan einige Jahre intensiven Lernens und Praktizierens erfordert, gefolgt von zusätzlichen Jahren der Arbeit an realen Projekten, sollte klar machen, warum die Antwort hier nicht passen kann.
Giorgio

Antworten:

18

Diese Liste ist ein Anfang ... Sie stellen eine große Frage!

  • Wie man klärt und aufschreibt, was der Kunde will ("Anforderungen"). Dies ist eine Kunst für sich. Wenn Sie dies tun können, wird Ihre Programmieraufgabe viel besser.
  • Wie schätzen und planen. Die Leute werden Sie nach einem Kostenvoranschlag fragen, seien Sie vorbereitet.
  • Wie man den Code anderer Leute konstruktiv überprüft.
  • Designmuster. Dies ist eine große. Aber benutzen Sie sie nicht zu eifrig.
  • Erfahren Sie den Unterschied zwischen einem Fehler, einem Problem und Funktionsanforderungen
  • Bleiben Sie mit Frameworks / Bibliotheken auf dem Laufenden. Sie müssen sie nicht verwenden, aber Sie müssen wissen, was sie tun und welche Vor- und Nachteile sie haben. Wenn etwas viel zu schwierig erscheint, gibt es wahrscheinlich (hoffentlich) eine viel einfachere Möglichkeit, Dinge zu tun.
  • Wie man komplizierte Algorithmen in einem Flussdiagramm dokumentiert oder einfach auf Englisch ausschreibt. Erwarten Sie nicht, dass jemand zwei Tage damit verbringt, Ihren Code zurückzuentwickeln.
  • So organisieren Sie Ihre Codestruktur, damit alle anderen sie verstehen können
  • So kommentieren Sie Ihren Code
  • So schreiben Sie Unit-Tests
  • Wissen, was unter der Haube los ist. ZB einen Webservice anrufen - was macht der eigentlich?
  • Wie man Logik in Klassen abstrahiert.
  • Refactor von Code
  • Lernen Sie das Wesentliche einiger Programmiersprachen. Sie wären überrascht, was Sie aus anderen Bereichen lernen können
  • Wie man anderen Programmierern sagt, was sie schreiben sollen.
  • Wie Sie dem Management erklären, was Sie tun und warum.
  • Wie Peter sagte, wie man debuggt. Ich bin mit allem einverstanden, was er sagt, echte Programmierer debuggen, nicht nur raten.
  • Wie man mit Maniacs arbeitet. Es gibt viele von ihnen da draußen.
  • Wie man Sachen fertig bekommt. Die ganze Theorie der Welt wird dir nicht helfen, wenn du nicht alles schaffen kannst.

Ich habe hier eine andere Frage in ähnlicher Weise (mit ähnlichem Inhalt) beantwortet:

Tipps, Richtlinien, wichtige Hinweise zum Rendern von professionellem Code?

Rocklan
quelle
1
+1: ERHALTEN SIE STUFF FERTIG! Vor ein paar Jahren habe ich eine Parole gepostet, die besagt, dass dies das bestimmende Merkmal eines Ingenieurs ist - sie erledigen Dinge. Manchmal ist es nicht schön, und manchmal müssen Sie zurückgehen und es wiederholen, aber am Ende des Tages erledigen
Peter Rowell
@PeterRowell: Vielleicht finden Sie dies interessant zu lesen: brandonsavage.net/when-to-write-bad-code
Marjan Venema
Leider stimmt die Frage nicht wirklich mit der Frage-und-Antwort-Philosophie und dem Format der Website überein, aber das schränkt den Wert Ihrer Antwort nicht ein. Wenn Sie es erweitern und ein paar Erklärungen für jeden Punkt hinzufügen möchten, ist es ein großartiger Blogeintrag für unser Community-Blog .
Yannis
@ MarjanVenema: Ja, ich stimme ihm vollkommen zu. In den 80ern hatte ich die Aufgabe, eine Spezifikation für einen neuen Editor zu schreiben, die genehmigt werden musste, bevor ich mit dem Codieren anfing. Ich starrte mehr als eine Woche lang auf diesen verdammt leeren Bildschirm und versuchte herauszufinden, wie ich etwas beschreiben konnte, das ich nicht verstand. Mein Vorgesetzter drückte sein Missfallen über meine mangelnden Fortschritte aus. Nach einem dreitägigen Wochenende hatte er einen Luftzug auf seinem Schreibtisch. Er fragte, was passiert sei, und ich sagte, dass ich über das Wochenende an den Herausgeber geschrieben und dann einfach eine Beschreibung meiner Arbeit geschrieben habe. Ich habe einen Teil des Codes neu geschrieben, aber es handelte sich hauptsächlich um Refactor / Cleanup.
Peter Rowell
1
@YannisRizos - Ich würde gerne einen Blog darüber schreiben. Möchten Sie mir eine E-Mail mit Richtlinien senden oder sollte ich einfach etwas aufschreiben?
Rocklan
21

Unter der Überschrift " etc. " steht etwas, das leicht 50% oder mehr Ihrer Zeit in Anspruch nehmen kann.

Erfahren Sie, wie Sie Fehler beheben.

Dies bedeutet das Erlernen der wissenschaftlichen Methode . Ich meine es wirklich zu lernen. Und dann mit brutaler Selbstaufrichtigkeit anwenden . Erfahren Sie, wie Sie genau sagen, was Sie wissen, ist wahr, was Sie wissen, ist nicht wahr, und die Dinge, die Sie nicht wissen. Jedes Mal , wenn Sie schlampig ein Element in der falschen Kategorie zuweisen, haben Sie gerade Ihr Leben gemacht viel härter.

Lerne "Ich denke" statt "Ich weiß" zu sagen. Sie können nur dann "Ich weiß" sagen, wenn Sie "denken", dass etwas wahr (oder falsch) ist, und dann beweisen Sie es!

Viele Bugs sind trivial, aber sie können schwer zu erkennen sein, weil Sie wissen, wie der Code lauten soll ... es sei denn, es ist nicht so. Finde einen Freund, dem du es erklären kannst. Bitten Sie sie, ein "erfahrener Idiot" zu sein: Jemand, der Ihren Code nicht kennt, aber von dem Sie wissen, dass Sie BS nicht vorbeischießen können. Seien Sie nicht überrascht, wenn Sie mitten in einer Beschreibung plötzlich innehalten und sagen: "Und so können Sie ... sehen ... sehen, dass ... sh * t. Danke."

Nicht-triviale Bugs erfordern ein Arsenal an Techniken. Wolf Fence in Alaska ist ein Klassiker, der die meisten Fehler, die nicht mit Timing zu tun haben, schnell aufdecken kann. Irgendwo in Alaska gibt es einen Wolf. baue einen Zaun, der den Staat halbiert. Auf welcher Seite ist der Wolf? Schneiden Sie diese Seite in zwei Hälften. Aufschäumen, ausspülen, wiederholen. Durch 20-maliges Ausführen an ausgewählten Stellen im Code wird der Bereich, in dem der Fehler (Wolf) auftreten kann, auf 1/1048576 verringert. Töte diesen Wolf.

Tipp: Suchen Sie nach Handwellen - physisch , mental oder auf andere Weise. Sobald Sie (oder Ihr Kollege) einen Teil des Codes zucken / ablenken / auf ein Mindestmaß reduzieren, werden Sie total tollwütig . Weil der Bereich, in dem Sie gerade den Fehler kennen, nicht sein kann, obwohl Sie Stunden / Tage damit verbracht haben, nach dem D * MN-Ding zu suchen und es immer noch nicht finden können ... das ist der Ort mit der höchsten Wahrscheinlichkeit für den Fehler. Niemand bekommt ein "Tschüss" , niemand (einschließlich der Maschine, des Betriebssystems, des Compilers oder Ihnen ) bekommt irgendeine Art von "gebührendem Respekt". Es gibt einen Bug. Zeitraum. Ende des Satzes. Jetzt geh und töte das d * mn Ding.

Ich kenne keine Schule, die das Debuggen als eigenes Fach unterrichtet. IMNSHO, dies ist vielleicht der eklatanteste Beweis dafür, dass sie (Universitäten / Professoren) Sie nicht lehren, Programmierer zu sein, sondern Sie lehren, ... wie sie zu sein? Hart? Vielleicht. Wahr? Entscheide dich. Jetzt beweise es.

Peter Rowell
quelle
Möglicherweise interessieren Sie sich für Saff Squeeze , eine von Kent Beck beschriebene Technik, die Tests und Refactoring zum Debuggen verwendet: Hit 'em High, Hit' em Low : Regressionstests und Saff Squeeze von Kent Beck, Three Rivers Institute (Zusammenfassung: To Sie können einen Defekt effektiv isolieren, mit einem Test auf Systemebene beginnen und schrittweise inline arbeiten und beschneiden, bis Sie den kleinstmöglichen Test erhalten, der den Defekt demonstriert.
Jörg W Mittag
1
Tolle Antwort - jeder kann Code schreiben, echte Programmierer debuggen.
Rocklan
@ JörgWMittag: Ich bin ein großer Fan von automatisierten Regressionstests. Ich habe es zum ersten Mal Mitte der 80er Jahre für ein Suchmaschinenprojekt verwendet, und ich war schockiert (schockiert!) Über das Zeug, das nach einer scheinbar "geringfügigen" Änderung an einem unschuldig aussehenden Teil des Codes herausfallen würde. (Hinweis: Dies war mehr als 200.000 SLOC von C, und Speicherverwaltungsprobleme waren der Fluch unserer Existenz.)
Peter Rowell
3

Ich fürchte, dies ist eine ziemlich große Frage, die jeder schlüssig oder verbindlich beantworten kann, vor allem, wenn Sie eine priorisierte Liste wünschen. Es gibt viele Programmierer, die an sehr unterschiedlichen Dingen arbeiten. Sicher, die Grundlagen bleiben gleich, aber was Sie brauchen, um in Ihrem Gedächtnis aktiv zu bleiben, kann sehr unterschiedlich sein, und in der Tat gibt es viele Aufgaben, bei denen Sie schön bleiben können High-Level ohne tiefer zu gehen.

Es scheint jedoch, dass Sie sich ernsthaft Gedanken darüber machen, wie Sie ein besserer Entwickler und nicht nur ein Alleskönner werden können. Ich finde das bewundernswert, und ich kann einige der Dinge mitteilen, die mir geholfen haben, das Programmieren zu lernen.

Fast die gesamte Programmierung läuft auf Algorithmen und Datenstrukturen hinaus. Sie sind wiederum Beispiele für die größere Frage: Wie modellieren wir Dinge und Prozesse aus der realen Welt in eine Darstellung, die ein Computer verstehen kann? Wenn Sie gerade erst anfangen, kann es hilfreich sein, eine höhere Programmiersprache (wie Java, Python usw.) zu verwenden, um sich mit der Implementierung von Datenstrukturen und Algorithmen vertraut zu machen.

Ab einem bestimmten Punkt, wenn Sie mit Datenstrukturen und Algorithmen herumgespielt haben, bekommen Sie vielleicht die nagende Frage: "Aber wie können wir dem Computer sagen, was zu tun ist, bis der Computer es tatsächlich tut?" Dann können Sie untersuchen, wie ein Computer tatsächlich berechnet - wie Arbeitsspeicher und CPU zusammenarbeiten, um Anweisungen auszuführen, wie Betriebssysteme die Hardware abstrahieren, damit Sie ein Programm schreiben können, das beispielsweise eine Datei öffnet, ohne auf einer bestimmten niedrigen Ebene zu codieren Festplattenschnittstelle.

Dies ist wahrscheinlich ein guter Ausgangspunkt - wie Algorithmen und Datenstrukturen Probleme aus der realen Welt modellieren und wie ein Computer tatsächlich Berechnungen durchführt. Letztere zu kennen, ist sehr nützlich, um untergeordnete Sprachen wie C zu beherrschen, die weitaus weniger Rauch und Spiegel als OO und Skriptsprachen verwenden :)

RuslanD
quelle
2

YAGNI : "Implementiere Dinge immer, wenn du sie wirklich brauchst, niemals, wenn du nur voraussiehst, dass du sie brauchst."

Nach meiner Erfahrung ist es üblich, dass "Programmierer" viele Fälle in der Zukunft vorhersehen und versuchen, den Code zu "verbessern", indem sie Codes hinzufügen, um sie vorwegzunehmen! In den meisten Fällen wird der Code, den sie hinzugefügt haben, nur aufgebläht und der Code wird komplexer.

Louis Rhys
quelle
1

Das Wichtigste, was Sie als Programmierer wissen müssen, ist, dass das Schreiben von Code ein Kinderspiel ist, und eine fachmännische Einstellung gegenüber dem, wofür Sie bezahlt werden, bringt Sie weiter als esoterisches Lernen.

Lerne, in die Zone zu kommen. Damit meine ich den mentalen Zustand, in dem Sie sich nur auf Ihre Aufgabe konzentrieren und anfangen können, eine Menge Dinge in Ihrem Kopf zu behalten und wie sie auf einmal zusammenwirken. Sobald Sie die Gewohnheit haben, nach Belieben in die Zone zu gelangen, müssen Sie sich um den Rest kümmern. Bis Sie Code wie eine Art Code auspressen können, ist der Rest praktisch nutzlos.

BEARBEITEN:

Wenn Sie das nicht glauben und mich herabgestimmt haben, glaube ich, dass Sie nicht wissen, ob Sie die Entschlossenheit haben, dies 20 Jahre lang zu tun. Ich weiß, dass ich das tue, weil ich das akzeptiere. ;)

Nathan C. Tresch
quelle
0

Eine kürzlich gestellte Frage, die in irgendeiner Weise mit dieser Frage zusammenhängt, und Answer hatten einen Link zu This blog , in dem dasselbe Problem aus einem anderen Blickwinkel erörtert wird.

Das wahrscheinlich wichtigste Konzept für jeden Entwickler ist "Demut". Wenn Sie einmal akzeptieren, dass Sie nicht alles wissen, können Sie nach Lösungen suchen. Die meisten Leute, die Blogs über Programmierung schreiben, befinden sich im oberen Perzentil, und das Problem ist, dass viele ihre narzisstischen Tendenzen noch nicht unter Kontrolle haben. Deshalb bloggen sie ignorieren dort schimpft

Der verlinkte Blog ist eigentlich nichts weiter als ein Witzbold - In jeder Branche wird beklagt, dass Absolventen in jüngster Zeit unbrauchbar sind, dass es Jahre dauert, bis sie nützlich und produktiv sind. Vielleicht ist das Problem, dass diese selbsternannten Guru tatsächlich zu viel erwarten und vergessen haben, dass sie FizzBuzz nicht hätten lösen können. Nicht jeder kann in den Top-10-Perzentilen sein, die Hälfte der Programmierer ist per definitionem unterdurchschnittlich ......

mattnz
quelle
Ich bin damit einverstanden , dass die Menschen viel schimpfen, aber ich denke , der Punkt der Pfosten Sie oben verbunden ist , dass die Leute , die nicht wissen , wie FizzBuzz zu lösen für die Programmierung Arbeitsplätze Anwendung , die von gerade sein ein Anfänger ist anders und benötigt zu wickeln Dein Kopf dreht sich um Programmiersprachen. Ich stimme Ihnen jedoch in Bezug auf Demut zu, und viele Menschen scheinen nicht zu wissen, was das ist.
RuslanD