増14補足.分担してプログラムを作る
●今回の発端
前々回、『増14.“テストファースト”と言われて』で、
- 一人でプログラムを作成する場合
と、
- 複数人で分担して作成する場合
を対比して提示しましたが、その(筆者の中での)背景の説明がなされていませんでした。年をまたぎましたが、それについて少々説明します。
●役割分担
複数人で分担してプログラム(システム)を作る場合、全員が同じ仕事をするわけではありません。
- お客さんは、「なになにを満たすすべて」がうまくいくことを要求。
- 上流工程の人は、それでは他人に伝わらないので、指示を出す形式(仕様書のような)に変換。
- 下流工程の人は、「その指示を満たす特定の」実装を作成。
- テスト工程の人は、「その指示から正解値を実装と独立して得、その通りか調べる」。
ことになると思います。
大抵、上流工程以上での議論は企業秘密、それに対し、下流工程での議論は世の中にこれほどのことは類例を見ないというほどオープンで、インターネット上でいろいろな知識が得られると思います(ただ、実際、下流工程で作成されたアプリケーションソフトの結果は、上流工程以上での情報を含んでいるので、どうしても秘密になります)。
実は、上流工程以上と下流工程は、うまくかみ合っていません。オブジェクトモデルと、リレーションモデルのミスマッチなんて屁でもないほどかみ合っていないです。設計書などで、何でこんなことを思いついたのか、下流工程の人間にはさっぱり分かりません(逆に、かみ合っているならば、とっくにプログラムの自動生成が可能だったはず)。
かみ合っていないので、下流工程の人間は「気を利かせる」ことができない、下流工程の人間は自発的に「何が正しいか」を思い付くことができない、という状態になります。
もちろん、「なになにを満たすすべて」を知っていれば思いつきますが、それは企業秘密です(オープン化全盛の時代、そちらまでオープンにすれば済むじゃないかとも言えますが、さすがにそこをオープンにしてしまうと儲けのネタが無くなり、ITの会社にも発注してもらえなくなるので、さすがにそれは永久に無理だと思います)。
ですので、少人数(しかも、上流工程以上に携わっている人間の数の方が少ない)の場合、上流工程の人がくたびれて、緊張が途切れた途端、急激に不具合が発生することがよくあります。
●権限と逆問題
1.←→2.、2.←→3.は順問題、逆問題の関係にあるかも知れません。1.→2.より1.←2が、2.→3.より2.←3.が困難だということになります。プログラムを読み解いて仕様を作成するというのはできなくはありませんが、逆問題であり、困難なので普通はしません。特に、ITに関する費用が昔のようにじゃぼじゃぼ出なくなった今日では、したくてもできない問題です。
もちろん時間をかければ(=お金をかければ)プログラミング分野の逆問題は、人間わざとして解けます(レガシープログラムの保守なんてそればかりでした(笑))。ただ最近はお金がないので、原則として2.→3.の流れにするのが普通です。
ここで、1つ、このコラムの前段落で言ったことと矛盾があるのではと思われるかも知れません。
- 下流工程の人間は「気を利かせる」ことができない、下流工程の人間は自発的に「何が正しいか」を思いつくことが出来ない
と言ったはずなのに、
- (2.←3.の様な)逆問題は、人間わざとして解ける
というのは矛盾ではないかということです。
それに、絡むキーワードが「権限」です。現在普通に行われているプログラム(システム)作成のプロセスでは、「文書」を作って承認を得るのが普通です。それに反して、苦労して「2.←3.」を解いても、(たとえ1字1句違わぬ大正解を導き出していたとしても)それは「正しい」ことではありません。大規模(複数人で分担して作る)の場合、「権限」を顕わにして「逆問題」を廃するのが、ソフトウェア工学の進歩の流れだと筆者は解釈しています。
●そして、始めに作るテスト
ここまで書いていて思ったのですが、仕事でプログラミングをしている人間の危惧は、
- テストファーストで「いつでも動かせるテストを作る」ことは、「権限」、「文書」にそわずプログラムを作成し、その結果、テストを作った以外の人間にそのテストを読み解かせる「逆問題」を強いる
結果になる(のでは)という点ではないかと思えてきました(このことは今、思いついたので、『増14.“テストファースト”と言われて』には書いていません。念のため)。
これは困ります!
この点から言っても、
- 本当に“テストファースト”を望むのなら設計者、それもアーキテクトクラスの設計者に言うべき
というのは正しいと思います。なお、ここで「上級の設計者に言え」と言ったのは、普通の設計者はビジネスルールの維持で手一杯で、さらなる技術的な要素の追加まで背負うことは不可能だろうからという、一種テクニカルな問題に過ぎません(上流工程の人間がくたびれると、前述の通り下流の人間も困るのです)。他意はありませんでした。
そうした上で、テストファーストも、「権限」に沿い「逆問題」を避ける方向でやっていただくならば、幸甚至極です。
まぁ、今回はこんなところです。
●コラムのコメント欄の方針
コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。
ですので、このコラムで、
- わたしは基本的にコメントに答えない
- コメントを書く人は、回答がない前提で議論を進めていただく
とさせていただきます。