こんにちは、白ヤギでは下手の横好き的なPythonistaのシバタアキラです。
カメリオのような複雑なオンラインサービスを開発提供していく上では、様々な開発言語からミドルウェアそしてハードウェアやモニタリングに至るまで、様々な計算技術を応用しています。開発言語自体はあくまで手段であって目的ではないので、自分たちのマインドシェアの中でも小さくあるべきと思っています。一方で、未だにvim vs emacsなんていう些細な選択肢に関しても「戦争」が起こる様に(起こってない?)なんだかんだいって、ツールというのはエンジニアにとってもデータサイエンティストにとってもとても大切なモノです。
昨年PyConJPのスポンサー(今年もやります!)をして以来、Pythonコミュニティーでコアに活動されている方々とお付き合いさせていただく機会も増え、また自分でもPyData.Tokyoというデータサイエンスに特化したPythonコミュニティーを立ち上げました。そういった活動の中でお会いしたPythonを知り尽くした超スゴイエンジニアの一人が、今週弊社のAIAL勉強会で登壇してくださった清水川(@shimizukawa)さんです。
清水川さんは2003年にPythonを使い始めたということで、今は日本のPython幕府であるBeProudに所属されています。今月半ばに出版された仕事でPythonを使うPythonistaのバイブル、Pythonプロフェッショナルプログラミング2(通称PyPro2)の中心的な執筆者でもいらっしゃり、今回の勉強会では、PyPro2の執筆に至るまでのPython周りの環境の変化と、PyPro2の読みどころを教えていただきました(スライドはこちら)。
「それPyProに書いてあるヨ」が「その部分もう古いのデ」になった
もともとPyProはBeProudで社員が必要なノウハウを学ぶという、超自己中心的な理由で執筆が始まり、仕事でPythonを使っていく上で発生する問題に対し、「それPyProに書いてあるヨ」といえるようなレファレンスを作ることが目標だったそうです。「自己中心的」というと聞こえが悪いですが、業界のベストプラクティスであるBeProudだからこそ意味のある、素晴らしい発想。
本書は所謂Pythonの書き方的な本ではなく、Pythonで開発をする上で言語について以外で重要になってくることがテーマです。特にその中でも環境構築に関する解説は重要で、多くのページが割かれています。PyPro1からPyPro2に至る間の変化として大きかったのが、setuptools及びeggsというパッケージ配布ツール及び形式がフェードアウトし、pip及びwheelsに取って代わられたということです。Pythonを初めて使った時のバージョンによっては
$ easy_install pip
という意味不明の手段でpipをインストールした方も多いと思いますが、これはつまり、easy_installを同梱するsetuptoolsが多くの人にとってpipをインストールするためのツールに成り下がっていたことの現れです。現行pipはpython2.7.9から同梱されるようになり、pythonの環境構築まわりがだいぶいい感じに整備されてきたと同時に、PyPro1でsetuptools及びeggsについて書かれていた部分は大幅にアップデートされたようです。
「で、今後Pythonはどうなるんですか?」
今回の勉強会で、個人的には一番気になっていたテーマ、今後Pythonがどのようになっていくのか。清水川さんのスライドでは「みなさん、どうなると思いますか?」という一見手抜きな1ページだけが用意され、参加者とのディスカッションが主な内容となりました。
白ヤギにとってPythonはとても重要な技術です。カメリオのバックエンドを未だ私が担当していた頃に、物理学の研究をしていた時から使っていたPythonを使って開発を初めたことがきっかけですが、今振り返っても自分のベースがPythonで良かったと思っています。Pythonは優れたシステムを生み出すことのできる非常に優れた基礎技術です。現在は私の書いたプロトタイプは私よりもはるかに優れたエンジニアである金子さんや北野さんがその大部分を書きなおしてくれましたが、そういった優れたエンジニアの方々を見つけることが出来たのも、Pythonのおかげでした。
一方でコンピューター言語のトレンドは移り変わりが激しいもので、「この言語だけわかればこの先も安泰」なんていう考え方は出来ないわけです。超天才な方はともかく、人間が習得できる言語の数には限りがあり、一度エクスパートになると、ある程度その言語に良くも悪くも依存して行くものです。ツールに対する愛着も湧いてくるし。
注)このへんから先は私の私感です。
Pythonのいいところはざっくり言うと
- 書きやすく、ささっと開発できる素敵な言語仕様
- そこそこの実行速度+いろいろな方法で早くできる
- いろんなライブラリーがあって、拡張機能を取り込みやすい
というところです。特に1つ目と2つ目はトレードオフになることが多く、バランスが非常に重要です。
またその結果
- 複雑なロジックのアルゴリズムの開発(例えば自然言語処理とか)
- Webサービスの開発(例えばAPIサーバーとか)
という2つの用途の両方に長けているということです。一方でそれぞれの領域でPythonを凌ぐ可能性のあるものがあるものが盛り上がって来ました。GoとJuliaです。
Goってスゴイですね
数回前のAIAL勉強会でもGunosyの松本さんがお話してくれましたが、Go言語イイです。その時のスライド
[speakerdeck https://speakerdeck.com/ymatsuwitter/when-to-use-golang-in-production]
今後Web系のバックエンド開発を中心にものすごく浸透していくと思います。マシンの性能をフルに使うことのできる効率のよいサーバーを書くためには、ボトルネックを解消していくためにマルチスレッド処理をしていくか、非同期処理していくかが重要になりますが、Goはマルチスレッド処理を非常に小さい手間で行うことが出来るため、複数のコアをフルに使うことが出来ます。逆に非同期処理はひとつのコアをフルに使う事ができ、Node.jsなんかもその点で優れていますが、開発のしやすさでは大きく劣ります(コールバック地獄)。
言語自体も非常にシンプル。この前の白ヤギGo勉強会で書いたフィボナッチはこんな感じで、非常にきれいな言語です。
var cache = map[int] sInt {} func fibo(n int) sInt { if n < 2 { return sInt(n) } else { c := cache[n] if c == 0 { c = fibo(n-1) + fibo(n-2) cache[n] = c } return c } }
またGoは型宣言のあるコンパイル言語ですが、コンパイラーが非常に速いため、スクリプティング言語とほとんど変わらないようなスピードで開発を行えます。近年非常に増えているAPIサーバーの開発には最適で、例えば先日目にしたのは、イメージ処理のAPIサーバーがまるごとGitHubで公開されていたりして、未来を感じました。デプロイにおいては、静的なバイナリを常に生成することで、動的なリンクにおける問題を解決しており、その分バイナリのサイズが大きくなるかもしれませんが、通信速度の早くなった今、そんなことを気にする人はいないですね。コンパイラの対応プラットフォームも超多数。
Pythonでもマルチスレッドや、非同期の処理は行えますし、例えばtwistedのような優れたフレームワークも存在するわけですが、ドキュメンテーションが少ないため、とっつきにくいのです。使っている人がいないわけではないのですが、そういう人は大概英語のドキュメントを読むことに慣れているため、間口が広がらない・・・。結果「Pythonっておそいっすね」といわれる。
Pythonの場合はRailsみたいな圧倒的な市民権をもったWebフレームワークがないので、Web系の部分は結構ほころびるのが速いかも。もちろんDjangoも素晴らしいんですが。(敵ばかり作っているこのブログ)
Juliaもスゴイですね
アルゴリズムやデータ処理の分野ではJuliaがかなりいいもの持っている様子。JITコンパイラー(走りながらパフォーマンスが良くなっていくコンパイル方法)が優れていて、場合によってはFortranよりも速くなる。これは驚異的。JITコンパイラーが優れている分実装時にプログラマーが工夫しなくても良いパフォーマンスが出るため、より素早い開発が行える、ということです。@chezouさんとかも、最近Julia Tokyoという勉強会で盛り上げていってるみたいですね、未だ参加してないけど。
Pythonのデータ解析で多用されているインタラクティブシェル、iPython(最近Jupyterになった)でも実行できたり、他の言語で書かれたライブラリーのインポートが充実してきたり、未だ市民権を得ていない感がありますが、これからが非常に楽しみです。
PythonでもJITコンパイラーは進んでいて、実は丁度次回のPyData.Tokyoはそのへんの高速化をテーマにしてます。
でもPythonは目下絶頂期デスネ、コミュニティーがいいから
なんだかんだ言っても、Pythonではないかと、Pythonista達による非常に偏ったディスカッションでは落ち着いた感があります。その一番の理由はコミュニティーです。PythonはGoみたいにある特定の企業がいるから成立しているような状況と大きく異なり、その周りにあるコミュニティーが言語自体、そして周辺ライブラリーの開発、メンテを行い続けています。後方互換が非常に強く、今後もそのレベルのサポートが続けられるだけの大きなコミュニティーがついています。Pythonを礎にした会社があり、勉強会があり、カンファレンスがあり、沢山の人の叡智がどんどん新しい方向にコミュニティーを進化していっています。白ヤギのような小さな会社にも素晴らしいエンジニアの方が来てくれるのもそんなコミュニティーがあるのが大きな理由です。
現時点ではPythonは絶好調です。アメリカで数年前に来ていたトレンドに日本も追い付いてきた感があります。折しもビッグデータの時代、PyData.Tokyoも非常に高い盛り上がりを見せていて、未だ当分このトレンドは続きそうです。Numpyなどの非常に優れたライブラリーや、Scikit-Learnなどの知的財産も他の言語が追いついてくるまでには未だ長ーい時間がかかります。
Pythonはどんなおじいちゃんになるのか
なんだかんだ言っても、Pythonもいつかはおじいちゃんになるわけで、そうなった時にどんな言語になっているのかは少し興味深いところです。C言語のように特定のレイヤーで使われ続ける言語になるのか、それともPascalみたいに消えるのか。Fortranみたいに特定の分野で使われ続けるのか、それともPerlみたいに消えるのか。あまり敵を作りたくないので消えた言語について話すのは控えめに。
自分の予想としては、Perlみたいに消えるのではないかと、今回のディスカッションを踏まえて思うようになりました。コミュニティーが活かしているものはコミュニティーが亡くなったら死ぬのでは。Numpyだってそのうち誰かが他の言語にポートするだろうし、Web系の技術は移り変わりが激しいです。Javaみたいに組織的な開発に極端に向いているわけでもないし、jsみたいにブラウザーの標準になってるわけでもない。
清水川さんは「教育用言語」として残るのでは、というお話をされてました。たしかにそれはあるかも!そもそも大学ではよく使われている言語だし、私の世代でも学部の頃の教授にはVisual Basicを教わりました。Javaとかはpublic void mainとか知らなくてもいいことが多すぎるし。
Python→Basicと考えると少ししんみりした気分になってきたので今回はこのへんで。