明らかに状況が変わってきている今日のプログラミングとは?

増15.逆問題の良さ

»

●今回の発端

 前回、『増14補足.分担してプログラムを作る』で、「逆問題」について(割と否定的に)言及しました。しかし、後から考えてみると、逆問題も有用ではないかと思えてきました。

 それについて、それについて少々説明します(なお、「1.→2.」などの記法は前回の通りです)。

●上流工程の人は
前回、

  1. お客さんは、「なになにを満たすすべて」がうまくいくことを要求。
  2. 上流工程の人は、それでは他人に伝わらないので、指示を出す形式(仕様書のような)に変換。

とさらっと言いましたが、

  1. 要求
  2. 仕様

で、1.→2.のみの順問題を解くだけで仕様書が出来るとは考えづらいです。仕様を作るに当たって、ぶち当たった制限や、整理した結果得たひらめきなどから、1.←2.の逆問題も解いてお客さんの要求をリファインしているはずです。

 下流の人間に対しては、「(逆問題的なことにはかかわらず)言われたことだけやっていればいい」的な言い方しかされません。もちろん、別にそれはそれでいいのです。必要な「正しさ」を供給し続けてくれるなら。

 当然ですが、最後まで必要な正しさを供給してくれるなんてことはありません。ですから、下流の人間としても(表だってはしないとしても)裏で、ぶち当たった制限や、整理した結果得たひらめきなどから、2.←※3.の逆問題を解いて仕様をリファインし具申して、上流の人間の意欲が枯渇するのを少しでも遅らせる必要があります。

 ※3:下流工程の人は、「その指示を満たす特定の」実装を作成(前回のコラム参照)。

 心の中だけで逆問題を解くのに、それまで妨げることのできる人間はいないと思います。

●やっぱ、この逆問題最高じゃん!

 しかしながら、衷心から申しますが、プログラムを入力とし逆問題を解いて得た知識のみから、個別の設計を超えるスコープの問題について発言するのは、絶対にするべきではありません。

なぜなら、

  • 上流の人が1.→2.(時々1.←2.)の順問題(時々逆問題)で仕様を得るのと、下流の人が2.←3.の逆問題で仕様を得るのでは、労力に格段の差がつくため。もし10倍差が付くとすると、常時下流の人は9倍のただ働きを強いられることになり、絶対続かない。
  • 仕様として同じ結果が得られるなら、設計のやり方で記述し結果を得る方が、プログラムのやり方で記述し結果を得るよりも、より俊敏である(ここで「設計」とは「実行可能でない設計」のことです。「実行可能な設計」はどう考えてもプログラム作成と同義です。「実行可能でない」分だけ「設計」が俊敏なのは当然です。UMLの規格で「定義されたポンチ絵としてのUML」を「実行可能により近いUML」に昇華させようとして、あまりに大変なことになったという例もあります)。
  • 下流の人が2.←3.の逆問題を解いて仕様を得ても、その入力は“閉じた、発展しない”対象であるプログラムであり、「頭の固い技術者の考えそうな」仕様しか得られない(「実行可能」である為には、必然的に“閉じさせ、発展を止めさせる”必要があります)。

という不利を背負い込むことになるからです。この分野では、下流の人間が「言われたことだけやっていればいい」とされるのは、至極もっともです(残念ですが)。

 以前、『増 2.デスマ考』で、

  1. その内、「権限がない中で仕様に介入する」ことが常態化し、安定的にデスマが発生する。権限がないので、営業の無理な発注にも対抗できない。
  2. プログラムは「閉じた発展しない」ものなので、実情に合わなくなってくる。

と書いたのは、このことです。

●ではどうしましょう?

 プログラムのコメントの有用性を高めるのに「逆問題」という概念は使えると思います。そして有用性の高いコメントは他のプログラマに対しても、他工程に対しても、有利な結果をもたらすと思います。

ここでおれおれ定義です。

  • 「有用性の高いコメント」とは、そのプログラムの(コメントの対象となる)部分について逆問題を解く時、助けになるコメントのこと。
  • なお、ここで「助け」とは、より楽により正確にそれが解けること。

とします。

その「有用性の高いコメント」の作り方ですが、

  1. プログラムを作る、今作ったプログラムを直す、前に(自分/他人が)作ったプログラムを直す
  2. それをしたらすぐ、今したコーディングについて逆問題を解く。つまり、今作ったロジックを入力とし、その仕様を考える。
  3. それをコメントに書く(考えたすべてでなく、後で助けになる程度に簡略化する方が望ましい)。

です。1を代入したロジックのコメントとして、「1を代入」ではなく、「初期値である1を代入」とか「こういう意味を持つ1を代入」とか書けば、より有用性が上がりますが、後2つを得るためには、どうしても逆問題を解く必要が有ります。

 しかし、今まさに作ったロジックの逆問題を解くことは、後で解くより圧倒的に有利だと思います。それをロジックを入力する度にやるのです。これなら、上流の人にも「余計なこと」だと言われないと思います(心の中だけの問題なので、文句の言いようがない)。

 まぁ、今回はこんなところです。

●コラムのコメント欄の方針
コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。

ですので、このコラムで、
 ・わたしは基本的にコメントに答えない
 ・コメントを書く人は、回答がない前提で議論を進めていただく
とさせていただきます。

Comment(4)

コメントを投稿する