Bonjour à tous!
Nous avons lancé le cinquième volet anniversaire du cours pour
développeurs Python . Avant le début de chaque thread, ils demandent souvent quelle version nous utilisons dans la formation (généralement les deux et pas seulement, aussi étrange que cela puisse paraître, étant donné le nom du cours, Python) et les différentes nuances de migration d'une version à l'autre. Aujourd'hui, nous voulons partager un article sur l'expérience de la migration de 2 à 3 sur Facebook, qui a été raconté sur PyConf.
Allons-y.
La transition vers Python 3 est devenue beaucoup plus populaire ces dernières années, mais le processus est encore loin d'être terminé. L'infrastructure de nombreuses grandes entreprises utilisant Python laisse de gros blocs de code dans Python 2.7, et Facebook ne fait pas exception. Jason Fried a visité PyCon 2018 pour parler des changements survenus dans l'entreprise au cours des 4 dernières années - au tout début de Python 3, il était pratiquement absent, mais à la fin, il est devenu la version principale de Python dans l'entreprise. Jason a aidé à atteindre cet objectif, et son
exposé [vidéo YouTube] est une excellente source d'idées pour d'autres organisations qui souhaitent migrer.
Fraid a rejoint Facebook en 2011 et s'est rapidement rendu compte qu'il devait apprendre Python s'il voulait obtenir des révisions de code plus rapidement. Un peu plus tard, il s'est rendu compte qu'il était devenu le principal moteur de la transition vers Python 3 sur Facebook. Cela n'a jamais fait partie de ses plans, et cela s'est produit bien sûr pendant qu'il travaillait avec Python.

Fraid a commencé par prendre une part active dans le groupe Python interne et s'est souvent avéré être le premier à répondre aux questions. En conséquence, il est devenu célèbre («plutôt de notoriété») parmi les pythonistes sur Facebook, en corrigeant lui-même le code, sans demander la permission, s'il voyait que le langage était mal utilisé. Cela est possible sur Facebook, en raison de l'absence d'une hiérarchie verticale de contrôle; tout le monde a autant de droits pour annuler vos modifications que vous devez effectuer ces modifications initialement. Au fil du temps, ces modifications ont contribué à renforcer la crédibilité de Freud dans la communauté Facebook Python, qui sera utile pendant le processus de migration.
Selon Freud, changer quelque chose comme une version du langage Python à l'échelle de Facebook a pris du temps et beaucoup de diplomatie. Il voulait raconter "l'histoire de la façon dont moi et quelques autres ingénieurs pendant mon temps libre et sans aucune autorité ont fait de Python 3 la version principale sur Facebook".
En 2013, il y avait un support rudimentaire pour Python 3.3 sur Facebook. Il est apparu dans le cadre de la tâche d'ajout de la prise en charge de Python 3 au système de génération. Mais cette tâche a été bloquée par la prise en charge de Python 3 dans les bibliothèques Facebook, qui à son tour a été bloquée par le manque de prise en charge de Python 3 dans le système de génération. La situation est similaire à celle de
Trick-22 : Python 3 était «disponible», mais rien dans l'environnement Facebook ne le supportait.
De plus, en 2013, Python 3 sur Facebook était entouré d'un sentiment négatif. Presque tout le monde pensait que la société resterait sur Python 2.7 pour toujours. Il a également été question de passer à une langue complètement différente. Même Fraid lui-même a déclaré (dans un groupe interne) que la transition vers Python 3 ne se fera jamais sur Facebook. Une seule personne a contesté cette déclaration et a proposé de faire quelque chose; à ce moment, Freide a ignoré l'appel à l'action mais a continué à réfléchir à cette idée.
Rayon d'espoirMais, selon Freud, l'espoir était chaleureux. En janvier 2013, le
linter a utilisé quatre importations en provenance de
__future__ (print_function, division, absolute_imports, andunicode_literals)
. Initialement, ils semblaient prolonger la durée de vie de la base de code Python 2, et ont été ajoutés partout pour que le linter cesse de maudire. Cela a finalement simplifié la conversion des modules en Python 3.
Facebook utilise le cadre omniprésent pour sérialiser et appeler à distance
les routines
Apache Thrift . Et sa compatibilité exceptionnelle avec Python 2 est devenue un bloqueur majeur. Mais dans un sondage sur les innovations potentiellement intéressantes de Thrift sur Facebook, l'ajout du support pour Python 3 s'est avéré être une option populaire. Fraid a voté pour lui, mais pas encore parce qu'il voulait promouvoir Python 3; il pensait simplement que l'interface Python 2 était similaire à quelque chose de Java, et nécessitait donc une refactorisation.
Son processus de réflexion a commencé à changer après une conférence de Guido van Rossum dans Yelp, San Francisco sur le sujet «Tulip», qui s'est avéré être un module
asyncio . Fride a toujours été un fan de la programmation Python asynchrone, mais l'a considérée comme fragmentée en raison des différences entre les frameworks (par exemple
Twisted ,
gevent ) qui la fournissaient. Tulip semblait pouvoir rendre les E / S asynchrones interopérables. La conférence n'était pas encore terminée, et Fraid avait déjà parlé avec l'équipe de Thrift Facebook, proposant d'implémenter le support Tulip pour Python 3 pour attendre le port de Twisted, gevent et autres. Quelques jours plus tard, Trift a publié une feuille de route montrant le support à venir pour Python 3 et Tulip.
Cela s'est produit au début de 2014, mais rien n'a changé pendant encore six mois; les utilisateurs ne sont pas apparus et n'ont pas prévu de le faire, en fait, ils ne connaissaient aucun changement.
Nouveau projetEn août 2014, vendredi a lancé un projet de réécriture d'un service hérité. Initialement, à cette fin, il prévoyait d'utiliser Python 2 et gevent, mais il a ensuite réalisé qu'au moment où il était terminé, il était déjà obsolète. Quelqu'un doit être le premier à apporter un changement; pour Facebook et Python 3, c'était précisément Fraid. "C'est vous qui devez devenir cette personne pour Python 3 dans votre organisation."
Il a donc commencé son projet en utilisant Python 3 et «tout était cassé»; il n'est pas surprenant que personne n'ait utilisé Python 3. Le système de construction n'a même pas pu compiler son code, et tous les packages de roues tiers n'étaient disponibles que pour Python 2. Et quand il a néanmoins réparé suffisamment de choses pour assembler son service, il s'est immédiatement écrasé au démarrage - à cause de quelque chose de profond dans le code qui a configuré les points d'entrée sur le système Facebook.
Par conséquent, afin de faire fonctionner le code, Fraid a été obligé de réparer tout le reste; Il a reconstruit des centaines de roues tierces pour fonctionner avec les deux versions de Python, mis à jour toutes les bibliothèques internes pour les rendre compatibles avec 2/3. Cependant, chaque jour, quelqu'un n'apportait des modifications à Python 2 que dans sa dépendance.Pas étonnant que Fraid en ait assez de corriger les régressions. La seule solution est de forcer la conformité avec Python 3 en interne, mais ce n'est pas possible sur Facebook. Cependant, si vous commencez à agir comme si vous en aviez le pouvoir, les gens commenceront à croire que vous les avez vraiment.
Fraid, utilisant son influence sociale, a ajouté le linter de
Pyflakes au processus de construction. Compte tenu de la présence de
PEP 8 , il a justifié d'en ajouter un nouveau afin de résoudre une catégorie différente de problèmes de code; De plus, Pyflakes avait moins de faux positifs, donc c'était moins ennuyeux pour les développeurs. Fraid a tout configuré pour que Pyflakes s'exécute sur tout le code soumis pour examen, d'abord pour Python 2, puis Python 3. Cela a aidé à répartir le travail de maintien de la compatibilité avec Python 3 entre tous les développeurs, ce qui a permis de progresser dans le projet Freud.
Au début, il devait expliquer aux gens que le linter n'était pas cassé, et il est logique de modifier le code pour le rendre compatible avec Python 3. Si les développeurs pensaient que la transition vers Python 3 était trop compliquée, ils reviendraient à l'idée de «rester avec Python 2 pour toujours». Avec Freud, rendre le code compatible avec Python 3 est devenu beaucoup plus facile. «Taire le linter», et donc de Freud lui-même, est devenu plus facile que de se plaindre de la nécessité de modifier le code, c'est pourquoi tout le monde l'a fait.
La formationTout cela a aidé à arrêter le «saignement», mais cela n'a pas permis de faire de progrès significatifs dans l'introduction de Python 3 sur Facebook. Vendredi a rejoint l'équipe qui a enseigné le Python aux nouveaux employés. Linters a déjà jeté des erreurs lorsque le code n'était pas compatible avec 2 ou 3, mais Fraid voulait atteindre le point où le code compatible avec 2/3 était écrit uniquement pour les projets hérités, et le nouveau code était écrit uniquement en Python 3. Encore une fois, Fraid a pris la situation entre ses mains: afin de faire cette déclaration, en 2015, il a changé les diapositives de la classe Python pour les nouveaux employés. L'idée était qu'à un moment inconnu dans le futur, Facebook voudrait passer à Python 3, donc cela n'a aucun sens d'écrire du code pour Python 2 - un jour, il devra être réécrit. Il a expliqué aux débutants que tout cela devrait fonctionner à l'intérieur de l'infrastructure Facebook et construire des systèmes, et si cela n'était pas possible, vous deviez envoyer un bogue, ou le réparer vous-même. "Curieusement, cela a fonctionné."
En janvier 2015, Fraid «a finalement rendu public» son projet. Il a passé le reste de l'année à parler aux gens de son succès et de la nécessité de passer à Python 3. Au cours de l'année, de nouveaux alliés sont apparus lors de la transition vers Python 3 sur Facebook.

L'un d'eux était ukasz Langa, qui "a en quelque sorte convaincu Instagram de passer à Python 3". En 2016, Langa a formé une nouvelle équipe de contrôle Facebook sur Facebook, appelée
«Department of Stupid Gait» . Puisqu'ils étaient «l'équipe Python», «l'autorité fictive» mentionnée ci-dessus a fonctionné; les gens pensaient pouvoir prendre des décisions sur Python sur Facebook.
En 2016, il y a eu une augmentation lente mais régulière de l'utilisation de Python 3 dans l'entreprise. Ils ont parlé de lui lors de réunions, utilisé dans de nouveaux projets. L'opinion changeait, bien que Python 3 ne soit toujours pas considéré comme la version par défaut, et les projets ont choisi volontairement de l'utiliser. En mai 2016, vendredi a annoncé son intention de basculer le système de build vers Python 3 par défaut. L'idée a été pleinement soutenue, donc quelques jours plus tard, le changement a été effectué - sans conséquences négatives.
Fin 2016, l'équipe du projet a publié un rapport avec les résultats du passage à Python 3. Les développeurs ont simplement lancé
2to3 dans le code et corrigé tous les points qu'il jurait. Lorsque le code reçu a été lancé, il a été constaté qu'il était 40% plus rapide et n'utilisait que la moitié de la mémoire. Cela indique un mythe que vendredi a souvent rencontré: Python 3 est plus lent que Python 2. Cela peut être vrai pour les versions antérieures de Python 3, mais pour le moment il n'est pas pertinent.
De bonnes choses
Début 2017, Instagram a achevé la migration vers Python 3 et Facebook récoltait les fruits d'un «avenir glorieux où vous pourrez profiter de bonnes choses». La mise à jour de la version Python n'a pas été un processus aussi effrayant et a ouvert la possibilité d'utiliser de nouvelles fonctionnalités. Les développeurs Facebook peuvent désormais se concentrer sur des problèmes tels que les nouvelles fonctionnalités de saisie statique ou la migration de services pour utiliser asyncio. "Python sur Facebook est à nouveau amusant."
Un nouveau problème - les gens demandent quand il est possible de refuser la prise en charge de Python 2. Lorsque des régressions apparaissent pour prendre en charge les bibliothèques ou modules Python 2, les développeurs demandent souvent s'ils peuvent simplement passer à Python 3. Le problème est le contraire de ce qu'il était il y a quelques années. "Oh, quel merveilleux monde dans lequel je vis."
Au cours de la conférence, Freide a montré un graphique des points d'entrée Facebook pour le service Python à partir du troisième trimestre 2015 - à l'époque, il n'y avait que 4 points Python 3. Au moment de la transition vers Python 3, au milieu de 2016, 4% de tous les points étaient déjà Python 3. En mars 2018, leur nombre dépassait 50%; à la mi-mai, au moment de la conférence, il y avait 55% des «dizaines de milliers de points d'entrée Facebook». Selon Freud, la société est maintenant gênée d'écrire du code qui ne fonctionne que sur Python 2.
Vendredi a analysé le processus. Il a noté qu'il fallait faire plus que simplement créer quelque chose de nouveau; vous devez conduire les développeurs à cela, "étant le changement que vous souhaitez voir." Nous devons attirer des gens, même s’ils ne comprennent pas qu’ils aident. Ceci est facilité par des tests de linter et unitaires. Il est très important d'enseigner aux nouveaux employés ce que vous recherchez. Lorsque vous obtenez le résultat, célébrez tout en profitant des «bonnes choses»: écrivez «du code Python 3 sympa». En voyant comment de nouvelles fonctionnalités peuvent être utilisées, d'autres voudront également changer.
Vendredi a répondu à quelques questions du public. Une question était de savoir comment effectuer un tel changement dans une organisation hiérarchique plus traditionnelle. Vendredi a suggéré que cela pourrait être encore plus facile, car vous n'avez pas besoin de convaincre des milliers de développeurs, mais seulement une chaîne de gestionnaires, à commencer par celui qui voit les avantages de la transition. Mais d'un autre côté, cela peut être plus difficile si la culture de l'entreprise est conservatrice. Se concentrer sur l'amélioration de la qualité du code aidera ici. Une autre question concernait le code indivisible, qui n'est pas divisé en de nombreux points d'entrée. Pour cette situation, vendredi a suggéré de regarder la
présentation d'Instagram (vidéo sur YouTube) avec PyCon 2017.
D'autres organisations peuvent apprendre beaucoup de cette conférence, mais il est clair qu'il est important d'avoir un partisan obstiné qui soit prêt à contrôler et à coordonner l'ensemble du processus. Les entreprises qui planifient une telle transition auront besoin d'un homme comme Fraid.
LA FIN
Nous attendons une question et des commentaires que vous pouvez laisser ici ou demander directement à
Stas dans sa
leçon ouverte .