古いオフィス街の一角に、元エンジニアのマスターとAIロボットが営む喫茶店がある。今日も客が一人、ドアを開けた。マスターには、少し懐かしい顔だった。
カランとドアベルが鳴る。入ってきた四十代半ばの男は、店内をぐるりと見回してから、カウンターの奥に目を留めて、ぱっと顔をほころばせた。
「……本当にいた。先輩、ご無沙汰してます」
「おや」マスターが手を止める。「井上君じゃないか」
現役時代の後輩だ。同じ会社で、若い頃はずいぶん一緒に残業した仲である。
「噂を聞いたんですよ。昔世話になった先輩が、この辺で喫茶店をやってるって。半信半疑で来てみたら」
「いらっしゃいませ。ご注文をどうぞ」
カウンターの中から声がした。井上が視線を落とすと、踏み台の上に小さなロボットが立っている。
「……先輩、これは」
「うちのウェイターですよ。優秀でね」
「へえ……よくできてますね。受け答えも自然だ」井上は、たいして興味もなさそうに椅子に腰を下ろした。「じゃあ、ブレンドをホットで」
マスターが豆を挽き始める。しばらくは近況の話になった。井上はいまもエンジニアを続けていて、Webサービスの会社でチームを見ているという。変わらないのは山歩きの趣味くらいで、いまも休みが取れると泊まりがけで登っているらしい。
「もう若手に教わる側ですよ。それでも、先輩がいた頃より開発はだいぶ楽になりました。……覚えてます? ソースの取り合い」
「懐かしいね」マスターが苦笑した。「直したいファイルに限って、誰かが握っている」
「それです、それ。……なんでしたっけ、うちで使ってたあれ」
「VSSだね。当時のうちの職場は、あれだった」
「補足します」ロボットが、すっと横に来た。「VSS──Visual SourceSafeですね。ロック方式のバージョン管理システムの一つです。ファイルを編集するには、まずロックを取得する必要があり、ロックは同時に一人しか取れませんでした」
「そうそう、それそれ」井上がうなずく。「ロックを取ったまま帰る人がいると、仕事が止まるんですよ」
「それでも、あれが入ったときはありがたかったんだよ」マスターがドリッパーに湯を注ぐ。「君が来る前は、バージョン管理というもの自体がなくてね。変更の記録は、コードのあちこちに直接書き込んでいた。直した場所に、日付と中身をコメントでね。前のコードも消さずに、コメントにして残しておくんだ」
「ああ、その手のコードなら、別のプロジェクトで見たことありますよ。ああやって溜まっていくんですね」
「おかげで、ファイルの中はゴミ溜めだよ。いま動いているコードと、コメントで潰した昔のコードと、日付のメモとが、ぐちゃぐちゃに積み重なってね。どれが生きているのか、掘り返さないと分からない」
「記録が成果物と同じ場所に同居する方式ですね」ロボットが言う。「履歴が増えるほど、本体が読みにくくなります」
「それにね、ファイルは共有の置き場にあるだけだから、二人が同時に開くと、後から保存したほうが丸ごと上書きだ。何日かぶんの直しが、そっくり消えたこともあった」
「うわあ……」
「だから、ロックの取り合いくらいは文句を言えなかった。少なくとも、直したものが黙って消えることは、なくなったからね」
「で、途中からSVNになったんですよね」井上が言う。「あれで一気に楽になった」
「楽には、なったね」マスターがドリッパーから目を上げず、少し間を置いた。「ただ……白状すると、私は馴染むまでずいぶんかかった」
「そうでしたっけ」
「良くなったところは分かるんだよ。ファイルごとにバラバラだった履歴が、関係する直しをひとまとめにして記録できるようになった。ブランチというものも作れるようになった。ただ──ロックがなくなったのが、どうもね」
「ああ……」
「ロックは分かりやすかった。誰かが取っていたら待つ。空いたら自分が直す。現物の道具の貸し借りと同じ理屈だ。それがSVNからは、みんなで同時に同じファイルを直して、あとで機械が混ぜ合わせるだろう? 頭では分かっていても、しばらくは信用できなくてね。勝手に混ぜて本当に大丈夫なのか、と」
「言ってました言ってました。それ、先輩だけじゃなかったですよ」井上が笑う。「でも、じきに慣れたでしょう」
「慣れたよ。慣れたが、あのとき覚えたんだ。便利になるほど、直感から遠ざかるものもあるんだな、と」
「いいことを言った風にまとめてますけど」井上がにやりとする。「先輩、その知識で止まってるでしょう」
「人聞きの悪い。……で、いまは違うのかい」
「聞いて驚いてくださいよ。──先輩、いまどきは山小屋でもコミットできるんですよ」
マスターの手が止まった。
「……山小屋に、ネットが来ているのかい」
「来てなくていいんです。圏外でも平気」
「いや、待ちなさい」マスターがカップを置く。「コミットというのは、あれだろう。書いたものを、あちらの記録に残すことだろう。繋がずに、どこへ記録するんだい」
「あー、えーと」井上が頭をかく。「違うんですよ、いまのコミットはそういうんじゃなくて……手元っていうか……なんて言えばいいかな」
「補足します」ロボットが割って入った。「現在主流のgitでは、変更はまず手元に記録されます。これがコミットです。それを共有の場所へ反映する操作は、プッシュと呼ばれる別のものです。手元に記録するので、ネットに繋がっていなくても、コミットはできます」
「そうそう、そういうことです。……たぶん」
「たぶん、とは」ロボットが井上を見た。
マスターはしばらく黙っていた。それから、淹れたてのコーヒーを井上の前に置き、続いてカウンターの下から使い込んだ売り上げ帳簿を取り出して、その隣に置く。
「……つまり、こういうことかな。うちには、この売り上げ帳簿が一冊ある。私の言うコミット──SVNのコミットは、注文を受けるたびに、ここへ直に書き込むことだった。書いたら最後、店の正式な記録だ。だから『慎重に』と言われたんだよ」
「ええ、そうでした」
「ところが、いまのgitは──あいだに、ひと手間挟まったんだね」マスターがカウンターの伝票立てから、注文伝票を一枚抜いた。「まずは、手元のこの伝票に書く。これが、いまのコミット。伝票はまだ自分の手の中だから、書き損じても、破って書き直せばいい。帳簿は汚れない」
「……はい。その通りです」
「その伝票を、あとでまとめて売り上げ帳簿に書き写す。これが、プッシュ。ここで初めて、店の正式な記録になる。──同じ『コミット』でも、私の頃は帳簿に直に書くこと、いまは手元の伝票に書くこと。それでは、話が噛み合わないわけだ」
「例えとして正確です」ロボットが言う。「SVNではコミットが、そのまま共有の記録になりました。gitはコミット(伝票)とプッシュ(帳簿)を分けたので、共有する前に、手元でいくらでも整えられます」
「そこ、SVNから移行してきた人だけじゃなく、みんな引っかかるんですよ」井上が言う。「うちの新人も『コミットしたのに共有されてません』ってよく言ってます。コミットとプッシュが別だってのが、最初はピンとこないみたいで」
「だろうね。私もいま、同じところで引っかかった」
「道理で、山小屋でも──」マスターが言いかけて、苦笑した。「……うちに当てはめれば、レジの帳簿まで戻らなくても、テーブルで伝票を書いておける、くらいのことだね」
「やってることは同じですよ」井上がコーヒーを一口飲む。「僕はその伝票を、たまたま山の上で書いてる、ってだけで」
「せっかく山まで登って、仕事をすることもないだろうに」
「気が向いたときだけですよ。小屋の夜は、飯を食って寝るまで、やることがないんで」
マスターが自分のぶんのコーヒーも淹れて、カウンターの内側に置いた。
「その伝票は、いつ帳簿に写すんだい」
「プッシュは、区切りのいいときですね。手を入れたところが、ひと通り動く形になったら、とか。山で書いたぶんなら、下りて電波が戻ってから。──それに、この二段構えが気楽なんですよ。伝票のうちは、破いて書き直そうが、誰にも迷惑はかからない。ちゃんとしたものだけ、帳簿に写せばいいんで」
「なるほど。……『慎重に』の相手が、コミットからプッシュに移ったんだね」マスターがうなずいた。
「実際のgitでは」ロボットが言う。「記録の一式を、全員がまるごと手元に複製して持っています。手元の複製に書くのがコミット、それを共有の一式へ反映するのがプッシュ。銘々が完全な複製を持ち、それを揃えていく──それがgitの仕組みです。コミットとプッシュが二段に分かれているのも、ネットに繋がらなくてもコミットできるのも、自分の複製が手元にあるからです」
「ほう……みんなが、同じ帳面を一冊ずつ持っている、というわけか」
井上がコーヒーを飲み干した。マスターがおかわりを注ぎながら、うなずく。
「なるほどね。手元にいったん控えて、揃ったところで表に出す。……手順が一つ増えただけで、やりたいことは昔と変わらない」
「そうまとめられると、自慢のしがいがないなあ」
「いや、いい時代になったと思うよ。コミット一つに身構えることもない。ロック一つで、仕事が止まることもない」
「いまの若い子に話しても、信じてもらえないですけどね。ソースの取り合いなんて」
マスターは新しいコーヒーを一口飲んで、それから、ふと真顔になった。
「……一つ、聞いてもいいかい。さっき、SVNは『みんなで直して、あとで機械が混ぜる』と言ったろう。あれが、どうも最後まで馴染めなくてね。gitでは、あの混ぜるところは、どうなったんだい」
井上が、おや、という顔をした。
「先輩、いいところ突きますね。正直、そこが一番変わったところなんですよ。……ただ」井上がカップを置いて、立ち上がった。「それ、ブランチっていうのとセットの話で。ちゃんとやると、今日の何倍もかかります」
「長くなるのか」
「なにせ、いまどきは、作業のたびにブランチを切って、済んだら捨てる。それくらい気軽なものなんですよ。なんでそう気軽にできるのか──から話すと、朝までコースです」
「……捨てる、とは豪気だね。私らの頃は、一度枝分かれさせたら、また一つにまとめ直すのがひと苦労でね。おいそれとは切れなかったよ」
「その顔が見たかった」井上が満足そうに笑う。「だから、混ぜる話もブランチの話も、まとめて次に取っときます」
「ああ、それと」井上が付け加える。「さっきの『プッシュは慎重に』も、実はいまどきは半分昔話です。──なんでかは、これもブランチとセットなんで」
「気になる置き土産を、いくつも……。いつでもどうぞ。今度は自慢じゃなく、愚痴でも構いませんよ」
「ごちそうさまでした。──いい店じゃないですか、先輩」
ドアベルが鳴って、井上が出ていく。
マスターはカウンターに残った伝票を、一枚ずつ売り上げ帳簿に書き写し、そっと帳簿を閉じた。それから、誰にともなくつぶやく。
「……また来るかな、あいつ」
「来ます」ロボットが即答した。「ブランチの話が、済んでいませんから」
マスターは小さく笑って、店の灯りを落とした。
ロボットのひとくちメモ
本日のポイントを整理します。
- ロック方式(VSSなど):ファイルのロックを取った人しか編集できないバージョン管理方式。それより前には、コードの中にコメントで変更履歴を書き込む時代もあった(履歴やコメント化した古いコードが本体と混ざり、上書きで人の直しが消えることも)。SVNのような「全員が同時に作業し、あとで合わせる」方式に取って代わられた
- SVN(Subversion):記録は中央に一つだけ。コミット=その中央へ直に書き込むことで、書いた瞬間に全員へ共有された(だから「コミットは慎重に」が合言葉だった)。ただし共有されるのは中央の記録そのもので、各自の手元のファイルには、それぞれが中央から最新を取り込む操作(update)をしたときに反映される
- git:全員が、記録の一式をまるごと手元に複製して持つ。コミットは、手元の複製への記録(手元の注文伝票に書くイメージ)なので、ネットに繋がらなくてもできる。プッシュは、手元のコミットを共有の記録へ書き写す別の操作で、ここではじめてみんなに見える。SVNではひと続きだったこの動作を、gitはコミットとプッシュの二段に分けた。だからコミットしただけでは共有されないし、誰にも迷惑をかけない