Python 3 auf Facebook

Hallo allerseits!

Wir haben den Stream zum fünften Jubiläum des Python Developer- Kurses gestartet. Vor dem Start jedes Threads werden sie häufig gefragt, welche Version wir im Training verwenden (im Allgemeinen beides und nicht nur, egal wie seltsam es sich anhört, wenn man den Namen des Kurses Python nennt) und welche Nuancen die Migration von einer Version zur anderen hat. Heute möchten wir einen Artikel über die Erfahrungen mit der Migration von 2 auf 3 auf Facebook veröffentlichen, der auf PyConf veröffentlicht wurde.

Lass uns gehen.

Der Übergang zu Python 3 ist in den letzten Jahren viel populärer geworden, aber der Prozess ist noch lange nicht abgeschlossen. Die Infrastruktur vieler großer Unternehmen, die Python verwenden, hinterlässt in Python 2.7 große Codeblöcke, und Facebook ist keine Ausnahme. Jason Fried besuchte PyCon 2018, um über die Veränderungen zu sprechen, die in den letzten 4 Jahren im Unternehmen aufgetreten sind - zu Beginn von Python 3 fehlte es praktisch, aber am Ende wurde es die Hauptversion von Python im Unternehmen. Jason hat dazu beigetragen, dieses Ziel zu erreichen, und sein Vortrag [YouTube-Video] ist eine großartige Quelle für Ideen für andere Organisationen, die migrieren möchten.

Fraid kam 2011 zu Facebook und erkannte schnell, dass er Python lernen musste, um Code-Reviews schneller zu erhalten. Wenig später stellte er fest, dass er die Hauptantriebskraft für den Übergang zu Python 3 auf Facebook geworden war. Dies war nie Teil seiner Pläne, und es geschah natürlich, als er mit Python arbeitete.



Fraid nahm zunächst aktiv an der internen Python-Gruppe teil und stellte sich häufig als erster heraus, der Fragen beantwortete. Infolgedessen wurde er unter Pythonisten auf Facebook berühmt („eher bekannt“), indem er den Code selbst korrigierte, ohne um Erlaubnis zu bitten, wenn er sah, dass die Sprache falsch verwendet wurde. Dies ist auf Facebook aufgrund des Fehlens einer vertikalen Kontrollhierarchie möglich. Jeder hat so viele Rechte, Ihre Änderungen zurückzusetzen, wie Sie diese Änderungen zunächst vornehmen müssen. Im Laufe der Zeit haben diese Änderungen dazu beigetragen, Freuds Glaubwürdigkeit in der Python-Facebook-Community zu stärken, was sich während des Migrationsprozesses als nützlich erweisen wird.

Laut Freud dauerte das Ändern einer Facebook-weiten Version der Python-Sprache einige Zeit und viel Diplomatie. Er wollte "die Geschichte erzählen, wie ich und ein paar andere Ingenieure in meiner Freizeit und ohne Autorität Python 3 zur Hauptversion auf Facebook gemacht haben".

Im Jahr 2013 gab es eine rudimentäre Unterstützung für Python 3.3 auf Facebook. Es erschien als Teil der Aufgabe, dem Build-System Python 3-Unterstützung hinzuzufügen. Diese Aufgabe wurde jedoch durch die Python 3-Unterstützung in Facebook-Bibliotheken blockiert, was wiederum durch die mangelnde Python 3-Unterstützung im Build-System blockiert wurde. Die Situation ist wie in Trick-22 : Python 3 war "verfügbar", aber nichts in der Facebook-Umgebung hat es unterstützt.

Darüber hinaus war Python 3 auf Facebook 2013 von einer negativen Stimmung umgeben. Fast alle dachten, das Unternehmen würde einfach für immer auf Python 2.7 bleiben. Es war auch die Rede davon, in eine völlig andere Sprache zu wechseln. Sogar Fraid selbst sagte (in einer internen Gruppe), dass der Übergang zu Python 3 auf Facebook niemals stattfinden wird. Nur eine Person hat diese Aussage angefochten und angeboten, etwas dagegen zu unternehmen. In diesem Moment ignorierte Freide den Aufruf zum Handeln, dachte aber weiter über diese Idee nach.

Lichtblick

Aber laut Freud war die Hoffnung warm. Im Januar 2013 verwendete der Linter vier Importe aus __future__ (print_function, division, absolute_imports, andunicode_literals) . Anfangs schienen sie die Lebensdauer der Python 2-Codebasis zu verlängern und wurden überall hinzugefügt, so dass der Linter aufhörte zu fluchen. Dies vereinfachte letztendlich die Konvertierung von Modulen in Python 3.

Facebook verwendet das allgegenwärtige Framework, um Apache Thrift- Routinen zu serialisieren und remote aufzurufen. Und seine außergewöhnliche Kompatibilität mit Python 2 ist zu einem großen Blocker geworden. In einer Umfrage zu potenziell interessanten Innovationen von Thrift auf Facebook erwies sich das Hinzufügen von Unterstützung für Python 3 als beliebte Option. Fraid stimmte für ihn, aber noch nicht, weil er Python 3 bewerben wollte. Er hatte einfach das Gefühl, dass die Python 2-Oberfläche etwas von Java ähnelte und daher ein Refactoring erforderte.

Sein Denkprozess begann sich nach einem Vortrag von Guido van Rossum in Yelp, San Francisco, zum Thema „Tulpe“ zu ändern , der sich als Asyncio- Modul herausstellte . Fride war schon immer ein Fan der asynchronen Python-Programmierung, hielt sie jedoch aufgrund der Unterschiede zwischen den Frameworks (z. B. Twisted , gevent ), die sie bereitstellten , für fragmentiert . Tulip sah aus, als könnte es asynchrone E / A interoperabel machen. Der Vortrag war noch nicht beendet und Fraid hatte bereits mit dem Thrift Facebook-Team gesprochen und angeboten, die Tulip-Unterstützung für Python 3 zu implementieren, um auf den Port von Twisted, Gevent und anderen zu warten. Einige Tage später veröffentlichte Trift eine Roadmap, die die bevorstehende Unterstützung für Python 3 und Tulip zeigt.

Dies geschah Anfang 2014, aber seit weiteren sechs Monaten hat sich nichts geändert. Benutzer erschienen nicht und hatten nicht vor, dies zu tun. Tatsächlich wussten sie nichts über Änderungen.

Neues Projekt

Im August 2014 startete Freitag ein Projekt zum Umschreiben eines Legacy-Dienstes. Zu diesem Zweck plante er zunächst, Python 2 und gevent zu verwenden, doch dann stellte er fest, dass es zum Zeitpunkt der Fertigstellung bereits veraltet war. Jemand muss der Erste sein, der eine Änderung vornimmt. für Facebook und Python 3 war es genau Fraid. "Sie müssen diese Person für Python 3 in Ihrer Organisation werden."

Also startete er sein Projekt mit Python 3 und „alles war kaputt“; Es ist nicht verwunderlich, dass niemand Python 3 verwendet hat. Das Build-System konnte nicht einmal seinen Code kompilieren, und alle Radpakete von Drittanbietern waren nur für Python 2 verfügbar. Und als er dennoch genug Dinge reparierte, um seinen Dienst zusammenzustellen, stürzte es beim Start sofort ab - wegen etwas tief im Code, das die Einstiegspunkte auf dem Facebook-System eingerichtet hat.

Um den Code zum Laufen zu bringen, musste Fraid daher alles andere reparieren. Er baute Hunderte von Rädern von Drittanbietern für beide Versionen von Python um und aktualisierte alle internen Bibliotheken, um sie mit 2/3 kompatibel zu machen. Jeden Tag hat jedoch jemand Änderungen an Python 2 nur in seiner Abhängigkeit vorgenommen. Kein Wunder, dass Fraid es satt hatte, Regressionen zu korrigieren. Die einzige Lösung besteht darin, die interne Einhaltung von Python 3 zu erzwingen. Dies ist jedoch auf Facebook nicht möglich. Wenn Sie jedoch anfangen, sich so zu verhalten, als hätten Sie die Autorität dazu, werden die Leute anfangen zu glauben, dass Sie sie wirklich haben.

Fraid nutzte seinen sozialen Einfluss, um den Pyflakes- Linter zum Bauprozess hinzuzufügen. Angesichts des Vorhandenseins von PEP 8 begründete er das Hinzufügen eines neuen, um eine andere Kategorie von Codeproblemen zu lösen. Außerdem hatte Pyflakes weniger Fehlalarme, sodass es für Entwickler weniger ärgerlich war. Fraid hat alles so eingerichtet, dass Pyflakes auf dem gesamten Code ausgeführt wird, der zur Überprüfung eingereicht wurde, zuerst für Python 2 und dann für Python 3. Dies hat dazu beigetragen, die Arbeit zur Aufrechterhaltung der Kompatibilität mit Python 3 auf alle Entwickler zu verteilen, wodurch Fortschritte im Freud-Projekt erzielt werden konnten.

Zuerst musste er den Leuten erklären, dass der Linter nicht kaputt war, und es ist sinnvoll, den Code so zu ändern, dass er mit Python 3 kompatibel ist. Wenn die Entwickler der Meinung wären, dass der Übergang zu Python 3 zu kompliziert sei, würden sie zu der Idee zurückkehren, „für immer bei Python 2 zu bleiben“. Mit Freud ist es viel einfacher geworden, Code mit Python 3 kompatibel zu machen. "Den Linter zum Schweigen bringen" und damit Freuds selbst ist einfacher geworden, als sich über die Notwendigkeit zu beschweren, den Code zu bearbeiten, weshalb es jeder getan hat.

Schulung

All dies half, die "Blutung" zu stoppen, aber es half nicht, signifikante Fortschritte bei der Einführung von Python 3 auf Facebook zu erzielen. Friday schloss sich dem Team an, das neuen Mitarbeitern Python beigebracht hat. Linters warf bereits Fehler aus, als der Code nicht mit 2 oder 3 kompatibel war, aber Fraid wollte den Punkt erreichen, an dem der mit 2/3 kompatible Code nur für ältere Projekte geschrieben wurde und der neue Code nur in Python 3 geschrieben wurde. Wieder nahm Fraid Die Situation in seinen eigenen Händen: Um diese Aussage zu treffen, hat er 2015 die Folien in der Python-Klasse für neue Mitarbeiter geändert. Die Idee war, dass Facebook zu einem unbekannten Zeitpunkt in der Zukunft zu Python 3 wechseln möchte. Daher macht es keinen Sinn, Code für Python 2 zu schreiben - eines Tages muss er neu geschrieben werden. Er erklärte Anfängern, dass all dies innerhalb der Facebook-Infrastruktur funktionieren und Systeme erstellen sollte. Wenn dies nicht möglich war, mussten Sie einen Fehler senden oder alles selbst beheben. "Seltsamerweise hat es funktioniert."

Im Januar 2015 hat Fraid sein Projekt „endlich veröffentlicht“. Den Rest des Jahres erzählte er den Menschen von seinem Erfolg und der Notwendigkeit, auf Python 3 umzusteigen. Im Laufe des Jahres tauchten beim Übergang zu Python 3 auf Facebook neue Verbündete auf.



Einer von ihnen war ukasz Langa, der „Instagram irgendwie davon überzeugt hat, auf Python 3 umzusteigen“. Im Jahr 2016 gründete Langa auf Facebook ein neues Facebook-Kontrollteam namens „Department of Stupid Gait“ . Da sie das "Python-Team" waren, funktionierte die oben erwähnte "fiktive Autorität"; Die Leute dachten, sie könnten auf Facebook Entscheidungen über Python treffen.

Im Jahr 2016 nahm die Verwendung von Python 3 im Unternehmen langsam, aber stetig zu. Sie sprachen über ihn bei Treffen, die in neuen Projekten verwendet wurden. Die Meinung änderte sich, obwohl Python 3 immer noch nicht als Standardversion angesehen wurde und Projekte sich freiwillig für die Verwendung entschieden haben. Im Mai 2016 gab Freitag seine Absicht bekannt, das Build-System standardmäßig auf Python 3 umzustellen. Die Idee wurde voll unterstützt, so dass einige Tage später der Wechsel durchgeführt wurde - ohne negative Konsequenzen.

Ende 2016 veröffentlichte das Projektteam einen Bericht mit den Ergebnissen der Umstellung auf Python 3. Die Entwickler starteten einfach 2to3 im Code und korrigierten alle Punkte, die er schwor. Beim Start des empfangenen Codes wurde festgestellt, dass er 40% schneller ist und nur die Hälfte des Speichers belegt. Dies deutete auf einen Mythos hin, dem Freitag häufig begegnet ist: Python 3 ist langsamer als Python 2. Dies mag für frühere Versionen von Python 3 zutreffen, ist aber derzeit nicht relevant.

Gutes Zeug

Anfang 2017 schloss Instagram die Migration zu Python 3 ab und Facebook profitierte von einer „glorreichen Zukunft, in der Sie gute Dinge genießen können“. Das Aktualisieren der Python-Version war kein so beängstigender Prozess und eröffnete die Möglichkeit, neue Funktionen zu verwenden. Facebook-Entwickler können sich jetzt auf Themen wie neue statische Typisierungsfunktionen oder Dienstmigration für die Verwendung von Asyncio konzentrieren. "Python auf Facebook macht wieder Spaß."

Ein neues Problem: Die Leute fragen, wann es möglich ist, die Unterstützung für Python 2 abzulehnen. Wenn Regressionen zur Unterstützung von Python 2-Bibliotheken oder -Modulen auftreten, fragen Entwickler häufig, ob sie einfach zu Python 3 wechseln können. Das Problem ist das Gegenteil von dem, was es vor einigen Jahren war. "Oh, wie wunderbar die Welt, in der ich lebe."

Während der Vorlesung zeigte Freide ab dem dritten Quartal 2015 eine grafische Darstellung der Facebook-Einstiegspunkte für den Python-Dienst - zu diesem Zeitpunkt gab es insgesamt nur 4 Python 3-Punkte. Zum Zeitpunkt des Übergangs zu Python 3 waren Mitte 2016 bereits 4% aller Punkte vorhanden Python 3. Im März 2018 lag ihre Anzahl über 50%; Mitte Mai, zum Zeitpunkt der Vorlesung, gab es 55% der „Zehntausende von Facebook-Einstiegspunkten“. Laut Freud ist es dem Unternehmen jetzt peinlich, Code zu schreiben, der nur auf Python 2 ausgeführt wird.

Dann analysierte Freitag den Prozess. Er stellte fest, dass mehr getan werden muss, als nur etwas Neues zu schaffen. Sie müssen Entwickler dazu führen, "die Veränderung zu sein, die Sie sehen wollen". Wir müssen Menschen anziehen, auch wenn sie nicht verstehen, dass sie helfen. Dies wird durch Linter- und Unit-Tests erleichtert. Es ist sehr wichtig, neuen Mitarbeitern beizubringen, wonach Sie streben. Wenn Sie das Ergebnis erhalten, feiern Sie, während Sie die „guten Dinge“ genießen: Schreiben Sie „coolen Python 3-Code“. Wenn Sie sehen, wie neue Funktionen verwendet werden können, möchten auch andere Benutzer wechseln.

Freitag beantwortete ein paar Fragen aus dem Publikum. Eine Frage war, wie eine solche Änderung in einer traditionelleren, hierarchischen Organisation vorgenommen werden kann. Freitag schlug vor, dass es noch einfacher sein könnte, da Sie nicht Tausende von Entwicklern überzeugen müssen, sondern nur eine Kette von Managern, beginnend mit demjenigen, der die Vorteile des Übergangs sieht. Andererseits kann es schwieriger sein, wenn die Unternehmenskultur konservativ ist. Hier hilft es, sich auf die Verbesserung der Codequalität zu konzentrieren. Eine andere Frage betraf unteilbaren Code, der nicht in viele Eingabepunkte unterteilt ist. In diesem Fall schlug Friday vor, die Präsentation von Instagram (Video auf YouTube) mit PyCon 2017 anzusehen.

Andere Organisationen können viel aus dieser Vorlesung lernen, aber es ist klar, dass es wichtig ist, einen hartnäckigen Unterstützer zu haben, der bereit ist, den gesamten Prozess zu kontrollieren und zu koordinieren. Unternehmen, die einen solchen Übergang planen, brauchen einen Mann wie Fraid.

DAS ENDE

Wir warten auf eine Frage und Kommentare, die Sie hier hinterlassen oder Stas direkt in seiner offenen Lektion fragen können.

Source: https://habr.com/ru/post/de425233/


All Articles