2014年6月17日
Pythonにサヨナラを
本記事は、原著者の許諾のもとに翻訳・掲載しております。
ずっと先延ばしにしてきた記事を書きます。決別宣言ではなく(ずいぶん前に離れていますし)、ただ自分が歩んできた道を振り返ったに過ぎません。Pythonの世界に別れを告げてずいぶん経つのに、これまでサヨナラを言う勇気がなかったのです。
何年も前にPythonを卒業したとはいえ多少の愛着は残っており、戻る可能性もあると思っていました。PyCon 2013への提議が却下されたことは頭にきましたが(面白い話をしようと思っていたのに!)、この件で自分はもうPythonコミュニティの一員ではないのだと確信しました。
Pythonは私が初めて(もしかしたら唯一)参加したプログラミングコミュニティです。自らの意思でこの世界に入ろうと決意し、Pythonを選びました。大学にいた頃はSchemeとSmalltalkに興味があり、どちらも面白いアイデアの詰まった高尚な言語だと思っていました。ただどちらも実用的とは思えなかったのです。Schemeは常にライブラリが少ない状況でアカデミックコミュニティも貧弱でした。一方のSmalltalkはビルド好きがビルド好きのために作っていたので生産的ではありました(このことは アラン・ケイ より ダン・インガルス の功績が大きいでしょう。ダン・インガルスの仕事には強い情熱を感じます。純粋だけど非生産的な言語では満足できなかったでしょう)。でもSmalltalkには今も昔も独自の世界がありました。その文化や技術はインターネット以前、オープンソース以前、オンラインコミュニティ以前と変わりません。すばらしい言語と環境だったとはいえ、当時は目新しかったアイデアを実現できませんでした。Smalltalkが変化に適応しようとしても難しかったのです。(私がSmalltalkと決別した理由は、過去のブログ記事「 Smalltalkはどこで道を誤ったか 」と その続き で、多少なりとも好意的に説明しています)
大学の卒業が近づき(1999年頃)、私は自分の基盤となりうる言語を積極的に探しました。PerlやCにも手を出しましたが馴染めません。そうこうするうちにPythonと出会い、これ以上の言語は必要ないと感じました。でもSchemeやSmalltalkにのめり込んだ時の感覚とは違います。Schemeは GW-BASIC 以上に世界への扉を開いてくれたし、SqueakとSmalltalkはミステリアスで、まるで古代遺跡を発見したかのような興奮がありました。一方のPythonはただ実用的だったのです。でも当時の私は発見よりビルドを求めていました。
Pythonを使っていくつも仕事をしました が、平凡なWebプログラミングをしているうちに、ビルドそのものよりビルドのためのツールをビルドする方に熱中し始めます。この頃にクールなプロダクトをいくつか作りましたが、完成したのはライブラリではなく、それより小さなユニットだけでした。そしてPythonのコミュニティを見つけます。
ビルドも続けました。 Webware に貢献していましたが、現在のPythonのWeb開発は別世代のもののように感じます。私は SQLObject を開発し、「どうしよう、みんながこれを使っている。いいのかな」と思いながら、ライブラリに最初の一歩を踏み出しました。しかしSQLObjectはタプログラミングの概念をいくつも使ったせいでPythonの世界では奇抜な存在となり、維持すること自体がとてつもない重荷に感じられました。今後どうするか決断を下すまでかなり時間がかかり、(少なからず原因は自分の関心不足にあるのですが)かつてのような興味を失ってしまいました。それで私よりずっと信頼できる オレグ にバトンを渡したのです。残念ながら私はこのパターンを繰り返していたのですが、SQLObjectが 次世代 に役立ったのならそれで満足です。
やがて WSGI が登場し、その巧妙さと実用性にワクワクしました。 Paste でWebフレームワークツールキット(もしくはWebフレームワークを作るためのフレームワーク?)を丸ごとビルドしました。私がPasteで何をしたかったのか本当に理解していた人は少ないでしょうし、私もよく分かっていませんでした。世の中には ベン・バンガート のようにコードに隠された原理が分かるプログラマもおり、利用可能な状態にして公開する人もいました。(私も PJE に同じことをしていた気がします)当時、PythonのWebフレームワークはひどい状態でしたが、最終的には私がPasteで目指したブリッジの構築より、モノリシックなアプローチで 成功に近づく 方がうまくいきました。ここからどんな教訓が得られるのか分かりません。いかに状況を見極め、誰とどうやって問題を解決するのか、広い視点が必要です。ただようやく、様々な視点やスキルを統合したビジョンの重要性は分かった気がします。成功するには適切な人材を適切な環境に集め、連係させていく方法を学ばなくてはなりません。
この頃、Pythonでコーディングし始めて1万時間ほどに達したでしょうか。Pasteの教訓からライブラリ設計のヒントを得て WebOb を記述しました。今でもこれがHTTPからPythonへの最善のマッピングだと思っています。他のライブラリにはもっとWeb開発の側面が含まれていたり、解説が整っていたり、ユーザが多かったりしますが、見方によってはWebObもまだ捨てたものではありません。WebObは Webフレームワークの構築 を探究するための重要な要素となってきました。この時期、他のライブラリには lxml.html や、小規模な WebTest 、 ScriptTest 、 MiniMock 、 Tempita 、野心あふれる(あるいはただ間違った野心の) Deliverance がありました。この頃は自分のシステムから多くのアイデアを消していたような気がします。
しかし、なぜか私のツールで最大の成功を収めたのが virtualenv と pip でした。どちらにも最大限の情熱どころか、それに近い情熱すら傾けたことはありません。デプロイメント時のイライラを抑えたり(virtualenv)、Setuptoolsやeasy_installに対するユーザの不満をかわす(pip)のが目的でした。両ツールの微妙な成功は幅広い支持のせいかどうかは分かりません。ライブラリではなくユーザの目に見えるツールだったことが理由かもしれないし、誰も手をつけたがらず完成が待たれていただけなのかもしれません。
私の最後のプロジェクトは Silver Lining でした。DevOps革命初期の頃で、Webアプリケーションのための汎用コンテナを考察する試みです。ある意味、より深くvirtualenvとpipにのめり込むことになりましたが、単にバラバラのツールを寄せ集めるだけでなく、完全なブロダクトを作るのが目的でした。誰もSilver Liningのことなど気に留めていませんでしたが、私は少しだけ気になっていました。Silver Liningは、ずっと考えていたデプロイメントに関してアイデアが完成されていたし、Webアプリケーション開発では軽快で信頼性が高いと言われていて、やりたくないタスクを飛ばして自動化することもできたからです。それでもvirtualenvやpipほどの思い入れはありません。私はコードやテクニカルデザインの道を進みましたが、離れてみるとそれも平凡なものでした。
実際に離れたらPythonにはワクワクする要素は何もありませんでした。Pythonは順調でしたが、私の興味が時流に左右されることはありません。確かにPythonはかつてないほど成功しています( マイナーバージョンアップ は別にして)。でも私は自分でツールセットを構築できるし、そのツールセットで作りたいものを作れると自負していました。具体的にどんなプロダクトかは考えていませんでしたが、適切なツールがあればそれなりの自信とスピードを持って行動できると思っていました。
でも私の場合、自分のアイデアに酔っている時は一度立ち止まらないといけません。冷静になって考え直した方がいいからです。そのまま突進してしまえば、きっと失敗して落胆するでしょう。もちろん実際のところは分かりません。思ったほどクールなアイデアでもなければ現実的でもないだろうと不安になり、目をそらしたくなるのかもしれません。それでも大抵は一歩下がってアイデアをより深く見つめ直してみます。ある意味、ツールやライブラリを作るのも、これと似たようなプロセスをたどった結果だと思います。すごいものを作ってやろうと思う気持ちが強すぎました。失敗するのではないか、完成できないのではないかと不安になったため、一歩離れてツールの開発をしようと思ったのです。
サーバでがんじがらめになっていても、私は常にWebに目を向けていました。ユーザの立場であっても、何とかしてネイティブGUIを避けていました。データの使い道も考えずにデータ処理をしても楽しくありません。それに運用は、とにかく最悪です。私は以前からフリーソフトやWebの信者だったので単なるフロントエンドとは思っていません。オープンソースでないWebも、Web向けでないオープンソースもあるでしょう。ただこうして書いていると、自分はWeb向けでないオープンソースに関心がないのだなと分かります。
Pythonでのコーディングをやめた時、もはやPythonはWebとは関係のないものに思えました。少なくとも興味のあるWebの範囲とは重ならないと感じたのです。私が作ってきたツールも今やWebとは無関係で、情熱も感じなくなっていました。データベースを使ったWebサイトやHTTPベースの動的なWebアプリケーション、テンプレートやデプロイメントといったRESTと呼ばれる部類のものには将来性を感じられず、自分が探し求めてきたものなど存在しないかのようでした。
これは新たな発見でも何でもありません。振り返ってみてそう思うのです。もし数年前にどうかと尋ねられたら、この意見に賛成したでしょう。自分で思いついたことではなく、むしろ世界が今のようになるのは分かり切ったことだったのかもしれません。こうしてJavaScriptやブラウザやDOMに目を向け始めたのです。
私がMozillaに加わったのはPythonから離れる少し前です。Mozillaへの参加がきっかけで、Pythonから距離を置くようになったわけではありません。もしMozillaにいながらPythonに携わっていれば、ずっと気楽だった可能性もあります。
移行してからここ数年は四苦八苦していました。Pythonやサーバに関わっていた頃は自分の仕事を理解していたし、得意な分野なので自信もありました。設計に関してどんな質問をされても自信を持って答えられたでしょう。周囲からは尊敬され、誰もが私の意見に耳を傾けました。ここまでのスキルを身につけるのに1万時間ほど費やしたと思います。
でもJavaScriptに移行してすべてが逆転し、今もかつてのレベルには達していません。もしWeb開発をやっていたら、もし別のプログラミング言語に移行した人が周りにいれば、もし何でもいいから小さなグループに入っていれば、これほど苦労しなかったのかもしれません。でもMozillaの環境は違いました。とはいえ、それで構わないのです。自分に自信があったのは、正してくれる人が誰もいなかったからでしょう。
不思議なことに、プログラマが数日や数ヵ月で新たな言語を身につける方法が話題になるのをよく耳にします。プログラマの知識は、( この例のように )別の言語に応用可能だと考えられているようですが、私は疑問を感じます。独善的な意見でしょうが、こう考える人たちは何かをマスターすることの実際を分かっていないのかもしれません。もちろん新たな言語や環境をモノにするのに、また1万時間をかける必要はないでしょう。それでも確実に数千時間は必要ですし、何年もかかることです。私自身はようやくそのレベルに近づいたと感じています。
何かに熟練することについて、恐らくこれが自分なりの考えなのだと思います。何かをやろうと決意して実際に行動するのはいいことですが、それだけで熟練の域に到達できるわけではありません。解決すべき課題を見つけないといけないし、それに対する正しい答えも見つけないといけない。計画の見直しが必要になれば、その原因を理解して適切なタイミングで軌道修正を図らないといけない。大局的でありながら細部にまで直感を働かせるべきだし、ささいなことで泥沼にはまらないようプログラミング言語のしっかりした知識も必要でしょう。でないと、大きなことに挑戦しようにも精神的なエネルギーがそがれてしまいます。PythonからJavaScriptへの移行はそれほど大きなことではないのもしれません。言語体系はよく似ているし、どちらもプラットフォームはブラウザです。それでも自分の直感を鍛え直して新しい環境でやっていくには、ある程度の時間がかかるのです。
残念ながら、私が以前の世界に戻ることはないでしょう。JavaScriptはPythonとは違います。まだJavaScriptのコミュニティを見つけていませんが、あったとしてもPythonを作り上げたPythonコミュニティのようなものはJavaScriptの世界に存在しないと思います。Pythonはインターネットから生まれた点がJavaScriptと違います。JavaScriptはインターネットのために作られましたが、Pythonはインターネットで作られました。今でもPythonコミュニティとその住人たちを懐かしく感じます。
ただ、今の自分にはプログラミング言語に対する忠誠心のようなものはありませんし、今後も気に入るような言語は出てこないでしょう。別に興味を失ったわけではありません。むしろ今でも最適なツールで仕事ができるよう頭を悩ませています。ただ議論の余地もないのにソフトウェア工学のタスクや選択肢に取り組むことが、何だか技術に対する冷めた諦めのように思えてきたのも事実です。
今は言語よりもプラットフォームに心引かれており、特に興味深いのがブラウザです。目新しいものではありませんが(ランタイムとして考えれば新しいとも言えますが)、その具体性や今日的な存在意義は大きな魅力です。今やブラウザはサーバからデータを受け取るだけの受け皿ではなく、サーバの代わりにサービスを仲介できる独立したエージェントとも言えます。もちろんそれがブラウザのすべてではありませんが、ひとつの将来的なモデルであり、未来のアーキテクチャを理解するには良い視点だと思います。
以上が私の目指している方向です。まだ道を歩き始めたばかりですが、完成できないようなツールを作って道草を繰り返すつもりはありません。現在はコラボレーションに取り組んでおり、手始めに TogetherJS を手がけました。次はもっと大きなプロジェクトにチャレンジしようと 新たな実験 も始めています。自分では、こうしたアイデアを形にするだけの能力をある程度身につけたと思うものの、プログラミングは大きなビジョンを推進するための一部分に過ぎません。サポートの集め方、プロジェクトの管理方法、実現可能性と利用者価値の両立、戦略とデザインの妥協点の探り方など、時間をかけて学ぶべきことはまだまだ残っています。それにコラボレーションそのものが専門知識の必要な領域です。これまでの知識をベースにある程度の仕事はこなせるものの、ここまでに挙げた項目で正しい選択ができるほどの経験はまだありません。努力してはいるものの、時間だけが過ぎていくようで不安です。
とにかく、これが今の私の立ち位置です。もうプログラミング言語の信奉者でもなく、どのコミュニティに属しているのかも定かではないので自己紹介にも困ります。プログラミングという技術的な基盤はあるものの、漂流者のような気分です。Python時代の仲間にサヨナラを言うのは名残惜しいので、代わりにこの言葉を。またいつかお会いしましょう。こちらの世界に来る人もいるでしょうから。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa