Gelegentlich stelle ich beim Stack Overflow Fragen zu Randfällen und anderen Verrücktheiten fest, die leicht von Leuten wie Jon Skeet und Eric Lippert beantwortet werden können und die ein tiefes Wissen über die Sprache und ihre vielen Feinheiten aufweisen, wie diese:
Sie könnten denken, um eine
foreach
Schleife zu verwenden, muss die Sammlung, über die Sie iterieren,IEnumerable
oder implementierenIEnumerable<T>
. Aber wie sich herausstellt, ist das eigentlich keine Voraussetzung. Erforderlich ist, dass der Typ der Auflistung eine öffentliche Methode hat, die aufgerufen wirdGetEnumerator
, und dass ein Typ zurückgegeben wird, der einen öffentlichen Eigenschafts-Getter hat, der aufgerufen wird,Current
und eine öffentliche MethodeMoveNext
, die a zurückgibtbool
. 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 ObjektIEnumerable
oder implementiertIEnumerable<T>
.
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 solch tiefes Wissen demonstrieren und keine Insider sind?
Wie finden bloße Sterbliche (die nicht im C # -Compilerteam sind) über solche Dinge Bescheid?
Gibt es Methoden, mit denen diese Leute dieses Wissen systematisch ausgraben, erforschen und verinnerlichen (es zu ihrem eigenen machen)?
quelle
Antworten:
Zunächst einmal danke für die freundlichen Worte.
Wenn Sie sich eingehend mit C # auskennen möchten, ist es zweifellos von Vorteil , die Sprachspezifikation, zehn Jahre Design-Notizen, den Quellcode, die Bug-Datenbank und Anders, Mads, Scott und Peter im Hintergrund zu haben. Ich bin auf jeden Fall glücklich, keine Frage.
Aber auch ohne diese Vorteile ist es immer noch möglich, ein tiefes Wissen über das Thema zu erlangen.
Als ich bei Microsoft anfing, arbeitete ich an dem JScript-Interpreter, der im Lieferumfang von Internet Explorer 3 enthalten war. Mein damaliger Manager gab mir einige der besten Ratschläge, die ich je erhalten habe. Er wollte, dass ich der anerkannte Experte für die Syntax und Semantik der JScript-Sprache bei Microsoft werde und dass ich dazu Fragen zu diesen Aspekten von JScript suche und beantworte. Besonders die Fragen zu beantworten, auf die ich keine Antworten kannte, weil das die sind, von denen ich lernen würde.
Offensichtlich sind StackOverflow und andere öffentliche Q & A-Foren wie das Trinken aus einem Feuerlöschschlauch für solche Dinge. Damals las ich comp.lang.javascript und unsere internen Microsoft "JS User" -Foren religiös und befolgte den Rat meines Managers: Als ich eine Frage über die Sprachsemantik sah , auf die ich keine Antwort wusste, habe ich sie gemacht mein Geschäft, um herauszufinden.
Wenn Sie so einen "tiefen Tauchgang" machen wollen, 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, kenne ich die Funktionsweise der verschiedenen Klassen in den Basisklassenbibliotheken bemerkenswert wenig. Ich habe das Glück, einen Job zu haben, der spezifisches tiefes Wissen auszeichnet. Wenn Ihr Job oder Ihre Talente eher dazu passen, ein Generalist zu sein, kann es sein, dass Sie nicht in die Tiefe gehen.
Das Schreiben eines Blogs ist ebenfalls sehr hilfreich. Indem ich anderen Menschen komplexe Themen erklären muss, muss ich mich ständig mit meinem eigenen unzureichenden Verständnis verschiedener Themen auseinandersetzen.
quelle
Nachdem ich ein oder zwei Mal auf der "Guru" -Seite des Gesprächs war, kann ich Ihnen sagen, dass das, was Sie als "tiefes Wissen" über eine Programmiersprache oder ein System empfinden, oft das Ergebnis des "Guru" ist, um das es in letzter Zeit gekämpft hat ein Monat, um genau das gleiche Problem zu lösen. Dies gilt insbesondere für ein Forum, in dem die Benutzer auswählen können, welche Fragen sie beantworten möchten. Sogar Leute wie Jon Skeet und Eric Lippert mussten einmal Hallo Welt lernen. Sie erwerben ihr Wissen wie jeder andere auch konzeptionell.
quelle
Umschreibung von Yogi Bhajan:
Programmieren ist wie die ultimative Herausforderung für den Unterricht. Das Unterrichten von Computern erfordert, dass Sie sich mit Ihren Dingen wirklich gut auskennen - 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 tiefgreifende C # -Kenntnisse erlernen möchten, schreiben Sie einen C # -Compiler (oder ein anderes Tool).
quelle
Soweit ich weiß, gibt es folgende Möglichkeiten, dies zu lernen:
Der zweite Weg kann viel länger dauern, wird aber wahrscheinlich zu einem tieferen Verständnis führen (aber nicht immer).
quelle
Ich würde sagen, mache folgendes:
Nachdem Sie einen relativ nützlichen Stapel von Sprachen gelernt haben (die Sie für einen echten Job benötigen), hören Sie auf, mehr Sprachen zu lernen, bis Sie mindestens eine Sprache gründlich gelernt haben. Ein Teil des Problems in unserer Branche besteht meiner Meinung nach derzeit darin, dass die Menschen nur die ersten 5 bis 10% der Sprache lernen, bevor sie zu einer anderen Sprache übergehen. Sobald Sie die Fähigkeit haben, die häufigsten Aufgaben in einem Job zu erledigen, sollten Sie sich mit einer Sache befassen. (Sie können zurückgehen, um Breite zu bekommen, nachdem Sie etwas Tiefe bekommen haben, und dann zwischen den beiden hin und her gehen.)
Helfen Sie mit bei den komplexeren und schwierigeren Aufgaben, bei denen Sie sich eingehend mit der Lösung der Probleme befassen müssen. Wenn Sie dort, wo Sie arbeiten, keine finden, suchen Sie nach Open-Source-Aufgaben, oder beginnen Sie mit der Arbeit an einem persönlichen Projekt, bei dem Sie sich eingehender mit dem Thema befassen müssen. Wenn Ihr Job keine interessanten Probleme hat, suchen Sie nach einem herausfordernden Job.
Lesen Sie die Bücher für Fortgeschrittene in einer Sprache (für SQl Server würde dies beispielsweise das Lesen von Informationen zur Leistungsoptimierung und zu Datenbankinternen beinhalten), anstatt die Bücher des Typs "X in 30 Tagen 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 vorher 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 Frage.
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. Nutzen Sie diese Antworten als Ausgangspunkt für Ihre Recherchen.
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. Lernen Sie 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 an ein ähnliches Problem herangegangen sind. Sie können die Punkte verbinden und sehen, wie das Problem X, das sie vor zwei Jahren gemacht haben, dem Problem Y ähnelt, das sie gerade haben (es erstaunt mich, wie wenige Leute in der Lage zu sein scheinen, solche Verbindungen herzustellen). Infolgedessen haben sie mehr Zeit für die Erforschung interessanterer Themen.
quelle
Sie können beginnen tief das Studium der Sprache Spezifikationen von denen , die Sie suchen einen Experten aus sein. Zum Beispiel:
quelle
foreach
und das in dem zitierten Blogbeitrag von Eric Lippert beschriebene Verhalten erläutert . Wenn sich jemals jemand denkt, dass etwas wie "Ich frage mich, wie foreach wirklich funktioniert", dann ist dies ein guter Ort, um nach etwas Ausschau zu halten.Holen Sie sich Reflector oder einen anderen Decompiler (da er jetzt bezahlt wird) und öffnen Sie einige der am häufigsten verwendeten .NET-Bibliotheken, um zu erfahren, wie die internen Funktionen funktionieren. In Kombination mit einem Buch wie CLR über C # werden Sie ziemlich tiefgreifend (tiefer, als die meisten von uns ihren regulären Job machen werden).
quelle
BitConverter
Klassen gemacht und dieIsLittleEndian
systemspezifische Flagge entdeckt.Ich habe diese Art von Wissen in C ++ entwickelt, indem
comp.lang.c++.moderated
ich mich ein paar Jahre hingegeben 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 Kenntnissen, die man über eine Programmiersprache erwerben kann:
Nummer 2 kann nur erreicht werden, indem Sie in der Sprache programmieren und sich den Code anderer ansehen. Nummer 1 kann jedoch erreicht werden, indem Sie sich viel Zeit nehmen, um in den Diskussionsforen über die Sprache zu lesen und zu sehen, welche Fragen und welche Fragen gestellt werden Antworten sind. Auch dafür ist StackOverflow ein guter Ort.
quelle
Umfassende Kenntnisse und Programmierkenntnisse bedeuten, dass Sie sich auf allen Abstraktionsstufen wohlfühlen. Dh
Alles, was ich in den letzten 15 Jahren gesehen habe, hat gezeigt, dass Sie nur dann eine Chance haben, tiefgreifende Kenntnisse zu erlangen, wenn Sie wirklich mit dem Compiler und der Laufzeit vertraut sind. Möglicherweise müssen Sie sich dazu zwingen, den Schritt zu wagen und mit dem Überlegen (und Erstellen) von Software auf der nächsthöheren Abstraktionsebene im Stapel zu beginnen , aber dies ist der einzige Weg zu Fachwissen.
Alles, was wir haben, ist Sprache für die Abstraktion. Sie müssen verstehen, wie Programmiersprachen entworfen und gebaut werden, um wirklich zu wissen, was die Maschine tut.
quelle
Lesen Sie das feine Handbuch Dies ist kein besonders tiefes Wissen. Es ist in Abschnitt 8.6.4 der C # -Sprachenspezifikation veröffentlicht. Sie sollten sich angewöhnen, zumindest die Spezifikationen für die von Ihnen verwendeten Sprachen zu überfliegen und die Dokumentation für alle integrierten Bibliotheken zu überfliegen.
Jedenfalls ist das 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 dynamischere Weise geschehen ist, anstatt nur zu überprüfen, ob das Objekt Iterable implementiert.
quelle