036_インスタ

Pythonで開発しているInstagramの生産性改善の仕組み

GitHubより発表された2019年版のオクトバースで、PythonがJavaを抜いて人気プログラミング言語の第2位にランクインしたことが話題になりましたね(*'ω'*)
データサイエンス等急速に普及や成長が進んでいることが背景とされていますが、『プログラミング初心者におすすめ』の言語とも言われますし、書店やらスクールやら学べる場所も選び放題、非エンジニアやプログラマーにも広まり続けることと思います。

そんな今を時めくPythonですが、一つ弱点があります。既に一通り勉強した方はご存じだと思いますが、処理が重いんです(;´・ω・) インタープリタ言語(開発者が叩いたソースコードをプログラミング実行時に『変換』する言語のこと)なので処理速度が求められるシステムやゲーム、アプリでは、実はPythonはあまり使われていないと言われています。

ところが、実はInstagramはPythonをベースに同アプリの開発を行っています。もちろん何の工夫もしていない訳では無く、同アプリのエンジニアが速度の問題を解決するために実施している背策を公開していますので、本稿では簡単にまとめてみました。

生産性の改善が至上課題

InstagramのエンジニアCarl Meyer氏によると、Pythonはコンパイルなしにプログラムを実行出来るから良いんだとか。インタープリタ言語は確かに大量の処理が無ければ良いかもしれませんが、InstagramではPythonが数百万行にも渡って延々と書かれているそうです。大量…(;^ω^) それを数百人のエンジニアが毎日大量にデプロイしているので、必然的に生産性の向上は至上課題ですね。

Mayer氏も曰く、同サービスのエンジニアにとって重要なゴールは『大規模開発において可能な限り生産性を高めること』。時間が弱点の言語に生産性とは…となりますが、Instagramでは次のような取り組みがされています。

lintをどう行うか

lintとは、バグやエラーの要因になりそうなコードを分析する静的解析のことです。

同じくInstagramのエンジニアであるWoodruff氏は、lint時に型チェックツールを使用していると紹介しています。Pythonの型チェックツールではMypyが有名ですが、Instagramでは大元であるFacebookが開発したPyreという無料のPython型チェックツールを使っているそう。型チェックを実施することでプログラマーが新しく参入しやすくなり、実行前のエラーも減るのでデバッグの手間が減ることにも繋がり、作業量の短縮が実現されるというメリットがあります。

ところが、同じく同サービスエンジニアのWoodruff氏によると

『こうしたツールはパワフルだけど、拡張性やカスタマイズ性の点で難しい』。

ということでInstagramでは、ソースコードのあらゆる部分を細かく記載した構文木をlintルールに則って作成するという方法を採用しています。構文木には通常のタイプ(CST)と、コメントなど不要な部分を除外し見やすくした抽象構文木(AST)がありますが、この両者を上手い具合にミックスさせたライブラリ(LibCST)を、なんと自社内で開発し業務に活用しているとのこと(・。・)。このライブラリ、GitHubでも公開されています。

副作用の防止

プログラミングにおける副作用とは『同じ関数やメソッドを実行したのに違う結果が出てしまうこと』等言われますが、要するに副作用があるとソースコードの可読性やテストの効率性に悪影響が出てしまうということですね( ゚Д゚)

Instagramでは“Strict modules”と呼ばれるモジュール型を採用しています。具体的な詳細や例は参照記事を見ていただければと思いますが、実行するモジュールのトップレベル(関数等の一番外側)である程度の制限を設けることにより、モジュールレベルでのデコレータやイニシャライザで副作用が発生しないようにすることが可能となるんだそうです。


この“Strict modules”はまだ試験段階、Instagram内での改良が続いています。

最後に

Pythonは処理速度が大規模システム向きではなく、Sales Force社も『商業レベルで常にハイパフォーマンスを出せるとは限らない』と言及しているなど、個人が小規模なプロダクトを作るならともかく規模が大きくなると事情が違ってくるようです。

勉強中、または個人での趣味や会社での業務効率化レベルでPythonを使いこなそうとすると、なかなか今回紹介したような大規模開発での課題は意識できないと思います。

しかしInstagramのように身近なプロダクトがPythonで作られていること、そしてそのエンジニア達が具体的にどうPythonを使いこなしているかを知ることは、例えビギナーでも大いに勉強になるんじゃないかと思います('ω')

参照サイト

https://www.zdnet.com/article/programming-languages-how-instagrams-taming-a-multimillion-line-python-monster/
https://www.sejuku.net/blog/107708
https://www.zdnet.com/article/salesforce-why-we-ditched-python-for-googles-go-language-in-einstein-analytics/
https://instagram-engineering.com/static-analysis-at-scale-an-instagram-story-8f498ab71a0c
https://instagram-engineering.com/python-at-scale-strict-modules-c0bb9245c834
https://github.com/Instagram/LibCST

この記事が気に入ったらサポートをしてみませんか?