僕は、twitterできわめて少数の人しかフォローしてません。そんな僕のtwitterタイムラインでも、何度も言及されていたのが次のブログエントリー:
本文は「なるほどね」という感想なんですが、コメント欄に驚くべき発言があります。
まずは本文から紹介すると、「いっしょに仕事をしたいプログラマ 5つの特徴」が挙げられていて、それらの特徴で「欠けているところがあれば、少なくとも自分はその人といっしょに仕事をしたいとは思わないだろう」と。
5つの特徴のひとつに「人のコードにパッチを送る」(適切なパッチを書ける能力)があるのですが、それに対するコメントが:
ミッションクリティカルなシステムでは自分が再利用しようとする既存コードにバグがあった場合は、まるっとコピーしたうえで修正したものを使うことが多いです。
「まるっとコピー」って、いったいそれナンなんだ? しかも「ミッションクリティカルなシステムでは」って…… もしそれが事実なら、随分と恐ろしい話ですよ。
コピーして変更とか言っているのだから、リビジョン管理システムもまともに使ってないと予測されます。「5つの特徴」には「バージョン管理システムを適切に使っている」もあるのですが、「ミッションクリティカルなシステムでは」そういうこともしてないわけ?
で、リビジョン管理システム(バージョン管理システム)を話題にしたいわけです。僕は以前「リビジョン管理システムを使える技術者はイケテいる」という記事を書いたことがあります。「いっしょに仕事をしたい」ではなくて「イケテいる」という表現をしましたが、技術者の基本スキルに触れた内容です。冒頭を引用すると:
ある程度の経験を積んだ技術者/プログラマであるかどうかを判断したいとき、「リビジョン管理システムを普通に使えるかどうか?」という基準はけっこう有効な気がした。
これに対して「そんなの使えて当たり前だろ」という(まっとうな)反応もあったのですが、僕の経験では「当たり前」ではありません。僕自身、分散リビジョン管理システムの使い方がサッパリわかりませんでした。そのことは「ナルホドー! 使って分かった Mercurial と Bitbucket の便利さ」に書きました。これも一部引用すると:
実は僕は、分散バージョン管理という発想と仕掛けを最初はまったく理解できず、「エエーッ?なんだそれ」「そんなんでうまくいくのかよ?」とかグダグダ言っていたのですが、いったん使い始めればラクチンラクチン。
こういうのは、概念的な説明が難しいですね。理屈を先に理解しようとすると、僕みたいに障壁を感じますよ。「四の五の言ってないで、使ってミソ」ってことです。
現在のリビジョン管理システムは、分散方式ではないセントラルリポジトリ方式であっても、「まるっとコピー」とか「ファイルごとにバックアップできる」とかの素朴なメンタルモデルからはかけ離れています。「そんなことはない」と反論する人は多いと思いますが、それはたぶん既にリビジョン管理システムを日常的に使っているからでしょう。統計的裏付けは何もないですが、リビジョン管理システムの概念を理解できずに挫折してしまった人は多いと想像します。
挫折した人の一部が「あんなもの使うとかえってめんどくさくなる」とか「別な方法のほうが良い」とか言いはじめるのじゃないのかな。
それで思い出すのは、昔、予備知識なしの若い子達にファイルシステムの使い方を教えたことです。使うコマンドは、pwd, ls, cd ですね。それに慣れたら、cp, mv, rm と。この段階で躓いちゃう人がいます。僕も周囲の仲間もくり返しくり返し教えたので挫折者は出なかったけど、挫折してもおかしくないくらいにファイルシステムの概念て難しいのです。
リビジョン管理システムは、ファイルシステムの機能を拡張したようなものだとも言えます。だから、「ファイルシステムに毛が生えた程度のもの」なんですが、そもそもファイルシステムが難しいし、毛の生え方に付いて行けない人もいるのです。ファイルシステムに関しては、GUIデスクトップにより生のファイルシステムを意識しなくても(ある程度は)済むようになったので、TortoiseXxxのような方向も有意義だと思います。
「リビジョン管理システムを使える技術者はイケテいる」に書いたような経験から言えることは、“ちゃんと教育しないでリビジョン管理システムを押し付けると変なことになっちゃうよ”、です。