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

増14.“テストファースト”と言われて

»

●今回の発端

 筆者は直接は言われたことはありませんが、別の所で仕事をしている人などは、「テストファースト」でプログラムを作るのが良いと言われたことがあるそうです(その人は「緑の文字」と言われただけで嫌そうな顔をしていました)。Webの記事などでも見かけます。

 もちろん、人間の価値観で軽重の無いプログラムの成果を、人間の価値観に引き込む唯一といっていい方法がテストです。テストは必要です。

 しかしながら、“仕事で分担して作業しているプログラマに直接”“「テストファースト」をしろ”と、言われると、まるで「労せず実務上の権限をごっそり奪取しよう」としているように聞こえます。多分、周りの人が手をこまねいていると本当に奪取されるかもしれません。

 なぜ、良いことのはずが、こんなにひどいことになるのか? その辺りを描写したいと思います。

●背景説明

 学生のプロジェクトなどで、

  • 自分一人でやっている
  • デザイン担当はいるが、ノリでそれを改変しても問題なし、むしろ意欲があってよろしい

という環境なら「テストファースト」は非常に良いかもしれません。究極の少人数で手掛かりもないところに、それが見つかるのですから、悪いはずがありません。

 ただし、仕事でプログラミングをしている場合、

  • 大枠を誰かが作る(誰が作るかは割と自由で、そこそこ書けるようになった新人の場合もあれば、ベテランの場合もあります)
  • 個別の機能を誰かが作りつつ、必要な共通機能を誰かが作る

ということになると思います(複数人数で個別の機能を作ってもばらばらになるだけです)。ここで問題なのは、どこがファーストか? ということです。上記の例では「大枠を作る」のがファーストに見えますが、ほぼ中身は作らないので、テストしようがありません。しかしながら、テストしがいのある個別の機能に着手できるころには、勝手なテストソースを混ぜ込むだけの余地は残っていなくなります。

 できるタイミングが無いのに、指示を出すことは無責任であり、無責任な人間に対して周りの人間が手をこまねいていることは、社会の成員として不誠実です。もちろん、相当の金額を投資して、対価をもって権限を得た場合でしたら別ですが、その場合の金額は家計レベルでなく、事業レベル(2桁は高い)となると思います。

●さらに説明

 さらにそもそも、プログラミングはファーストではありません。その前に、設計があります。そして、その設計内容は「ノリで改変する」ことあたわざるものです。

 もちろん設計は(アニメでいう動画と原画の原画に当たる)大まかな物で、(動画に相当するものの担当の)プログラマも質問したり、すりあわせをしたりしてコミュニケーションを取る必要がありますが、その際、設計者に対して意見をしたりする知見の元は、実際にやってみた実体験です。少なくとも1度は実体験をしないと、前々から準備してきた設計者を揺り動かすだけの知見は得られません。

 (自分の置かれた制限の中で闇雲に何かをやる)実体験がファーストだと思います。何もやらずに手を動かさずに設計者の意図とは独立してテスト内容を「ファースト」で思い付くのは人智を超えていると思います。

●本当に“テストファースト”を望むのなら

 本当に“テストファースト”を望むのなら設計者、それもアーキテクトクラスの設計者に言うべきだと思います。そここそがまさに「ファースト」です。

 VBなど「任意の箇所で任意の資源にアクセスできて当然」みたいな作りのシステム(作りやすい代わりに、確定的なテストをするためには、すべて画面から手で打ち込まないと×)を、設計段階からもう少し“不自由”にしてもらって(MVCパターンとか)切れ目を利用してテストしやすくするなど、できたら最高ですが、そのような全体の決定は高位の設計者の役割です。
プログラミングの段階で個別のプログラマに、そのような決定を強いるのは、間違いなく権限の簒奪です。

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

●コラムのコメント欄の方針

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

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

Comment(5)

コメント

ちけんち

筆者はコメントには答えないそうですので、読者の方にお聞きしたいのですが、テストファーストが「誰が」「誰の」「どんな権限」を簒奪すると言っているのかさっぱりわかりません。
しかも一人で作業する場合はテストファーストが良くて、複数人での共同作業ではテストファーストは良くないと言っている? 全く逆のような気がするが…
一人での作業ならどう進めようか自由だけど、複数人で進める時は単体テストを必ず通して、結合で他の人に迷惑をかけないようにするべきだと思います。

なるせ

わたしもさっぱり何を言っているのかわからなくて何度か読み直して気づいたのですが、「勝手なテストソースを混ぜ込むだけの余地は残っていなくなります」というくだりなどから推測するに、この筆者は根本的にこの文脈で想定されるべき「テスト」という概念をご存じないのでは……。
「テストファースト」って、まず自動テストを書けって話ですよね。

この文章には「プログラマ」と「(アーキテクトレベルの)設計者」という2つの主体しか明示されておらず、しかも全体を貫く話者の立場がそのいずれかなのかまたはまったく別の主体なのかとか、テストファーストしろと言ったのは誰なのかとか、その辺が全く不明です。これで何を言ってるのか理解しろというのに無理がありますよね。

というわけで頑張って読み解いてみました。

まず、話者の立場はいわゆる「SE」です。この文章中の「設計者」です。
話者である「SE」は、現場で「PG」たち(この文章中では「プログラマ」と呼ばれています)を指揮して活躍しています。
ここで、「SE」のさらに上位に当たる存在(いわゆる「PM」でしょうか?)が、「SE」の頭越しに「PG」たちに「君たちテストファーストでやりなさい」という指示を出したのだと思われます。
以上の前提に立って、文章が一貫してこの「SE」からの視点で書かれているとして読むと、なんとか意味が通じるように思えます。

「PM」の指示で「PG」たちがテストを書き始めます。
テストは当然ですが仕様を内包しているわけで、「PG」がテストを書くというのは「SE」から設計の「権限」を「奪取」することになります。
「SE」にとっては許しがたい「ひどいこと」なわけですね。

以下、「設計者」(=「SE」)以外に設計なんかできるはずはない、「PG」が「SE」にまともに意見できる資格を得るのは一通り「SE」の指示通りにプログラムを組んでみた後だけだ……と、「PG」に設計「権限」を与えることを全面的に否定しています。
その上で、仮にテストファーストでやるなら「PM」は「SE」にそう指示すべきであり、「SE」の頭越しに「PG」に言われちゃ迷惑千万、「SE」から「権限を簒奪」する行為だ……と「PM」の指示を非難しています。

まとめると、この文章は、古典的な「PM」「SE」「PG」による開発チーム構成における古参の「SE」による、「ぼくがいちばんうまくせっけいができるんだ!」「設計を独占することによる俺のチーム支配権を奪うな!」という叫びである、と読むことができるかと思います。
実際、テストファーストによる開発というのは、普通には、プログラマ全員が共同して設計に取り組むという形態になるわけで、そのチームにはコードを書かない「SE」は不要とみなされがちであるとは言えると思います。
それが「良いこと」なのか「ひどいこと」なのか、は人それぞれの考え方だと思いますが……。

長文ごめんなさい。この解釈で合ってるといいのですが。

私の解釈は少し違います。

実装経験の無い営業もしくは落下傘で親会社からきた役員・部長クラスの人が
耳かじりで「テストファースト」を乱発してるのではなでしょうか。

かれらはそれを言うだけで、それにかかる実際のコストは理解しておらず
結局そのつけをPGが残業で払わされるということかと想像します。

ななし

「設計者が仕様書を切る前にプログラマがコードを実装するのがテストファースト」と、くわぢ氏は誤読したのではないでしょうか。

jibun.atmarkit.co.jp/ljibun01/rensai/tabecho/03/01.html

例えばこういうのを読み違えた可能性を疑います。

1年前の話にああこういのもヤボですけど。

コメントを投稿する