Ich höre oft, dass ein echter Programmierer innerhalb einer Woche leicht jede Sprache lernen kann. Sprachen sind nur Werkzeuge, um Dinge zu erledigen. Programmierung ist die ultimative Fähigkeit, die gelernt und gemeistert werden muss.
Wie kann ich sicherstellen, dass ich das Programmieren lerne , anstatt nur die Details einer Sprache zu lernen? Und wie kann ich Programmierkenntnisse entwickeln, die auf alle Sprachen anstatt nur auf eine angewendet werden können?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. 1 Woche später:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Antworten:
Mach dir keine Sorgen, wenn du ein lächerliches Konzept von "Geschicklichkeit" triffst, das so häufig in folgenden Aussagen vorkommt:
Diese Aussagen beruhen alle auf einer fehlerhaften Prämisse und verraten mangelnde Erfahrung in einem breiteren Spektrum von Programmiersprachen. Sie sind sehr verbreitete Aussagen und werden von einer großen Anzahl von Programmierern nachdrücklich geglaubt. Ich werde das nicht bestreiten, aber ich werde ihre Richtigkeit bestreiten.
Dies ist einfach bewiesen: Verbringen Sie eine Woche (oder wirklich mehr als ein paar Tage), um die Grundlagen von Haskell , Prolog oder Agda zu erlernen . Sie werden bald nach dem Start das alte Lied der Sesamstraße in Ihrem Kopf spielen hören "Eines dieser Dinge ist nicht wie die anderen ...".
Wie sich herausstellt, gibt es eine ganze Reihe von Programmiersprachen, -techniken und -ansätzen, die für 95% von uns so fremd sind oder waren. Viele sind sich überhaupt nicht bewusst, dass eines dieser anderen Konzepte überhaupt existiert, was in Ordnung ist und diese Konzepte nicht notwendig sind, um ein angestellter und sogar effektiver Programmierer zu sein.
Aber die Tatsache bleibt: Diese Techniken und Ansätze existieren, sie eignen sich für viele verschiedene Dinge und können sehr nützlich sein, aber sie sind nicht nur so, wie Sie es gewohnt sind, und die Leute können sie nicht einfach mit einem Nachmittag des Geigenspiels aufgreifen.
Außerdem würde ich sagen, dass die Mehrheit der Fälle, in denen Leute behaupten, so komplexe Dinge wie Programmiersprachen zu haben oder zu lernen, so schnell wie eine Woche unter dem Mahnkrüger-Effekt (Wikipedia) leiden (Hervorhebung von mir):
Ich verweise die Leute auf diesen erfahreneren Überblick über das Konzept des Programmierlernens von Peter Norvig: Programmieren lernen in zehn Jahren .
Sicher gibt es eine Reihe von übergreifenden Prinzipien, die das Erlernen aller Sprachen vereinfachen.
Vielleicht, aber ich würde behaupten, dass diese Prinzipien so umfangreich sind, dass es fast immer Sprachen außerhalb Ihrer Reichweite von einer Woche geben wird. Wenn Sie der Liste, mit der Sie vertraut und vertraut sind, neue Begriffe hinzufügen, wird diese Liste von Sprachen, die sich nicht in Ihrer unmittelbaren Reichweite befinden, möglicherweise kleiner, aber ich kann kaum glauben, dass sie jemals aufhören wird. Die Liste der konzeptionellen Computeransätze für Dinge ist so umfangreich, dass sie verwirrend ist, von verketteten Sprachen über vektorbasierte Sprachen bis hin zu Sprachen, die sich auf KI oder Metaprogrammierung spezialisiert haben ( oder Sprachen, die ausschließlich zur Unterstützung regulärer Ausdrücke existieren ).
Nach zehn Jahren können Sie generell programmieren. Dies bedeutet, dass Sie in einigen Sprachen oder Sprachstilen etwas anständigen Code schreiben können. Nach 10 Jahren sind Sie bereit, diese unzähligen übergreifenden Konzepte für den Rest Ihres Lebens in Angriff zu nehmen, und wenn Sie nicht Edsger W. Dijkstra , Donald Knuth oder John D. Carmack sind , werden Sie nicht alle erreichen von ihnen.
quelle
Der Schlüssel zu dieser Frage liegt darin, die Sprache zu überschreiten und nicht in der Sprache zu denken, in der Sie programmieren.
Was?
Erfahrene polyglotte Programmierer denken im abstrakten Syntaxbaum (AST) an ihr eigenes mentales Sprachmodell. Man denkt nicht "Ich brauche eine for-Schleife hier", sondern "Ich muss eine Schleife über etwas machen" und übersetzt diese in die für oder während, oder Iterator oder Rekursion für diese Sprache.
Dies ähnelt dem, was man beim Erlernen einer gesprochenen Sprache sieht. Menschen, die viele Sprachen fließend sprechen, denken über die Bedeutung nach und sie kommt in einer bestimmten Sprache zum Ausdruck.
Ein Hinweis auf diesen AST ist in den beiden Eyetracking-Videos Codeverständnis mit Eye-Tracking und Eye-Tracking-Code-Experiment (Anfänger) zu sehen, in denen die Bewegungen des Auges eines Anfängers und eines erfahrenen Programmierers beobachtet werden. Man kann sehen, wie der erfahrene Programmierer den Code in sein mentales Modell "kompiliert" und in seinem Kopf "ausführt", während der Anfänger den Code Schlüsselwort für Schlüsselwort durchlaufen muss.
Der Schlüssel für die Frage, wie Programmierkenntnisse für alle Sprachen entwickelt werden können, liegt also darin, mehrere Sprachen zu lernen, damit man sich vom mentalen Modell einer Sprache distanzieren und die Fähigkeit entwickeln kann, die AST für ein Problem in der Sprache selbst zu generieren eine Kopfsprache, die dann in eine bestimmte Sprache übersetzt wird.
Sobald man diese Fähigkeit hat, das AST im Kopf zu benutzen, wird das Erlernen einer anderen Sprache innerhalb einer ähnlichen Denkschule ( Befunge ist ein kleiner Sprung von Java, aber nicht so viel von Forth ) viel einfacher - es ist 'nur' Übersetzen des AST in eine neue Sprache, was beim 3., 4. und 5. Mal (usw.) viel einfacher ist.
Es gibt einen klassischen Artikel: Echte Programmierer verwenden Pascal nicht . Ein Teil davon lautet:
Es gibt auch Teile, für die Sie nicht nur das mentale AST verwenden können - Sie müssen auch in der Sprache denken. Die Ausführung dieses Vorgangs nimmt einige Zeit in Anspruch (ich bin immer noch beschuldigt, Perl- Code in Python geschrieben zu haben, und mein erster Lisp- Code wurde mit der Meldung "Dies ist ein sehr gutes C-Programm" überprüft.)
Dazu muss ich auf einen Artikel hinweisen, der von der ACM veröffentlicht wurde: Wie man Fortran nicht in einer beliebigen Sprache schreibt . Der dritte Absatz des Artikels (der keine Anführungszeichen enthält) befasst sich direkt mit der vorliegenden Frage:
Es ist nicht nur genug, um die AST zu haben - es ist notwendig, die AST zu haben, die man in andere Sprachen übersetzen kann. Ein Fortran AST im Kopf zu haben und Fortran-Code in Java zu schreiben, ist keine gute Sache. Man muss auch mit der Sprache und ihren Redewendungen vertraut genug sein, um in der Sprache denken zu können (trotz dessen, was ich ganz oben gesagt habe).
Ich habe Java-Code von jemandem gesehen, der nicht aufgehört hat, C-Code zu schreiben. Es gab ein Objekt mit einer Hauptmethode. In diesem Objekt befanden sich eine Reihe von statischen Methoden, die von aufgerufen wurden
main
, und private innere Klassen, die öffentliche Felder hatten (und daher Streben sehr ähnlich sahen). Es war C-Code, der in Java geschrieben war. Es wurde lediglich die Syntax einer Sprache in eine andere übersetzt.Um diesen Punkt zu überwinden, muss man weiterhin Code in mehreren Sprachen schreiben und beim Entwerfen des Codes nicht in diesen Sprachen denken, sondern in diesen, wenn das Design in den Code übersetzt wird, um mit den Sprachidiomen korrekt zu arbeiten.
Der einzige Weg dorthin - in der Lage zu sein, Programmierkenntnisse zu entwickeln, die auf alle Sprachen angewendet werden können - besteht darin, weiterhin Sprachen zu lernen und diese mentale Programmiersprache flexibel zu halten, anstatt an eine Sprache gebunden zu sein.
(Ich entschuldige mich bei ChaosPandion, dass ich mich stark von der Idee, die er vorgestellt hat , geliehen habe .)
quelle
Wählen Sie eine Sprache und starten Sie die Codierung. Python ist eine gute Wahl für Anfänger, und es gibt Online-Tutorials , damit Sie lernen, wie man es richtig macht.
Daraus folgt alles. Ihre Interessen führen Sie zu Frameworks und Designkonzepten, die Ihre Programme verfeinern. Sie werden feststellen, dass es Online-Kurse gibt, die Ihnen die Grundlagen und die Theorie vermitteln, und dass es verschiedene Programmierparadigmen gibt, die Sie erforschen können, und so weiter.
Und ja, Sie werden Sprachen wie Haskell entdecken, die Ihnen etwas Neues beibringen, sobald Sie eine solide Grundlage für die Grundlagen haben.
Einige Programmierer denken wahrscheinlich, dass alle Sprachen gleich sind, weil sie keiner ausgesetzt waren, die sie dazu bringen, anders zu denken. Alle am häufigsten verwendeten Sprachen leiten sich von Algol ab (es handelt sich im Wesentlichen um prozedurale Sprachen), und die meisten von ihnen sind C-ähnliche geschweifte Klammern.
quelle
Beim Programmieren geht es um Probleme, die so gelöst werden, dass die Lösung in einer so eingeschränkten Grammatik ausgedrückt werden kann, dass sie mit einer Programmiersprache implementiert werden kann. Die Kunst des Programmierens ist daher die Kunst, Probleme zu lösen.
Bestimmte Sprachen fordern andere Programmierparadigmen wie Objektorientierung, ereignisgesteuerte, Multithread- und MVC-Framework-basierte. Dies sind alles nur Modelle und Muster und haben nichts wirklich mit der Implementierung zu tun.
Wenn Sie ein Problem auf Papier so lösen können, dass es leicht in Code übersetzt werden kann und mit einem geeigneten Modell für Ihre Plattform verknüpft ist, sind Sie ein Programmierer. Wenn Sie diese Lösungen nur in der von Ihnen gewählten Sprache implementieren können, ist das eine andere Sache.
Ich programmiere seit 30 Jahren (OMFG!) Und verwende immer noch
php.net
, um Befehle in PHP nachzuschlagen, da es nicht meine Muttersprache ist.Ich würde sagen, dass das Fachwissen in Sprachen umgekehrt proportional zu der Häufigkeit ist, mit der Sie sich das Handbuch oder den Stapelüberlauf ansehen. Erfahrung in der Programmierung ist, wie schnell Sie Probleme auf eine Weise lösen, die mit Computerprogrammiersprachen kompatibel ist.
In ähnlichen Nachrichten habe ich letzte Woche Ruby gelernt. Obwohl ich kein "Experte" bin, kann ich ein Problem lösen, das ich in Perl schreiben könnte, und dann ein Zeitalter damit verbringen, es in Ruby zu übersetzen, während ich es noch etwas lerne.
quelle
Ich denke, wie bei allem, macht Übung den Meister. Lassen Sie sich einfach nicht dazu überreden, immer das Gleiche zu tun oder immer die gleiche Sprache zu sprechen, und lernen Sie bei jedem Projekt weiter.
Ich denke, man kann leicht eine Parallele zu etwas ziehen, das dem Erlernen des Gitarrenspiels entspricht. Jeder gute Musiker kann in kürzester Zeit lernen, ein neues Lied zu spielen, da er bereits alle Akkorde und die Theorie kennt, warum die Akkorde so gespielt werden, wie sie sind. Wie bekommen sie das gut? Sie haben so viele Songs gespielt, dass sich alle Patterns soeben vermischt haben, während sie gleichzeitig ihr Wissen durch eine tatsächlich dokumentierte Theorie ergänzt haben, die auch diese Patterns abonnieren.
Vielleicht kannst du ein paar Songs sehr gut spielen, aber du kannst nicht schnell davon abweichen oder neue Songs aufnehmen. Dies ist wahrscheinlich das Äquivalent eines .NET- Programmierers, der immer wieder dieselbe CRUD- Anwendung erstellt, irgendwann etwas Neues ausprobiert, einige Webservice-Aufrufe oder eine erweiterte Benutzeroberfläche hinzufügt oder sie in einer ganz neuen Sprache schreibt. Wenn Sie sich einen Überblick verschaffen, warum die Dinge so ablaufen, Fragen zu Stack Exchange usw. stellen, werden Sie schließlich alle Muster sehen, die ständig auftauchen, und einige der zugrunde liegenden Theorien kennen, und das Erlernen einer neuen Sprache wird dies nicht tun scheinen fast so entmutigend.
quelle
Ich werde nicht untersuchen, wie lange es dauert, eine Sprache zu lernen oder was es bedeutet, eine Sprache zu lernen, sondern ich werde mich mit Ihrem eigentlichen Problem befassen: wie Sie feststellen, ob Sie Programmieren gelernt haben oder eine Programmiersprache gelernt haben .
Sie haben programmieren gelernt, wenn Sie gelernt haben, ein Problem in einzelne Prozesse aufzuteilen und diese Prozesse dann zur Lösung Ihres Problems zu verwenden. Sie haben eine Programmiersprache gelernt, wenn Sie die Syntax einer Sprache kennen und wissen, wie Sie die Funktionsweise eines Prozesses anpassen, wenn er in dieser Sprache implementiert ist.
Dies bedeutet nicht, dass Sie in Fortan programmieren sollten, wenn Sie Lisp verwenden, oder die Werte einer Spalte in einer Tabelle in einer Datenbank mit einem Cursor addieren sollten. Nur dass die Sprache ein Implementierungsdetail ist. Eine, die ändern kann, welche Prozesse benötigt werden, aber nicht die Notwendigkeit, Prozesse zu identifizieren und zu erstellen - am Ende gibt es eine reale Implementierung mit Input / Output und gewünschten Ergebnissen.
quelle
Meine Strategie war schon immer, mich auf reine Fähigkeiten zu konzentrieren und nicht auf bestimmte Fähigkeiten.
Anstatt die spezielle Syntax von Python (oder einer anderen Sprache) für alles zu lernen, was Sie tun möchten, müssen Sie Ihre Gehirnzyklen damit verbringen, abstrakte Probleme zu lösen, wie Sie jedes Problem in dieser Kategorie am besten lösen können.
Auf diese Weise wissen Sie unabhängig von der Sprache, was zu tun ist, und verfügen meist über zeitlose Fähigkeiten, mit denen Sie in jeder Sprache programmieren können.
Vermeiden Sie insbesondere Tools, die voller Fallstricke sind, wie MySQL, oder eigensinnige Sprachen, wie Java, da alles, was Sie mit diesen Tools lernen, einen großen Anteil an Tool-spezifischem Wissen hat, das mit Sicherheit ziemlich schnell unbrauchbar wird.
Im Gegensatz zu dem, was in vielen Antworten gesagt wurde, hören Sie NICHT auf andere Programmierer. Sie sind ein Noob und es gibt keine Möglichkeit, die Fälschung vom echten Deal zu unterscheiden. Sie sollten also besser alles mit einem Löffel Salz nehmen.
Sie möchten ständig Fragen stellen und nur akzeptieren, wenn die Lösung schnell, elegant und zuverlässig ist.
quelle
Es gibt den theoretischen Ansatz. Erfahren Sie, wie Computer im Hintergrund funktionieren. Wie die grundlegenden Prozessoranweisungen aneinander gereiht werden, um die komplexeren Operationen und Strukturen zu erzeugen, die wir in der Programmiersprache auf hoher Ebene für selbstverständlich halten.
Dann gibt es den praktischeren Programmieransatz. Das Hauptproblem, das die Leute normalerweise als "nicht gute Programmierer" bezeichnen, ist, dass sie nur eine Sprache wirklich beherrschen . Und selbst wenn sie andere kennen, programmieren sie in ihnen genauso wie in ihrer Muttersprache . Das ist ein Zyklus, den man unterbrechen muss, wenn man wirklich lernen will, wie man programmiert. Die Standardantwort darauf besteht darin, mindestens eine Sprache aus jedem Programmierparadigma zu lernen. Lernen Sie also eine OOP-Sprache, eine funktionale Sprache, eine Skriptsprache usw. Und mit Lernen meine ich nicht das Erlernen der Syntax . Sie lernen eine Sprache, indem Sie sie tatsächlich verwenden, um etwas zu erschaffen.
Wenn ich persönlich eine neue Sprache lernen möchte, verwende ich Project Euler- Puzzles. Ich gehe zu einem Rätsel, das ich bereits in einer OOP-Sprache gelöst habe (als Beispiel) und versuche, es mit einer funktionalen zu lösen, während ich versuche, den Best Practices der neuen Sprache zu folgen. Wenn Sie dasselbe Problem mit zwei grundlegend unterschiedlichen Ansätzen lösen, erkennen Sie nicht nur die tatsächlichen Unterschiede, sondern zeigen Ihnen auch, wo sich die gemeinsamen Bereiche befinden. Diese gemeinsamen Bereiche, die von allen Sprachen gemeinsam genutzt werden, stellen die eigentliche Programmierung dar . Die Unterschiede bestehen lediglich darin, wie sie erreicht werden können.
quelle
Nun, die meisten Dinge, die ich sagen wollte, wurden bereits gesagt. Was ich hinzufügen möchte, ist eine sehr einfache Analogie.
Wenn Programmiersprachen als bloße Werkzeuge betrachtet werden, gibt es absolut keine Logik, wenn man gut ist und gut ist, wenn man gut ist.
Sprachen sind oft nicht schwer zu lernen, aber es braucht Geduld und Übung, um gut darin zu sein. Außerdem gibt es keinen richtigen Weg, um das Programmieren zu lernen.
Hier sind ein paar Dinge, die Sie vielleicht tun möchten, wenn Sie eine Sprache lernen.
Erleben Sie neue Sprachen, entdecken Sie neue Bibliotheken, lernen Sie neue Tricks in Ihrer Freizeit. Bevor Sie es merken, werden Sie sich mit Ihrem Können überraschen.
quelle
In meinem Fall lerne ich, wie man tatsächlich programmiert:
Wie Ihre Kommentatoren bereits erwähnt haben, vergessen Sie nicht, auch Ihre Tools zu beherrschen. Das Erlernen der besten Praktiken und der besten Theorien ist zwecklos oder wird schlecht umgesetzt, wenn Sie nicht genug über Ihr Tool, in diesem Fall eine Programmiersprache, wissen.
quelle
Ich denke, wenn Sie analytisch denken können, haben Sie einen guten Anfang.
Lernen Sie jede Sprache, die Sie wollen, und arbeiten Sie sich anhand einer Reihe von Beispielen vor, wie sie beispielsweise in fast allen Büchern zum Thema Programmieren vorgestellt werden.
Versuchen Sie als nächstes, Ihre eigenen Probleme zu lösen. Versuche verschiedene Lösungen zu finden und vergleiche sie. Geschwindigkeit und Speichernutzung sind häufig verwendete Faktoren, die eine Rolle spielen. Besprechen Sie Ihre Lösungen mit anderen Programmierern.
Lesen Sie den Code anderer Programmierer und versuchen Sie zu verstehen, warum sie das Problem auf diese Weise gelöst haben.
Sie sollten auch einige Bücher über Algorithmen lesen, um einen Überblick über Standardansätze zu erhalten. Neue Probleme sind oft Modifikationen alter Probleme.
Viel Übung und das Arbeiten mit Code auch in Teams helfen Ihnen, Ihre Fähigkeiten Schritt für Schritt zu verbessern.
Ich hoffe meine Meinung beantwortet deine Frage zumindest teilweise.
quelle