
サトシのSourceForgeのSVNの履歴は、何が実装されたかを知る記録としては、よく調べられてきた。コミットした人は4人、リビジョンは252件、そして2010年の初めに75日間の沈黙がある。だが164件のコミットメッセージの語数を数えた者や、コミット間隔の統計を取った者、その沈黙が明けた後で彼の書き方がどう変わったかを確かめた者は、探した限り見当たらなかった。そこで、実際にやってみた。戻ってきたサトシのメッセージは、以前より短くなっていた。なお、164件という数字は、サトシ同定の非対称性分析の材料一覧にも、一行だけ出てくる。本エントリーは、その一行のもとになった集計を、すべて示す。
1 数える対象を正しく決める
SVN履歴のGitミラーresearch-note/bitcoin-legacyから始めたところ、s_nakamoto名義のコミットは159件で、164より5件少なかった。
ミラー自体に欠落がある。r15〜r202の全範囲で、誰のコミットかにかかわらず、7件のSVNのリビジョンが、masterブランチにそもそもなかった。この7件を、SourceForgeのコミットログとじかに突き合わせた。5件はサトシのもので、r29・r30・r31(2009年11月4日の小さなLinux/xpm修正3件)、r50(「Version 0.2.0 released」)、r98(「version 0.3 release」)である。残り2件(r26・r27)はマルッティ・マルミのものだった。159+5=164で、SourceForgeのログがs_nakamotoに数える件数と一致する。
2 メッセージが語ること
164件のメッセージを、1行目だけでなく全文で数えると、サトシのコミットメッセージは、平均11.74語、中央値8語だった。全文で数えたのは、一部のコミットが、関係のない複数の修正を、カンマで区切って1つのメッセージに詰め込んでいたからである。最短は1語で、5件が該当する。「misc」が4件、「correction」(2010年12月)が1件。最長は64語で、ThreadSocketHandlerのソケット処理修正を一節ずつ列挙している。
使われる語は、ほとんどが作業を記録するための決まり文句だ。冠詞や前置詞などを除くと、多いのは「version」(41回)、「fix」(25回)、「build」(20回)、「linux」(18回)、「added」(17回)の順である。「rpc」と「unix」は14回で、並んで6位だった。3件のメッセージが協力者の名前を挙げて謝辞を述べている。相手はteknohogとjgarzik、そしてBlackEyeで、BlackEyeには、Crypto++の高速化について「BlackEyeがアラインメントの問題を突き止めてくれた」と書いている。ほかに5件で、翻訳した人の名前を挙げて礼を言っている。一人称は164件中ちょうど2件にしか現れない。感嘆符は0件。
比較として、ギャビン・アンドレセンのSVNコミット66件は平均13.61語・中央値7.5語で、サトシの8語に近い。マルッティ・マルミのコミットのうち、gitミラーにある13件(sirius-m名義、SourceForgeでは21件)は平均7.69語・中央値5語。サトシの書き方がそっけない理由は分からないが、そっけないのはサトシに限らなかった。このプロジェクトでは、誰のコミットメッセージも短かったのである。
3 間隙を測る
2010年3月5日から5月19日までの75日間、サトシがコミットしなかったことは、コード分析のページにすでに記録されている。まだ測られていなかったのは、この空白が、163件あるコミットの間隔の中で何番目に長いかだ。答えは1番目で、2番目を大きく引き離していた。中央値22.9時間・平均62.0時間に対し、この間隙は1797.5時間に達する。標準的なIQR検定(上側基準168.6時間)では163件中8件が外れ値と判定され、75日間の間隙はその8件の中でも最大だった。同じタイムスタンプは、別の手がかりを探すのにも使われている。サトシの国籍を考える分析は、UTC06:00から12:00の間にコミットがほぼ皆無であることを、ESTかCSTの地域に合う証拠としている。
163件のコミットの間隔を、間隔の中央値の半分より短いもの、2倍より長いもの、その間のものに分けると、ほぼ同じ数ずつになる。続けざまの短い間隔が54件、いつもの調子の間隔が55件、長く空いた間隔が54件だ。メッセージの長さも、この空白の前とあとで変わっている。3月5日までの54件は平均15.74語(中央値10語)、5月19日以降の110件は平均9.78語(中央値8語)。この75日間にサトシが何をしていたのかは分からない。ただ、戻ってきたサトシは、前より短いコミットメッセージを書くようになっていた。
4 中身のない巨大なコミット
164件中158件(残り6件は.cpp/.hを一切触っていないか、Gitミラーに存在しない)を、変更した行数の合計の多い順に並べると、1番目は2010年8月29日のリビジョンで、ほかを大きく引き離していた。65ファイル、31,004行の追加、31,004行の削除である。コミットメッセージは「propset svn:eol-style native」。
これは改行コードの正規化だ。実際の内容の文字を一つも変えずに、すべての行の終端記号を書き換えるSVNのプロパティ変更である。Gitの行単位のdiffは「この行の内容が変わった」と「この行の終端記号が変わった」を区別できないため、ファイル全体が置き換わったと報告する。これを含めたままだと、平均変更規模は396行から784行まで膨らみ、サトシの実際の作業とは関係なく、分布の形までゆがんでしまう。除外すると、実際の最大コミットは8,591行で、2010年2月の「strip out unfinished product, review and market stuff」である。大きさは並外れているが、こちらは中身を実際に変えたコミットだ。
164件全件を実際の内容(機能追加・バグ修正・リファクタリング・クリーンアップ・文書、または内容を伴わないバージョンリリースのタグ付け)で分類すると、機能追加74・バグ修正44・クリーンアップ14・文書/翻訳13・リリースタグ12・リファクタリング7。追加したコードの行のうちコメントの行が占める割合は、75日間の空白の前とあとでほとんど変わらず、前が8.12%、あとが9.09%だった。メッセージが短くなったのに対し、こちらは変わらなかったのである。21件は、すぐ前のコミットと同じファイルを変えていて、しかも訂正を示す語(「fix」「revert」「correction」)を含む。最も分かりやすい例はリビジョンfb7e197の4語、「revert revision 56, going in different direction with boost::asio and JSON-RPC」である。
5 限界
164件のうち5件(Gitミラーにない分)は、メッセージの本文だけを数えた。diffは取得していないため、§4のdiff規模に関する数値(変更行数の合計、最大コミットの順位)は158件を対象としており、164件全件ではない。同じ節でもメッセージ本文だけで判定する内容分類は164件全件を対象にしている。この5件のうち2件(r50・r98)は正確な時刻の記録がなく、§3でこの2件に隣接する間隔だけ精度が粗い。どれも、中央値を動かしたり、飛び抜けた間隔の順位を入れ替えたりするほどではない。欠けているのは、もともと結果をほとんど左右しない、分布の端の部分だけである。
この作業に取りかかったとき、退屈な結論を予想していた。誰もこの語数を数えなかったのは、数えても何も出てこないからだろう、と。おおむね、その通りだった。並んでいる語は、作業の項目を書き出しただけのようなもので、日記のように何かを語ってはいない。作業の途中で、本当に意外な発見が一つあった。行数だけを見ると履歴全体で一番大きいコミットが、実は中身に何も触れない改行コードのプロパティ変更だったのである。数字を信じずにdiffを開かなければ、気づかなかっただろう。だが、私の心に残ったのは、もっと小さな数字だった。あの75日間のあと戻ってきたサトシは、どこにいたのかを説明しようとして、言葉を増やしたりはしなかった。むしろ減らした。1コミットあたり平均9.78語、間隙前の15.74語に対してである。離れていた理由が何であれ、戻ってきたサトシの口数は増えなかった。むしろ、前より寡黙になっていた。沈黙がこの記録に残した跡は、それだけである。しかもそれは、言葉として残ったのではない。平均値として残っただけである。




