Wie kann ich eine Programmiersprache wirklich beherrschen?


103

Ich weiß, dass Sie beim Erlernen einer Sprache einfach ein Buch kaufen, den Beispielen folgen und, wann immer möglich, die Übungen ausprobieren können. Aber was ich wirklich suche, ist, wie man die Sprache beherrscht, wenn man sie erst einmal gelernt hat.

Jetzt weiß ich, dass Erfahrung ein wichtiger Faktor ist, aber was ist mit dem Erlernen der Interna der Sprache, der zugrunde liegenden Struktur usw.

Es gibt Artikel, die sagen: Lies dieses Buch, lese dieses Buch, mache dieses Spiel und das Spiel. Für mich heißt das aber nicht, eine Sprache zu beherrschen. Ich möchte in der Lage sein, den Code anderer Leute zu lesen und zu verstehen, egal wie schwer das ist. Um zu verstehen, wann eine Funktion verwendet werden soll und wann eine andere usw. usw.

Die Liste könnte weiter und weiter gehen, aber ich glaube, ich habe den Punkt gemacht. :)

Nehmen Sie zum Schluss eine beliebige Sprache als Beispiel, obwohl dies am besten wäre, wenn C als Beispiel genommen würde.


11
Erfahrung ist alles, worauf es wirklich ankommt. Alle Theorien, in denen Sie ein Experte sind, sind nutzlos, es sei denn, Sie können sie praktisch anwenden.
Simon Whitehead

2
Implementieren Sie einen Compiler für diese Sprache. Eigentlich ist das meine Lieblingsmethode, um eine neue Sprache auszuprobieren. Wenn es etwas zu einfach und langweilig klingt, versuchen Sie stattdessen, die formale Sprachsemantik mithilfe des K-Frameworks oder ähnlichem zu definieren.
SK-logic

6
"Mann, Kartoffel ist Dinossaurier, Autouniversum". Es spielt keine Rolle, wie gut Sie eine Sprache beherrschen. Wenn der Code schlecht und nicht sinnvoll ist, ist er immer noch schwer zu verstehen.
Renato Dinhani

2
Ich habe das Gefühl, den Punkt ein wenig verfehlt zu haben. Langauges entwickeln sich, es gibt also keine Beherrschung einer Sprache, man wächst mit ihr, je mehr man sie benutzt, desto mehr muss man lernen.
Nycynik

2
Code und Code lesen. Nehmen Sie einen zufälligen Teil des Linux-Kernels (C Programming) und finden Sie heraus, was eine Funktion bewirkt.
Alex Hart

Antworten:


166

Ich muss antworten: "Alle oben genannten." Die Leute streiten sich darüber, ob das Codieren eine Kunst, ein Handwerk, eine technische Disziplin oder ein Zweig der Mathematik ist, und ich denke, es ist am fairsten, zu sagen, dass es einige von jedem sind. Je mehr Techniken Sie einsetzen, um die Sprache zu beherrschen, desto besser. Hier ist eine unvollständige Liste:

  • Verwenden Sie die Sprache den ganzen Tag, jeden Tag. In der Regel bedeutet dies, dass Sie Vollzeit in der Sprache beschäftigt sind.

  • Lesen Sie alles über die Sprache. Insbesondere "Best Practices" und Redewendungen.

  • Treten Sie einer Benutzergruppe bei, um mit anderen über die Sprache und deren Verwendung zu sprechen.

  • Arbeite mit dem Code anderer Leute! Es gibt keinen schnelleren Weg, um zu lernen, was man nicht in einer Sprache tun soll, als nach jemandem aufzuräumen, der etwas Schreckliches getan hat.

  • Unterstützen Sie den Code, den Sie schreiben - jeder Fehler wird zu einer Tour Ihrer schlimmsten Entscheidungen!

  • Studiere Informatik und Sprachen im Allgemeinen

  • Lerne eine ganz andere Sprache. Ein großes Kompliment an C wäre eine funktionale Sprache wie Lisp. Dies wird die Art und Weise, wie Sie über Ihre prozedurale Sprache denken, auf den Kopf stellen.

  • Erfahren Sie, wie Sie die für diese Sprache verfügbaren Frameworks und APIs verwenden.

  • Nehmen Sie sich Zeit, um selbst mit der Sprache zu experimentieren. SICP ist nicht auf C anwendbar, aber die Einstellung, eine Sprache durch Testen ihrer Grenzen zu lernen, ist sehr produktiv.

  • Lesen Sie die Geschichte der Sprache, um zu erfahren, warum sie so gemacht wurde, wie sie ist.

  • Nehmen Sie an Konferenzen teil, um die Sprache der Autoren zu hören oder um zu erfahren, was Branchenführer mit der Sprache tun.

  • Nehmen Sie an einem Kurs in der Sprache teil.

  • Lehren Sie die Sprache anderen (Dank an Bryan Oakley )

Fazit: Tun Sie alles, was Sie sich vorstellen können. Es gibt keine Möglichkeit, alles über die meisten Sprachen zu wissen. Jede Lerntechnik, die Sie anwenden, bringt eine zusätzliche Perspektive in Ihr Verständnis ein.


76
+5 für Unterstütze den Code, den du schreibst - jeder Fehler wird zu einer Tour deiner schlimmsten Entscheidungen!
Jennifer S

8
+1 nur für den letzten Satz:Every technique you use to learn brings and additional perspective to your understanding.
Izkata

1
@ Izkata: OMG, habe ich das geschrieben? Ich bin ein englischer Muttersprachler! Ich habe es korrigiert. Vielen Dank!
GlenPeterson

2
@ GlenPeterson ... Eigentlich habe ich nur eingefügt kopiert, ohne viel auf den Satz zu achten, der "aus" ist. Das +1 war in der Tat für die Absicht dahinter. = P
Izkata

13
+1 für "Lernen Sie eine ganz andere Sprache. Ein großartiges Kompliment an C wäre eine funktionale Sprache wie Lisp. Dies wird die Art und Weise, wie Sie über Ihre prozedurale Sprache denken, auf den Kopf stellen." - das ist wohl das wichtigste. Es hilft Ihnen dabei, zu lernen, wie man etwas über Programmierung lernt (dh worauf in welcher Situation zu achten ist).
naught101

53

10.000 Übungsstunden sind das, was es braucht.

Lesen Sie "Programmieren lernen in zehn Jahren"

Wichtige Punkte von oben:

  • Interessiere dich für das Programmieren und mache etwas, weil es Spaß macht. Stellen Sie sicher, dass es immer genug Spaß macht, damit Sie bereit sind, Ihre zehn Jahre / 10.000 Stunden zu investieren.
  • Programm. Die beste Art des Lernens ist das Lernen durch Handeln.
  • Sprechen Sie mit anderen Programmierern. Lesen Sie andere Programme.

1
Das wollte ich posten! Offensichtlich habe ich noch nicht genug Stunden auf P.SE verbracht.
Martijn Pieters

@MartijnPieters: :-D
vartec

8
Toller Titel für ein Buch! Ich kann es kaum erwarten, die Fortsetzung "Bring dir bei, in 20 Jahren gut zu programmieren!"
GlenPeterson

16
Sie müssen jedoch sicherstellen, dass Sie nicht die gleichen 10 Stunden 1000 Mal wiederholen ...
Izkata

Keine Menge an technischem Fachwissen hilft jemandem dabei, zu automatisieren oder ein Programm dafür zu erstellen. Das ist wie gesagt: Gehen Sie in die Turnhalle und machen Sie zehn Jahre lang jede grundlegende Übung im Basketball, eine Stunde pro Tag. Poof! Du bist ein Basketball-Superstar (Meister) ... nein, es ist mehr als nur technisches Können. Daher halte ich dies nicht für eine Antwort auf die Frage, wie man ein Meister wird. Dies mag ein Teil der Lösung sein, aber es ist kein Zaubertrank für die Meisterschaft. Ich weiß - ich bin kein Meister!
27.

36

Betrachten Sie sich NIEMALS als den Meister der ganzen Sprache, bis Sie eine bessere Sprache implementiert haben. Das heißt, um zu lernen, wie eine bestimmte Sprache von unten funktioniert, erhalten Sie ein Buch, das Ihnen die Compiler- / Interpreter-Konzepte der Sprache beibringt. Zum Beispiel:

  • C: Das LCC-Compiler-Buch

  • C ++: Das Design und die Entwicklung von C ++ (und dann bauen Sie Ihren eigenen C ++ - Compiler auf oder verstehen Sie zumindest die Implementierung eines solchen Compilers unter Verwendung des GNU C ++ - Compiler-Codes)

  • Java: Holen Sie sich "Inside JVM" und holen Sie sich den Java-Quellcode. Der .C-Code von "java" ist ebenfalls hilfreich

  • Python: CPython-Implementierung.

  • ObjectiveC: Fast jedes Material von Apple über die Interna von ObjC Runtime Env und Compiler-Quellcodes wird Ihnen helfen.

  • Lisp: SICP Book (lehrt Sie Schema und einen grundlegenden Interpreter-Compiler für Lisp-ähnliche Sprache): Lisp in Small Pieces (ein weiteres gutes Buch).


1
Das nenne ich eine Antwort. Ich habe bereits eine angenommen, aber dies hätte eine "beste Antwort" verdient, wenn es etwas früher gewesen wäre
cprogcr

2
Sie haben keine Ahnung, wie sehr Ihre Antwort geholfen hat. Ich lese über die Bücher, die Sie erwähnt haben, und sie sind das, was ich brauche.
cprogcr

hehe ich habe von ihnen gelernt. Gerne helfen :-)
Aniket Inge

da Sie C als Beispiel genannt haben, möchte ich Ihnen die Namen von zwei weiteren Büchern als Geschenk geben, mit denen ich C wie mit dem Handrücken gemeistert habe): 1. OOC.PDF (online frei verfügbar) und 2. Minix-Buch (obwohl es sich um ein Buch für OS-Implementierer handelt, das hat Linus Torvalds vor der Implementierung von Linux gelesen)
Aniket Inge,

1
ja von Andrew Tenenbaum, das ist das Buch. Jede Ausgabe ist gut zu lesen. Sie erfahren nicht, wie "C" funktioniert, aber wenn Sie sehen, wie die C-Bibliothek für ein von Ihnen erstelltes Betriebssystem implementiert ist, verstehen Sie C sogar noch besser! Vielleicht genug, um es zu ändern. (Und hier kommt OOC ins
Spiel

12

Versuchen Sie, die Sprache für etwas zu verwenden, für das sie nicht vorgesehen ist. Schreiben Sie einen Gerätetreiber in Python oder eine Matrix-Manipulationsbibliothek in COBOL. Ich denke, eine der besten Möglichkeiten, eine Sprache zu beherrschen, besteht darin, sie wirklich voranzutreiben und zu versuchen, ihre Stärken und Schwächen zu überwinden.


1
Als ich am College war, entschied ich, dass ich eine Sprache "beherrscht" hatte, sobald ich Pong darin geschrieben hatte. Das hat ganz gut funktioniert, bis ich MIPS gelernt habe. Ich habe immer noch Albträume.
Roddy of the Frozen Peas

Website in C kann getan werden?
BigSack

10

Ich werde es dir leicht machen. Du wirst niemals eine Sprache beherrschen. Zeitraum. Wenn Sie denken, dass Sie haben, dann haben Sie ganz offensichtlich nicht. Es gibt keinen Berggipfel, den Sie plötzlich erreichen und sagen: "Nun, jetzt habe ich diese Sprache vollständig beherrscht. Was jetzt?" Selbst erfahrene Programmierer, die jahrzehntelang mit derselben Sprache gearbeitet haben, werden Ihnen sagen, dass sie manchmal immer noch auf neue Ideen, Prozesse, Praktiken usw. stoßen. Das wahre Ziel ist es, Ihr konzeptuelles Verständnis einer oder mehrerer Sprachen zu meistern. Die Fähigkeit, neue Konzepte zu erlernen und die Geschwindigkeit, mit der Sie neue oder geänderte Funktionen in die Sprache übernehmen können, ist weitaus wichtiger als die genaue Kenntnis jedes Schlüsselworts und jeder Syntax. Hören Sie auf, sich Gedanken über die Beherrschung einer Sprache zu machen, und sorgen Sie sich lediglich um die kontinuierliche Verbesserung und Verbesserung der Qualität und Effizienz Ihres Codes.


2
The true goal is to master your conceptual understanding of a language or languages.Genau. Das habe ich wirklich gemeint.
cprogcr

Jede Programmiersprache ist endlich. Es setzt sich aus einer endlichen Anzahl von Konzepten zusammen und erfordert eine endliche Anzahl von idiomatischen Tricks. Daher ist es einfach, jede Sprache zu beherrschen. Natürlich kann man das Programmieren im Allgemeinen nicht beherrschen , es gibt immer ein Potenzial für eine weitere Verbesserung, aber die Frage bezieht sich speziell auf eine bestimmte Sprache .
SK-logic

SK-Logik: Programmiersprachen ändern sich, ebenso ihre Bibliotheken und Umgebungen. Infolgedessen ändert sich auch Ihre Arbeitsweise mit der Sprache. Zum Beispiel hat jQuery die Art und Weise, wie wir mit Javascript arbeiten, geändert.
Orlp

Es ist wahrscheinlich richtig, dass niemand eine Sprache wie C ++ wirklich beherrschen kann, aber für etwas minimalistische wie Scheme sollte es durchaus möglich sein - wie @ SK-logic sagt, ist es wirklich die Programmierung , in welcher Sprache auch immer, die nicht beherrscht werden kann, weil die Anwendungsbereich ist unendlich.
Leftaroundabout

1
@nightcracker, Sprachen "entwickeln" sich nicht. C99 wird immer C99 sein und sich nie ändern. C ++ 11 bleibt immer C ++ 11, auch wenn es von einer Sprache der nächsten Generation abgelöst wird. Die Umgebungen "entwickeln sich", ja, aber jQuery hat keine neuen Techniken eingeführt, die den anderen Sprachgemeinschaften zuvor nicht bekannt waren . Sie waren nur in der engen Javascript-Community neu.
SK-logic,

5

Sie kennen bereits die Antwort darauf

  • Sie müssen die Sprache verwenden. Viel. So vielfältig wie möglich zu lösen
  • Sie müssen den Code anderer Völker lesen (und im Idealfall damit arbeiten), vorzugsweise solche, die einen gewissen Grad an Beherrschung besitzen (dh ein tiefes Verständnis von mindestens einem Aspekt der Sprache). Umso besser, wenn Sie mit Menschen über das Lösen von Problemen mit der Sprache sprechen können.

Es kommt auf harte Arbeit und Entschlossenheit an, und bei allem, was Sie vielleicht nie erreichen werden.

Überlegen Sie, woher wir den Begriff haben - um ein Meister zu werden, mussten Sie ein Lehrling und dann ein Geselle sein, und nur bei ihnen könnten Sie die Chance haben, Meister zu werden. Auf dem Weg dorthin würden Sie unterrichtet und Sie würden üben und Sie würden andere an ihrem Handwerk beobachten und befragen und (hoffentlich) von ihnen lernen.

Es gibt keine Wundermittel ...


2

Beginnen Sie damit, SDLC (auch bekannt als Software Development Life-Cycle) zu lesen und zu verstehen . Es ist ein iterativer Prozess, der Selbstverbesserung, Lernen,**practicing, practicing...**

Bildbeschreibung hier eingeben

Das würde Ihnen Horizonte eröffnen, in welchen Bereichen Sie lernen oder sich verbessern müssen. Es gibt mehrere Kernbücher zur Softwareentwicklung, die Sie auch sehr nützlich finden, wenn Sie einige Anwendungen selbst erstellen.

Wenn Sie sich erst einmal mit einer OOP-Sprache vertraut fühlen , können Sie anfangen, Designmuster zu lernen , und Head First Design-Muster sind ein wirklich gutes Buch, das Sie in Betracht ziehen sollten. Ich liebe dieses Buch.


1
Vielen Dank. Ich hatte bereits Antwort gewählt, als ich dies las, werde aber auf jeden Fall Ihren Rat annehmen.
cprogcr

Ich bin mir nicht sicher, warum ich zurückgestimmt habe. Bitte lassen Sie mich wissen, was verbessert werden muss.
EL Yusubov,

2

Es gibt keinen Ersatz für Erfahrung. Um etwas zu meistern, muss man es für viele verschiedene Dinge tun / verwenden.

Verwenden Sie diese Sprache also für Übungen (wie Project Euler ) und persönliche Projekte, Dinge, die Sie tatsächlich benötigen oder die Sie für interessant halten. Schreiben Sie ein Spiel, schreiben Sie eine Webapp, schreiben Sie einen Parser, was immer Sie wollen. Versuchen Sie bei jedem Schritt zu verstehen, was Sie tun, anstatt nur Code zusammenzufügen oder Anweisungen zu befolgen.

Ich möchte in der Lage sein, den Code anderer Leute zu lesen und zu verstehen, egal wie schwer das ist.

Das können Sie sofort tun, wenn Sie die grundlegende Syntax verstanden haben. Nehmen Sie sich einfach Code und nehmen Sie sich die Zeit, um es im Detail herauszufinden. Suchen Sie nach Dingen, die Sie nicht verstehen, oder stellen Sie bestimmte Fragen zu Orten wie Stack Overflow .


2

Erfahren Sie mehr über Architektur: Wie organisieren Sie Ihre Projekte, wie ist ihre Struktur? Lass sie nicht einfach zufällig wachsen.

Lernen Sie auf der mittleren Ebene verschiedene Techniken und Paradigmen. Je vielfältiger Ihr Repertoire ist, desto mehr Macht haben Sie. Wenn Sie nur Java, Python und Ruby studiert haben, waren Sie nur einem kleinen Teil des Programmierraums ausgesetzt. Lernen Sie imperative und funktionale Programmierung, lernen Sie Prolog und J. Die Idee ist nicht, hundert Sprachen zu "beherrschen", sondern verschiedene Wege zu erlernen, um dieselben Probleme zu lösen.

Auf der niedrigen Ebene des Problems ist eine Sache, die Ihnen helfen könnte, ein besserer Programmierer zu sein (in der Tat besser in dem, was Sie tun), ein gutes mentales Modell der Plattform zu haben. Sie können beispielsweise lernen, wie C-Steuerelementstrukturen funktionieren und die gängigsten Bibliotheken kennen. Wenn Sie jedoch kein mentales Modell für die Funktionsweise von Zeigern und Speicher haben, haben Sie Probleme mit mäßig komplexen Ausdrücken.


1

Darf ich ein paar Vorschläge machen?

Erstens, wenn Sie einen Mentor finden, der Ihre Verwendung der Sprache mit Ihnen bespricht, die besten Tipps und Tricks erhält und antwortet, wenn eine Technik besser ist als eine andere.

Zweitens, üben Sie so viel wie möglich und probieren Sie die Sprache maximal aus! Früher arbeitete ich in einem Team, das jeden Tag (aus Spaß) ein Verb oder ein anderes Stück der Programmiersprache aus dem Handbuch auswählte. Es war ein Zeichen der Ehre, wenn Sie es an diesem Tag in Ihre Kodierung einarbeiten konnten. Dies bedeutete, dass das gesamte Programmierteam sich den (manchmal) undurchsichtigen Begriff ansehen und verstehen musste, um ihn effektiv zu verstehen und zu verwenden. An manchen Tagen sind wir gescheitert, aber dieses Team hat Spaß gemacht und war technisch wirklich gut aufgestellt !!


0

Programmiersprachen spiegeln die Ideen hinter den Programmierparadigmen wider, die für die allgemeine Softwareentwicklung oder für die Entwicklung von Spezialsoftware entwickelt wurden. Beispielsweise stellt eine Programmiersprache wie Java das objektorientierte Programmparadigma dar, aber AspectJ (eine Erweiterung von Java) wird verwendet, um gemäß aspektorientierter Programmierung zu programmieren.

In Anbetracht dieser kurzen Einführung wäre es nicht sehr hilfreich, ein Buch zu kaufen und zu lesen, um eine Sprache wirklich zu beherrschen. Sie müssen die Umgebung verstehen, in der Sie mit der gewünschten Sprache programmieren, das Paradigma kennen lernen und vor allem eine sinnvolle Anwendung mit der Sprache erstellen können. Das Erstellen einer kleinen Anwendung, die Ihnen einen Einblick in die verschiedenen von der Sprache bereitgestellten Tools gibt, ist ein sehr hilfreicher Lernansatz.

Ich habe Leute gesehen, die aus der reinen C-Community kamen, ohne etwas über Objektorientierung und Schwierigkeiten beim Erlernen von Java oder Objective-C zu lernen. Ich habe auch Leute gesehen, die Schwierigkeiten mit der Programmierung von Benutzeroberflächen hatten, wenn sie nicht wirklich mit den Elementen der Benutzeroberfläche, der ereignisgesteuerten Programmierung usw. vertraut waren.

Ich hoffe das hilft!


0

Ich würde zwei Elemente zu Glen's Liste hinzufügen

  • Versuchen Sie, schwierige Probleme zu lösen, die andere zB über SO beantwortet haben
  • Lesen Sie Blogs / Bücher von Sprachdesignern. Das ist die beste Quelle für tiefes Wissen. Sie würden wissen, welche Designentscheidung hinter reason X steckt.

0

Aufbauend auf dem, was @TMN gesagt hat. Ich habe sehr erfolgreich Sprachen gelernt, indem ich das gleiche Programm in einer anderen Sprache geschrieben habe.

Schreiben Sie beispielsweise ein Programm, das eine CSV-Datei einliest, den Text analysiert und dann mit den Spalten in umgekehrter Reihenfolge in eine zweite CSV-Datei zurückschreibt.

So was,

Spalte1, Spalte2, Spalte3

zu

Spalte3, Spalte2, Spalte1

Dadurch erhalten Sie ein grundlegendes Verständnis oder die Sprache. Dann sehen Sie, was Sie sonst noch tun können. Ermöglichen Sie möglicherweise die Ersetzung von Werten oder das Neuanordnen oder Lesen von der Befehlszeile. Machen Sie es so komplex wie Sie wollen.

Auch ich denke, was @ GlenPeterson sagte,

Lerne eine ganz andere Sprache. Ein großes Kompliment an C wäre eine funktionale Sprache wie Lisp. Dies wird die Art und Weise, wie Sie über Ihre prozedurale Sprache denken, auf den Kopf stellen.

Ist eine tolle Idee. Ich würde eine Sprache wie Haskell vorschlagen, da Sie in den neuesten Versionen alle vier Programmierparadigmen von OO verwenden können, ob prozedural, logisch oder funktional. Obwohl es sich tatsächlich um eine funktionierende Sprache handelt, können Sie mit einigem Aufwand die anderen Paradigmen umsetzen, die eine gute Lernerfahrung wären.

Tolle Sprache zum Herumspielen.


0

Sie können keine Sprache aus dem Buch lernen. Alles was du brauchst ist üben und üben. Denken Sie nicht, dass Sie eine Sprache aus diesem bestimmten Buch oder dieser bestimmten Quelle lernen können. Denken Sie einfach, dass die Programmiersprache die gleiche ist wie die menschliche Sprache. Sie können nicht einfach Englisch oder Französisch lernen, indem Sie ein bestimmtes Buch lesen Tagesleben. Code von Grund auf neu, erweitern Sie seine Funktionalität und versuchen Sie, etwas zu erstellen, das Sie ein wenig zufrieden stellt. Und wenn Sie daran denken, eine Sprache als Ganzsprache zu beherrschen und jedes Element der Programmiersprache in der praktischen Codierung zu verwenden, KÖNNEN SIE NICHT. Oder auch wenn Sie können, könnte es 10-15 Jahre dauern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.