危険な一括処理の味方

どんなに簡単に出来ても。どんなに楽を出来ても。忘れてはいけないこと。

以下は「猛烈改行コード置換くん」である(crnl2nl):

 1 # -*- coding: utf-8 -*-
 2 import os
 3 from os import path
 4 from fnmatch import fnmatch
 5 
 6 for root, dirs, files in os.walk("."):
 7     for fn in files:
 8         if fnmatch(fn, "*.py"):
 9             pt = path.join(root, fn)
10             d = open(pt, "rb").read().replace("\r\n", "\n")
11             open(pt, "wb").write(d)
12     if '.svn' in dirs:
13         dirs.remove('.svn')  # don't visit .svn directories

カレントフォルダから再帰的に「*.py」を見つけ次第猛烈に改行コードをバックアップも取らずに置換してゆく。

この種のものは、慣れていれば2、3分もあれば書ける。今2分で書いた。

けれども、これが許される、もしくは、「安心して実行して良いと自分が思える」ための条件がある。

言うまでもなく、「適用対象がリビジョン管理ツールの管理下にあること」かつ、「リビジョン管理ツールがビジュアルdiff/mergeツールと統合されていること」である。改行コード変換くらいであればそうそう問題は起こらないかもしれないが、そうではないある種の置換は、だいたいは「置換し過ぎ」問題を起こす。置換コードの間違いをしでかすことも多い。

安心して間違い、安心して壊せる環境が構築されていること、これが絶対に必要。

スクリプト言語を「生産性のために」使おうとしているならば、リビジョン管理ツールとビジュアルdiff/mergeツールを心の友にすることだ。「爆速で」変換して余った時間は、「対象を地道に誠実に確実にチェックする」時間に費やすのである。それにはどれだけ時間をかけてもいい。大丈夫、どうせ間違いは一つくらいは見つかるから。

実は能率に貢献しているのは、作業が

 1. スクリプト作成
 2. スクリプト実行
 3. チェック

と、粒度の大きな性質の異なる作業、に分解されていること、である。

例えば 50 箇所の対象を、「一つずつ間違わないように手作業で置換する」のは、これは「精神力が続かない」。なぜならば、この作業を更に分解すると、

 1. 対象箇所の特定
 2. 特定箇所への移動
 3. 対象箇所の編集
 4. 編集箇所のチェック

というステップ実行だからだ。これは先ほどの自動処理を挟むやり方とは違い、「粒度が小さく性質の異なる作業を一つの単位とする繰り返し」である。何回も繰り返しているとこれが、抜け・漏れを生みやすいのは、つまり「作業が複雑だから」なのだ。馬鹿だから間違うのではないし、誠実でないから間違うのでもないし、雑だから間違うのでもないのだ。人間には集中力が続く限界がある。ちょっとした割り込みが簡単に誤りのトリガーにもなる。

自動処理は抜け・漏れは発生しにくい。大事なのはここからだ。そうやって自動で置換した「対象箇所」は、ビジュアルdiff/mergeツールが「漏れなく」拾い上げてくれるということ。すなわち、ビジュアルdiff/mergeツールの助けを借りて、「置換した箇所全てをチェックする」ことは、決して無理難題ではないのである。

ビジュアルdiff/mergeツールは、ワタシは Windows では WinMerge、Unix 系では(不満も多いけど) Meld、リビジョン管理ツールは、最近は Mercurial がお気に入りである。Mercurial 周辺ツールでは、Windows では TortoiseHg

TortoiseHgで、自分の PC に好きにレポジトリを作り、自分だけのために使うことが出来る。Eclipse のリビジョン管理系プラグインが「馬鹿」なのは、リビジョン管理を「チーム」と言い換えていることである。我田引水。リビジョン管理を自分だけのために使って何が悪い。

リビジョン管理は、チームが使ってなくても個人では使え。リビジョン管理を日常にしなさい。チームが使っていないなら、普及活動しなさい。





なんて話を、スクリプティングネタが多いサイトなので、時折言わねばなぁ、と思った。

こんな話さぁ、「これが常識でしょ」の文化が多い一方で、いまだリビジョン管理ツールの存在すら知らない企業文化もまだまだ多いのです。もはや便利だからというものではなく、必要不可欠なインフラ、なのだけれどもね、要は「パラレルワールドの証明は出来ない」、現状維持は万能薬です。導入しないことによって「変化しないこと」の証明の方が簡単。現状維持ならプラスにもならないがマイナスにもならない、導入はいつだってマイナスのリスクがある、パラレルワールドの証明は出来ないが、マイナスにならない方がマイナスになる可能性があるよりはマシだ。要するにそういう消極性が、この手のインフラの導入促進の阻害要因なわけですな。

だからね、こういうことこそ、「個人レベルで使い倒しておく」ことで、草の根的に普及させていこう、という想いが大事だと想うよ。