最近Gitを多少理解した。
Gitを理解することは、ソフトウェアの設計について深く考えさせられる体験である。おそらく、SCMになんの関心もない人にとっても、Gitを理解することは有益だ。理解した結果ではなく、理解する過程が有益となる。
Gitを理解した結果は、Gitを理解する過程に比べると、些細なものだ。tarballとパッチによるワークフローの、賢く素早いが面倒な自動化――「そうそう、コンピュータってこういうものなんだよ」と改めて思い出させてくれる。賢く素早いが、面倒。
インターネットが普及し始めてから20年以上が過ぎた。コンピュータによる自動化が容易な分野は、掘り尽くされつつある。今後新しく登場する種類のソフトウェアの多くは、Gitと似た問題を抱えるだろう。
Gitを理解するうえでの困難について書き留めておく。
・用語の混乱と不統一
まず、名詞のcommitと動詞のcommitがある。
名詞のcommitとはなにか。tarballに属性がついたものだ。この属性を使って、Gitはすべての操作を自動化する。動詞のcommitは、名詞のcommitを作成する操作だ。
次に、index。あまりにも一般的な名前のためか、「ステージングエリア」という言い換えがよくなされる。
そしてcheckout。ソースコードを持ってくる操作のように見える名前だが、同時にブランチも操作する。そして、ソースコードを持ってこずにbranchだけを新規作成するときにも、checkoutが使われる。
どれも「あるある」的な混乱と不統一だが、多くの場合、Gitほどの困難を生み出さずに済んでいる。なぜGitではまずいのかというと、
・核となる概念が消去されている
Gitの核は実は簡単で、tarballとパッチ、それだけだ。tarballはソースコードを固めたもの、パッチはソースコード間の差分を集めたもの。なにも難しいことはない。
が、Gitは賢い自動化のために、パッチを直接の操作対象として扱わせない。そのため、名詞のcommit、履歴(≒名詞のcommit間の家系)、branchなどの概念を同時に理解する必要が生じる。
自動化は大なり小なりピタゴラ装置だが、tarballとパッチを自動化するだけで、これほどのピタゴラ装置が生み出される。ソフトウェアの設計について考えるうえで、Gitのケーススタディには大きな意義があるだろう。
『ビューティフルテスティング――ソフトウェアテストの美しい実践』をざっと読んだ。
感想――絶望。
「完全な仕様書」なるものを考えよう。そのまま実行できるか、少なくとも完全なテストスイートを生成できる仕様書だ。「完全なテストスイート」とは、それをパスすれば必ず仕様を満たしていると言えるテストスイートだ。ただし、これらはあくまで思考実験上の存在である。現実的な時間内に実行を終えられるかどうかは問わないし、実在できなくてもかまわない。
1913年、ホワイトヘッドとラッセルは、算術の完全な仕様書を書いた。タイトルを『Principia Mathematica』という。算術、つまり、1+1=2や4x4=16といった操作が、この仕様書には定義されている。
ウィトゲンシュタインはこの仕様書を次のように批判した。
「足し算引き算割り算掛け算は、世界中の人間が毎日やっている。全世界の全歴史のどこでも1+1=2だし、4x4=16だ。もしこういう操作で意見の不一致を生じたら大問題になるだろうが、深刻な不一致はどうやら今まで一度も起きていないらしい。
さて、『Principia Mathematica』を徹底的に検討したところ、バグが見つかったとしよう。世界中の人間が一致して出すはずの答えと、『Principia Mathematica』の導く答えが食い違うケースを発見したとしよう。
そのバグがどんなものであろうと、
『つまり、これまで全世界の人間がやっていた算術にはバグがあるんだよ!』
『な、なんだってー!!』
……ということにはならない。バグっているのは『Principia Mathematica』のほう、ということになる。
こういう事態が生じる可能性をゼロにすることはできない。完全な仕様書なのにバグっている可能性があるとは、いかがなものか」
ウィトゲンシュタインによる批判を、実践的に表現すると、本書216-217ページのようになる――
最近では、特定のアサーションのみをチェックすることが一般的になっています。このため、テストの自動化では以下のような点が確認できなくなります。
・アイコンの背景色が透明ではない
・[Submit]の実行後、演算子のドロップダウンリストがデフォルトの[Plus](加算)になるため、「4+4=16」のように表示してしまう。
・2番目の値の入力後、キャンセルボタンを無効化してしまう
・[Answer](解答)が無効化されるべき(グレーアウトされるべき)ときに編集可能となる。
・演算の完了に8秒もかかる。
・生成した新規ページには正しい答えを表示しているが、入力した最初の値として0を表示している。このため、「0+4=8」と表示してしまう。
人間のテスターは思考することができるため、瞬時にこれらの問題に気づきます。
「人間のテスターは思考することができるため、瞬時にこれらの問題に気づきます」とは、「バグっているのは『Principia Mathematica』のほう」というのと同じことだ。上で引用したような問題が報告されて、「仕様ではその動作は不定だから問題ない」と言い放つ勇気はなかなか持てない。「バグっているのはこれまでの全世界の人間のほう」よりはまだ言いやすいが。
つまり、そこにあるのは政治であり、権力だ。習慣という旗印のもとに味方を集められると踏んだテスターや、習慣と争っても勝負にならないと踏んだウィトゲンシュタインは、権力の大小にもとづく政治的な判断を下している。
テストやバグや仕様について考えるには、これらが政治的問題であることをまず認識しなければならない。が、本書のなかには、そうした認識は見つけられなかった(私が見落とした部分にはあるのかもしれないが)。政治的問題を無視してテストを論じる本書は、私の目には、無様なナンセンスと映る。そのナンセンスに気づきもしない著者たちの鈍感さは、私を絶望させた。
私の実家の近くには競輪場がある。控えめに言っても小汚い、有り体に言えば大汚い老人が電車に乗ってきて、競輪場の最寄り駅で降りる光景をよく見かけた。私の子供時代にはまだ競輪場は人の集まるところで、「こんなにカモを集めたらさぞ儲かるだろうな。いつか競輪を開催して儲けたい」と子供心に思っていた。
子供心に――まったく子供らしい話だ。現在の競輪はといえば、マイナス成長を続けて20年、開催自治体の多くを赤字で苦しめている。この世に永遠のものはない。幼い私にはそんな簡単なこともわからなかった。
幼い私には難しすぎた事実は、ほかにもいくつかある。
ひとつは、あの大汚い老人たちは、カモであると同時に恐ろしく賢い、ということだ。
金を損しに集まる人々が恐ろしく賢い、などということがどうしてありうるのか。「賢い」を「高性能」と言い換えれば、わかりやすいかもしれない。あの大汚い老人たちは、高性能な競輪予想マシーンだ。
「あんなジジイたちの予想が大したものであるわけがない」とお考えだろうか。では競輪を今から勉強して、大汚い老人たちを出し抜いて稼げばいい。「控除率が高すぎる」? 三連単の選択肢は十分に広い。見下せるほど無能な相手なら、25%のハンデくらいは覆せるはずだ。
……などと私がいくら書きつらねても、「ではあのジジイたちをカモってやるか」と決心して競輪の勉強を始める人間は、おそらくこの地上に一人もいない。また逆に、「あんなジジイたちの予想が大したものであるわけがない」という信念を捨てる人も、やはりおそらく一人もいない。どんなに間抜けな人も、こういうことに関しては恐ろしく賢い。あの大汚い老人たちも同じように賢いわけだ。
金を損しに集まる人々でありながら、恐ろしく賢い。
そういう人々のことを、無能だと決め付けながら、実は恐ろしく賢いと認めている。
どちらの事実も、幼い私には難しすぎた。
あの高性能な競輪予想マシーンを相手に回せば、競輪予想の初心者や中級者はただひたすらカモにされる。それがわかっているから、「あのジジイたちをカモってやるか」と決心して競輪の勉強を始める人間は稀だ。
ではその老人たちは、かつて競輪を始めたときには、高性能な競輪予想マシーンを相手に怯むことなく蛮勇を奮い起こして競輪場に飛び込んだのかといえば、おそらくそうではない。
競輪の客が高性能な競輪予想マシーンばかりではなく、初心者・中級者がうようよしていた時代――競輪の勃興期に競輪を始めた人々がほとんどなのではないか。競輪場に初心者・中級者がうようよしているのを見て、「こいつらならカモにできる」と判断して自分もその初心者の一人になった人々の数十年後が、あの老人たちなのではないか。
つまり、初心者・中級者の割合が多いほど、新規参入者が増えるのではないか。初心者・中級者の割合がゼロに近づくと、新規参入者もゼロに近づくのではないか。
ほとんどの競輪場は、競輪というものが誕生してからほんの数年のうちに建てられている。これは「初心者・中級者の割合が多いほど、新規参入者が増える」という仮説と整合する。客の全員が初心者のとき、新規参入者は一番多くなる。その増加の勢いを見れば、いくつ競輪場があっても足りないと思えただろう。
「初心者・中級者の割合が多いほど、新規参入者が増える」という仮説がもし正しいとすると、客の能力が問われるギャンブルほど持続可能性が低い。
客の能力が一切問われない公営のギャンブルは、宝くじしかない。この記事の、公営競技と宝くじの売上額グラフを比較してみると、どちらのほうが持続可能性が高そうか、一目瞭然だ。
現在のカジノの主なゲームはどれも、能力のたぐいを働かせる余地がない。これは偶然や運営の都合ではなく、公営ギャンブルよりもはるかに長い歴史から生み出された知恵かもしれない。