Entretien de la communauté Python avec Brett Slatkin – Real Python

By | février 12, 2020

Expert Python

Aujourd'hui, je parle à Brett Slatkin, principal ingénieur logiciel chez Google et auteur du livre de programmation Python Python efficace. Rejoignez-nous alors que nous discutons de l'expérience de Brett avec Python chez Google, de la refactorisation et des défis qu'il a rencontrés lors de la rédaction de la deuxième édition de son livre. Sans plus tarder, allons-y!

Ricky: Bienvenue à Vrai Python, Brett. Je suis ravi que vous ayez pu me rejoindre pour cette interview. Commençons de la même manière que nous le faisons avec tous nos invités. Comment avez-vous commencé la programmation et quand avez-vous commencé à utiliser Python?

Brett Slatkin

Brett: Merci de m'avoir! Mon chemin vers la programmation a été long et varié. Python a été une tournure surprenante à la fin de mon éducation. C'était quelque chose auquel je ne m'attendais pas, mais c'était une bénédiction. Une fois que j'ai appris la langue, je suis tombée amoureuse d'elle.

Quand je grandissais, ma famille avait des ordinateurs dans notre maison, ce qui était un énorme privilège. J'ai toujours aimé démonter les choses pour voir comment elles fonctionnaient, et je ne me souviens pas d'un moment où je n'utilisais pas d'ordinateurs et essayais de les comprendre. L'une des histoires préférées de mon défunt grand-père concernait le moment où il avait un problème d'impression et je l'ai résolu pour lui. (J'avais 3 ans.)

En 5e année, toute ma classe est allée dans un laboratoire informatique un jour et a programmé avec Logo sur un Apple IIgs. J'ai de la chance que ma mère ait encouragé mon intérêt pour la programmation après cela en m'achetant des livres et en m'inscrivant à des camps d'été ringards. J'ai utilisé des kits Lego Technic Control Center pour programmer de petites machines. Ce sont les précurseurs des Lego Mindstorms d'aujourd'hui.

J'ai également utilisé Borland Delphi pour créer des applications GUI simples, comme deviner les jeux de nombres. Ensuite, le personnel de mon café Internet local m'a montré Unix, Linux et C, ce qui m'a époustouflé. C'est à ce moment-là que j'ai su que je voulais devenir programmeur quand j'ai grandi.

Au lycée, j'ai pris des cours gratuits dans mon collège communautaire local et étudié le C, C ++, l'assemblage x86 et le développement de jeux. J'ai lu la deuxième édition de Scott Meyers C ++ efficace et est devenu un grand fan de C ++ et de toutes ses fonctionnalités arcaniques. Un été, j'ai eu un stage non rémunéré avec une startup point-com bubble où j'ai écrit des applications web en ASP et VBScript. J'étais très enthousiasmé par la programmation réseau et j'ai essayé de créer mes propres versions de DikuMUD et Hotline.

Au collège, je me suis spécialisé en génie informatique parce que je voulais comprendre comment les ordinateurs fonctionnaient au niveau des transistors. La plupart de mes cours étaient en génie électrique, où j'ai utilisé des outils de programmation comme SPICE, VHDL et MATLAB. Pour les cours d'informatique, j'ai appris LISP et écrit beaucoup de Java. J'étais assistant d'enseignement pour une variété de classes et j'aimais vraiment enseigner aux autres.

Enfin, ma première rencontre avec Python a eu lieu en 2003 lorsque je cherchais comment fonctionnait le client BitTorrent. (C'était open source à l'époque.) Je pensais que le code était moche à cause de tous les __dunder__ méthodes spéciales, et j'ai ignoré la langue pour tous mes projets!

Je suis allé à Google en 2005 après avoir obtenu mon diplôme universitaire, car cela semblait être le meilleur endroit pour en savoir plus sur la programmation réseau. Mais dans les premiers jours de l'entreprise, vous n'aviez pas la possibilité de choisir ce sur quoi vous travailliez en tant que nouvelle embauche. Vous venez d'être affecté à une équipe.

Le premier jour, mon patron m'a donné une copie du livre Python en bref et m'a dit d'aller réparer une base de code ~ 25KLOC qui était cassée. Je pensais que dans le travail, j'écrirais du C ++ pour les systèmes en réseau, mais j'ai fini par devoir faire quelque chose de complètement différent. Ce qui a empiré les choses, c'est que j'étais seul parce que le programmeur d'origine était parti en vacances obligatoires en raison de l'épuisement professionnel!

Heureusement, Alex Martelli était un collègue de l'équipe que j'ai rejointe. Il était l'auteur du livre Python en bref et il m'a aidé à apprendre la langue. J'ai pu réécrire la plupart de la base de code dont j'ai hérité, résoudre ses problèmes fondamentaux et l'adapter à l'ensemble du parc de machines de production de Google. Croyez-le ou non, ce code est toujours utilisé aujourd'hui, près de 15 ans plus tard.

La productivité que j'ai gagnée en utilisant Python était spectaculaire par rapport à mon expérience avec C ++ et Java. Ma perspective sur la programmation et les langages avait complètement changé. J'étais maintenant excité à propos de Python!

Ricky: Vous avez déjà abordé l'utilisation de Python chez Google, où vous êtes maintenant un ingénieur logiciel principal, mais au cours de votre mandat, vous avez lancé le premier produit cloud de Google, App Engine. Vous êtes désormais le responsable technique de Google Surveys, entre autres projets. Dans quelle mesure Python a-t-il contribué à vous aider à les développer, et à quoi ressemble l'avenir de Python chez Google?

Brett: Il ne fait aucun doute que je dois ma carrière chez Google à Python, mais il y a plus à l'histoire. En arrière-plan, il est important pour vous de savoir que les cinq ingénieurs qui ont fondé App Engine utilisaient à l'origine JavaScript, similaire au serveur Livewire de Netscape de 1995. Cependant, c'était avant la sortie de Chrome et les grandes améliorations des performances de V8, qui ont conduit à NodeJS.

Les fondateurs craignaient que le JavaScript côté serveur ne rende le système trop créneau. Ils voulaient fournir la pile LAMP, qui était très populaire à l'époque. Le «P» dans LAMP signifiait Perl, PHP ou Python. Perl n'était généralement pas à la mode et PHP n'était pas un langage utilisé par Google en interne. Mais Python l'était, grâce à Peter Norvig, et c'était donc le choix naturel.

J'ai commencé dans l'équipe App Engine avec un projet de 20% fin 2006 lorsque j'ai implémenté le dev_appserver en Python. Avant cela, il n'y avait aucun moyen d'exécuter localement une application avant de la déployer. J'étais tellement excité par le potentiel du produit et son utilisation de Python que j'ai déménagé pour y travailler à temps plein peu de temps après.

Guido van Rossum, qui a également travaillé chez Google à l'époque, nous a rapidement rejoint. J'ai eu le privilège passionnant de faire la démo en direct lors de l'événement de lancement en 2008, où j'ai écrit une application web en Python à partir de zéro et l'ai déployée en quelques minutes. J'ai collaboré avec Guido sur une variété de projets au fil des ans, dont le plus intéressant était ndb (le précurseur de asyncio) que j'ai testé en profondeur.

Ce que j'ai le plus apprécié, c'est d'écrire des applications complètes avec Python dans l'environnement App Engine pour repousser les limites du produit. Je brisais fréquemment le système avec mes applications de démonstration en heurtant de nouvelles barrières que nous ne réalisions pas. Cela nous amènerait à créer des améliorations d'infrastructure pour garantir que la prochaine application qui devait évoluer, comme Snapchat, ne rencontrerait pas les mêmes problèmes.

Mon application de démonstration préférée était le protocole PubSubHubbub et le hub que Brad Fitzpatrick et moi avons développé ensemble. Le protocole a transformé les flux RSS en flux en temps réel. Il a apporté la vivacité de services comme Twitter sur le Web ouvert.

À son apogée, notre application concentrateur traitait des millions de flux et des milliers de demandes par seconde, tous utilisant Python sur App Engine. Depuis lors, le hub a été intégré à l'infrastructure d'exploration de sites Web standard de Google. PubSubHubbub (maintenant appelé WebSub) est devenu partie d'un groupe plus large de spécifications qui constituaient OStatus, ce qui a aidé à faire décoller Mastadon.

Google Surveys a commencé comme une autre application de démonstration Python sur App Engine. J'ai prototypé l'ensemble du système de bout en bout en quelques semaines seulement. Mon co-fondateur et moi avons eu la chance de le montrer à Larry Page, et il a éclairci le projet. Nous avons lancé un an plus tard avec une équipe allégée, grâce à l'effet de levier que Python fournit.

Nos services traitent désormais plus de 500 000 requêtes par seconde et ont un impact sur la majorité des utilisateurs et des revenus de Google. La base de code est passée de ~ 10KLOC à plus de 1MLOC, la majorité étant en Python. Nous avons dû migrer certains services vers Go, C ++ et Java car nous avons rencontré diverses contraintes de coût et de latence du processeur, mais Python est toujours au cœur de tout ce que nous faisons.

Python a trouvé sa place chez Google principalement en tant qu'outil pour la science des données, l'apprentissage automatique et DevOps / SRE. À l'heure actuelle, les ingénieurs de l'entreprise s'efforcent de déprécier Python 2 et de déplacer l'ensemble du monorepo vers Python 3 pour rester en ligne avec la communauté Python et les packages open source.

Ricky: En plus de ce dont vous venez de parler, vous êtes également l'auteur du populaire livre de programmation Python, Python efficace, que nous avons précédemment examiné dans The Best Python Books. Vous avez récemment publié une deuxième édition, qui comporte d'importantes mises à jour. Que comprennent les mises à jour et qu'est-ce qui a changé depuis la première édition?

Brett: Merci d'avoir considéré mon livre comme l'un des meilleurs! La réponse à la première édition a été merveilleuse. Il a même été traduit en huit langues! Il y a beaucoup d'informations sur le nouveau livre sur le site officiel, y compris la table des matières complète avec tous les titres des articles, une variété d'échantillons et le code d'exemple.

La deuxième édition de Python efficace fait près du double de la longueur de l'original et révise considérablement tous les conseils, en plus d'en fournir plus de 30 nouveaux. La première édition du livre a été écrite en 2014 avec Python 2.7 et Python 3.4 à l'esprit. Tant de choses ont été ajoutées dans Python 3.5 à Python 3.8 au cours des 5 dernières années, il y avait donc beaucoup de choses à écrire! Le style général est le même et il comprend toujours la coloration syntaxique multicolore.

Le nouveau livre couvre l'opérateur de morse, les chaînes f, les meilleures pratiques pour les dictionnaires, les décorateurs de classe et toutes les caractéristiques importantes des fonctions (y compris l'exécution asynchrone). J'entre dans les détails du déballage des généralisations, du tri personnalisé, des installations de test et des performances algorithmiques dans la bibliothèque standard. J'explique également comment tirer parti d'outils plus avancés tels que le module de saisie et le mémoire visuelle type.

Dans cette nouvelle édition, mes conseils sur les métaclasses ont complètement changé, grâce à l'ajout de __init_subclass__ et __set_name__ à la langue. Ma recommandation pour une utilisation avancée du générateur avec envoyer() et jeter() est maintenant l'opposé de ce qu'il était dans la première édition. (Maintenant, je dis de les éviter.) Je compare les avantages de l'asyncio aux threads et aux processus, ce qui manquait auparavant. Je donne des conseils sur la façon de convertir du code synchrone en code asynchrone, ainsi que sur la façon de mélanger asyncio avec des threads.

Quiconque lit le livre, n'hésitez pas à m'envoyer des questions ou des commentaires!

Ricky: Lors de PyCon 2016, vous avez donné une conférence intitulée Refactoring Python: pourquoi et comment restructurer votre code, qui a également fait partie de notre liste des 10 meilleurs discours PyCon à ne pas manquer. Je suis curieux de connaître vos motivations pour donner la conférence. Qu'est-ce que le refactoring (ou son absence) vous a inspiré pour en parler? Les gens semblent-ils avoir du mal à refactoriser? Tombent-ils pour les mêmes pièges communs?

Brett: Merci d'avoir inclus mon discours dans votre liste des dix premiers!

Quand j'ai rassemblé cet exposé, je travaillais dans la même base de code depuis environ six ans. Tout code de cet âge doit être constamment remanié et mis à jour pour l'empêcher de pourrir et de devenir inutilisable.

La pourriture dont je parle se produit lorsque les dépendances changent de manière incompatible en amont, lorsque l'infrastructure sous-jacente change pour avoir des caractéristiques de performances différentes, ou lorsque les décisions relatives aux produits cassent un grand nombre d'hypothèses antérieures. Donc, le refactoring était une nécessité permanente et cela me revenait souvent à l'esprit. Cette expérience m'a donné une nouvelle appréciation de l'importance cruciale de la compétence de refactoring.

Les gens parlent souvent de la façon dont les tests, les outils et les frameworks font d'eux des programmeurs plus efficaces. Mais je crois que le refactoring est la grande compétence fondamentale sous-estimée que chaque programmeur doit se concentrer sur l'amélioration. Pourquoi? À mon avis, le meilleur code est un code qui n'existe pas et qui a été supprimé ou n'a jamais été écrit. Le meilleur programme que vous pouvez avoir est un vide .py fichier. La question est de savoir comment vous rapprocher de votre idéal pour vous rapprocher de cet idéal? En refactorisant.

Je voulais aider les autres programmeurs de mon équipe à apprendre à devenir meilleur en refactoring, mais le livre Refactoring par Martin Fowler n'avait pas été mis à jour depuis 1999. J'envisageais donc d'écrire une version spécifique à Python du livre pour le moderniser en quelque chose que mes collègues pourraient lire. Cependant, je l'ai mis en attente lorsque j'ai appris que Fowler travaillait sur la deuxième édition de Refactoring, qui a depuis été publié et utilise JavaScript comme langage d'implémentation.

Malheureusement, il ne répond toujours pas à mes besoins. J'aimerais voir un livre de refactorisation spécifique à Python, ou un ensemble d'exemples réalisables, qui tirent parti de tout ce que le langage a à offrir.

Ricky: Maintenant pour mes dernières questions. Que faites-vous d'autre pendant votre temps libre? Quels autres hobbies et intérêts avez-vous, à part Python et la programmation?

Brett: Nous avons deux très jeunes enfants à la maison, donc ma femme et moi passons beaucoup de temps avec eux. Chanter des chansons et jouer de la musique (piano principalement, mais parfois guitare, ukulélé, xylophone et harmonica) ont été les meilleurs moyens de profiter de notre temps ensemble. Je suis terrible sur tous ces instruments, et je ne suis pas non plus un grand chanteur, mais nous avons encore beaucoup de bons moments.

J'aime être dehors tous les jours, marcher sur les collines de San Francisco ou courir (généralement en poussant une poussette). J'adore surfer quand j'en ai l'occasion. J'aime lire, en particulier le journalisme de longue durée, mais en réalité, c'est surtout Reddit et Lobsters. Je voudrais être un meilleur cuisinier et trouver le bon équilibre entre paresse et gourmandise. J'essaie aussi de m'apprendre à construire des modèles statistiques en utilisant des méthodes bayésiennes. Si j’ai appris quelque chose au fil des ans, c’est que rien n’est certain.


Merci, Brett, d'être avec moi cette semaine! Vous pouvez trouver Brett sur Twitter ou GitHub, et en savoir plus sur la deuxième édition de Effective Python sur effectivepython.com.

S'il y a quelqu'un que vous aimeriez que j'interviewe à l'avenir, contactez-moi dans les commentaires ci-dessous, ou envoyez moi un message sur Twitter. Bon codage!