it-swarm-eu.dev

Über die Entwicklung tiefer Programmierkenntnisse

Gelegentlich sehe ich Fragen zu Edge-Fällen und anderen Verrücktheiten bei Stack Overflow, die von Leuten wie Jon Skeet und Eric Lippert leicht beantwortet werden können und ein tiefes Wissen über die Sprache und ihre vielen Feinheiten demonstrieren. wie dieser :

Sie könnten denken, dass zur Verwendung einer foreach - Schleife die Sammlung, über die Sie iterieren, IEnumerable oder IEnumerable<T> Implementieren muss. Aber wie sich herausstellt, ist das eigentlich keine Voraussetzung. Erforderlich ist, dass der Typ der Auflistung eine öffentliche Methode namens GetEnumerator haben muss und dass ein Typ zurückgegeben werden muss, der einen Getter für öffentliche Eigenschaften namens Current und eine öffentliche Methode MoveNext, das ein bool zurückgibt. Wenn der Compiler feststellen kann, dass alle diese Anforderungen erfüllt sind, wird der Code zur Verwendung dieser Methoden generiert. Nur wenn diese Anforderungen nicht erfüllt sind, prüfen wir, ob das Objekt IEnumerable oder IEnumerable<T> Implementiert.

Das ist cool zu wissen. Ich kann verstehen, warum Eric das weiß; Er ist im Compiler-Team, also muss er es wissen. Aber was ist mit denen, die so tiefes Wissen zeigen und keine Insider sind?

Wie erfahren bloße Sterbliche (die nicht zum C # -Compilerteam gehören) von solchen Dingen?

Gibt es speziell Methoden, mit denen diese Leute dieses Wissen systematisch ausrotten, erforschen und verinnerlichen (zu ihrem eigenen machen)?

139
Robert Harvey

Zunächst einmal vielen Dank für die freundlichen Worte.

Wenn Sie ein tiefes Wissen über C # erlangen möchten, ist es zweifellos ein Vorteil, über die Sprachspezifikation, zehn Jahre Design Notes, den Quellcode, die Fehlerdatenbank sowie Anders, Mads, Scott und Peter zu verfügen gleich den Flur runter. Ich bin auf jeden Fall glücklich, keine Frage.

Auch ohne diese Vorteile ist es jedoch möglich, ein tiefes Wissen über das Thema zu erlangen.

Als ich bei Microsoft anfing, arbeitete ich an dem mit Internet Explorer 3 gelieferten JScript-Interpreter. Mein damaliger Manager sagte mir etwas, das zu den besten Ratschlägen gehörte, die ich je bekommen habe. Er sagte, dass er wollte, dass ich der anerkannte Experte bei Microsoft für die Syntax und Semantik der JScript-Sprache werde, und dass ich dies tun sollte, indem ich Fragen zu diesen Aspekten von JScript suche und sie beantworte. Besonders die Beantwortung der Fragen, auf die ich keine Antworten kannte, weil ich von diesen lernen würde.

Offensichtlich sind StackOverflow und andere öffentliche Q & A-Foren wie das Trinken aus einem Feuerwehrschlauch für solche Dinge. Damals las ich comp.lang.javascript und unsere internen Microsoft "JS User" -Foren religiös und folgte dem Rat meines Managers: Als ich eine Frage sah, die sich mit der Sprachsemantik befasste, die ich nicht kannte Als Antwort darauf machte ich es mir zur Aufgabe, es herauszufinden.

Wenn Sie so einen "tiefen Tauchgang" machen möchten, müssen Sie sorgfältig auswählen. Ich bin bis heute bemerkenswert unwissend, wie das Browser-Objektmodell funktioniert. Da ich mich in den letzten Jahren darauf konzentriert habe, C # -Sprachenexperte zu werden, weiß ich bemerkenswert wenig darüber, wie die verschiedenen Klassen in den Basisklassenbibliotheken funktionieren. Ich habe das Glück, dass ich einen Job habe, der spezifisches tiefes Wissen auszeichnet. Wenn Ihr Job oder Ihre Talente eher mit dem eines Generalisten übereinstimmen, funktioniert es möglicherweise nicht, wenn Sie tief gehen.

Das Schreiben eines Blogs ist ebenfalls äußerst hilfreich. Indem ich mich dazu verpflichte, anderen Menschen komplexe Themen zu erklären, bin ich gezwungen, mich ständig mit meinem eigenen unzureichenden Verständnis verschiedener Themen auseinanderzusetzen.

171
Eric Lippert

Nachdem ich ein- oder zweimal auf der "Guru" -Seite des Gesprächs war, kann ich Ihnen sagen, dass das, was Sie als "tiefes Wissen" über eine Programmiersprache oder ein Programmiersystem empfinden, oft das Ergebnis des "Gurus" ist, um den Sie in letzter Zeit gekämpft haben einen Monat, um genau das gleiche Problem zu lösen. Dies gilt insbesondere in einem Forum, in dem die Benutzer auswählen können, welche Fragen sie beantworten möchten. Sogar Leute wie Jon Skeet und Eric Lippert mussten irgendwann Hallo Welt lernen. Sie lernen ihr Wissen wie jeder andere Konzept einzeln kennen.

66
Karl Bielefeldt

Yogi Bhajan umschreiben:

"Wenn du etwas lernen willst, lies darüber; wenn du etwas verstehen willst, schreibe darüber; wenn du etwas beherrschen willst, Programm es."

Programmieren ist wie die ultimative Herausforderung für den Unterricht. Das Unterrichten von Computern erfordert, dass Sie Ihre Kenntnisse wirklich gut kennen - oder Sie werden lernen, sie zu beherrschen.

Wenn Sie beispielsweise Physik lernen möchten, schreiben Sie eine Physik-Engine. Wenn Sie Schach lernen möchten, programmieren Sie ein Schachspiel. Wenn Sie tiefes C # -Wissen erlernen möchten, schreiben Sie einen C # -Compiler (oder ein anderes Tool).

48
Maglob

Soweit ich weiß, gibt es folgende Möglichkeiten, dies zu lernen:

  • Lesen Sie darüber von jemandem wie Eric Lippert
  • Erleben und lösen Sie die Probleme aus erster Hand.

Der zweite Weg kann viel länger dauern, wird aber wahrscheinlich zu einem tieferen Verständnis führen (aber nicht immer).

Ich würde sagen, mache folgendes:

Nachdem Sie einen relativ nützlichen Stapel von Sprachen (die Sie für einen echten Job benötigen) auf der Ebene gelernt haben, auf der Sie die häufigsten Aufgaben erledigen können, hören Sie auf, mehr Sprachen zu lernen, bis Sie mindestens eine vertieft haben. Ein Teil des Problems in unserer Branche ist meiner Meinung nach, dass die Leute nur die ersten 5-10% der Sprache lernen, bevor sie zu einer anderen Sprache übergehen. Sobald Sie in der Lage sind, die häufigsten Aufgaben in einem Job zu erledigen, sollten Sie sich eingehend mit einer Sache befassen. (Sie können wieder zur Breite zurückkehren, nachdem Sie eine gewisse Tiefe erreicht haben, und dann zwischen den beiden hin und her gehen.)

Helfen Sie freiwillig für die komplexeren, schwierigeren Aufgaben, die Sie dazu bringen, sich eingehend mit den Problemen zu befassen. Wenn es keine gibt, in denen Sie arbeiten, suchen Sie nach Open-Source-Aufgaben oder beginnen Sie mit der Arbeit an einem persönlichen Projekt, bei dem Sie sich eingehend damit befassen müssen. Wenn Ihr Job keine interessanten Probleme hat, suchen Sie nach einem herausfordernden Job.

Lesen Sie die erweiterten Bücher in einer Sprache (für SQl Server umfasst dies beispielsweise das Lesen von Informationen zur Leistungsoptimierung und zu Datenbankinternalen), anstatt das Buch X in 30 Tagen zu lernen.

Lesen Sie die interessanten Fragen hier und an anderen Stellen, an denen sie gestellt werden, und versuchen Sie, einige selbst zu lösen. Wenn Sie lernen möchten, versuchen Sie, einige zu lösen, ohne zuerst die anderen Antworten zu lesen. Auch wenn die Frage bereits beantwortet wurde, erfahren Sie mehr, wenn Sie die Antwort selbst finden. Vielleicht finden Sie sogar eine bessere Antwort als die, die die Frage hatte.

Stellen Sie einige der schwierigeren Fragen. Bewerten Sie die Antworten, die Sie erhalten, und verwenden Sie sie nicht nur. Stellen Sie sicher, dass Sie verstehen, warum die Antwort funktionieren würde oder nicht. Verwenden Sie diese Antworten als Ausgangspunkt für die Recherche.

Finden Sie einige gute technische Blogs von bekannten Experten auf dem Gebiet und lesen Sie sie.

Hören Sie auf, Ihr Wissen wegzuwerfen, wenn Sie damit fertig sind. Lerne zu behalten. Die meisten Experten müssen die gängige Syntax nicht nachschlagen. Sie müssen das Rad nicht jedes Mal neu erfinden, wenn sie auf ein Problem stoßen, weil sie sich daran erinnern, wie sie zuvor ein ähnliches Problem angegangen sind. Sie können die Punkte verbinden und sehen, wie das Problem X, das sie vor zwei Jahren hatten, dem Problem Y ähnelt, das sie gerade haben (es wundert mich, wie wenige Leute in der Lage zu sein scheinen, solche Verbindungen herzustellen). Folglich haben sie mehr Zeit, um interessantere Themen zu erforschen.

23
HLGEM

Sie können beginnen, indem Sie gründlich die Sprachspezifikationen derjenigen studieren, für die Sie ein Experte sein möchten. Zum Beispiel:

9
Marcelo

Holen Sie sich Reflector oder einen anderen Dekompiler (da er jetzt bezahlt) und öffnen Sie einige der am häufigsten verwendeten .NET-Bibliotheken, um zu erfahren, wie die Interna funktionieren. In Kombination mit einem Buch wie CLR über C # werden Sie ziemlich tief (tiefer als die meisten von uns ihren regulären Job machen werden).

6
Bart

Ich habe diese Art von Wissen in C++ entwickelt, indem ich ein paar Jahre in comp.lang.c++.moderated Abgehangen habe, obwohl ich zu diesem Zeitpunkt nicht wirklich so hart daran gearbeitet habe, darin zu programmieren. Ich bin mir jedoch nicht sicher, wie Guru ich sagen kann.

Ich denke, es gibt zwei Arten von Wissen, das man über eine Programmiersprache lernen kann:

  1. Trivia über die Sprache kennen und wissen, wie man Fallstricke vermeidet.
  2. Wissen, wie man Probleme effektiv löst.

Nummer 2 kann nur erreicht werden, indem man in der Sprache programmiert und den Code anderer Leute betrachtet. Nummer 1 kann jedoch erreicht werden, indem man sich viel Zeit nimmt, um in den Diskussionsforen über die Sprache zu lesen und zu sehen, welche Art von Fragen die Leute stellen und welche Antworten sind. Auch dafür ist StackOverflow ein guter Ort.

4
Ken Bloom

Tiefes Wissen und Programmierkenntnisse bedeuten, sich auf allen Abstraktionsebenen wohl zu fühlen. Das heißt,.

  • bibliotheken und APIs
  • sprachsemantik
  • compiler-Optimierungen
  • compiler-Interna und Codegenerierung
  • laufzeit- und Garbage Collector-Verhalten
  • architektur- und Befehlssatzprobleme

Alles, was ich in den letzten 15 Jahren gesehen habe, hat gezeigt, dass Sie nur dann eine Chance haben, tiefgreifend zu werden, wenn Sie wirklich in den Compiler und die Laufzeit einsteigen können. Möglicherweise müssen Sie sich zwingen, den Schritt zu tun und mit dem Denken (und Erstellen) von Software auf der nächsten Abstraktionsebene zu beginnen weiter unten im Stapel, aber dies ist der einzige Weg zu Fachwissen.

Wir haben nur Sprache für die Abstraktion. Sie müssen verstehen, wie Programmiersprachen entworfen und gebaut werden, um wirklich zu wissen, was die Maschine tut.

4
Don Stewart

Lesen Sie das Fine Manual Dies ist kein besonders tiefes Wissen. Es wurde in der C # -Sprachspezifikation Abschnitt 8.6.4 veröffentlicht. Sie sollten es sich zur Gewohnheit machen, mindestens die Spezifikationen für die von Ihnen verwendeten Sprachen sowie die Dokumentation für alle integrierten Bibliotheken zu überfliegen.

Jedenfalls ist dies nicht meine Vorstellung von tiefem Wissen; Es ist nur ein uninteressantes Implementierungsdetail. Es könnte interessanter sein, wenn der Designer erklärt, warum dies auf diese dynamischere Weise erfolgt ist, anstatt nur zu überprüfen, ob das Objekt Iterable implementiert.

3
kevin cline