Der Kanarienvogel ist ein kleiner Vogel, der stĂ€ndig singt. Diese Vögel sind empfindlich gegenĂŒber Methan und Kohlenmonoxid. Selbst bei einer geringen Konzentration dieser Gase in der Luft verlieren sie das Bewusstsein oder sterben. Goldsucher und Bergleute nahmen die Vögel mit in die Minen: solang die Kanarienvögel singen, kann gearbeitet werden; wenn sie schweigen, ist Gas in der Mine und es ist Zeit zu gehen. Die Bergleute opferten den kleinen Vogel, um lebend aus den Minen zu entkommen.

Eine Ă€hnliche Praxis hat sich auch in der IT etabliert. Zum Beispiel bei der Standardaufgabe, eine neue Version eines Dienstes oder einer Anwendung in der Produktion zu deployen, nachdem zuvor getestet wurde. Eine Testumgebung kann zu teuer sein, automatisierte Tests decken nicht alles ab, was man sich wĂŒnscht, und ohne Tests zu arbeiten, gefĂ€hrdet die QualitĂ€t. In solchen FĂ€llen hilft der Ansatz des Canary Deployments, bei dem ein wenig echter Produktionsverkehr auf die neue Version geleitet wird. Diese Methode hilft sicher die neue Version in der Produktion zu prĂŒfen, indem man wenig opfert, um ein groĂes Ziel zu erreichen. Mehr darĂŒber, wie der Ansatz funktioniert, welche Vorteile er bietet und wie man ihn umsetzt, wird Andrey Markelov (), am Beispiel der Implementierung bei Infobip erlĂ€utern.
Andrey Markelov â leitender Softwareingenieur bei Infobip, der seit 11 Jahren an der Entwicklung von Java-Anwendungen im Bereich Finanzen und Telekommunikation arbeitet. Er entwickelt Open-Source-Produkte, engagiert sich aktiv in der Atlassian-Community und schreibt Plugins fĂŒr Atlassian-Produkte. Evangelist fĂŒr Prometheus, Docker und Redis.

Ăber Infobip
Eine globale Telekommunikationsplattform, die Banken, EinzelhĂ€ndlern, Online-Shops und Transportunternehmen ermöglicht, ihren Kunden Nachrichten ĂŒber SMS, Push-Nachrichten, E-Mails und Sprachmitteilungen zu senden. In diesem GeschĂ€ft sind StabilitĂ€t und ZuverlĂ€ssigkeit entscheidend, damit die Kunden rechtzeitig Nachrichten erhalten.
IT-Infrastruktur von Infobip in Zahlen:
- 15 Rechenzentren weltweit;
- 500 einzigartige Dienstleistungen im Einsatz;
- 2500 Instanzen von Services, was deutlich mehr ist als die Anzahl der Teams;
- 4,5 TB monatlicher Traffic;
- 4,5 Milliarden Telefonnummern;
Das GeschĂ€ft wĂ€chst, ebenso die Anzahl der Releases. Wir fĂŒhren tĂ€glich 60 Releases durch, weil die Kunden mehr Funktionen und Möglichkeiten wollen. Aber das ist schwierig â es gibt viele Services und zu wenige Teams. Man muss schnell Code schreiben, der fehlerfrei in der Produktion funktioniert.
Releases
Ein typisches Release bei uns lÀuft so ab. Zum Beispiel gibt es die Dienste A, B, C, D und E, wobei jeder von einem eigenen Team entwickelt wird.

Irgendwann beschlieĂt das Team des Dienstes A, eine neue Version zu deployen, aber die Teams der Dienste B, C, D und E wissen nichts darĂŒber. Das Team des Dienstes A hat zwei Optionen.
Es wird ein inkrementelles Release durchfĂŒhren: zuerst wird eine Version ersetzt und anschlieĂend die andere.

Es gibt jedoch eine zweite Option: Das Team findet zusÀtzliche KapazitÀten und Maschinen, deployt die neue Version und wechselt dann den Router, sodass die Version in der Produktion lÀuft.

In jedem Fall treten nach dem Deployment fast immer Probleme auf, selbst wenn die Version getestet wurde. Man kann manuell testen, automatisiert testen oder gar nicht testen â die Probleme werden in jedem Fall auftreten. Der einfachste und richtige Weg, damit umzugehen, ist, auf eine funktionierende Version zurĂŒckzukehren. Danach kann man sich mit dem Schaden und den Ursachen beschĂ€ftigen und diese beheben.
Also, was wollen wir?
Probleme wollen wir nicht. Wenn Kunden sie schneller entdecken als wir, schadet das unserem Ruf. Deshalb mĂŒssen wir Probleme schneller finden als die Kunden. Durch proaktives Arbeiten minimieren wir den Schaden.
Gleichzeitig möchten wir den Deployment-Prozess beschleunigen, damit alles schnell, einfach, selbstverstĂ€ndlich und ohne Druck auf das Team ablĂ€uft. Ingenieure, DevOps-Engineers und Programmierer mĂŒssen geschont werden â die Veröffentlichung einer neuen Version ist stressig. Das Team ist kein Verbrauchsmaterial; wir streben an, die menschlichen Ressourcen sinnvoll zu nutzen.
Deployment-Probleme
der Kundenverkehr ist unvorhersehbar. Es ist unmöglich vorherzusagen, wann der Kundenverkehr am niedrigsten sein wird. Wir wissen nicht, wo und wann Kunden ihre Kampagnen starten â vielleicht heute Nacht in Indien und morgen in Hongkong. Angesichts der groĂen Zeitverschiebung garantiert ein Deployment um 2 Uhr morgens nicht, dass die Kunden nicht betroffen sind.
Probleme mit den Anbietern. Messenger und Anbieter sind unsere Partner. Manchmal haben sie AusfÀlle, die wÀhrend des Deployments neuer Versionen Fehler verursachen.
Verteilte Teams. Die Teams, die die Client-Seite und das Backend entwickeln, befinden sich in unterschiedlichen Zeitzonen. Daher können sie oft keine Einigung erzielen.
Rechenzentren lassen sich nicht auf der Staging-Plattform nachbilden. In einem Rechenzentrum gibt es 200 Racks â das in einer Sandbox auch nur annĂ€hernd nachzubilden, ist nicht möglich.
Ausfallzeitensind nicht akzeptabel! Wir haben ein zulĂ€ssiges VerfĂŒgbarkeitsniveau (Error Budget), bei dem wir 99,99 % der Zeit arbeiten; die restlichen ProzentsĂ€tze sind das 'Recht auf Fehler'. Es ist unmöglich, 100 % ZuverlĂ€ssigkeit zu erreichen, aber es ist wichtig, AusfĂ€lle und Downtimes kontinuierlich zu ĂŒberwachen.
Klassische LösungsansÀtze
Fehlerfreien Code schreiben. Als ich ein junger Entwickler war, kamen Manager zu mir und baten um einen Release ohne Bugs, aber das ist nicht immer möglich.
Tests schreiben. Tests funktionieren, aber manchmal ganz anders, als es das GeschĂ€ft wĂŒnscht. Geld zu verdienen ist nicht die Aufgabe von Tests.
Auf der Staging-Umgebung testen. In meinen 3,5 Jahren bei Infobip habe ich noch nie gesehen, dass der Zustand der Staging-Umgebung auch nur teilweise mit der Produktion ĂŒbereinstimmte.

Wir haben sogar versucht, diese Idee weiterzuentwickeln: Zuerst hatten wir eine Staging-Umgebung, dann eine Pre-Production und schlieĂlich eine Pre-Production der Pre-Production. Aber auch das half nicht â sie stimmten nicht einmal in ihrer KapazitĂ€t ĂŒberein. Mit der Staging-Umgebung können wir grundlegende FunktionalitĂ€t garantieren, wissen aber nicht, wie sie unter Last funktionieren wird.
Der Release wird von demjenigen durchgefĂŒhrt, der entwickelt hat. Das ist eine gute Praxis: Selbst wenn jemand den Titel eines Kommentars Ă€ndert, wird er sofort in die Produktion eingefĂŒgt. Dies fördert Verantwortungsbewusstsein und sorgt dafĂŒr, dass Ănderungen nicht in Vergessenheit geraten.
Es gibt auch zusĂ€tzliche Herausforderungen. FĂŒr den Entwickler ist es stressig, viel Zeit damit zu verbringen, alles manuell zu ĂŒberprĂŒfen.
Konsolidierte Releases. Diese Variante wird normalerweise vom Management vorgeschlagen: âLassen Sie uns vereinbaren, dass Sie jeden Tag testen und neue Versionen hinzufĂŒgen.â Das funktioniert nicht: Es gibt immer ein Team, das auf die anderen wartet oder umgekehrt.
Smoke-Tests
Eine weitere Möglichkeit, unsere Probleme mit dem Deployment zu lösen. Lassen Sie uns untersuchen, wie Smoke-Tests im vorherigen Beispiel funktionieren, wenn Team A eine neue Version bereitstellen möchte.
Zuerst stellt das Team eine Instanz in der Produktion bereit. Mit Nachrichten in der Instanz von Mocks wird der reale Verkehr simuliert, sodass er mit dem normalen tĂ€glichen Verkehr ĂŒbereinstimmt. Wenn alles gut lĂ€uft, schaltet das Team die neue Version auf den Benutzertverkehr um.

Die zweite Möglichkeit ist, zu deployen mit zusÀtzlicher Hardware. Das Team testet sie in der Produktion, wechselt dann um, und alles funktioniert.

Nachteile der Smoke-Tests:
- Tests sind nicht zuverlĂ€ssig. Woher bekomme ich den gleichen Traffic wie in der Produktion? Man kann gestrigen oder einer Woche alten Traffic verwenden, aber er stimmt nicht immer mit dem aktuellen ĂŒberein.
- Schwierig zu verwalten. Es mĂŒssen Testkonten verwaltet und vor jedem Deployment zurĂŒckgesetzt werden, wenn aktive DatensĂ€tze an das Repository gesendet werden. Das ist komplizierter, als einen Test in einer Sandbox zu schreiben.
Der einzige Vorteil hier ist man kann die Leistung ĂŒberprĂŒfen.
Canary-Releases
Aufgrund der MĂ€ngel von Smoke-Tests haben wir begonnen, Canary-Releases zu verwenden.
Eine Praxis, Ă€hnlich wie Bergleute Kanarienvögel zur Anzeige von Gasleveln verwendeten, hat auch in der IT Einzug gehalten. Wir leiten ein wenig echten Produktionsverkehr auf die neue Version, wĂ€hrend wir versuchen, die Service Level Agreement (SLA) einzuhalten. SLA ist unser âRecht auf einen Fehlerâ, das wir einmal im Jahr (oder in einem anderen Zeitraum) nutzen können. Wenn alles gut lĂ€uft, fĂŒgen wir mehr Traffic hinzu. Wenn nicht, rollen wir die vorherigen Versionen zurĂŒck.

Implementierung und Feinheiten
Wie haben wir die Canary-Releases implementiert? Zum Beispiel sendet eine Kundengruppe ĂŒber unseren Service Nachrichten.

Der Deployment-Prozess verlÀuft so: Wir entfernen einen Knoten vom Load Balancer (1), Àndern die Version (2) und lassen dann schrittweise etwas Traffic laufen (3).

Insgesamt werden in der Gruppe alle zufrieden sein, selbst wenn ein Nutzer unzufrieden ist. Wenn alles gut lÀuft, Àndern wir alle Versionen.

Ich zeige schematisch, wie das in den meisten FĂ€llen fĂŒr Mikrodienste aussieht.
Es gibt einen Service Discovery und zwei weitere Dienste: S1N1 und S2. Der erste Dienst (S1N1) informiert den Service Discovery, wenn er startet, und dieser speichert ihn. Der zweite Dienst mit zwei Knoten (S2N1 und S2N2) informiert ebenfalls beim Start den Service Discovery.

Der zweite Dienst fungiert fĂŒr den ersten als Server. Der erste Dienst fragt bei Service Discovery Informationen ĂŒber seine Server an und sucht und ĂŒberprĂŒft sie, wenn er diese erhĂ€lt ("Health Check"). Sobald die ĂberprĂŒfung erfolgt ist, sendet er ihnen Nachrichten.
Wenn jemand eine neue Version des zweiten Dienstes bereitstellen möchte, teilt er dem Service Discovery mit, dass der zweite Knoten eine Canary-Node sein wird: Auf ihn wird weniger Traffic geleitet, da jetzt das Deployment stattfindet. Wir entfernen die Canary-Node vom Load Balancer, und der erste Dienst sendet keinen Traffic mehr dorthin.

Wir Ă€ndern die Version und der Service Discovery weiĂ, dass der zweite Node jetzt ein Canary ist â wir können ihm weniger Last (5%) zuweisen. Wenn alles gut lĂ€uft, Ă€ndern wir die Version, stellen die Last wieder her und arbeiten weiter.
Um all dies umzusetzen, benötigen wir:
- Lastverteilung;
- Monitoring, da es wichtig ist zu wissen, was jeder Benutzer erwartet und wie detailliert unsere Dienste funktionieren;
- Versionsanalyse, um zu verstehen, wie gut die neue Version in der Produktion funktionieren wird;
- Automatisierung â wir schreiben die Bereitstellungsreihenfolge (Deployment-Pipeline).

Lastverteilung
Das ist das Erste, worĂŒber wir nachdenken mĂŒssen. Es gibt zwei Strategien zur Lastverteilung.
Die einfachste Variante ist, dass ein Node immer ein Canary ist.Dieser Node erhÀlt immer weniger Verkehr und wir beginnen das Deployment mit ihm. Bei Problemen vergleichen wir seine Leistung vor und wÀhrend des Deployments. Zum Beispiel, wenn die Fehler um das Doppelte gestiegen sind, dann ist auch der Schaden um das Doppelte gewachsen.
Der Canary-Node wird im Verlauf des Deployments festgelegt.Wenn das Deployment abgeschlossen ist und wir den Canary-Status von ihm entfernen, wird die Lastverteilung wiederhergestellt. Mit weniger Maschinen erhalten wir eine faire Verteilung.
Ăberwachung
Der Grundstein fĂŒr Canary-Releases. Wir mĂŒssen genau verstehen, warum wir das tun und welche Metriken wir sammeln möchten.
Beispiele fĂŒr Metriken, die wir von unseren Diensten sammeln.
- Anzahl der Fehler, die in die Protokolle geschrieben werden. Dies ist ein offensichtlicher Indikator dafĂŒr, dass alles wie gewĂŒnscht funktioniert. Insgesamt ist das eine gute Metrik.
- Antwortzeit (Latenz). Diese Metrik wird von allen ĂŒberwacht, da alle schnell arbeiten möchten.
- GröĂe der Warteschlange (Durchsatz).
- Anzahl der erfolgreichen Antworten pro Sekunde.
- Die AusfĂŒhrungszeit von 95 % aller Anfragen.
- GeschĂ€ftsmetriken: wie viel Geld das Unternehmen in einem bestimmten Zeitraum verdient oder der Benutzerabwanderung. Diese Metriken könnten fĂŒr unsere neue Version wichtiger sein als die, die Ingenieure hinzufĂŒgen.
Beispiele fĂŒr Metriken in den meisten gĂ€ngigen Ăberwachungssystemen.
ZĂ€hler. Dies ist eine zunehmende GröĂe, zum Beispiel die Anzahl der Fehler. Diese Metrik lĂ€sst sich einfach interpolieren und der Verlauf lĂ€sst sich betrachten: Gestern gab es 2 Fehler, heute 500, das bedeutet, dass etwas schiefgegangen ist.
Die Anzahl der Fehler pro Minute oder Sekunde ist ein wesentlicher Indikator, der mit dem Counter berechnet werden kann. Diese Daten bieten einen klaren Ăberblick ĂŒber die Systemleistung im Laufe der Zeit. Betrachten wir das Beispiel eines Diagramms der Anzahl der Fehler pro Sekunde fĂŒr zwei Versionen des Produktionssystems.

In der ersten Version gab es wenige Fehler, möglicherweise hat das Audit nicht funktioniert. In der zweiten Version sieht es viel schlimmer aus. Man kann sicher sagen, dass es Probleme gibt, weshalb wir diese Version zurĂŒcksetzen mĂŒssen.
Gauge. Metriken Ă€hneln dem Counter, aber wir zeichnen Werte auf, die sowohl zunehmen als auch abnehmen können. Zum Beispiel die AusfĂŒhrungszeit von Anfragen oder die GröĂe der Warteschlange.
Im Diagramm ist ein Beispiel fĂŒr die Reaktionszeit (latency) zu sehen. Anhand des Diagramms erkennt man, dass die Versionen Ă€hnlich sind und damit gearbeitet werden kann. Bei genauem Hinsehen ist jedoch deutlich zu erkennen, wie sich der Wert verĂ€ndert. Wenn die AusfĂŒhrungszeit von Anfragen mit der Anzahl der Benutzer steigt, ist sofort klar, dass es Probleme gibt â so etwas gab es frĂŒher nicht.

Zusammenfassung. Eine der wichtigsten Kennzahlen fĂŒr das GeschĂ€ft sind die Perzentile. Die Metrik zeigt, dass in 95 % der FĂ€lle Unser System funktioniert so, wie wir es möchten. Wir können akzeptieren, wenn es irgendwo Probleme gibt, weil wir die allgemeine Tendenz verstehen, wie gut oder schlecht alles ist.
Werkzeuge
ELK Stack. Ein Canary kann mit Elasticsearch implementiert werden â wir protokollieren Fehler, wenn Ereignisse eintreten. Mit einem einfachen API-Aufruf kann die Anzahl der Fehler zu jedem Zeitpunkt abgerufen und mit frĂŒheren ZeitrĂ€umen verglichen werden: GET /applg/_cunt?q=level:errr.
Prometheus. Hat sich bei Infobip bewÀhrt. Es ermöglicht die Implementierung multidimensionaler Metriken, da Labels verwendet werden.
Wir können level, Instanz, service, in einem System kombinieren. Damit offset kann zum Beispiel der Wert vor einer Woche mit nur einem Befehl angezeigt werden. GET /api/v1/query?query={query}, wobei {query}:
rate(logback_appender_total{
level="error",
instance=~"$instance"
}[5m] offset $offset_value)Versionsanalyse
Es gibt mehrere Strategien zur Analyse von Versionen.
Nur die Canary-Knoten beobachten. Eine der einfachsten Varianten: eine neue Version bereitgestellt und nur die Leistung untersucht. Aber wenn der Ingenieur in der Zwischenzeit beginnt, die Logs zu studieren und stÀndig nervös die Seiten neu lÀdt, unterscheidet sich diese Lösung nicht von anderen.
Der Canary-Knoten wird mit jedem anderen Knoten verglichen.. Dies ist ein Vergleich mit anderen Instanzen, die mit vollem Verkehr arbeiten. Wenn beispielsweise bei geringem Verkehr die Situation schlechter oder nicht besser ist als bei den realen Instanzen, dann stimmt etwas nicht.
Die Canary-Node wird mit sich selbst in der Vergangenheit verglichen. Die fĂŒr die Canary-Node reservierten Nodes können mit historischen Daten verglichen werden. Wenn vor einer Woche alles gut war, können wir uns auf diese Daten stĂŒtzen, um die aktuelle Situation zu verstehen.
Automatisierung
Wir möchten die Ingenieure von manuellen Vergleichen entlasten, daher ist es wichtig, die Automatisierung umzusetzen. Der Bereitstellungsprozess (Deployment-Pipeline) sieht normalerweise so aus:
- Wir starten;
- wir nehmen den Node aus dem Load Balancer;
- wir setzen die Canary-Node;
- wir aktivieren den Load Balancer bereits mit einer begrenzten Menge an Verkehr;
- wir vergleichen.

An diesem Punkt implementieren wir automatische Vergleiche. Wie das aussehen kann und warum es besser ist als eine ĂberprĂŒfung nach der Bereitstellung, werden wir am Beispiel von Jenkins betrachten.
Das ist die Pipeline zu Groovy.
while (System.currentTimeMillis() < endCanaryTs) {
def isOk = compare(srv, canary, time, base, offset, metrics)
if (isOk) {
sleep DEFAULT SLEEP
} else {
echo "Canary ist fehlgeschlagen, muss zurĂŒckgesetzt werden"
return false
}
} Hier im Zyklus legen wir fest, dass wir den neuen Knoten fĂŒr eine Stunde vergleichen werden. Wenn der Canary-Prozess noch nicht abgeschlossen ist, rufen wir die Funktion auf. Sie gibt an, ob alles gut ist oder nicht: def isOk = compare(srv, canary, time, base, offset, metrics).
Wenn alles gut ist â sleep DEFAULT SLEEP, zum Beispiel eine Sekunde, und wir machen weiter. Wenn nicht, brechen wir ab â das Deployment war nicht erfolgreich.
Beschreibung der Metrik. Schauen wir uns an, wie die Funktion compare mit DSL aussehen könnte.
metric(
'errorCounts',
'rate(errorCounts{node=~"$canaryInst"}[5m] offset $offset)',
{ baseValue, canaryValue ->
if (canaryValue > baseValue * 1.3) return false
return true
}
)Angenommen, wir vergleichen die Anzahl der Fehler und möchten die Anzahl der Fehler pro Sekunde in den letzten 5 Minuten wissen.
Wir haben zwei Werte: den Basiswert und den Canary-Knoten. Der Wert des Canary-Knotens ist der aktuelle. Der Basiswert ist baseValue â das ist der Wert eines beliebigen anderen Knotens, der kein Canary-Knoten ist. Wir vergleichen die Werte gemÀà der Formel, die wir basierend auf unserer Erfahrung und Beobachtungen festgelegt haben. Wenn der Wert canaryValue schlecht ist, war das Deployment nicht erfolgreich, und wir rollen zurĂŒck.
Warum ist das alles notwendig?
Ein Mensch kann Hunderte und Tausende von Metriken nicht ĂŒberprĂŒfen., insbesondere um dies schnell zu tun. Die automatische Vergleichsfunktion hilft, alle Metriken zu ĂŒberprĂŒfen und schnell ĂŒber Probleme zu informieren. Die Zeit fĂŒr die Benachrichtigung ist entscheidend: Wenn innerhalb der letzten 2 Sekunden etwas passiert ist, ist der Schaden nicht so groĂ, als wĂ€re es 15 Minuten zuvor geschehen. WĂ€hrend jemand das Problem bemerkt, die Supportanfrage schreibt und wir zurĂŒcksetzen, könnte man Kunden verlieren.
Wenn der Prozess abgeschlossen ist und alles gut aussieht, stellen wir alle anderen Knoten automatisch bereit. In dieser Zeit tun die Ingenieure nichts. Erst wenn sie das Canary starten, entscheiden sie, welche Metriken zu berĂŒcksichtigen sind, wie lange der Vergleich dauern soll und welche Strategie anzuwenden ist.

Wenn Probleme auftreten, setzen wir den Canary-Knoten automatisch zurĂŒck, arbeiten mit frĂŒheren Versionen und beheben die gefundenen Fehler. Anhand der Metriken lassen sich die Probleme leicht finden und der Schaden durch die neue Version erkennen.
Hindernisse
Das umzusetzen, ist natĂŒrlich nicht einfach. ZunĂ€chst brauchen wir ein gemeinsames Ăberwachungssystem. Die Ingenieure haben ihre eigenen Metriken, der Support und die Analysten andere, und das Business wieder andere. Ein gemeinsames System ist die gemeinsame Sprache, in der das GeschĂ€ft und die Entwicklung kommunizieren.
Wir mĂŒssen in der Praxis ĂŒberprĂŒfen die StabilitĂ€t der Metriken. Eine ĂberprĂŒfung hilft zu verstehen, welcher minimale Satz an Metriken erforderlich ist, um QualitĂ€t zu gewĂ€hrleisten..
Wie erreichen wir das? Entwenden Sie den Canary-Dienst nicht wĂ€hrend des Deployments.. Wir fĂŒgen in der alten Version einen bestimmten Dienst hinzu, der jederzeit einen dedizierten Knoten ĂŒbernehmen kann, den Verkehr ohne Deployment reduziert. Danach vergleichen wir: Wir untersuchen die Fehler und suchen nach dem Punkt, an dem wir QualitĂ€t erreichen.

Welchen Nutzen haben wir aus Canary-Releases gezogen?
Wir haben den Prozentsatz an durch Bugs verursachten SchÀden minimiert. Die meisten Deployment-Fehler treten aufgrund von Inkonsistenzen in Daten oder PrioritÀten auf. Solche Fehler gibt es nun viel seltener, da wir Probleme in den ersten Sekunden lösen können.
Wir haben die Arbeit der Teams optimiert. Neue Mitarbeiter haben das âRecht auf Fehlerâ: Sie können ohne Angst vor Fehlern in der Produktionsumgebung deployen, was zusĂ€tzliche Initiative und Anreiz zum Arbeiten schafft. Wenn sie etwas kaputt machen, ist das nicht kritisch, und sie werden nicht entlassen.
Wir haben das Deployment automatisiert.. Es ist nicht mehr ein manueller Prozess wie frĂŒher, sondern ein echter automatisierter Prozess. Aber es dauert lĂ€nger.
Wir haben wichtige Metriken hervorgehoben.. Das gesamte Unternehmen, von den GeschĂ€ftsfĂŒhrern bis zu den Ingenieuren, versteht, was in unserem Produkt wirklich wichtig ist, welche Kennzahlen wie Nutzerabwanderung und -zuwanderung entscheidend sind. Wir ĂŒberwachen den Prozess: testen Kennzahlen, fĂŒhren neue ein und beobachten, wie die bisherigen funktionieren, um ein System zu entwickeln, das profitabler ist.
Wir haben viele groĂartige Praktiken und Systeme, die uns unterstĂŒtzen. Dennoch streben wir danach, Profis zu sein und unsere Arbeit qualitativ hochwertig zu erledigen, unabhĂ€ngig davon, ob wir ein unterstĂŒtzendes System haben oder nicht.
IngenieuransĂ€tze und -praktiken â . Wenn Sie auf dem Weg zur technischen Exzellenz Fortschritte gemacht haben und bereit sind, zu teilen, was Ihnen dabei geholfen hat â .
Wir planen die DurchfĂŒhrung der 8. Juni. Wir verstehen, dass es derzeit schwierig ist, Entscheidungen ĂŒber die Teilnahme an der Konferenz zu treffen. Gleichzeitig sind wir jedoch der Meinung, dass die QuarantĂ€ne kein Grund ist, professionellen Austausch und Entwicklung zu stoppen. Deshalb werden wir auf jeden Fall einen Weg finden, die Aufgaben des technischen Leiters und AnsĂ€tze zu deren Lösung zu besprechen â wenn nötig, gehen wir online und starten das Networking dort!
Quelle: habr.com
