Beginn einer Vorlage zur schnellen "Erdung" von PHP-Entwicklern in GoSeit 15 Jahren machen wir ein Backend in PHP. Und sobald eine strategische Entscheidung getroffen wurde: Schreiben Sie zuerst die am stärksten belasteten Stellen auf Go neu und entwickeln Sie dann neue Dienste darauf.
Stellen Sie sich vor: Sie möchten mit einem Team von 40 Entwicklern, die PHP so gut vorbereiten, dass sie ein Multithread-Echtzeit- und Hochverfügbarkeitssystem zusammenstellen, über eine neue Sprache sprechen.
Im schlimmsten Fall werden sie dich verbrennen, bestenfalls werden sie zuhören, aber sie werden weiterhin so tun wie zuvor. Dies ist der Fall, wenn Sie die Sprache mit Gewalt eingeben.
Deshalb haben wir uns entschlossen, zuerst einen Hackathon zu organisieren und dann alle auf die dunkle Seite einzuladen. Wenn mindestens zehn Leute sie rekrutiert hätten, hätten sie im Laufe der Zeit allen anderen ein persönliches Beispiel dafür gezeigt, wie cool das ist.
Ich werde Ihnen schrittweise erklären, wie Sie eine solche Erfahrung mit Ihnen wiederholen können. Und über die Ergebnisse unserer Implementierung. Und darüber, was im Kopf eines PHP-Entwicklers passiert, wenn er eine neue Sprache sieht.
Wir haben mit der Vorbereitung der Vorlage und der CI / CD begonnen, mit der Sie in 15 Sekunden herunterfahren können. Um es selbst zu schreiben, brauchen Sie ungefähr zwei Wochen. Wir haben es im Voraus gemacht.
Schritt 1. Erzählen Sie von Golang
Wir haben oft viele interne Seminare. Jemand möchte etwas erzählen, schreibt eine Anzeige, sammelt Leute und erzählt. Es kommt vor, dass es sich insbesondere um die Regulierung des Flugverkehrs in Russland handelt, dass es sich um eine Reisegeschichte handelt, aber häufiger geht es um eine Technologie oder Funktion, die implementiert wurde. Und es kann für jemand anderen nützlich sein. Deshalb haben wir ein internes Seminar über Go zusammengestellt, in dem wir über die Vorteile der Sprache gesprochen haben. Schnell (ohne Tamburin kompiliert: PHP kann auch kompiliert werden, aber schwieriger), sofort mit mehreren Threads, ganz einfach unterstützt, können Sie ohne Framework direkt in ein Notizbuch schreiben, dh es gibt keine Hämorrhoiden mit Abhängigkeiten der dritten Ebene, die das entwickelte Framework mit sich zieht. Bereitstellung in 15 Sekunden. Und es scheint, dass es in unserer Situation nicht einmal offensichtliche Mängel gibt. Wir empfehlen es zu versuchen. Es war wie eine Geschichte über eine andere Welt: Hier ist die Sprache, sehen Sie, wie sie sich unterscheidet, nächstes Wochenende wird es einen Hackathon für diejenigen geben, die interessiert sind.
Schritt 2. Dokumentation
Drei Tage vor dem Hackathon senden wir einen Link zu einem halbstündigen Einführungskurs zu Syntax, grundlegenden Datentypen und Funktionen. Und grundlegende Dokumentation. Folgendes haben die Entwickler erhalten:
golang.org/doctour.golang.orgPlus Go-Senior-Kontakte im Inneren.
Schritt 3. Gruppen
Außerdem haben wir vorgeschlagen, in Gruppen aufzuteilen und Aufgaben, die wir hier und jetzt implementieren möchten, in einer neuen Sprache zu bringen. Sie warnten sofort, dass der Hackathon nach Stunden (am Samstag) im Büro sein würde, die Angelegenheit war freiwillig, aber es wäre möglich, die Kampfaufgabe zu lösen und in der Praxis fast paarweise mit einer Person zu lernen, die die Nuancen der Sprache kennt. Dies interessierte 40 Menschen, und sie begannen, in Gruppen zu kämpfen und Aufgaben zu rekrutieren. Nicht jeder hatte Erfolg mit den Gruppen: Viele kamen mit der Aufgabe von nur einer, die Gruppen waren zwei, seltener - drei Personen. Die Aufgaben selbst standen auf Rückständen oder bezogen sich auf das Duplizieren einer Art Hemmstelle.
Das ultimative Ziel war es, beim Hackathon eine Aufgabe zu erledigen, die dann ein wenig aufgerollt und an den Product Owner (Direction Manager) „verkauft“ werden kann. Im Geiste: "Schau, es hat vor 40 Sekunden funktioniert, und jetzt macht es alles in zwei Teilen." Dieser Teil ist der wichtigste für den strategischen Erfolg der Einführung der Sprache in Teams: Sie brauchen gleich zu Beginn einen kleinen Sieg.
Schritt 4. Unsichtbare Arbeit
Wir haben eine Vorlage für unsere Infrastruktur vorbereitet, über die ich oben gesprochen habe, damit wir sofort ohne Tanz laufen können, um alles zu bauen und zu verbinden, was Sie brauchen. Diese Vorlage ersetzt das Framework. Verbreiten macht nicht viel Sinn: Ich wiederhole, es ist nur für uns sehr eingesperrt.
Ich werde nur die Funktionen auflisten, die in der Vorlage festgelegt wurden:
- Integration mit k8s.
- Exportieren Sie Metriken nach prometheus.
- Konfiguration über Umgebungsvariablen.
- HTTP-Server.
- Opentracing.
- Logger
Wir haben lange an der Untersuchung von Kubernetes gearbeitet und als Lösung OpenShift gewählt, das großartige Möglichkeiten zum Anpassen und Konfigurieren von CI / CD bietet. Also haben wir die Vorlage sofort unter k8s geschärft. Die in OpenShift erstellte Anwendung erstellt das Repository, sammelt das Anwendungsskelett, den Dienst in k8s, wendet Sicherheitsrichtlinien an, sammelt die Binärdatei, stellt in k8s bereit und in weniger als einer Minute ist der Dienst im Netzwerk verfügbar. So wurde der Hackathon auch zu einer Veranstaltung, bei der Entwickler in unser zukünftiges PaaS eingeführt wurden.
Wir haben in Grafana auch ein Dashboard mit grundlegenden Metriken erstellt, Exportprotokolle für Kibana und Agenten für Jaeger eingerichtet. Für jeden Dienst werden Links zu Diensten generiert, über die Sie sofort alle erforderlichen Informationen erhalten.
Als nächstes musste vereinbart werden, dass Hackathon-Teilnehmer auf die Datenbanken zugreifen können, die zur Lösung von Problemen benötigt werden. Das ist falsch, aber wir haben uns für die Dauer der Arbeit schreibgeschützt mit den Militärbasen verbunden. Dies ist ein weiterer Grund, warum Samstag an diesem Tag die kleinste Last ist.
Sie warnten die Küche (ich erinnere Sie daran, dass wir sie
kostenlos für Snacks haben - Hüttenkäse-Früchte, aber nicht für warmes Essen) vor der Veranstaltung. Das Essen wurde ins Büro gebracht, damit wir nicht abgelenkt wurden.
Schritt 5. Hackathon selbst
Aus offensichtlichen Gründen (Familie, Entspannung) scheiterten einige am Samstag, sodass wir 15 Personen in Anrufe aufteilten.
Sie sprachen über unsere PaaS-Plattform, wie man eine Anwendung aus einer Vorlage erstellt und wie man eine Vorlage verwendet. Dieses Framework, in dem es Wrapper zum Sammeln von Metriken, Integritätsprüfungen und Metriken, zum Herstellen einer Verbindung zu einer Datenbank usw. gibt, zeigte, wie alle möglichen Dinge miteinander verbunden werden können. Es war möglich, alles an Ort und Stelle oder im Voraus zu entfernen (die Vorlage wurde auch an den Hackathon verteilt). Dies ist eine vorgefertigte Anwendung, die erweitert werden muss.
Sie sprachen über Bereitstellungs- und Entwicklungsfunktionen für Kubernetes (Konfiguration, Protokollierung, Metriken, Arbeiten mit fertigen Beispielen, Zuweisung von Ressourcen für den Prozessor und den Speicher usw.). Sie haben versucht, "Hallo Welt!"

Die Jungs selbst haben die Dienste erstellt. Ich war angenehm überrascht von der Einfachheit und Benutzerfreundlichkeit der Vorlage. Jemand hatte bereits Zeit, auf Golang zu üben, jemand blätterte nur in der Dokumentation.

Wir hatten nicht das Ziel zu zeigen, wie man gut schreibt, es war notwendig, einen groben Funktionscode zu erhalten und zu zeigen, wie alles schnell zum Preprod gelangen kann, wie alles schnell funktioniert und wie einfach es ist, Änderungen vorzunehmen.
Der Plan war folgender: Die Teams schreiben, wenn Sie Fragen haben, antworten wir. Dann eine Überprüfungssitzung und Hilfe, wie man in Golang etwas Richtigeres in der Architektur macht.
Von den kognitiven Verzerrungen der PHP-Mitte ist die „alte“ Denkweise in einem Thread zu erwähnen. Go hat ein gutes integriertes Wettbewerbsmodell und sofort einsatzbereites Multithreading, das nicht in PHP enthalten war. Der Code erweist sich als sehr lesbar, was zu wenige erwartet haben.
In der Praxis verwenden wir nicht immer Multithreading. Kommt auf die Aufgabe an. Aber unter der Haube ist sie es auch, und wo nötig erhöht sich die Geschwindigkeit aufgrund von ihr. Beispielsweise wird für jede eingehende REST-Anforderung eine separate Goroutine erstellt. Golang kann mehrere Anforderungen gleichzeitig verarbeiten, wenn die meisten anderen Sprachen (einschließlich PHP) diese standardmäßig in die Warteschlange stellen und für jeden Mitarbeiter in einem Thread verarbeiten.
Das zweite Merkmal ist ein großer Schmerz bei der Rückgabe von Fehlern. Wenn Multithreading nur eine andere Architektur ist und es leicht ist, sich in ein oder zwei Stunden daran zu gewöhnen, ist dies bei Fehlern beim Wechsel von PHP eine Änderung des gesamten Denkmodells. Das Zurückgeben von Fehlern aus Funktionen ist das Hauptparadigma in Go. In PHP dreht Try-Catch normalerweise alles um. Und hier ist es erforderlich, explizit im Hauptteil der Funktion zu verarbeiten. Einige Menschen wurden von dieser „Verlangsamung“ brutal bombardiert, sie widersetzten sich aktiv. Dies liegt daran, dass der Ansatz TDD ziemlich nahe kommt und TDD beim Schreiben von Code Geduld erfordert, das Debuggen jedoch einfach ist. Dies erhöht den Code Zeile für Zeile "if - a error", aber sobald Sie schreiben und nicht zurückkehren. Dies ist in der Architektur von Microservices sehr wichtig, da Microservices wie Pilze wachsen und ein Entwickler Dutzende von Microservices schreiben kann. Das ständige Wechseln von Kontexten und das Debuggen von Fehlern ist sehr teuer und ineffizient. Wenn alles richtig gemacht ist, funktioniert die Anwendung jahrelang genauso effektiv wie während der Entwicklung. Und in PHP in der gleichen Situation ist es wahrscheinlich, dass, wenn der Code falsch geschrieben wird, ständig neue Fehler auftauchen, wonach es notwendig sein wird, alles erneut zu debuggen.
Es stellte sich heraus, Fußtücher in der Hauptsache. Als der Funktionsteil gestartet wurde, haben sie bereits herausgefunden, wie er am besten in Pakete zerlegt werden kann. Dann gab es eine Überprüfung. Wenn Go-senior Ihnen hilft, ist es sofort sehr nützlich. Sie zeigten jemandem, wie man ständige Besuche in der Basis durch einen Cache im RAM ersetzt. Jemandem wurde geholfen, den Code in paralleler Ausführung neu zu schreiben. Irgendwo gab es kleine Stecker, wie die Tatsache, dass der HTTP-Server in PHP traditionell steigt und stirbt, aber hier bleibt es hängen.
Schritt 6. Repository
Am Ende des Hackathons wurde der Code in das Repository gefaltet, wo jeder den Code der benachbarten Teams sehen und eine Pull-Anfrage senden konnte. Dies ist auch Teil des Trainings, und während der Woche gingen diese Anfragen ziemlich aktiv.
Zusammenfassung
Acht Stunden Hackathon in zwei Streams mit plus oder minus 15 Personen (ich erinnere Sie daran, dass von 70 Entwicklern 40 Go ausprobieren wollten und Dokumentation und eine Vorlage erhielten, aber nicht jeder an einem Tag teilnehmen konnte oder physisch teilnehmen wollte).
Ein Viertel der Dienstleistungen lieferte sofort das erwartete Ergebnis. Ein anderer Teil erforderte entweder lange Modifikationen seitens des PHP-Monolithen oder war einfach mehr als acht Stunden breit. Etwa die Hälfte der Dienstleistungen wurde vor dem späteren Verkauf abgeschlossen.
Infolgedessen lernten alle die Sprache, die OpenShift-Plattform, wie man sie zusammen heiratet und so weiter kennen. Wir haben die Anwendungsvorlage und die neue CI / CD gesehen und alle Tools zur weiteren Lösung unserer Probleme auf Go erhalten.
Dann wurden die Funktionen an Produktbesitzer „verkauft“. Wir haben Architekturfragen von Teamleitern beantwortet.
Im Laufe des nächsten Monats haben fast alle zusammen eine Vorlage (ein Mini-Framework) zu den Anforderungen der Abteilungen hinzugefügt. Infolgedessen wurde er größer. Ja, ein weiteres Merkmal der Vorlage: die gesamte Konfiguration - durch Umgebungsvariablen, dh bei der lokalen Entwicklung und beim Wechsel zu Preprod-Prod, funktioniert alles einwandfrei. Docker ist gut.
Nicht nur Go ging vom Hackathon zu den Massen. In der PaaS-Plattform für PHP und Node.js wurden Vorlagen angezeigt. Trotzdem wählen Entwickler bei gleichbleibenden Bedingungen häufig Go als Sprache für den Microservice. In der Praxis werden daher alle nach dem Hackathon neu verkauften Mikrodienstleistungen speziell auf Go geschrieben. Das heißt, wir schneiden den Monolithen und schreiben sofort alles Neue unter Kubernetes. Bis Ende des Jahres werden wir fast vollständig dorthin ziehen.
Diejenigen, die nicht gekommen waren, fragten ihre Kollegen, was es sei. Dann näherten sie sich und fragten nach der Sprache, erledigten mehrere Aufgaben im Hintergrund (zur Hauptarbeit), stellten den Code in das Repository und erhielten Pull-Anfragen von anderen gerade geschulten Entwicklern und von Go-Spezialisten. Interessiert an Büchern. Das heißt, wir waren noch einige Wochen technischer Support der zweiten Linie.
Für diejenigen, die ihr Studium fortsetzen wollten, gründeten sie eine Gruppe in Telegramm mit Büchern und mehr. Wir haben auch eine Gilde von Golang-Entwicklern organisiert, in der wir wöchentlich aufkommende Probleme in der Arbeit diskutieren, gemeinsame Komponenten entwickeln und bewährte Verfahren austauschen. Jeder Entwickler kann teilnehmen.
Die größte Konsequenz ist, dass wir nach einem Monat einen der am stärksten frequentierten Abschnitte neu geschrieben haben und er ungefähr sechstausendmal schneller im Produkt zu arbeiten begann. Aber ich werde besser separat darüber sprechen: Es gibt nicht nur die Merkmale der Sprache, sondern auch die Implementierung von Multithreading, einige architektonische Verbesserungen und ein bisschen Schamanismus. Das Wichtigste ist unsere Erfahrung, die Sprache kennenzulernen, und es ist im Allgemeinen einfach, sie mit Ihnen zu wiederholen, wenn Sie mindestens einen Go-Spezialisten haben, der einige Wochen lang lernen wird.
Weitere Beiträge zu unserer Entwicklung: Die
Geschichte des 15-jährigen Monolithen , ein
Lebensmittelgeschäft für die Küche ,
was der Entwickler über das Geschäft wissen sollte , und
insbesondere die Rückgabe von Flugtickets .