Vorwort
Die Programmierkenntnisse der Programmierer werden sich mit zunehmender Erfahrung schrittweise verbessern. Ich denke, die Programmierfähigkeit lässt sich in verschiedene Stufen einteilen.
Im Folgenden wird das Programmierfähigkeitshierarchiemodell in zwei Dimensionen erörtert.
Eine Dimension ist das Niveau der Programmierkenntnisse und die andere Dimension ist das Niveau der Domänenkenntnisse.
Programmierkompetenzniveau
Das Programmierkompetenzniveau bezieht sich auf die Fähigkeit des Programmierers, Programme zu entwerfen und zu schreiben. Dies ist die Grundlage der Programmierer.
Absatz 0 – Nicht-Programmierer:
Einsteiger in die Programmierung sind völlig verwirrt, wenn sie auf Probleme stoßen, und wissen nicht, wie sie programmieren sollen, um das Problem zu lösen. Mit anderen Worten, Sie sind immer noch Laie und können noch nicht als „Programmierer“ bezeichnet werden. Der Computer war immer noch eine mysteriöse Blackbox vor ihm.
Stufe 1 – Grundlegender Programmierer:
Nachdem Sie eine Zeit lang Programmieren gelernt haben, können Sie ein Programm schreiben, um die Aufgabe zu erledigen, wenn Sie eine Aufgabe erhalten.
Der geschriebene Code kann unter normalen Umständen funktionieren, im tatsächlichen Betrieb treten jedoch verschiedene Fehler auf, wenn bestimmte besondere Bedingungen auftreten. Mit anderen Worten: Wenn Sie die Möglichkeit haben, Demo-Software zu entwickeln, die entwickelte Software aber tatsächlich zur Nutzung an Kunden geliefert wird, werden Sie möglicherweise von Kunden beschimpft.
Der Programmierer hat das Programm geschrieben, aber warum es manchmal richtig funktioniert und manchmal nicht, weiß der Programmierer selbst nicht.
Wenn während des Betriebs ein Fehler auftritt oder sich die Anforderungen ändern, muss der Code geändert oder hinzugefügt werden. Bald wird die Programmstruktur chaotisch, der Code ist aufgebläht und es gibt viele Fehler. Bald waren selbst die ursprünglichen Entwickler nicht mehr bereit, die Pflege des Programms zu übernehmen.
Absatz 2 – Datenstruktur:
Nach einer Zeit der Programmierpraxis werden Programmierer die Bedeutung des alten Sprichworts „Datenstruktur + Algorithmus = Programm“ erkennen. Sie nutzen Algorithmen, um Probleme zu lösen. Darüber hinaus werden sie erkennen, dass Algorithmen im Wesentlichen von Datenstrukturen abhängen. Sobald eine gute Datenstruktur entworfen ist, entstehen gute Algorithmen.
Wenn Sie die falsche Datenstruktur entwerfen, ist es unmöglich, einen guten Algorithmus zu entwickeln.
Ich erinnere mich, dass ein ausländischer Weiser einmal sagte: „Zeigen Sie mir Ihre Datenstruktur!“
Absatz 3 – Objektorientiert:
Danach wird der Programmierer Sie zu schätzen wissen Leistungsfähigkeit der objektorientierten Programmierung. Die meisten modernen Programmiersprachen unterstützen die objektorientierte Programmierung. Dies bedeutet jedoch nicht, dass Sie objektorientierten Code schreiben, wenn Sie zum Programmieren eine objektorientierte Programmiersprache verwenden, wenn Sie Klassen verwenden oder sogar Klassen erben.
Ich habe viel prozessorientierten Code gesehen, der in Java, Python und Ruby geschrieben wurde.
Nur wenn Sie Schnittstellen beherrschen, Polymorphismus beherrschen und die Beziehung zwischen Klassen, Objekten und Objekten beherrschen, können Sie die objektorientierte Programmiertechnologie wirklich beherrschen.
Selbst wenn Sie eine traditionelle Programmiersprache verwenden, die keine objektorientierte Programmierung unterstützt, können Sie dennoch objektorientierte Programme entwickeln, solange Sie „Objekte“ im Kopf haben.
Wenn ich beispielsweise in der Sprache C programmiere, verwende ich bewusst objektorientierte Techniken, um Programme zu schreiben und zu entwerfen. Verwenden Sie struct, um Klassen zu simulieren, und fügen Sie Funktionen desselben Konzepttyps zusammen, um Klassen zu simulieren. Wenn Sie Zweifel haben, ob objektorientierter Code in der C-Sprache geschrieben werden kann, können Sie einen Blick auf den Linux-Kernel werfen. Er ist in der C-Sprache geschrieben, aber Sie können auch das starke „Objekt“ sehen, das aus den Zeilen seines Quellcodes hervorgeht . der Geschmack.
Es ist nicht einfach, die objektorientierte Programmiertechnologie wirklich zu beherrschen.
In meiner technischen Karriere gibt es zwei Hürden, die mir am meisten Kopfschmerzen bereiten.
Eine Hürde ist, dass ich beim Übergang von der DOS- zur Windows-Entwicklung das Konzept des Frameworks lange Zeit nicht verstehen konnte. Im Dos-Zeitalter ist alles ein Aufruf einer Funktionsbibliothek, und Ihr Programm ruft aktiv Funktionen auf. In der Windows-Ära wurde es durch ein Framework ersetzt. Sogar Ihr Hauptprogramm wird tatsächlich vom Framework aufgerufen. Der UI-Thread erhält die Nachricht vom Betriebssystem und sendet sie zur Verarbeitung an Ihr Programm. Das Spring-Framework, mit dem Java-Programmierer vertraut sind, ist ebenfalls ein solches Reverse-Call-Framework.
Da der Begriff „Framework“ heutzutage sehr nobel erscheint, nennen sich viele „Klassenbibliotheken“/„Funktionsbibliotheken“ selbst „Frameworks“. Meiner Meinung nach ist das alles ein Namensmissbrauch.
„Klassenbibliothek“/„Funktionsbibliothek“ bezieht sich auf den Code, den ich geschrieben habe, um sie aufzurufen.
„Framework“ bedeutet, dass ich die Rückruffunktion beim Framework registriere und das Framework die von mir geschriebene Funktion aufruft.
Eine weitere Hürde ist die Objektorientierung. Lange Zeit wusste ich nicht, wie man die Beziehung zwischen Klassen gestaltet, und ich konnte eine Klassenhierarchie nicht gut entwerfen.
Ich erinnere mich, dass ich damals ein Buch eines ausländischen Experten gelesen habe, in dem er über eine sehr einfache und praktische objektorientierte Designtechnik sprach: „Stellen Sie das Problem dar. Finden Sie dann die Substantive heraus und verwenden Sie sie, um Klassen zu erstellen.“ . Finden Sie die Verben heraus und verwenden Sie sie, um Klassenmethoden zu erstellen. Obwohl diese Technik recht effektiv ist, ist sie zu basisorientiert, hat keine theoretische Grundlage und ist nicht streng. Wenn das Problem schlecht formuliert ist, wird das resultierende Klassensystem problematisch sein.
Es sollte viele Möglichkeiten geben, objektorientiertes Denken zu beherrschen. Ich habe mich von relationalen Datenbanken inspirieren lassen, um objektorientiertes Designdenken zu verstehen und zu beherrschen.
Meiner Meinung nach ist eine relationale Datenbanktabelle tatsächlich eine Klasse, und jede Datensatzzeile ist eine Instanz einer Klasse, also ein Objekt. Die Beziehung zwischen Tabellen ist die Beziehung zwischen Klassen. Für die Zuordnung von objektorientiertem Code zu Datenbanktabellen wird die O-Rmapping-Technologie (z. B. Hibernate) verwendet, was auch zeigt, dass Klassen und Tabellen tatsächlich logisch äquivalent sind.
Da Datenbankdesign und Klassendesign gleichwertig sind, müssen Sie zum Entwerfen eines objektorientierten Systems nur die Designfähigkeiten relationaler Datenbanken nutzen.
Der Entwurf einer relationalen Datenbanktabellenstruktur ist sehr einfach:
1. Identifizieren Sie die Beziehung zwischen Tabellen, dh die Beziehung zwischen Klassen. Ist es eins-zu-eins, eins-zu-viele, viele-zu-eins oder viele-zu-viele? Dies ist die Beziehung zwischen Klassen.
2. Identifizieren Sie die Felder der Tabelle. Natürlich hat ein Objekt unzählige Attribute (z. B. eine Person: Größe, Gewicht, Geschlecht, Alter, Name, Ausweisnummer, Führerscheinnummer, Bankkartennummer, Reisepassnummer, Passnummer für Hongkong und Macau, Arbeitsnummer, Krankenversicherung). B. Geschichte, Heiratsgeschichte usw.), was wir zum Schreiben eines Programms zur Aufzeichnung benötigen, sind nur die Attribute, die uns wichtig sind. Diese relevanten Eigenschaften sind die Felder der Tabelle, also die Attribute der Klasse. „Dreitausend schwaches Wasser, ich nehme eine Schöpfkelle zum Trinken“!
Absatz 4 – Designmuster:
Ich habe einmal diesen Satz im Internet gesehen: „Wenn Sie nicht 100.000 Zeilen Code haben, sprechen Sie nicht mit mir über Designmuster.“ Ich stimme voll und ganz zu.
Ich erinnere mich, als ich Gofs Buch über Designmuster zum ersten Mal las, stellte ich fest, dass ich, obwohl ich vorher nichts über Designmuster wusste, einige Designmuster tatsächlich bewusst im eigentlichen Programmierprozess verwendet habe. Entwurfsmuster sind objektive Gesetze der Programmierung. Sie wurden von niemandem erfunden, sondern zuerst von einigen frühen erfahrenen Programmierern entdeckt.
Sie können ein Programm schreiben, das Ihren Anforderungen entspricht, ohne Entwurfsmuster zu verwenden. Sobald sich jedoch die späteren Anforderungen ändern, wird Ihr Programm nicht flexibel genug und nicht mehr nachhaltig sein. Nachdem das eigentliche Programm an den Kunden geliefert wurde, wird es auf jeden Fall weitere Rückmeldungen zur Nachfrage geben. Die Entwicklung weiterer Versionen wird die Nachfrage auf jeden Fall erhöhen. Dies ist eine Realität, der sich Programmierer nicht entziehen können.
Beim Schreiben von UI-Programmen, egal ob Web, Desktop, Mobil oder Spiel, müssen Sie das MVC-Entwurfsmuster verwenden. Andernfalls ist Ihr Programm angesichts späterer Änderungen der UI-Anforderungen nicht mehr tragfähig.
Designmuster, die wichtigste Idee ist die Entkopplung, die Entkopplung durch Schnittstellen. Wenn sich die Anforderungen in Zukunft ändern, müssen Sie auf diese Weise nur eine neue Implementierungsklasse bereitstellen.
Die wichtigsten Entwurfsmuster sind tatsächlich objektorientiert. Daher kann das Entwurfsmuster als eine fortgeschrittene Stufe der Objektorientierung betrachtet werden. Nur wenn wir Designmuster beherrschen, können wir davon ausgehen, dass wir objektorientierte Designtechniken wirklich und gründlich beherrschen.
Wenn ich eine neue Sprache lerne (einschließlich nicht objektorientierter Sprachen, wie z. B. funktionale Programmiersprachen), schaue ich mir immer an, wie verschiedene Entwurfsmuster in dieser Sprache funktionieren, nachdem ich deren Syntax verstanden habe. Dies ist auch ein Tipp zum Erlernen von Programmiersprachen.
5 Absätze – Sprachexperte:
Nach einer Zeit der Programmierpraxis beherrschen Programmierer eine gängige Programmiersprache recht gut. Einige Leute sind auch zu „Sprachanwälten“ geworden und können anderen Programmierern den Sprachgebrauch und verschiedene Fallstricke erklären.
Programmierer sind in dieser Phase oft treue Anhänger der von ihnen verwendeten Sprache. Sie streiten sich oft mit Benutzern anderer Sprachen in Communities und Foren darüber, welche Sprache die beste Programmiersprache ist. Sie denken, dass die Sprache, die sie verwenden, die beste Programmiersprache der Welt ist, ohne Ausnahme. Sie glauben, dass die von ihnen verwendete Programmiersprache für alle Szenarien geeignet ist. Sie sehen nur Hämmer und behandeln daher alle Aufgaben wie Nägel.
Absatz 6 – Mehrsprachiger Experte:
Programmierer haben in dieser Phase aufgrund von Arbeitsbeziehungen oder einfach aufgrund ihres Interesses an Technologie mehrere Programmiersprachen gelernt und beherrscht. Ich habe die unterschiedlichen Designideen verschiedener Programmiersprachen erlebt und verstehe die Stärken und Schwächen jeder Sprache besser.
Sie glauben jetzt, dass die Programmiersprache nicht das Wichtigste ist, sondern dass es sich bei der Programmiersprache nur um Grundkenntnisse handelt.
Sie werden jetzt verschiedene Programmiersprachen wählen, um Probleme basierend auf unterschiedlichen Aufgabenanforderungen oder unterschiedlichen Ressourcen zu lösen, und werden sich nicht mehr darüber beschweren, dass sie nicht eine bestimmte bevorzugte Programmiersprache für die Entwicklung verwenden.
Es gibt viele Schulen und Ideen für Programmiersprachen, und einige Programmiersprachen unterstützen mehrere Programmierparadigmen gleichzeitig.
Statisches Programmierparadigma
In einer Programmiersprache, die das statische Programmierparadigma übernimmt, müssen ihre Variablen explizit typisiert werden. Repräsentative Sprachen: C, C++, Pascal, Objective-C, Java, C#, VB.NET, Swift, Golang.
Dies hat folgende Vorteile:
1. Der Compiler kann Typfehler zur Kompilierungszeit finden.
2. Der Compiler kann die Leistung verbessern, indem er die Typinformationen beim Kompilieren kennt.
Dieses Paradigma geht davon aus, dass Programmierer die Art der Variablen kennen müssen. Wenn Sie die Art der Variablen nicht kennen, dann machen Sie keinen Spaß! Beim Kompilieren meldet das Programm einen Fehler.
Die Swift- und Go-Sprachen sind beide statisch typisierte Programmiersprachen, sie müssen den Typ jedoch nicht explizit angeben, sondern können seinen Typ automatisch durch den Compiler durch Inferenz bestimmen.
Dynamisches Typprogrammierparadigma
In einer Programmiersprache, die das statische Typprogrammierparadigma übernimmt, müssen ihre Variablen keine Typen explizit angeben. Jede Variable kann auf jeden Objekttyp verweisen. Repräsentative Sprachen: Python, Ruby, JavaScript.
Die Philosophie des dynamischen Tippens lässt sich mit dem Konzept des Duck-Typings zusammenfassen. Der von James Whitcomb Riley vorgeschlagene Ententest kann folgendermaßen ausgedrückt werden: „Wenn Sie einen Vogel sehen, der wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente quakt, dann kann der Vogel eine Ente genannt werden.“ 🎜> Dieses Paradigma geht davon aus, dass Programmierer den Typ der Variablen und die von ihr unterstützten Methoden und Eigenschaften kennen müssen. Wenn Sie den Typ der Variablen nicht kennen, dann machen Sie keinen Spaß! Das Programm stürzt beim Ausführen ab! Wer trägt die Schuld, wenn das Programm abstürzt? Geben Sie sich selbst die Schuld, Sie sind kein qualifizierter Programmierer!
Die Vorteile der dynamischen Typisierung sind:
Es besteht keine Notwendigkeit, Schnittstellen und abstrakte Typen explizit zu definieren. Solange ein Typ die erforderlichen Methoden und Eigenschaften unterstützt, ist er in Ordnung. Das Verfahren wird recht flexibel und einfach sein. Die Schnittstellen/Basisklassen, die C++, Java und C# als ihr Lebenselixier betrachten, werden in dynamischen Sprachen als nichts betrachtet!
Nachteile sind:
1. Wenn der Typ falsch ist, kann der Compiler den Fehler nicht finden, aber das Programm stürzt zur Laufzeit ab.
2. Da der Compiler den Typ der Variablen nicht kennt, kann er die Leistung nicht optimieren.
Objektorientiertes Programmierparadigma
Das objektorientierte Programmierparadigma begann in den späten 1970er Jahren aufzutauchen. Es unterstützt Klassen und Instanzen von Klassen als Module, die Code kapseln. Repräsentative Sprachen: Smalltalk, C++, Objective-C, Java, C#, VB.NET, Swift, Go, Python, Ruby, ActionScritp, OCaml.
Frühe Programmiersprachen waren alle prozessorientiert. Es sind Sequenzen, Bedingungen und Schleifen, die Funktionen bilden. Da die Größe des Codes zunimmt, wird es für notwendig erachtet, den Code zu modularisieren. Der einem Konzept entsprechende Code wird in einer Datei abgelegt, was die gleichzeitige Entwicklung und Codeverwaltung erleichtert.
Menschen haben auch die Regel „Programm = Datenstruktur + Algorithmus“ entdeckt. Daher sollten die einem Konzept entsprechenden Datenstrukturen und Funktionen in einer Datei abgelegt werden. Das ist das Konzept der Klassen.
Das objektorientierte Programmierparadigma hat die Produktionseffizienz tatsächlich erheblich verbessert und ist daher weit verbreitet. Daher gibt es viele Sprachen, die das objektorientierte Programmierparadigma auf Sprachebene unterstützen.
Obwohl die C-Sprache das objektorientierte Programmierparadigma auf Sprachebene nicht unterstützt, wird die moderne C-Sprachentwicklung die objektorientierte modulare Idee anwenden und die gleichen Arten von Datenstrukturen und Funktionen in einer Datei zusammenfassen. Verwenden Sie ein ähnliches Namensschema.
Schließlich unterstützt die C-Sprache keine objektorientierte Unterstützung auf Sprachebene, daher möchten viele Programmierer der C-Sprache objektorientierte Unterstützung hinzufügen. Vertreter sind C++ und Objective-C.
C++ ist eine neue Sprache, aber die meisten Sprachelemente sind mit C kompatibel.
Objective-C ist vollständig mit C kompatibel. Objective-C fügt C eine dünne Schicht syntaktischen Zuckers hinzu, um Schnittstellen (d. h. Klassen in anderen Sprachen) und Protokolle (d. h. Schnittstellen in anderen Sprachen) zu unterstützen. Sogar die anfängliche Implementierung von Objective-C war ein C-Sprach-Precompiler. Ehrlich gesagt ist Objective-C in seinem objektorientierten Systemdesign tatsächlich recht exquisit, abgesehen davon, dass die hinzugefügte Syntax nicht dem C-Fluss entspricht. In seinen frühen Jahren war Jobs sehr anspruchsvoll und nahm Objective-C in die Tasche. Da es in das Apple/NextStep-System integriert war, wussten nur wenige Leute davon. Mit der Popularität von iOS-Systemen ist Objective-C in den letzten Jahren auf der ganzen Welt bekannt geworden.
Funktionales Programmierparadigma
Das funktionale Programmierparadigma ist eine Programmiersprache, die von einigen Mathematikern erfunden wurde. Sie glauben, dass Programme mathematische Funktionen sind. Repräsentative Sprachen: Lisp, Erlang, JavaScript, OCaml, Prog.
Es gibt viele Experten, die die funktionale Programmiersprache stark befürwortet haben und sie für äußerst revolutionär halten. Aber ich denke, sie haben die Macht des funktionalen Programmierparadigmas überschätzt. Ich glaube nicht, dass das funktionale Programmierparadigma besser ist als das objektorientierte Programmierparadigma.
Der Kern funktionaler Programmiersprachen sind Funktionen, und sie haben kein Klassenkonzept. Seine Funktionen entsprechen jedoch nicht denen traditioneller prozessorientierter Sprachen. Seine Funktionen unterstützen das Konzept des „Abschlusses“.
Meiner Meinung nach sind Funktionen in funktionalen Programmiersprachen, auch „Closures“ genannt, eigentlich „Klassen“, um es ganz klar auszudrücken. Die Entwicklung von Programmiersprachen erfordert bis heute eine Modularisierung und die Kombination von „Datenstruktur“ und „Algorithmus“. Unabhängig von der Sprache gibt es keinen Ausweg, wenn die Programmiermethode sie nicht kombiniert.
Die objektorientierte Programmiersprache verwendet Klassen, um „Datenstruktur“ und „Algorithmus“ zu kombinieren. Der Kern einer Klasse ist die „Datenstruktur“, also ihre „Eigenschaften“, nicht der „Algorithmus“, ihre „Funktion“. In einer Klasse sind es die Funktionen, die den Eigenschaften zugeordnet sind.
Die funktionale Programmiersprache verwendet Abschlüsse, um „Datenstruktur“ und „Algorithmus“ zu kombinieren. Es handelt sich um eine Funktion, die externe Felder erfassen kann. Es ist die „Eigenschaft“, die mit der „Funktion“ verbunden ist.
„Klasse“ ist im Wesentlichen gleichbedeutend mit „Abschluss“. Viele objektorientierte Programmiersprachen unterstützen inzwischen Abschlüsse. Wenn wir ihre Codes beobachten, können wir feststellen, dass sie tatsächlich „Klassen“ verwenden, um „Abschlüsse“ zu implementieren.
Welches ist einfacher zu verwenden, „Klasse“ oder „Abschluss“? Offensichtlich „Klasse“.
Und „Abschluss“ ist prägnanter, daher wird „Abschluss“ häufig verwendet, um anonyme Klassen in objektorientierten Programmiersprachen zu ersetzen. Es ist zu mühsam, eine Klasse mit nur einer Funktion zu schreiben. Es ist besser, sie als Abschluss zu schreiben, was prägnanter ist.
Lassen Sie uns über die Sprache OCaml beschweren. Sie ist eine sehr gute funktionale Sprache und unterstützt sowohl objektorientierte als auch funktionale Programmierparadigmen. Es ist genauso hirnzerreißend wie C++.
Es gibt auch viele objektorientierte Sprachcontroller, die von JavaScript genervt sind und immer objektorientierte Unterstützung zu JavaScript hinzufügen möchten. ActionScript ist ein solcher Versuch. Ich habe es verwendet und es unterscheidet sich wirklich nicht viel von Java.
Beschweren wir uns noch einmal über ExtJS. Als ich mich für ein Web-Frontend-Entwicklungsframework entschieden habe, habe ich ExtJS und JQuery verglichen.
ExtJS wurde offensichtlich von Java-Experten entwickelt. Sie verwendeten JavaScript, um die Designideen von Swing zu imitieren und erstellten eine UI-Bibliothek.
Die JQuery-Entwickler haben offensichtlich das funktionale Programmierparadigma von JavaScript verstanden und eine UI-Bibliothek erstellt, die auf den Merkmalen der dynamischen funktionalen Programmiersprache von JavaScript basiert, was ExtJS sofort zum Erliegen brachte.
Aus der Geschichte von ExtJS und JQuery können wir ersehen, wie wichtig mehrsprachige Programmierfunktionen sind. Der Autor von ExtJS beherrscht Java und liebt Java. Deshalb verwendet er das Skalpell JavaScript als Hammer, um Java zu verwenden, und klopft wahllos darauf, was undankbar ist.
Funktionale Programmiersprache sowie einige Tricks wie die Schwanzrekursion. Für die Tail-Rekursion ist kein Stapel erforderlich, um einen Stapelüberlauf bei rekursiven Aufrufen zu verhindern.
Template-Programmierparadigma
Bei der Template-Programmierung werden Typen als Parameter verwendet, und eine Reihe von Funktionen kann eine beliebige Anzahl von Typen unterstützen. Repräsentative Sprache: C++.
Der Bedarf an Vorlagenprogrammierung entstand, als C++ Containerbibliotheken entwickelte. Da Container Objekte jeglicher Art speichern müssen, besteht Bedarf an Generika.
Bei der Vorlagenprogrammierung in C++ geht es darum, den entsprechenden Codetyp basierend auf der Verwendung im Quellcode während der Kompilierung zu erstellen. Neben C++ verfügen auch Java und C# über ähnliche Mechanismen, die „Generika“ genannt werden, ihre Implementierungsmethoden unterscheiden sich jedoch stark von C++-Vorlagen. Ihre Compiler generieren keinen neuen Code, sondern verwenden stattdessen Casts.
Wie speichert man in einer Programmiersprache ohne Vorlagen/Generika Objekte in einem Container? Greifen Sie einfach auf ein Objekt eines öffentlichen Basisklassentyps (Java, C#) oder eines void*-Zeigers (C) zu und wandeln Sie es beim Herausnehmen selbst in den tatsächlichen Typ um. Dynamisch typisierte Sprachen kümmern sich nicht um Typen, und das spielt keine Rolle. Werfen Sie einfach ein beliebiges Objekt in den Container, nehmen Sie es heraus und verwenden Sie es direkt.
Einige C++-Meister haben sich eine „Vorlagen-Metaprogrammierung“ ausgedacht, die auf Vorlagen basiert. Da die Vorlagenprogrammierung vom C++-Compiler durchgeführt wird, besteht die Vorlagenmetaprogrammierung darin, den Compiler Berechnungen durchführen zu lassen, und die Ergebnisse werden nach der Kompilierung berechnet. Ich weiß nicht, welchen Nutzen dieses Ding hat, außer zur Recherche und zum Angeben von Fähigkeiten?
Zusammenfassung
Ich denke, es gibt mehrere Kriterien dafür, ob es sich lohnt, eine Sprache zu lernen:
1. Wenn du sie verwenden willst, musst du sie lernen. Das gibt es Daran besteht kein Zweifel. Schließlich müssen wir alle essen.
2. Ob die Sprachfunktionen Ihnen ein erfrischendes Gefühl vermitteln. Wenn ja, ist es den Eintrittspreis wert. Beispielsweise hat die Go-Sprache Ausnahmen abgeschafft und gibt stattdessen mehrere Werte zurück. Ich glaube schon. Tatsächlich nutze ich seit vielen Jahren aktiv Ausnahmen. Denn ich denke, da C keine Ausnahmen unterstützt und gut leben kann, warum braucht es dann Ausnahmen? Es ist ein Fehler aufgetreten und ein Fehlercode wurde zurückgegeben. Bei irreversiblen Fehlern einfach das Programm direkt abbrechen! Darüber hinaus verstoßen Ausnahmen tatsächlich gegen die Prinzipien der prozeduralen Programmierung. Eine Funktion sollte nur einen Eingang und einen Ausgang haben. Es gibt weitere Ausgänge zum Auslösen von Ausnahmen.
3. Bist du in einem bestimmten Bereich gut? Wenn Sie nur einen Hammer haben, werden Sie jede Aufgabe wie einen Hammer behandeln. Wenn Sie jedoch über eine Vielzahl von Werkzeugen in Ihrem Werkzeugkasten verfügen, ist es viel einfacher, verschiedene Aufgaben zu bewältigen.
Abschnitt 7 – Architekturdesign
Sie müssen auch die Fähigkeiten des Architekturdesigns beherrschen, um hervorragende Software zu entwerfen. Es gibt einige Fähigkeiten im Architekturdesign:
1. Schichtung
Eine Software ist normalerweise unterteilt in:
Präsentationsschicht – UI-Teil
Schnittstellenschicht – Kommunikationsschnittstellenteil des Hintergrunddienstes
Serviceschicht – eigentlicher Serviceteil
Speicherschicht – persistenter Speicherteil, gespeichert in Dateien oder Datenbanken.
Mehrschichtige Software kann jedes Modul entkoppeln, die parallele Entwicklung unterstützen, leicht zu ändern sein und die Leistung leicht verbessern.
2. SOA
Module sind durch Netzwerkkommunikation miteinander verbunden und lose gekoppelt. Jedes Modul kann unabhängig bereitgestellt werden und Bereitstellungsinstanzen können hinzugefügt werden, um die Leistung zu verbessern. Jedes Modul kann in verschiedenen Sprachen und Plattformen entwickelt werden und zuvor entwickelte Dienste können wiederverwendet werden. SOA, häufig verwendete Protokolle umfassen WebService, REST, JSON-RPC usw.
3. Leistungsengpass
1) Ändern Sie die Synchronisierung auf asynchron.
Implementiert mit Speicherwarteschlange (Redis), Workflow-Engine (JBpm) usw. Speicherwarteschlangen sind anfällig für Datenverlust, aber schnell. Die Workflow-Engine speichert die Anfrage in der Datenbank.
Durch die Umwandlung synchroner Anfragen in asynchrone Anfragen können grundsätzlich 99,99 % der Leistungsprobleme gelöst werden.
2) Verwenden Sie die parallele Hardwareverarbeitung auf einer Maschine.
Verwenden Sie beispielsweise GPU, FPGA und andere Hardware, um die Leistung zu verarbeiten und zu verbessern.
3) Verwenden Sie Cluster-Computer zur Verarbeitung.
Beispielsweise verwendet ein Hadoop-Cluster mehrere Computer, um Daten parallel zu verarbeiten.
In Ihrem eigenen Software-Stack können Sie auch mehrere Kopien eines Moduls für die Parallelverarbeitung bereitstellen.
4) Verwenden Sie den Cache, um Anfragen zu erfüllen. Nachdem der Cache mit häufig verwendeten Inhalten aufgeheizt wurde, werden bei einer großen Anzahl von Benutzeranforderungen nur Daten aus dem Speicher gelesen, und die Leistung wird erheblich verbessert.
Cache ist der Gott-Algorithmus. Seine Leistung liegt nur geringfügig unter der optimalen Leistung, als ob Sie Gott wären und die Zukunft vorhersehen könnten. Da die X86-CPU nun auf eine Frequenzbegrenzung stößt, besteht die wichtigste Möglichkeit für die CPU, ihre Leistung zu verbessern, darin, einen Hochgeschwindigkeits-Cache hinzuzufügen.
4. Kleine Projekte für große Systeme
Geraten Sie nicht in Panik, wenn Sie auf ein großes System stoßen, teilen Sie es in mehrere Module auf, verwenden Sie mehrere kleine Programme und lösen Sie es durch SOA-Zusammenarbeit. Dies entspricht der Designphilosophie von Unix. Unter Unix wurde eine große Anzahl kleiner Programme mit einem einzigen Zweck entwickelt. Es empfiehlt Benutzern die Verwendung von Pipelines, um die Zusammenarbeit mehrerer kleiner Programme zur Lösung von Benutzeranforderungen zu ermöglichen. Natürlich weist die Pipeline-Kommunikation zu viele Einschränkungen auf und ist nicht flexibel genug. Daher können wir jetzt mehrere Programme über URI und SOA zusammenarbeiten lassen. Anwendungen auf Android und iOS arbeiten jetzt über URIs zusammen. Dies kann als eine moderne Weiterentwicklung der Unix-Designideen angesehen werden, oder? !
5. Sharding Slicing
Es gibt jetzt einen Trend, der zum IOE geht. I-IBM-Mainframe, O-Oracle-Datenbank, E-EMC-Speicher. Früher wurden große Systeme oft mit IOE entworfen, wobei eine Oracle-Datenbank auf dem Mainframe bereitgestellt wurde, und die Oracle-Datenbank nutzte EMC zum Speichern von Daten. IOE ist heute der leistungsstärkste Computer, die leistungsstärkste Datenbank und der leistungsstärkste Speicher. Aber es wird eine Zeit kommen, in der sie dem massiven System nicht widerstehen können.
Die Oracle-Datenbank ist Shareeverything, die auf einem Computercluster ausgeführt werden kann (Serverknoten dürfen nicht mehr als 16 sein). Computercluster nutzen alle denselben Speicher.
Die IOE-Bewegung markiert den Bankrott des ShareEverything-Modells. ShareNothing muss verwendet werden, damit das System unendlich erweitert werden kann.
Verwenden Sie die MySQL-Datenbank, um Daten jeder Größe zu verarbeiten. Voraussetzung ist, dass Sie Sharding kennen. Teilen Sie ein großes System in mehrere kleine Systeme auf und teilen Sie es in mehrere günstige Server und Speicher auf. Moderner ist, dass es in eine große Anzahl virtueller Maschinen unterteilt ist.
Zum Beispiel die 12306-Website des Eisenbahnministeriums. Wir wissen, dass Bahntickets zu einem bestimmten Zug gehören. Dann teilen wir jeden Zug als Einheit auf, und die 12306-Website kann in Tausende von Modulen unterteilt werden. Eine virtuelle Maschine kann mehrere Module hosten. Wenn bestimmte Züge zu Leistungsengpässen führen, können sie auf unabhängige virtuelle Maschinen verschoben werden. Selbst wenn einige der aufgeführten Dienste am Ende nicht verfügbar sein sollten, ist das System nicht vollständig nicht verfügbar.
12306 Website hat nur einen globalen Teil, nämlich die Benutzeranmeldung. Dies kann einem Dritten überlassen werden. Benutzer können sich beispielsweise mit WeChat, Weibo, QQ und anderen Konten anmelden.
Sie können den Benutzer-Login-Service auch selbst implementieren. Oder nutzen Sie Slicing, um Dienste mit mehreren Redis-Servern bereitzustellen. Der Redis-Server speichert die Sitzungs- und Benutzer-ID, Rollen, Berechtigungen und andere Informationen jedes angemeldeten Benutzers. Die Sitzungs-ID wird zufällig generiert und einige ihrer Bits können ausgewählt werden, um zu identifizieren, auf welchem Redis-Server sie sich befindet. Nachdem sich der Benutzer angemeldet hat, wird die Sitzungs-ID an den Kunden gesendet. Die Sitzungs-ID wird jedes Mal an den Server zurückgesendet, wenn der Benutzer eine Anfrage stellt. Der Server sendet die Sitzungs-ID an den Redis-Server, um die Benutzerinformationen abzufragen und die Benutzeranfrage zu verarbeiten. Wenn die Sitzungs-ID nicht auf dem Redis-Server gefunden wird, lassen Sie den Benutzer sich anmelden. Selbst wenn sich alle registrierten Benutzer gleichzeitig anmelden, wird nicht viel Speicher benötigt. Wenn zu viel Sitzungsspeicher vorhanden ist, können Sie außerdem die Sitzung des zuerst angemeldeten Benutzers löschen und ihn zu einer erneuten Anmeldung zwingen. Die Anzahl der gleichzeitig aktiven Benutzer wird nicht zu hoch sein.
Ebenen des Domänenwissens
Alle vorherigen Ebenen konzentrieren sich auf die Fähigkeiten des Programmierens selbst. Um es ganz klar auszudrücken: Es handelt sich um grundlegende Fähigkeiten, die an sich keinen großen Wert haben. Aber zu viele Programmierer verschwenden zu viel Zeit mit diesen grundlegenden Ebenen.
Manche Programmierer beschäftigen sich besonders gerne mit Programmiersprachen. Immer wenn eine neue Programmiersprache herauskommt oder eine alte Sprache gehypt wird, investieren sie ihre Energie in die Forschung. Ich bin einer von ihnen, der viel Energie mit Programmiersprachen und Tricks verschwendet.
Ich denke, die Sprache C++ ist eine besonders große Gefahr. Es wurde ursprünglich als objektorientiertes C entwickelt. Später wurde die Vorlagenprogrammierung entdeckt und die Vorlagenprogrammierung und weitere Vorlagen-Metaprogrammierung wurden stark befürwortet. Kürzlich wurden neue Standards wie C++11 und C++14 eingeführt, die viele neue Dinge wie funktionale Programmierung, Typinferenz usw. hinzufügen. C++ ist zu komplex und weist zu viele Fallstricke auf, die den Programmierern viel Energie rauben. Wenn ich C++ verwende, verwende ich nur den objektorientierten Teil und den Vorlagenteil und verwende keine anderen zu anspruchsvollen Funktionen.
Informatik ist ein sehr breites Fachgebiet, das eine eingehende Auseinandersetzung erfordert und verdient, damit wir wertvolle Programme schreiben können. Damit Software bei der Implementierung einen Mehrwert bietet, muss sie in die Branche integriert werden. Sie können keine wertvollen Programme schreiben, indem Sie einfach Programmierkenntnisse erlernen, ohne Domänenkenntnisse zu verstehen.
Es gibt viele Bereiche in der Informatik, einige sind unten aufgeführt:
Speicher ---- Blockgerät, Dateisystem, Cluster-Dateisystem, verteiltes Dateisystem, Glasfaser-SCSI, iSCSI, RAID usw.
Netzwerk ---- Ethernet, Glasfasernetzwerk, Mobilfunknetzwerk, WIFI, VLAN usw.
Computerarchitektur, hauptsächlich der CPU-Befehlssatz. x86, ARM usw.
USB-Protokoll. Sie müssen das URB-Paket kennen.
PCI-Protokoll, PCI-E-Protokoll. Moderne Computerperipheriegeräte basieren alle auf dem PCI-Protokoll und dem PCI-E-Protokoll. Grafikkarten sind mittlerweile alle über das PCI-E-Protokoll mit dem Computer verbunden. Relativ gesehen reduziert es viel Wissen, das erlernt werden muss. Um sich mit der Virtualisierung befassen zu können, müssen Sie über umfassende Kenntnisse des PCI-Protokolls verfügen.
Bildverarbeitung – Bildkomprimierung, Echtzeit-Videokodierung usw.
3D-Spiele
Relationale Datenbank
NoSQL-Datenbank
Betriebssystem
Verteiltes Betriebssystem
Kompilierungsprinzip
Maschinelles Lernen – Big Data muss jetzt genutzt werden!
Zum Verständnis des Wissens in diesen Bereichen gehört auch das Verständnis der vorhandenen kommerziellen Hardware, kommerziellen Software und Open-Source-Software in diesem Bereich. Oft sind für die Arbeit, die Sie erledigen möchten, bereits fertige Werkzeuge vorhanden. Sie erledigen Ihre Arbeit einfach mit handelsüblichen Tools, es ist keine Entwicklung erforderlich. Manchmal müssen Sie lediglich vorhandene Tools kombinieren und einige Skripte schreiben, um die Aufgabe abzuschließen.
Beispielsweise möchte ich jeweils eine bidirektionale Synchronisierungsaufgabe implementieren. Ich habe die hervorragende Open-Source-Software Unison gefunden, die Konfigurationsdatei geschrieben und die Aufgabe erfolgreich abgeschlossen. Es ist nicht nötig, Code zu schreiben.
Ein anderes Mal habe ich, um eine hohe Verfügbarkeit zu erreichen, Python verwendet, um mehrere Open-Source-Software aufzurufen, und das war leicht zu erreichen.
Schreiben Sie ein Installationsprogramm und passen Sie das Betriebssystem an. Sobald Sie die Domänenkenntnisse des Betriebssystems kennen, können Sie dies ganz einfach tun, indem Sie ein paar Zeilen Skripte schreiben.
Personen, die nicht über Domänenkenntnisse verfügen, müssen möglicherweise viele unnötige Entwicklungen durchführen und stellen möglicherweise nach langer Zeit fest, dass dies eine Sackgasse ist.
Darüber hinaus können fundierte Domänenkenntnisse die Programmier-Debugging- und Fehlerprüfungsfähigkeiten erheblich verbessern. Wenn Sie wissen, wie Compiler und Programmiersprachenlaufzeiten funktionieren, können Sie Ihren Code schnell auf der Grundlage von Kompilierungsfehlern und Warnungen ändern.
Wenn Sie den zugrunde liegenden Betriebsmechanismus des Betriebssystems kennen, können Sie schnell die Grundursache für Laufzeitfehler finden. Zum Beispiel habe ich einmal ein Windows-Upgrade-Dienstprogramm geschrieben. Es ist ein Windows-Dienst und muss ein DOS-Skript ausführen. Dieses Skript ersetzt den Windows-Dienst selbst. Ich habe festgestellt, dass die Skriptausführung manchmal ungültig war. Nachdem ich sie die ganze Nacht überprüft hatte, stellte ich fest, dass es nach der Installation des Windows-Dienstes beim ersten Start zu Berechtigungsproblemen kam Das Skript hatte keine Wirkung. Aber sobald das Windows-Dienstprogramm einmal gestartet ist, ist es in Ordnung. Dies muss ein Problem mit dem zugrunde liegenden Sicherheitsmechanismus des Windows-Betriebssystems sein. Da ich nicht viel über den Windows-Kernel weiß, habe ich lange gebraucht, um dieses Problem zu entdecken, und ich kenne die Grundursache dafür nicht Problem.
Absatz 0 – Anfänger in Domänenkenntnissen
Ich habe nicht viel Wissen über Domänenkenntnisse. Verwenden Sie Suchmaschinen, um einige Einführungsartikel zu Software und Hardware in diesem Bereich zu finden, und befolgen Sie die Anweisungen Im Artikel erfahren Sie, wie Sie die Software konfigurieren und verwenden. Vorhandene Soft- und Hardware kann kaum genutzt werden.
1. Stufe – Domänenwissensexperte
Verstehen Sie die im Feld häufig verwendete Hardware und beherrschen Sie die Konfigurations- und Verwendungsfähigkeiten der im Feld häufig verwendeten Software gründlich. Sie müssen in der Lage sein, mithilfe vorhandener Software und Hardware geschickt Lösungen zu erstellen und verschiedene Probleme zu lösen, die bei der tatsächlichen Arbeit auftreten.
Absatz 2 – Fachwissensexperte
Wenn Sie nicht nur die Software und Tools auf diesem Gebiet beherrschen, wissen, wie man sie verwendet, sondern auch ihre Prinzipien kennen, „wissen, was es ist und warum.“ es ist so“, die Wissensexperten auf diesem Gebiet sind.
Nur wenn Sie die Prinzipien der Netzwerkprotokolle kennen, können Sie wissen, wo das Problem liegen könnte, wenn ein Problem mit dem Netzwerk vorliegt. Handelt es sich um einen Mac-Konflikt, einen IP-Konflikt oder eine Netzwerkschleife?
Nur wenn Sie die Speicherprinzipien kennen, können Sie wissen, warum diese Speichermethode nicht für die Virtualisierung geeignet ist, welche Speichermethode für die Virtualisierung geeignet ist und welche andere Methode für die Datensicherung geeignet ist.
Nur wenn Sie das PCI-Protokoll kennen, können Sie wissen, wie Sie ein Hardwaregerät virtualisieren.
Nur wenn Sie das Hardwareprotokoll der Netzwerkkarte kennen, können Sie eine virtuelle Netzwerkkarte simulieren, die die virtuelle Maschine normal verwenden kann.
Nur wenn Sie das Videokodierungsformat und die Prinzipien kennen, können Sie wissen, welches Videoformat die geringste Bandbreite und welches Videoformat die geringste CPU beansprucht.
Nur wenn Sie den IntelVT/Amd V-Befehlssatz verstehen, können Sie wissen, wie die Virtualisierung implementiert wird.
Sie verstehen, dass es sich bei einem Workflow tatsächlich um eine Zustandsmaschine handelt. Nur wenn Sie auf komplexe Workflows stoßen, können Sie wissen, wie Sie eine Workflow-Engine entwerfen, die den Anforderungen entspricht.
Absatz 3 – Wissenschaftler
Sie sind ein Experte für Fachwissen, aber Ihr gesamtes Wissen stammt aus Büchern und von anderen Menschen.
Wenn Sie damit zufrieden sind, ein Experte für Domänenwissen zu sein, können Sie sich nur die Weisheit anderer aneignen und niemals versuchen, diese zu übertreffen. Andere sind möglicherweise nicht bereit, Ihnen ihre Forschungsergebnisse mitzuteilen. Wenn Ihnen jemand anderes davon erzählt, hat er möglicherweise eine aktualisierte Theorie entdeckt und steht möglicherweise kurz vor der Veröffentlichung einer neuen Produktgeneration.
Wissenschaftler sind Menschen, die das Unbekannte erforschen, den Mut zur Innovation haben und den Fortschritt der menschlichen Gesellschaft fördern.
Der Legende nach sagte ein Cisco-Manager einmal halb im Scherz: „Wenn Cisco aufhört, neue Technologien zu entwickeln, wird Huawei seine Richtung nicht finden können.“ Dies ist eine Verhöhnung von Huawei, da es nur auf der Ebene von Fachwissensexperten liegt und diese nur nachahmen, aber nicht übertreffen kann. Ich kenne die tatsächliche Situation von Huawei nicht, aber ich hoffe, dass Huawei jetzt die Spitzenposition erreicht hat.
Owen Jacobs entdeckte das Prinzip des CDMA-Codemultiplex-Mehrfachzugriffs und stellte fest, dass es ein großes Potenzial für die Kommunikation hatte, und gründete Qualcomm. Qualcomm lebt hauptsächlich von Patentlizenzgebühren und beschäftigt eine große Anzahl von Wissenschaftlern, die im Bereich Kommunikation forschen. Manche Leute sagen, Qualcomm sei ein Patenttroll. Diese Menschen verstehen den Wert von Wissen nicht. In ihren Augen sollte der angemessene Preis für Windows 5 Yuan betragen, der Preis einer CD. Der Preis für ein iPhone sollte für ein Bare-Metal-Gerät mehr als 1.000 Yuan betragen. Qualcomm ist ein Patent-Troll, also warum trollen Sie nicht auch CDMA und LTE? Kommen Sie raus und zeigen Sie es mir!
Der X86-Chip wurde nicht im Hinblick auf Virtualisierung entwickelt. Daher werden sogenannte „Virtualisierungsschwachstellen“ auftreten. Das heißt, wenn einige CPU-privilegierte Anweisungen ausgeführt werden, werden in der Umgebung der virtuellen Maschine keine Ausnahmen ausgelöst, sodass diese nicht auf den Host umgeschaltet werden können. Dadurch können virtuelle Maschinen nicht auf dem X86-Chip laufen.
Das Unternehmen VmWare wurde 1998 von mehreren amerikanischen Wissenschaftlern gegründet. Sie entdeckten, dass sie die binäre Übersetzungstechnologie nutzen konnten, um virtuelle Maschinen auf x86-Computern auszuführen.
Auch die Xen-Virtualisierungssoftware wurde von mehreren Wissenschaftlern erfunden. Sie fanden heraus, dass eine Virtualisierung erreicht und die Laufleistung verbessert werden konnte, solange die Kernel des Betriebssystems der virtuellen Maschine und des Host-Betriebssystems geändert wurden und die Funktionen des Hosts direkt aufgerufen wurden, wenn eine „Virtualisierungs-Schwachstellen“-Anweisung ausgeführt werden musste Die virtuelle Maschine würde erheblich verbessert werden.
Später fügte Intel den IntelVT-Befehlssatz seinen eigenen Chips hinzu, und AMD fügte den AmdV-Befehlssatz seinen eigenen Chips hinzu, um die „Virtualisierungsschwachstelle“ auszugleichen. Es gibt also eine KVM-Software für virtuelle Maschinen, die direkt CPU-Hardwareanweisungen verwendet, um die Virtualisierung zu implementieren.
Wenn KVM CPU-Anweisungen ausführt, läuft es direkt auf der physischen CPU und ist daher äußerst effizient. Wenn eine virtuelle Maschine jedoch ein virtuelles Peripheriegerät ausführt, muss dies per Software simuliert werden, sodass die E/A-Zugriffsgeschwindigkeit der virtuellen Maschine sehr langsam ist.
Der IBM-Wissenschaftler Rusty Russell nutzte die Forschungs- und Entwicklungserfahrung von Xen und entwickelte die VirtIO-Technologie. Es dient dazu, einen Satz virtueller PCI-Geräte und Treiber in die virtuelle Maschine zu schreiben. Dieser Satz virtueller PCI-Geräte verfügt über einen virtuellen Gerätespeicher. Auf diesen virtuellen Gerätespeicher-Host kann zugegriffen werden, und die virtuelle Maschine kann auch über den VirtIO-Treiber darauf zugreifen. Das heißt, ein Teil des Speichers wird zwischen der virtuellen Maschine und dem Host gemeinsam genutzt, wodurch das E/A-Leistungsproblem der virtuellen Maschine gelöst wird.
Erzählen Sie mir eine andere Suchmaschinengeschichte:
Vor langer Zeit wollte ich einem Programm eine Suchfunktion hinzufügen. Ich habe gerade mit der SQL-Abfrageimplementierung begonnen und festgestellt, dass sie zu langsam ist. Später fand ich das Open-Source-Projekt Lucene. Es nutzt die Reverse-Indexing-Technologie, die die Suchgeschwindigkeit durch die Erstellung von Reverse-Indizes in Dateien erheblich verbessert.
Die beiden Gründer von Google entdeckten das Geheimnis der Links in HTML. Sie entdeckten, dass die Gewichtung jeder HTML-Seite durch die Linkbeziehung der HTML-Seite festgelegt werden kann. Das ist der PageRank-Algorithmus. Infolgedessen besiegte die automatisierte Suchmaschine von Google die manuell klassifizierte Suchmaschine von Yahoo.
OK, mit Reverse-Index-Technologie und PageRank sowie einem einfachen HTML-Crawler-Roboter können wir eine Suchmaschine erstellen. Allerdings ist das Internet riesig und jeden Tag werden viele neue Webseiten generiert. Es ist schwierig, einen umgekehrten Index für das gesamte Internet zu erstellen.
Einige Jahre später veröffentlichte Google drei weitere Artikel: Googlefs, Mapreduce und Bigtable. Daher entwickelten die Entwickler des Lucene-Projekts das Hadoop-Projekt basierend auf Googles Mapreduce-Papier. MapReduce verwendet eine große Anzahl von Computern, um Daten zu speichern und Berechnungen durchzuführen, und fasst schließlich die Ergebnisse zusammen. Mit Hadoop + Reverse Index + PageRank können Sie eine Suchmaschine erstellen. Yahoo, Baidu und andere Unternehmen haben ihre eigenen Suchmaschinen auf Basis von Hadoop entwickelt.
Allerdings sind die Suchmaschineneffekte anderer Unternehmen immer noch nicht mit denen von Google vergleichbar. Wir Programmierer wissen das am besten. Wie ich gehe ich immer über die Mauer hinaus, nur zu Google.
Einige Artikel von Dr. Wu Jun wurden auf Google Blackboard veröffentlicht, die viel Wissen über maschinelles Lernen einführten. Wie Sie dem Artikel entnehmen können, nutzt Google tatsächlich maschinelles Lernen, um die gesammelten Seiten zu analysieren. Google wird diese Formel offensichtlich nicht veröffentlichen. Selbst wenn Google diese Formel eines Tages wirklich öffentlich macht, dann ist es denkbar, dass Google definitiv eine schärfere Geheimformel entwickelt und die Suchmaschinenwirkung der Nachahmerprodukte immer noch nicht so gut sein wird wie bei Google.
Nachahmer ist der einzige Weg zur Innovation. Bevor man auf diesem Gebiet führend wird, muss man eine Phase des Lernens und Nachahmens durchlaufen. Aber um der Boss der Branche zu werden, um ein Champion zu werden, muss man mutig genug sein, andere in Kurven zu überholen, mutig den Weg der Innovation beschreiten und ein echter Wissenschaftler und ein echter Experte werden!
Zusammenfassung
Programmierfähigkeit kann in zwei Dimensionen unterteilt werden: Die eine ist das Niveau der Programmierkenntnisse und die andere ist das Niveau der Domänenkenntnisse.
Manche Programmierer verwenden möglicherweise ihre ganze Energie darauf, ihre Programmierkenntnisse zu verbessern und haben nur geringe Fachkenntnisse. Dies ist in der täglichen Arbeit tatsächlich äußerst schädlich. Für einige Anforderungen gibt es möglicherweise bereits fertige, quelloffene und kostenlose Lösungen, oder sie lassen sich schnell durch die Kombination einiger vorhandener Softwarelösungen lösen, müssen jedoch viel Zeit damit verbringen, sie selbst zu entwickeln. Darüber hinaus ist es aufgrund mangelnder Domänenkenntnisse schwierig, die Ursache des Problems schnell zu lokalisieren und Fehler zu beheben, wenn unerwartete Situationen im Programm auftreten.