# Über den Autor:
vczh, dessen richtiger Name Chen Zihan ist, da in Zhihus persönlichen Daten „professioneller Laufradbauer“ steht, nennen ihn die Leute auf der Welt „Radbruder“. “. vczh absolvierte während seiner Studienzeit ein Praktikum bei Microsoft und kam direkt nach seinem Abschluss zu Microsoft. Ich begann bei Microsoft Shanghai und stieg später bei Microsoft Research Asia in Peking ein. Jetzt ist er nach Seattle, USA gezogen und arbeitet als Ingenieur im Office-Team.
Früher wurde ich oft gefragt, wie ich zu Microsoft komme. Tatsächlich hatte ich noch nie über diese Frage nachgedacht, daher war die Antwort damals natürlich die Werbung von Microsoft (gut im Programmieren, gut in Mathematik und gute Einstellung). Als ich 2009 mein letztes Studium beendete, traf uns zufällig die US-Subprime-Hypothekenkrise, was es für diejenigen von uns, die zu US-Unternehmen gehen wollten, noch schwieriger machte, ausgebeutet zu werden. Glücklicherweise habe ich fünf Tests bestanden, sechs Generäle besiegt und es schließlich geschafft, nach dem Praktikum zu bleiben. Ursache und Wirkung lassen sich in den wenigen Tagen des Interviews offensichtlich nicht klären, also müssen wir mit „Hallo Welt“ beginnen.
# Mittelschule
Ich hatte das Glück, seit der zweiten Klasse der Mittelschule Programmieren zu lernen. Zu dieser Zeit befand sich die Welt bereits auf einem modernen Stand. Das Betriebssystem verfügte über einen virtuellen Speicher, eine grafische Oberfläche, das Internet, Entwicklungssoftware und integrierte Entwicklungsumgebungen. Das Kompilieren eines Programms erforderte mehrere Wechsel der Datenträger, wie von einigen alten Hasen beschrieben . Die Tage sind völlig anders.
Es war ein halbes Jahr, nachdem ich meinen Computer gekauft hatte, und ich war sehr neugierig auf alles, was ich sah. Außerdem war mein Vater damals nicht damit einverstanden, dass ich Spiele spielte, also dachte ich darüber nach, selbst ein paar Spiele zu machen dass ich es offen machen könnte. Als ich hörte, dass die Shantou Overseas Chinese Middle School Visual Basic 5.0-Kurse anbot, war ich ziemlich aufgeregt. Aber die Aufregung ist im Vergleich zu dem Tag, an dem ich vor meinem ersten Computerkurs übermäßig aufgeregt war und so schnell mit dem Fahrrad fuhr, kaum zu übersehen, dass ich stark blutete und ein paar Zähne verlor.
Es war noch das erste Jahr des 21. Jahrhunderts, als der Internetzugang extrem teuer war und Google gerade erst gestartet war und fast niemand davon wusste, dass es viel schwieriger war als heute, Programmieren zu lernen. Als ich nach Wissen suchte, war das Internet im Grunde genommen hoffnungslos, also entwickelte ich das Hobby, in Buchhandlungen zu gehen.
Es dauerte nicht lange, bis ich ein Buch mit dem Titel „Visual Studio Advanced Graphics Programming Tutorial“ fand. Mir gefällt dieses Buch sehr gut und ich kann es kaum aus der Hand legen. Leider war der Inhalt zu fortgeschritten, sodass es später Geschichten darüber gab, wie ich im dritten Jahr der Mittelschule durch Selbststudium rudimentäre dreidimensionale analytische Geometrie erlernt habe und dass ich den Vorlesungen im Unterricht in der Schule nicht zugehört habe Im dritten Jahr der High School verließ ich mich nur auf meine eigene mathematische Analyse, verstand sie aber später.
In der Mitte habe ich versucht, mithilfe der Programmierung viele komplexe Grafiken zu zeichnen und verschiedene komplexe Transformationen an Bildern durchzuführen, sodass ich lange Formeln auf Papier ableiten musste, bevor ich ein Programm schreiben konnte. Wenn das Ausführungsergebnis des Programms falsch ist, gibt es keine Möglichkeit, es zu debuggen. Daher müssen wir es erneut ableiten, in der Hoffnung, ein paar Fehler in der Formel zu finden, die erklären, warum der Fehler aufgetreten ist.
Von da an war ich sehr gut im symbolischen Rechnen. Darüber hinaus gibt es zu viele Dinge zu berechnen, egal ob ich Mathe- und Physik-Hausaufgaben mache oder Formeln durch Programmieren ableite, und ich bin zu faul, überall nach Zetteln zu suchen, sodass ich mir die Fähigkeit angeeignet habe, komplexe Prozesse mental zu berechnen (leider habe ich sie verloren). es jetzt). Das brachte mir übrigens auch einen Vorteil, das heißt, ich habe alle Antworten auf die Multiple-Choice-Mathematikfragen der Hochschulaufnahmeprüfung innerhalb von 10 Minuten nach der Abgabe der Arbeiten im Kopf berechnet und durfte nicht schreiben. Und das waren sie auch alles richtig.
Nachdem ich mich lange Zeit mit Grafikprogrammierung beschäftigt hatte, erinnerte ich mich an mein ursprüngliches Ideal und begann, Spiele zu spielen. Damals sah ich „Heroes of Mana“, das von der Chengdu Golden Pin Working Group entwickelt wurde, was meine Begeisterung für die Entwicklung von Rollenspielen entfachte. Nach mehreren Fehlschlägen habe ich am ersten Tag des ersten Mondmonats meines zweiten High-School-Jahres endlich die gesamte Codierungsarbeit für „Tiandi Zhuan“ abgeschlossen und es nicht lange danach auf die GameRes-Website hochgeladen.
Dies ist mein erstes Programm mit über 10.000 Zeilen. Um es erfolgreich abzuschließen, habe ich viele Wahrheiten gelernt, unter anderem, warum es objektorientiert ist und warum es notwendig ist, Module zu unterteilen, um die gegenseitige Abhängigkeit zu verringern. Dies bot mir später auch die Gelegenheit, meine eigene grafische Benutzeroberfläche und Skript-Engine zu entwickeln. Später habe ich versucht, OpenGL zum Erstellen von 3D-Spielen zu verwenden, aber weil es schwierig war, Künstler mit gleichen Interessen zu finden, die mit mir zusammenarbeiten konnten, habe ich aufgegeben. Aber das gab mir viel Zeit, in die grafische Oberfläche und die Skript-Engine zu investieren.
Später kam mir die Idee, Hochsprachen zu erklären. Dies war der erste Wendepunkt in meiner gesamten Programmiergeschichte. Zu dieser Zeit verwendete ich nur verknüpfte Listen für die Datenstruktur und hatte noch nie von Kompilierungsprinzipien oder Entwurfsmustern gehört. Natürlich war es damals schwieriger, Hochsprachen zu erklären. Deshalb habe ich nach vielen Tagen intensiven Nachdenkens eine Methode entwickelt, die jetzt als One-Pass-Kompilierung bezeichnet wird (was ebenfalls sehr schlecht ist), um eine einfache Hochsprache in eine einfache Befehlssatzsprache umzuwandeln, die der Assembler ähnelt.
Da ich mich zu diesem Zeitpunkt bereits im Abschlussjahr der High School befand, hatte ich eigentlich nicht viel Zeit, um in die Programmierung zu investieren. Daher war der erste Prototyp, den ich erstellte, ein vereinfachter Pascal-Interpreter, der in Delphi entwickelt wurde. Wenn ich jetzt darüber nachdenke, muss es viele Speicherlecks und Leistungsprobleme gegeben haben, aber ich wusste damals nicht, was das für Dinge waren. Während der drei Monate des Nichtstuns nach dem Abitur habe ich dieses Ding neu gestaltet und einen Plan mit Dutzenden von Seiten erstellt. Da ich keine Zeit hatte, es fertigzustellen, druckte ich es aus und brachte es zur South China University of Technology.
#Universität
Nur ein paar Tage nach meinem College-Eintritt hörte ich von einer älteren Schwester, dass unser Klassenlehrer, Herr Chen Jian, Zusammenstellungsprinzipien lehrt, also zeigte ich ihr diesen Stapel Papier. Sie sagte nichts (rückblickend kann ich nur sagen, dass das Design wirklich unansehnlich war ...) und gab mir ein Lehrbuch über Kompilierungsprinzipien. Ich habe es schnell zu Ende gelesen und dann das darin enthaltene Wissen genutzt, um die erste echte Skript-Engine zu erstellen. Die Syntax hat einige einfache Teile der Java-Sprache kopiert und außerdem eine Funktion hinzugefügt, die die Vorlagenparameter automatisch in die Syntax des Objekttyps ändert namens Jupiter. Später nahm ich an einem Java-Kurs teil und stellte fest, dass Java dies tatsächlich tat, was mich sehr seltsam fühlte.
Später habe ich nacheinander viele Skript-Engines geschrieben. Jove, das ich als Neuling entwickelt habe, war meiner Meinung nach die erste Skript-Engine, die immer noch beliebt war. Die zweite ist die dynamische Sprache, die ich in meinem zweiten Jahr entwickelt habe, nachdem ich in meinem zweiten Jahr gescheitert bin und viele Lektionen gelernt habe. Der Name ist Free (zu finden auf meinem Blog http://www.cppblog.com/vczh). Kürzlich ist geplant, es auf 3.0 zu aktualisieren, um mit GacUI zusammenzuarbeiten, einer in der Entwicklung befindlichen grafikkartenbeschleunigten GUI-Klassenbibliothek. Als nächstes habe ich während meines Praktikums in der WCFTools-Gruppe von Microsoft Shanghai jeden Abend eine rein funktionale Sprache namens KernelFP fertiggestellt, die später zu meinem Abschlussprojekt wurde.
Nachdem ich meine Abschlussarbeit eingereicht hatte, schloss ich CMinus innerhalb weniger Monate vor meinem Abschluss ab. Dabei handelt es sich nicht um den extrem einfachen CMinus, der im Kurs „Kompilierungsprinzipien“ entwickelt wurde, sondern um einen vollständigen C-Sprachcompiler (die Syntax der Funktionszeiger wurde von mir geändert, wird aber weiterhin unterstützt). Das Kompilierungsergebnis ist ein im Speicher gespeicherter X86-Binärcode. Die Startadresse der Funktion kann erzwungen werden, in einen Funktionszeiger umgewandelt und direkt im C++-Programm verwendet zu werden beim Generieren von Anweisungen Die Konvention ist im MSDN klar beschrieben.
Nach meinem Abschluss habe ich ehrgeizig NativeX entwickelt, eine C-Sprache mit Generika und Konzeptzuordnung. Vor ein paar Monaten habe ich versucht, C# zu kopieren, aber C# war zu kompliziert, also habe ich mich für GacUI entschieden. Ich habe auch viele Klassenbibliotheken für grafische Schnittstellen (GUI) geschrieben. Nachdem in der High School zwei Steuerungsbibliotheken für RPGs entwickelt wurden, scheiterten zwei GUI-Bibliotheken, die im College mit OpenGL entwickelt wurden. Später wurde auch die Windows-API (Vczh-GUI) gekapselt, um ihre Benutzerfreundlichkeit an VCL oder WinForm anzunähern.
Nach meinem Abschluss habe ich mehrmals versucht, eine renderbasierte GUI zu veröffentlichen und die Architektur mehrmals geändert. Erst mit der GacUI, die ich jetzt entwickle, hatte ich das Gefühl, auf dem richtigen Weg zu sein. Eine Schlussfolgerung, die ich in diesem Prozess gezogen habe, ist: Das Design von Windows Presentation Foundation ist wirklich perfekt ... Zusätzlich zu diesen Aufgaben habe ich auch drei Software-Rendering-Programme für dreidimensionale Objekte entwickelt. Die ersten beiden wurden vor meinem Abschluss erstellt. , das letzte wurde vor einem Jahr entwickelt, weil ich nicht wusste, wie ich meine Freizeit nutzen sollte, um mein Leben zu bereichern. Es wurde entwickelt, um die Zeit totzuschlagen.
Hier denke ich, dass ich eine Frage beantworten kann, die ich vor einem Monat von meinen jüngeren Brüdern und Schwestern nicht gut beantworten konnte. Wie finde ich einen Job bei Microsoft? Weil ich alles, was ich oben getan habe, in meinen Lebenslauf geschrieben habe. Gleichzeitig ist es bereits zu spät, wenn Sie diese Frage erst in Ihrem Abschlussjahr stellen ...
Erwähnenswert ist, dass ich seit meinem ersten Studienjahr einen Studenten einer Software-Hochschule, der fast keine Grundkenntnisse hatte und zwei Klassen unter mir war, darin coachte, Programmieren zu lernen. Um der anderen Partei eine solide C++-Grundlage und ein kompetentes Unit-Test-Schreibniveau zu vermitteln und in der Lage zu sein, nach Erhalt meiner dreijährigen Ausbildung intuitiv einige nicht allzu schlechte Designs zu entwickeln, habe ich viele Inhalte über C++ überprüft, insbesondere für Ich bereite mich seit mehreren Tagen auf mehrere Zeigerkurse vor und es gibt jeden Tag eine Aufgabe. Während dieses Prozesses hatte ich das tiefe Gefühl, dass man, wenn man sein Programmierniveau schnell verbessern will, immer etwas tun muss, was man tun kann, aber es ist so schwierig, dass man es nicht tun kann, wenn es nur ein bisschen schwieriger ist. Wenn Sie noch mehrere Jahre so weitermachen, werden Sie definitiv in die Riege der Meister aufsteigen.
Daher habe ich bei der Hausaufgabenvermittlung den Inhalt der Hinweise bewusst verschoben. Lassen Sie die andere Partei zunächst Variablen und Verzweigungsschleifen akzeptieren, entwickeln Sie dann einen guten Stil (z. B. können Sie Variablen nicht immer mit einem Buchstaben benennen usw.), lernen Sie dann, wie man Arrays bedient, und im nächsten Schritt geht es um Zeiger ohne erzwungene Typkonvertierung, und innerhalb eines Monats habe ich eine String-Klasse mit Unit-Tests erstellt. Der entscheidende Punkt bei Zeigern besteht darin, dass die andere Partei das Konzept „Der Zeiger selbst ist eine Zahl, die auf die Position zeigt“ genau versteht. Zu diesem Zweck habe ich speziell eine Assemblersprache mit nur einem globalen Array unendlicher Länge entworfen (aber nicht implementiert), um einige komplexe Konzepte hinter Zeigern zu erklären. Danach gibt es einige Kenntnisse über Objektorientierung, Designmuster und Dinge im Zusammenhang mit Skript-Engines.
Das Abschlussprojekt des Studenten ist eine einfache dynamische Sprachskript-Engine, und die Implementierung der Skript-Engine führt eine Listenverarbeitungsfunktionsbibliothek, die ich Linq nachgeahmt habe, korrekt aus. Diese Implementierung von Abschlüssen ist übereinander geschichtet, fügt einem Objekt überall Löschfunktionen hinzu und erstellt verschiedene Iteratoren mit verzögerter Ausführung, die die Implementierung einer Skript-Engine testen können. Die andere Partei wurde nach ihrem Abschluss von NetEase rekrutiert und erhielt eine menschenwürdige Behandlung.
Meine Programmierreise umfasst nicht nur die Programme, die ich in meiner Freizeit gemacht habe, sondern auch den Prozess des Praktikums und der Arbeit bei Microsoft. Als ich in der High School war, hörte ich vom Microsoft Club an der South China University of Technology und verspürte auch eine gewisse Sehnsucht nach Microsoft. Deshalb habe ich nach meiner Einschreibung zusätzlich zur Studentenvereinigung der Hochschule mitgeholfen Achten Sie auf den Microsoft Club. Rekrutieren Sie neue Mitglieder und ignorieren Sie alle anderen Vereine. Aber ehrlich gesagt war meine Arbeit im Studentenwerk und im Microsoft Club nur ein Nebenschauplatz und ich habe nie etwas Ernsthaftes gemacht.
Als ich im zweiten Studienjahr war und das Microsoft Search Technology Center (STC) zum Microsoft Club kam, um Lebensläufe zu sammeln, traf ich unterwegs Lehrerin Chen Jian, die zuvor erwähnte Klassenlehrerin, und erzählte ihr von dieser Angelegenheit. Später gab ich auf, weil die andere Partei meinte, ich sei zu jung, weil alle anderen Doktoranden seien. Als ich noch im dritten Studienjahr war, erwähnte die Lehrerin Chen Jian mir gegenüber, dass sie alte Klassenkameraden bitten könne, mir bei der Einreichung meines Praktikumslebenslaufs bei Microsoft zu helfen, und so erhielt ich im März 2008 ein Telefoninterview von Microsoft Shanghai. Es gab zwei Telefoninterviews, das erste Mal mit einem HR-Mitarbeiter und das zweite Mal mit einem Software-Ingenieur. Während des zweiten Telefoninterviews sprachen wir über das oben erwähnte Free und führten auch eine leidenschaftliche Diskussion über einige Fragen der Datenstruktur und des Framework-Designs. Innerhalb weniger Tage erhielt ich die Benachrichtigung über das Vorstellungsgespräch und ging für ein Vorstellungsgespräch zum Zizhu Digital Information Port im Bezirk Minhang in Shanghai. Das war das erste Interview in meinem Leben.
# Praktikum
Die Interviewvereinbarungen von Microsoft sind sekundengenau, was viel benutzerfreundlicher ist als bei einigen anderen Unternehmen und keine Stunden der Zeit anderer Leute verschwendet. Für das Praktikum gab es drei Interviewrunden, alle Gespräche wurden auf Englisch geführt, obwohl nur einer von ihnen ein Ausländer war. Ich erinnere mich noch dunkel daran, dass ich, als ich von diesem jungen Ausländer interviewt wurde, zu nervös war und nicht in der Lage war, auf eine einfache Frage die optimale Antwort zu geben. Aber schließlich erlaubten sie mir, als Praktikant einem Microsoft WCF Tools-Team in Shanghai beizutreten.
Dieses Team hat einen Softwareentwicklungsmanager, Herrn Ge Ziang, den ich sehr respektiere. Herr Ge ist ein Mensch, der Agilität liebt und sich oft der Praxis widmet. Während meines 4,5-monatigen Praktikums hat er mir viel über Software-Engineering beigebracht, und das Wichtigste, was mir sehr geholfen hat, war das Unit-Testen.
Darüber hinaus erlebte ich auch schnelle Iterationen, Scrum-Meetings, Paarprogrammierung und kollaborative Entwicklungsprozesse mit mehreren Personen auf Basis eines Quellcode-Versionsverwaltungssystems (wir verwendeten TFS). Nachdem ich PetShop modifiziert hatte, um eine WCF-Demo für die TechEd-Konferenz zu erstellen, Fehler für das WCF-Entwicklungstool von Visual Studio 2010 behoben und einen hoch skalierbaren Konfigurationsdatei-Editor entwickelt hatte, beendete ich mein Praktikum bei Microsoft im Dezember 2008. Nach diesem Praktikum hat sich auch meine Fähigkeit zur Kontrolle des Quellcodes verbessert, was sich direkt in der Codequalität der Projekte widerspiegelt, die ich in meiner Freizeit entwickle.
# Werden Sie Stammgast
Vor Ende des Praktikums wurde mir ein Vorstellungsgespräch als Vollzeitbeschäftigter (FTE) angeboten. Die Situation war damals sehr ernst. Die Subprime-Hypothekenkrise 2008 in den Vereinigten Staaten wirkte sich offiziell im Oktober auf Microsoft Shanghai aus, und das Unternehmen beschloss, die Zahl der Einstellungen von Vollzeitkräften in diesem Zeitraum zu reduzieren. Ich hatte im November ein Vorstellungsgespräch für eine Festanstellung und dieser Vorfall machte mich sehr nervös. Später sagte Herr Ge, dass sein persönlicher Vorschlag darin bestand, dass er hoffte, dass ich nach meinem Abschluss bleiben und weiter arbeiten würde, was mir Sicherheit gab.
Es gibt fünf Interviewrunden für Praktikanten, um Vollzeitkräfte zu werden. Was mich sehr beeindruckt hat, war, dass der Interviewer mir in einer Runde viele sehr komplexe Fragen stellte und mir schließlich eine Frage zur Online-Aktualisierung von Hinweis-Binärbäumen stellte, aber ich kann mich nicht an den spezifischen Inhalt erinnern. Ich erinnere mich nur daran, dass die Zeit vorbei war und ich keine Zeit mehr hatte, Code auf das Whiteboard zu schreiben, nachdem ich lange gebraucht hatte, um endlich über einen richtigen Algorithmus nachzudenken. Später habe ich das Vorstellungsgespräch endlich bestanden und einer der wenigen Plätze wurde mir endgültig weggenommen. Allerdings habe ich gehört, dass die Beschränkungen in ein paar Monaten gelockert werden, sodass es nicht mehr so schwierig sein wird wie bei meinem Vorstellungsgespräch.
Während des Praktikums und des Vorstellungsgesprächs hatte ich das Gefühl, dass viele der von der School of Software der South China University of Technology angebotenen Kurse tatsächlich sehr nützlich waren, insbesondere die über Datenstruktur, Designmuster und Softwaretests. Dies sind sehr nützliche Kenntnisse im Berufsleben, und es ist auch notwendig, bei zukünftigen Arbeiten weiterhin Erfahrungen in diesen Dingen zu sammeln. Nur weil die Hochschule eine große Anzahl von Studenten hat und es einer neuen Hochschule immer an Lehrpersonal mangelt, sagten viele meiner Klassenkameraden, dass es schwierig sei, die Rolle der im Lehrbuch erwähnten Inhalte zu verstehen. Vermutlich ist es heute viel besser als damals.
#Microsoft SQL Server
Vom Ende des Vorstellungsgesprächs bis zu dem Zeitpunkt, an dem ich das Angebot erhielt, vergingen Dutzende Tage, und die letzte Benachrichtigung von der Personalabteilung traf schließlich am Silvesterabend ein. In den nächsten sechs Monaten machte ich in der Schule weiter mein eigenes Ding, nahm gelegentlich an einigen Aktivitäten teil, um Erfahrungen usw. einzubringen, und ging mit einigen Leuten zum Spielen. Nach seinem Abschluss ging er zu Microsoft nach Shanghai. Aufgrund der Quotenänderung habe ich zwar das Angebot von WCF Tools angenommen, aber vorher keine Benachrichtigung erhalten. Da ich Datenbanken nicht mag und sehr wenig Verständnis für SQL Server habe, habe ich anderthalb Jahre damit verbracht, SQL Server Management Studio (auch bekannt als die legendäre „Schnittstelle“) zu entwickeln. Während dieser Zeit habe ich meinen Kollegen einige Kenntnisse über Unit-Tests, Schnittstellenentwicklung, Designmuster, Linq und Syntaxanalysatoren vermittelt.
Diese anderthalb Jahre Erfahrung haben mich sehr weiterentwickelt, vor allem weil ich im Vergleich zu Praktika, wenn ich offiziell arbeite, immer einen leidenschaftlichen und umfassenden Austausch mit anderen Teams, Unternehmen, ethnischen Gruppen, Ländern und Arten führen muss, und das auch nimmt viel Zeit in Anspruch. Manchmal muss ich in die Vereinigten Staaten fliegen, um die Überlegenheit des Sozialismus zu erleben. Der Schnittstellenteil der formalen Software ist sehr komplex, da sich nicht nur die DPI des Betriebssystems und der Lokalisierungsprozess ändern (der größte Teil des Inhalts besteht darin, den Text auf der Benutzeroberfläche in andere Sprachen zu übersetzen), sondern auch das Layout der Benutzeroberfläche automatisch so angepasst werden, dass ein Teil des Textes nicht verloren geht oder nur die Hälfte der Schaltflächen angezeigt wird, und dass verschiedene Arten von behinderten Menschen (insbesondere Menschen, die ihr Sehvermögen verloren haben) berücksichtigt werden müssen und einige Laufzeitschnittstellen für einige selbst bereitgestellt werden müssen -Zeichnen Sie komplexe Inhalte, damit das automatische Testteam seine Aufgaben erledigen kann.
Diese Erfahrung ließ mich spüren, wie schwierig es ist, eine anspruchsvolle Benutzeroberfläche zu entwickeln. Ein anderes Gefühl betrifft Nachfrageänderungen. Die Existenz von Entwurfsmustern besteht darin, Änderungen in den Anforderungen zu widerstehen. Ich konnte diese Wahrheit erst verstehen, als ich anfing zu arbeiten. Sie müssen die Architektur einer Software so gut gestalten, dass Ihr Code als Ganzes auch nach umfangreichen Änderungen der Anforderungen immer noch schön, leicht zu ändern, leistungsfähig und sicher ist. Nicht jede Änderung kann ein Patch sein, Sie müssen immer eine Umgestaltung vornehmen, um Ihren Code als Ganzes jederzeit gut zu machen. Um dieses Ziel zu erreichen, müssen Sie Entwurfsmuster beherrschen und zur Entwicklung von Projekten verwenden.
Einer der seltenen Vorteile von Microsoft im Vergleich zu anderen Unternehmen besteht darin, dass Sie viel Zeit haben, die Software langsam fertigzustellen. Und diese gute Definition konzentriert sich natürlich auf Funktionalität und Wartbarkeit. Wenn ein Code eine sehr subtile Methode verwendet, um eine Aufgabe mit hoher Geschwindigkeit zu erledigen, aber so kompliziert ist, dass er von nachfolgenden Betreuern nicht verstanden werden kann, selbst wenn er vollständig mit Kommentaren geschrieben ist, dann hat der Code keinen praktischen Wert. Ein guter Code zeichnet sich nicht dadurch aus, wie clever sein Design oder wie fortschrittlich sein Algorithmus ist, sondern darin, dass er von Tausenden von Menschen gleichzeitig über einen Zeitraum von 10 Jahren entwickelt werden kann und dabei kontinuierlich Funktionen hinzugefügt wird. es wird nicht zu verwirrend werden. Dies führte dazu, dass ein Umschreiben erforderlich wurde.
# Job-Hopping
Später habe ich aus bestimmten Gründen einen Personaltransfer zu Microsoft Research Asia (MSRA) beantragt. Im Januar 2011 reiste ich nach Zustimmung meines Vorgesetzten von Shanghai nach Peking, um an einem Vorstellungsgespräch im Institut teilzunehmen. Diesmal gibt es noch fünf Interviewrunden. Dieses Interview war schwierig. Einer der Interviewer fand in meinem Lebenslauf viele Dinge im Zusammenhang mit Compilern und beschloss, mich zu bitten, eine strncpy-Funktion zu implementieren. Die Anforderung ist, dass die Anzahl der CPU-Zugriffe auf den Speicher minimal sein sollte. Dies beinhaltet verschiedene Probleme wie Bandbreite, Ausrichtung und binäre Byte-Verschiebungsvorgänge. Die Methode selbst ist bereits sehr umständlich und beim Schreiben von Code auf Papier sind Fehler unvermeidlich, sodass ich immer noch keine Zeit habe, das gesamte Programm fertig zu schreiben. Ein anderer Interviewer, ein Ausländer, hat in seiner Jugend auch einige Compiler-Arbeiten durchgeführt. Was mich überraschte, war, dass er mir während des Interviews keine Fragen stellte. Stattdessen sprach er in einer Stunde über verschiedene Algorithmen und Probleme mit Compilern Das Wissen, das ich wusste, wurde offenbart, weil ich die Fragen beantworten musste. Mit diesem Mann entwickelte sich dann eine tiefe Freundschaft.
Kurz darauf wurde mir die Versetzung genehmigt. Nachdem ich einige Abschlussarbeiten erledigt hatte, darunter die Festlegung von Unit-Testing-Standards für das SQL Server-Team in Shanghai, ging ich im April 2011 nach Peking und wurde offiziell Mitglied von Microsoft Research Asia, wo ich einige Arbeiten im Zusammenhang mit der verteilten Systemforschung durchführte.
#Microsoft Research Asia
Die Arbeit des Forschungsinstituts ist etwas ganz Besonderes, vor allem weil ich an keinen Langzeitprojekten beteiligt war und immer mit wenigen Forschern zusammengearbeitet habe. Das erste Projekt ist hauptsächlich ein dynamisches Analyseprojekt, um festzustellen, ob ein C/S-Architekturprogramm blockiert, und um einige Berichte bereitzustellen, die Programmierern helfen, die Grundursache des Problems zu verstehen und ihre eigenen Programme weiter zu ändern und zu debuggen. Später folgte ich ihnen beim Aufbau einer Bildsuchmaschine und einer verteilten Diagrammdatenbank. Bevor ich ging, half ich ihnen beim Aufbau mehrerer Crawler, um die Daten von Microsofts eigenem Wissensdiagrammprojekt usw. anzureichern.
In den letzten Jahren am Institut habe ich neben dem Erwerb einiger technischer Kenntnisse und dem Erlernen, wie man ein Veteran wird, den größten technischen Fortschritt nach wie vor durch die von mir entwickelten Projekte erzielt. Die Struktur des Instituts eignet sich sehr gut für Programmierer wie mich, die gerne mit komplexen (aber nicht unbedingt neuen) Technologien spielen. Darüber hinaus war Zou Xin mein direkter Vorgesetzter am Institut, wodurch mir klar wurde, wie wichtig eine gute Führungskraft ist.
Es ist viereinhalb Jahre her, seit ich es geschrieben habe. Die ursprüngliche Absicht beim Schreiben von GacUI bestand darin, eine IDE für meine eigene Sprache zu erstellen, aber es hat Spaß gemacht, einen Parser in C++ zu schreiben. Ich hatte zuvor mit Projekten experimentiert, in denen die Benutzeroberfläche in C# und der intelligente Eingabeaufforderungsalgorithmus in C++ geschrieben waren.
Später dachte ich einfach, es wäre toll, wenn das Ganze in C++ geschrieben werden könnte. Aber die Unterstützung von MVVM durch die C++-GUI-Bibliothek ist Quatsch, also wurde GacUI ins Leben gerufen. Aber der Arbeitsaufwand beim Erstellen einer GUI-Bibliothek ist wirklich etwas hoch, und ich strebe eine gute Entwicklungserfahrung an, also habe ich so lange daran gearbeitet. 1.0 soll dieses Jahr erscheinen...
Durch die Entwicklung von GacUI habe ich nicht nur die Erfahrungen und Lehren der 7 Heavenly Kingdoms-GUI-Bibliotheken, die ich im Laufe der Jahre erstellt hatte, verbessert, sondern auch gelernt, wie man plattformübergreifende Client-Programme mit minimalen Kosten entwickelt. Tatsächlich ist es überhaupt nicht schwierig, ein plattformübergreifendes Programm zu schreiben. Ich weiß nicht, warum es so viele Leute im Internet gibt, die darüber so viel Aufhebens machen. Ein weiterer Vorteil, den mir GacUI gebracht hat, besteht darin, dass ich im Grunde den gesamten Inhalt von Entwurfsmustern überprüft habe und aufgrund seiner enormen Größe auch ein kleines Tool erstellt habe, das speziell Teilreihenfolgeabhängigkeiten zwischen verschiedenen Git-Repos implementiert – verwendet, um den C++-Code unter einem zu verwenden Das gesamte Repo ist in zwei Dateien gepackt, sodass es direkt von anderen Repos verwendet werden kann. Ursprünglich wollte ich Submodule ausprobieren, aber Submodule können nur Baumabhängigkeiten implementieren, was wirklich schlecht ist.
GacUI überprüfte schließlich die zuvor erlernten Kompilierungsprinzipien. Denn beim Kompilieren von XML übersetzt GacUI tatsächlich alles in den Bytecode einer Skript-Engine. Am Ende führt es das Skript entweder direkt aus oder übersetzt das Skript in C++ (in Entwicklung). Um dies zu erreichen, ist es daher unvermeidlich, einen Compiler zu schreiben, und die kompilierten Dinge müssen in der Lage sein, mit den Klassen in C++ zu kommunizieren. Daher habe ich den Inhalt von COM noch einmal überprüft (obwohl ich ihn nicht verwendet habe, habe ich es einfach versucht Habe das Gleiche gemacht).
Nachdem die C++-Generation abgeschlossen ist, werde ich weiterhin GacJS schreiben, das ich letztes Jahr begonnen habe, GacUI in den Browser verschieben und meine IDE in allen Aspekten ausführen. Die Bereiche, in denen C++ geeignet ist, sind umfangreich und tiefgreifend.
# Ins Ausland gehen
Ich muss sagen, dass ich den Job zum Forschungsinstitut gewechselt habe, weil mir Datenbanken nicht gefielen. Infolgedessen hat das Forschungsinstitut gesehen, dass ich von SQL Server komme und eine Menge Datenbankkram für mich gemacht. Später fragte ich meinen Chef, ob ich noch etwas tun könnte? Der Chef fragte mich, was Sie tun möchten, und ich sagte: Versuchen Sie, ein paar Compiler-Sachen zu besorgen. Also veranlasste mein Chef später, dass ich für ein anderes Forschungsinstitut arbeitete, um eine Abfragesprache für eine verteilte Graphdatenbank zu entwickeln. Aber so etwas ist zunächst einmal super einfach. Nachdem ich es schnell erledigt hatte, wurde ich wieder Datenbankentwickler. Dadurch wurde mir eine Wahrheit klar: Die meisten Forschungsinstitute haben nichts, was mir gefällt.
Nach einigen Jahren wuchs meine Unzufriedenheit mit Peking (Grundschule) und dem Institut (Nebenfach) allmählich, sodass ich schnell eine Frau fand und mich engagierte. Tatsächlich ist es dasselbe wie ein gewöhnliches Vorstellungsgespräch:
6 .Visum beantragen
Dieser Prozess ließ mich seufzen, die amerikanischen Interviewer haben einfach nicht die Welt gesehen. Der Konkurrenzdruck ist zu gering und die gestellten Fragen sind super einfach. Sie müssen nach China kommen, um dort zu bleiben und sich zu treffen, sonst wird der US-Imperialismus früher oder später unter Druck gesetzt. Aber ich denke, ein weiterer Aspekt ist, dass das Team, das die plattformübergreifende Benutzeroberfläche für Office erstellt hat, einen Blick auf die von mir erstellte GacUI geworfen hat. Ich denke, sie fanden sie ziemlich gut, also haben sie mich beiläufig interviewt.
Obwohl es keinen großen Unterschied zwischen den Gehältern talentierter Menschen in China und den Vereinigten Staaten gibt, abgesehen von der Tatsache, dass die Immobilienpreise in den IT-Gebieten der Vereinigten Staaten denen in Peking, Shanghai und Guangzhou ähneln, gibt es außer Autos und anderen Dingen auch andere Dinge Elektrogeräte sind in den USA deutlich teurer. Insgesamt ist die Zufriedenheit zurückgegangen. Glücklicherweise ist die Luftverschmutzung in Chinas IT-entwickelten Gebieten so schwerwiegend, dass sie nicht nur diesen Mangel ausgleicht, sondern mir auch ein besseres Gefühl gibt, wenn ich ärmer wäre. Seitdem ich über die Mauer gesprungen bin, lebe ich ein Leben, in dem ich keine Zeit mehr habe, mit elektronischen Produkten zu spielen. Ich fahre, wenn ich Zeit habe, und gehe zur Arbeit, wenn ich keine Zeit habe.
Als ich dieses Mal den Job wechselte, traf ich zufällig jemanden von Microsoft, der Leute von Nokia entlassen wollte. Infolgedessen wurden die Quoten der meisten Teams eingefroren. Nur Office mit großen Taschen konnte Leute einstellen, also hatte ich keine andere Wahl ins Büro kommen. Ursprünglich bestand mein Ziel darin, eine JS-Engine für Edge zu erstellen oder zur VS-Gruppe zu gehen, um einen Compiler oder ähnliches zu erstellen, aber sie waren zu schlecht, also musste ich aufgeben.
Die Arbeit in Office hat mir die Augen geöffnet, wie man eine Software erstellt, die 30 Jahre lang von 10.000 Menschen geschrieben wurde und Hunderte von Gigabyte Code in einem Repo-Snapshot enthält. Da die Maschine zu teuer ist, können Sie den Code beim Ändern nur lokal kompilieren. Daher enthält der von uns auf Basis von msbuild erstellte CI-Satz auch den Code der lib/dll, der verknüpft werden muss, wenn er nicht vorhanden ist Gehen Sie zum Server, um den kompilierten Cache des aktuellen Prüfpunkts zu finden, und laden Sie die kompilierte Funktion herunter. Daher kann an den Tagen, an denen die Build-Farm gelegentlich aufhängt, die lokale Kompilierung aufgrund der unterbrochenen Netzwerkverbindung nicht durchgeführt werden.
# Epilog
Wenn ich auf meine Programmierreise zurückblicke, habe ich als Student wahrscheinlich angefangen, Spiele zu schreiben, dann Game-Engines zu schreiben und mich dann auf Grafiken, GUI-Bibliotheken und Skript-Engines zu spezialisieren, die von Game-Engines benötigt werden GUI-Bibliotheken und Compiler-Gerät. Als ich die Skript-Engine von Anfang an entworfen habe, habe ich der Frage, wie das Skript angehalten werden kann, große Aufmerksamkeit gewidmet – tatsächlich wurde es im Wesentlichen von den Anforderungen des Spiels abgeleitet –, sodass menschliches Fleisch verschiedene seltsame Implementierungen von Coroutine vornahm. Am Ende habe ich endlich die orthodoxe Methode gelernt, sodass das Problem, das leicht hätte gelöst werden können, aufgrund der späteren Anforderungen etwas komplizierter wurde (um es ganz klar auszudrücken: Es geht darum, Skripten die Anpassung (oder das Hacken) von Coroutinen zu ermöglichen Typsysteme), was dazu führt, dass unendlich komplexe Methoden zur Implementierung von Coroutinen erforderlich sind. Warum verletzen sich Menschen gegenseitig?
Als es um die Arbeit ging, war es im Grunde
1 Ich hatte ursprünglich vor, Visual Studio zu bekommen, und als ich Student war, mochte ich SQL nicht. Der Inhalt der Arbeit umfasste das Erlernen professioneller Datenbankkenntnisse und das Ziehen von Steuerelementen.
2. Aber nachdem ich mehrere Jahre lang gearbeitet hatte, hatte ich immer noch das Gefühl, dass mir SQL nicht gefiel, also wechselte ich zu MSRA. Daher versuchte MSRA ihr Bestes, um mir die Arbeit mit Datenbanken zu überlassen. Ich glaube nicht, dass ich gegangen bin, weil mir das nicht gefallen hat ...
3 Später dachte ich, okay, da der Compiler sowieso nicht gemacht werden muss, mache ich es einfach Ziehen Sie das Steuerelement. Also habe ich den Leuten im Büro gesagt: Schauen Sie sich an, wie großartig ich darin bin, GacUI zu erstellen! Die Leute im Büro sagten: Verdammt! Daher wurde ich eingestellt, um für den Nicht-GUI-Teil des Teams verantwortlich zu sein.
4. Nach einem halben Jahr fing der Chef an, die Arbeit zu organisieren, und ich überlegte, wie ich zum Ausdruck bringen konnte, dass ich immer noch gerne an anderen Dingen arbeite. Also fing ich endlich an, meinem alten Job nachzugehen – der Entwicklung interner Compiler für Office-Programmierer.
Endlich habe ich den Job gemacht, den ich liebe.
Das obige ist der detaillierte Inhalt vonLegendärer Programmierer Zhihu Wheel Brother, ich kniete nieder, nachdem ich das gelesen hatte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!