← すべての記事

エンジニアリング哲学:Guido van Rossum、可読性は重要だ

Pythonプログラミング言語の生みの親、Guido van Rossum

要点

  • コードは書かれるよりもはるかに多く読まれます。だからvan RossumはPythonを、機械でもなければ書いているその瞬間の作者でもなく、後でその行を読む人間のために最適化しました。
  • 意味を持つ空白は、読むという行為を誠実にします。目に見えるインデントが、そのまま実行されるブロック構造そのものなのです。だからPythonプログラムの見た目は、それが何をするかについて嘘をつけません。
  • 「それを行う明白な方法がひとつあるべきだ」——これは、見知らぬ誰かが書いたコードでも、まるで一人の手で書かれたかのように読める、という意味です。ひとつのイディオムへの収束は、未来のすべての読者への贈り物なのです。
  • Pythonの禅はvan RossumではなくTim Petersのものです——よくある誤った帰属です。Petersは、すでに言語に組み込まれていた価値観を蒸留したのでした。

原則

「Guidoの重要な洞察のひとつは、コードは書かれるよりもはるかに多く読まれる、ということだ。」——PEP 8、この洞察をGuido van Rossumに帰して1

この洞察は、言語設計のなかで最も静かな革命的主張です。そしてほとんど誰もがそれにうなずいて、そのまま無視します。その一文をゆっくり読んでみてください。コードは書かれるよりもはるかに多く読まれる。一度だけタイプした行は、何十回も読まれます——それを承認するレビュアー、それを拡張する同僚、それを受け継ぐ見知らぬ人、そして最も多くは半年後のあなた自身が、自分が何を意図したのかを思い出そうとして読むのです。もしそれが本当なら、ソースコードの読者は機械でもなければ、書いているその瞬間の作者でもありません。後でそれを読む人間なのです。そして言語は、その本当の読者のために最適化されるべきなのです。

そう作られた言語はほとんどありませんでした。1980年代のシステム言語はコンパイラと機械のために最適化され、スクリプト言語はその瞬間の作者の都合のために最適化されました。だからこそ、その多くは書かれた翌日には読めなくなったのです。Guido van Rossumの賭けは、代わりに読者のために最適化できる、というものでした——明確さをデフォルトとし、文法そのものによって強制すれば、数十年にわたってコミュニティ全体で複利のように積み上がっていく、と。彼は、ほとんど誰も予測しなかったほどの差で正しかったのです。Pythonの禅は、同じ価値観を、すべてのPythonプログラマーが読んだことのある三語に蒸留しています。「可読性は重要だ。」2

その信念は、趣味判断は技術的なシステムである——主張するだけの雰囲気ではない——という議論の根底にあるものと同じです。可読性は、後からスタイルガイドで取って付けるような、柔らかな好みではありません。Pythonにおいてそれは構造的なのです——構文に焼き込まれており、読みやすい版を書くのと同じくらい簡単には、読みにくい版を書けないようになっています。van Rossumの賭けは、明確なものを最も抵抗の少ない道にすれば、言われずとも生態系全体が明確さへと流れていく、というものでした。

背景

Guido van Rossumは1956年1月31日、オランダのハーグに生まれ、1982年にアムステルダム大学で数学とコンピュータ科学の修士号を取得しました。3 彼はCentrum Wiskunde & Informatica(CWI)——アムステルダムにあるオランダの国立数学・コンピュータ科学研究所——で働き始めます。そこに、彼のキャリアを決定づける経験が待っていました。ABCというプログラミング言語です。

ABCはCWIでLeo Geurts、Lambert Meertens、Steven Pembertonによって設計され、学びやすく読みやすいことを目指した教育用言語でした。van Rossumは1980年代半ばの数年間、その実装に取り組みました。4 ABCは、その後の彼のすべての仕事に響く2つの選択をしました。ひとつはインデントでブロック構造を示すこと——「オフサイドルール」で、波括弧もbegin/endもありません——もうひとつは可読性を主要な設計目標として扱い、プログラムが典型的にはPascalやCの同等版の4分の1のサイズに収まる、ということでした。4 van Rossumはこのインデントの発想を愛するようになりました。彼は後に、括弧をどこに置くかをめぐる無意味な宗教戦争に終止符を打ったと語っています。5 しかしABCには致命的な欠陥もありました——モノリシックな実装、拡張しづらい閉じた設計、本物のUnixプログラマーを遠ざける学術的な閉鎖性です。彼はその読みやすい言語を使い、教訓の両面を見ていました——どの発想が本当に優れていたのか、そしてどれがそれを殺した過ちだったのか、です。

そして、あの有名な起源の物語がやってきます。それは伝説が語るとおりに本当に起こったのでした。「6年以上前の1989年12月、」とvan Rossumは書いています。「私はクリスマスの前後の一週間を埋めてくれる『趣味の』プログラミングプロジェクトを探していた。」6 CWIの彼のオフィスは休暇で閉まっていました。彼は、ABCの最良の発想——可読性とインデント——を残し、その過ちを直し、今度はABCが決して届かなかったUnix/Cのハッカーたちに狙いを定めた、スクリプト言語を作ろうとしました。名前については、「少し不真面目な気分だった(そしてMonty Python’s Flying Circusの大ファンだった)ので」、Pythonを選びました。6 ヘビではありません。あのコメディ集団です。彼は1991年に最初のバージョンを公開しました。3

講演するGuido van Rossum

仕事

可読性と意味を持つ空白

van RossumがABCから引き継いだ最も重大な設計判断は、初心者が議論し、ベテランが気にも留めなくなるものです。インデントは構文である。 ほとんどの言語ではブロック構造は波括弧やキーワードで示され、インデントは人間の目が使い、コンパイラは無視する単なる装飾にすぎません。つまり、両者は食い違うことがあります。波括弧があることを言い、インデントが別のことを言う。そしてコードが、実際に動く内容とは違うことをしているように見えてしまうのです——古典的な「誤解を招くインデント」のバグ、Appleの悪名高いgoto failのSSL脆弱性を生んだ過ちの一族です。あれは、はぐれた2行目のインデント付きの行が、視覚的にはそれを含んでいるように見えるifの外側に座っていたのでした。

Pythonはその種のバグを構造的に不可能にします。目に見えるインデントが、そのまま実行されるブロック構造そのものなのです。それが食い違うための、第二の隠れた真実は存在しません。van RossumはこれをABCから受け継ぎました。波括弧の配置をめぐる論争を終わらせたからです。しかしより深い見返りは、まさに彼の原則そのものです——それは読むという行為を誠実にするのです。読者の目がプログラムの形として知覚するものは、定義上、インタープリタが実行する形なのです。45

Guido van Rossum

誠実な構造は、Pythonがプログラマーでない人にどう見えるかの理由でもあります——たまたま動く、構造化された疑似コードのように見えるのです。それが狙いでした。van Rossumは自認するところによれば非常に視覚的な人間で、表面を親しみやすく、構造を目に見えるように設計しました。だから「コードを読む」ことと「プログラムを理解する」ことのあいだの隔たりは、文法が縮められるかぎり小さいのです。

Pythonの禅と「明白な方法がひとつ」

1999年、長年のコア開発者Tim Petersは、Pythonを活気づける設計上の価値観を20の格言に書き留めました。それはやがてPEP 20、Pythonの禅として正式に定められ、言語そのものの内側に同梱されています。Pythonのプロンプトでimport thisとタイプすれば、それが印字されます。その功績の帰属は重要で、しばしば誤られます。そのテキストを書いたのはTim Petersであって、van Rossumではありません。2 しかしこの禅は、Guidoの設計感覚の蒸留なのです——Petersは、すでに言語のなかにあった価値観を言葉にしていました。優れた批評家がアーティスト本人よりも巧みにその意図を言い当てるように。

2行が哲学のすべてを担っています。「可読性は重要だ。」 そして——「それを行う明白な方法が——できれば唯一の——あるべきだ。」2 この2行目は、Perlの名高いモットー「それを行う方法は2つ以上ある」を意図的に裏返したものです。van RossumのPythonは反対方向に賭けます——明白な方法をひとつ示す言語とは、誰が書いてもコードが同じに見える言語であり、つまり誰もが他の誰かのコードを読めるということなのです。ひとつのイディオムへの収束は、作者への制約ではありません。それは未来のすべての読者への贈り物なのです。(その格言自身の句読点——「できれば唯一の」を挟むダッシュ——でさえ、それを述べる行為のなかで規則がわずかに破られている、というお茶目な冗談です。)

BDFLとガバナンス:2018年の退任

Pythonの人生のほとんどの期間、van Rossumは言語の設計に対する最終決定権を握っていました。1995年のPythonの集まりで半ば冗談として作られ、Barry Warsawによって恒久化された称号のもとに——BDFL、慈悲深い終身独裁者(Benevolent Dictator For Life)です。7 それは本物のガバナンスモデルでした。言語の変更はPEPプロセス——Python Enhancement Proposals、つまりあらゆる変更が提案され、議論され、決定される、開かれた、文書化された、保管される仕組み——を通じて流れていきました。しかし合意が得られないときは、BDFLが決めたのです。何十年ものあいだそれが機能したのは、van Rossumの趣味判断こそ、コミュニティが信頼していたものだったからです。

それはひとつの演算子をめぐって終わりました。PEP 572は「ウォルラス」代入式:=を導入し、その議論は異例なほど激しいものでした——van Rossumは大きく根強い反対を押し切ってそれを通しました。それが受理された数日後の2018年7月12日、彼はpython-committersリストに「Transfer of power(権力の移譲)」という題のメールを投稿しました。「PEP 572が片付いた今、」と彼は書きました。「私はもう二度と、PEPのためにこれほど激しく戦い、これほど多くの人々が私の決定を蔑むのを見たくはない。」 彼は自らに「BDFLからの永久休暇」を与え——そしてここが重要なのですが——後継者を指名することをきっぱり拒みました(「私は後継者を任命するつもりはない」)。コミュニティに自分たちの政府を発明させたのです。8 そしてコミュニティはそうしました——5人の選挙で選ばれたSteering Councilが、PEP 8016によって批准され、いまやPythonを統治しています。慈悲深い独裁者は、意図的に独裁制を廃止したのでした。

Pythonの広がり

可読性への賭けは、ソフトウェアの歴史のなかでも最大級の成果へと複利で積み上がりました。Pythonは人々が読める言語だったからこそ、人々が教えられる言語になりました——いまや世界中の大学で支配的な入門言語です。読みやすく拡張しやすかったからこそ、科学計算の接着剤になりました——NumPy、SciPy、pandas、データサイエンスのスタック全体です。そしてデータサイエンスのスタックがすでにPythonにあったからこそ、深層学習の革命もまたPythonの上に築かれました——PyTorch、TensorFlow、JAX、そしてあなたが名前を聞いたことのあるほぼすべてのモデルが、オランダのプログラマーがクリスマス休暇に人間の目にやさしくあれと設計した言語から動かされているのです。van Rossum自身も2020年に引退から復帰し、Microsoftに加わってFaster CPythonプロジェクトに取り組みました。インタープリタをおよそ2倍速くする試みです——彼自身の言葉を借りれば、自分の原点へと戻りながら。9

方法

その方法は、ひとつの信念——読者のために最適化せよ——を、35年にわたって異例の一貫性で追い求めたものです。

コードを読む人間のために最適化せよ。 機械でもなければ、その瞬間の作者でもありません。あらゆる表面上の判断——インデント、小さなキーワードの語彙、明確さへのこだわり——は、後でその行を読む人に奉仕します。その人こそが本当の読者であり、その数ははるかに多いからです。1

構造を目に見えるようにし、読むという行為を誠実にせよ。 インデントがそのままブロック構造なので、目が知覚するものがインタープリタの実行するものになります。言語は、コードの見た目とその振る舞いが食い違うことを許しません。4

明白な方法をひとつ選べ。 同じ作業に5つのイディオムを差し出すことに抗いましょう。ひとつの明確なイディオムへの収束は、見知らぬ者たちが書いたコードでも、まるで一人の手で書かれたかのように読める、ということを意味します。2

良い発想を取り、過ちを直せ。 PythonはABCの可読性とインデントから、ABCのモノリシックで閉じた、拡張不能な設計を差し引いたものです。van Rossumは無から発明したのではありません。彼は、先にあったものを取捨選択する目利きの編集者でした。45

開かれた場で統治し、手放すべき時を知れ。 PEPプロセスは設計判断を公開され、文書化されたものにしました。そして、自らが最終権威であることがコミュニティへの奉仕ではなく負担になったとき、彼は自分自身を取り除き——そして後任を聖別することを拒み、自分の代わりに永続する制度が形づくられることを強いたのです。8

影響の連鎖

彼を形づくった人々

ABC、そしてCWIのLambert Meertens、Leo Geurts、Steven Pemberton。 ABCはvan Rossumに、彼を定義づける2つの発想——構文としてのインデントと、主要目標としての可読性——を手渡しました。そして失敗することによって、負の教訓を教えました——モノリスを作るな、設計を閉じるな、現場のプログラマーを無視するな、と。PythonはABCの良い半分を救い出したものです。(直接的で形成的な影響)

Modula-3。 その清潔なモジュールと例外の設計は、Python自身の設計に影響を与えました。van Rossumがあらゆる車輪を再発明するのではなく、敬愛する言語から意図的に借用したことを思い出させてくれます。(直接的な影響)

CとUnixの文化。 CはPythonにその実装言語(CPythonはCで書かれています)と、その狙うべき読者——ABCが決して届かなかったUnix/Cのハッカーたち——を与えました。PythonはCのにある読みやすいスクリプト層として、Cで拡張可能な、Cの世界の接着剤として構想されたのです。(形成的な影響)

彼が形づくった人々

地球上で最大のプログラミングコミュニティ。 Pythonは、ほとんどの尺度において、いまや世界で最も広く使われているプログラミング言語であり、初心者に教えられるデフォルトの第一言語です。一世代が、読まれるために設計された構文のなかで、プログラムについて考えることを学びました。

データサイエンス、AI、科学計算。 NumPy、pandas、PyTorch、TensorFlow——現代のAI時代全体の道具立てがPythonの上に乗っています。Pythonが、研究者たちが読んで拡張できる言語だったからです。可読性への賭けは、間接的に、私が働く分野の荷重を支えているのです。

オープンソースのガバナンス。 BDFLモデルと、その意図的な解体による選挙制のSteering Councilへの移行は、一人の趣味判断によって率いられるプロジェクトが、どうすればその人物の権威を超えて生き延びられるかについて、研究される雛型となりました。

貫く一本の線

Yukihiro Matsumotoプログラマーの幸福と最小驚きの原則のためにRubyを設計し、van Rossumは読者のためにPythonを設計しました。両者は2つの偉大な「喜び」の言語であり、わずかに異なる的に向けられた同じ本能なのです——Matzは書くときの感触のために最適化し、van Rossumは読むときの感触のために最適化する——だからこそ両者はこれほど頻繁に収束し、両者のコミュニティは互いを認め合うのです。Donald Knuth文芸的プログラミングによって、学術の側から同じ目的地に到達しました——プログラムは人間のために書かれた文学作品であり、機械がそれを実行できることはほとんど副産物にすぎない、という過激な主張です。van Rossumはその信念を、方法論ではなく言語の文法のなかに築き込みました。そしてBjarne Stroustrupゼロオーバーヘッドの性能を最優先し、C++を流暢に読めるまで何年もかかる言語へと育つにまかせたのに対し、van Rossumは可読性を最優先し、その代償としてインタープリタの遅さを受け入れました——2人の設計者、正反対の最優先事項、それぞれが相手の払うことを拒んだ通貨で支払っているのです。(シリーズの橋渡し)

私がここから受け取るもの

私が抱き続ける教訓は、可読性は礼儀ではなく、それこそが実際の製品である、ということです。コードは書かれるよりもはるかに多く読まれるので、読んで明確な版こそが、より価値の高い版なのです——そして「後で片付けるよ」とは、いま私がひそかに裏切っている読者への約束なのです。van Rossumの一手は、明確な版をデフォルトにすることです。だから正しいことをするのは、規律の行為ではなく、最も抵抗の少ない道になります。それは品質こそが唯一の変数であるという基準と同じです——問いは決して「これは動くか?」ではなく、「次にこれを読む人は、必要なだけの速さでこれを理解できるか?」なのです。

私がいま築いている世界——エージェント、ツールのループ、プロンプト、ほかのエージェントや未来の私が午前2時に読むことになる土台のコード——では、誘惑は「可読性は重要だ」の正反対です。気の利いたワンライナー、暗黙の状態、誰の頭にも収まらないコードベースのあちこちに散らばった、同じことをする5通りの方法。van Rossumの一手は、明白な方法をひとつ選び、構造を誠実にすることです。だから読むものが、そのまま動くものになります。その信念——明確さを、意志の力に委ねるのではなく構造的なものにし、システムの文法によって強制すれば、後でそれを読むすべての人にわたって複利で積み上がっていく——こそが、1989年のクリスマスの趣味プロジェクトから2026年のエージェントの土台へと貫く一本の線なのです。読者こそが受け手なのです。彼らのために築きましょう。

FAQ

Guido van Rossumのエンジニアリング哲学とは何ですか?

van Rossumの中核的な信念は、コードは書かれるよりもはるかに多く読まれる、だから言語はそれを読む人間のために最適化されるべきだ、というものです。1 彼はPythonを、可読性を主要かつ構造的な目標として——後から取って付けるスタイルの指針ではなく、意味を持つインデント、小さなキーワードの語彙、そして「それを行う明白な方法がひとつあるべきだ」という原則を通じて、文法に焼き込んで——築き上げました。2 彼はこれを、PEPプロセスを通じた開かれた言語の統治と組み合わせ、そして2018年に、その最終権威の座から意図的に退きました。8

なぜPythonは波括弧ではなくインデントを使うのですか?

van Rossumはインデントに基づくブロック構造(「オフサイドルール」)を、1980年代にCWIで取り組んだABC言語から採り入れました。彼は、それが波括弧をどこに置くかをめぐる果てしない論争を終わらせたことを気に入っていました。45 それが今なお続くより深い理由は、読むという行為を誠実にするからです。波括弧の言語ではインデントは装飾であり、波括弧と食い違うことがあるので、コードは実際に動く内容とは違うことをしているように見えることがあります(誤解を招くインデントのバグ)。Pythonでは、目に見えるインデントが、そのまま実行されるブロック構造そのものなのです——それが食い違うための、第二の隠れた真実は存在しません。

Pythonの禅を書いたのは誰ですか?

長年のPythonコア開発者であるTim Petersが、Pythonの禅を書きました——PEP 20として正式に定められ、import thisを実行すると印字される、20の格言です。それはGuido van Rossumによって書かれたのではありません。よくある誤った帰属です。2 それがしていることは、van Rossum自身の設計上の価値観を記憶に残る形に蒸留することです——「可読性は重要だ」や「それを行う明白な方法が——できれば唯一の——あるべきだ」といった行は、すでに言語に組み込まれていた感覚を言葉にしているのです。

なぜGuido van RossumはPythonのBDFLを退いたのですか?

van Rossumは何十年にもわたり、PythonをそのBDFL——慈悲深い終身独裁者として率いてきました。1995年のPythonの集まりで半ば冗談として作られた称号です。7 彼は2018年7月12日、PEP 572(ウォルラス演算子:=)の物議をかもす受理の数日後に辞任しました。彼は重い反対を押し切ってそれを通したのでした。「Transfer of power(権力の移譲)」と題したメールのなかで、彼はこう書いています。「PEP 572が片付いた今、私はもう二度と、PEPのためにこれほど激しく戦い、これほど多くの人々が私の決定を蔑むのを見たくはない。」 彼は自らに「BDFLからの永久休暇」を与え、そしてあえて後継者を指名することを拒みました。8 コミュニティは彼の代わりに、選挙で選ばれた5人のSteering Councilを据えました。


出典


  1. 「PEP 8 – Style Guide for Python Code,」 peps.python.org、Guido van Rossum、Barry Warsaw、Alyssa Coghlanによる。「Guidoの重要な洞察のひとつは、コードは書かれるよりもはるかに多く読まれる、ということだ。」 このガイドラインは、その直後にPEP 20の「可読性は重要だ」を引用している。 

  2. Tim Peters、「PEP 20 – The Zen of Python,」 peps.python.org。Tim Petersによる執筆(Guido van Rossumではない)。import thisによって印字される。「可読性は重要だ。」および「それを行う明白な方法が——できれば唯一の——あるべきだ。」を含む。 

  3. 「Guido van Rossum,」 Wikipedia。1956年1月31日、オランダのハーグに生まれる。アムステルダム大学修士(1982年)。CWIでABCの開発に貢献。1989年12月にPythonインタープリタを始め、1991年に初公開。Monty Python’s Flying Circusにちなんで命名。Google(2005–2012年、ここでMondrianコードレビューツールを構築)、Dropbox(2013–2019年)、Microsoft(2020年11月から)。 

  4. 「ABC (programming language),」 Wikipedia。CWIでLeo Geurts、Lambert Meertens、Steven Pembertonによって設計された。ブロック構造にインデント(オフサイドルール)を用いる、教育・可読性重視の言語。プログラムは同等のPascalやCのおよそ4分の1のサイズ。van Rossumは1980年代半ばにABCの実装に取り組み、そのインデントと可読性の発想をPythonへと持ち込んだ。 

  5. Bill Venners、「The Making of Python: A Conversation with Guido van Rossum,」 Artima。van Rossumが、Unix/CのハッカーたちのためにABCの子孫としてPythonを作ったことについて——ABCの優れた性質(可読性、グループ化のためのインデント)を保ちつつその問題を直したこと、そして波括弧の配置の論争を終わらせたためにインデントを好むようになったことについて語っている。 

  6. Guido van Rossum、「Foreword for ‘Programming Python’ (1st ed.),」 python.org。「6年以上前の1989年12月、私はクリスマスの前後の一週間を埋めてくれる『趣味の』プログラミングプロジェクトを探していた。」 名前について:「私はそのプロジェクトの仮題としてPythonを選んだ。少し不真面目な気分だった(そしてMonty Python’s Flying Circusの大ファンだった)からだ。」 

  7. 「Benevolent dictator for life,」 Wikipedia。この用語が初めてvan Rossumに対して使われたのは1995年。Pythonの集まりでKen Manheimerが「Benevolent Dictator」と名づけ、Barry Warsawが「for Life」を提案した。Guido van Rossum、「Origin of BDFL,」 Artimaも参照。この用語を1995年の会合まで遡っている。 

  8. Guido van Rossum、「[python-committers] Transfer of power,」 python-committersメーリングリスト、2018年7月12日。「PEP 572が片付いた今、私はもう二度と、PEPのためにこれほど激しく戦い、これほど多くの人々が私の決定を蔑むのを見たくはない。」 彼は「BDFLからの永久休暇を自分自身に与える」と発表し、「私は後継者を任命するつもりはない」と述べている。背景:「Guido van Rossum resigns as Python leader,」 LWN.net。PEP 572(ウォルラス演算子)はpeps.python.org/pep-0572.にある。 

  9. 「A Team at Microsoft is Helping Make Python Faster,」 Microsoft for Python Developers Blog。van Rossumが2020年にMicrosoftに加わって取り組んだFaster CPythonプロジェクトについて。インタープリタのおよそ2倍の高速化を目指す。「Guido van Rossum’s Ambitious Plans for Improving Python Performance,」 The New Stackも参照。引退からの復帰についてvan Rossumは語る。「私はMicrosoftに応募して採用された……私は自分の原点へ戻ることを選んだのだ。」 

関連記事

エンジニアリング哲学:Roberto Ierusalimschy

Roberto Ierusalimschyは、ただひとつの原則——ポリシーではなくメカニズム——を軸にLuaを設計しました。小さく、速く、組み込み可能な言語は、規則ではなくレバーをあなたに手渡します。

3 分で読める

エンジニアリング哲学:グレース・ホッパー、コンピューターに人間の言葉を話させる

グレース・ホッパーは、プログラムを人間の言葉で書けるよう最初のコンパイラーを作り、ナノ秒のワイヤーでレイテンシーを物理的なものに変え、古びた教条と闘い続けました。

1 分で読める

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 分で読める