大学は前期試験の季節です。 テストって嫌ですよね。これまでずっと嫌だった。 ところが先生になったので、生まれて初めて自分がテストをする側になったんです。 そんなこともあって、テストをすることってなんなだろうということについてつくづくと考えてみました。
ソフトウェア開発でも、テストはとても手間のかかる嫌なもののひとつです。 でもこれをちゃんとやっていないと後でひどい目にあいます。
教師としてテストを作ろうとして気が付いたことは、テストというのは講義をやった後に作るものではなくて、講義の内容を設計する最初に作るべきものだということです。 この講義の目的は何か、この講義を受講した生徒にはどういう力をつけて欲しいのか、まずテストしたいことを決めてからカリキュラムを作る。テスト問題を作るときになって、ああ、そうすべきだったなとしみじみ思いました。
テストから目を背けてはいけません。 「人間は複雑だからね、テストだけで判断できないよ」というのは、概ね年寄りの嘘です。 テストは意味を持っています。今回はテストの意味論について、書いてみたいと思います。
遠い昔に宇宙にビッグバンというものがあって、最初は点のようだった宇宙が光の速度で膨張しているらしいです。 宇宙のはては、今も光の速度で遠ざかっているのでどんな宇宙船を使っても宇宙の外に出ていくことはできないそうです。 これが本当なのかどうかわかりませんが、この宇宙のモデルは人間の意識の始まりに似ています。 生まれて最初の意識が見た世界は点のようなものだったはずですが、それが人生の経験とともにどんどん膨張していき、僕達が生きている限り自分の中の世界は膨張を続けていくでしょう。 でも、この世界は個人の記憶と感覚の中の世界です。そう考えてみると、人間は完全に閉じた存在なんだなあと思います。どんな手段を使ってもこの自分という閉じた世界の外側に出ることはできないのですから。
こんなにも閉じた存在である僕達が、お互いに他人が自分と同じことを考えているかどうか知る方法はあるのでしょうか?
いきなり結論をいえば、そんなものはありません。 でも、近似的にそれを知る方法はあります。 その一つが、ライプニッツという哲学者が提案した「不可識別者同一の原則」です。 これは、ある概念について二人の人間に同じテストをしてみて、その答えが二人の間で全て完全に一致した場合、二人は同じことを考えているんだとみなすということです。 荒っぽいやり方ですが、でも、考えうるあらゆるテストについて二人の答えが全く同じなら、二人の考えの違いを識別することがそもそもできません。 ライプニッツは、「同じ」という概念を、「違っていることを識る手段がない」ということに帰着させたのです。
テストは講義の意味論です。 教師が講義を通して生徒に伝えようとしたものと「同じ」ものが生徒の内側に伝わったかどうか、本当に知ることはできませんが、テストを通じて生徒に伝わったものを観測できるようになります。 テストは、講義という形態のコミュニケーションを完成させるコミュニケーションの手段の一部です。 そう考えると、冒頭に述べたように、講義は講義、テストはテストというのでは意味論のない講義をしていることになります。 講義の設計のときに、最終的に講義を受けた生徒がどのようなテストに合格するようにしたいのかという目標を設定するということが必要なのです。
ソフトウェア開発でも、コミュニケーションの手段としてテストを最初に作るという方法論があります。 あるシステムをプロジェクトチームで開発しようとしているとき、開発内容がチームのメンバーごとに食い違っていたら問題ですよね。でも実際に、そういうことはよくあるのです。
「こういうものを作ろう」という言い方は、「こういうテストに合格するものを作ろう」という言い方に言い換えることができます。そして、後者の言い方の方がずっと正確です。 そう言い換えることによって、プロジェクトチームのメンバーの間で開発目標をきっちりと誤解のおきないものにすることができるのです。
もし、自分の中に別の人格がいて、知らない間にその人格が犯罪を犯していたらどうするでしょうか?
変な設定ですが、これもテストです。テストは、ペーパーテストに限りません。 とっさに出た言葉や態度、せっぱつまった状況における行動を調べることは、とても良いテストになります。 楽しいデートの最中にも、僕らは常にテストにさらされています。特にデートの最中にアクシデントが起きたときのとっさの行動や言葉は良いテストとしてチェックされることになるでしょう。気をつけても無駄ですけど。
未成年の犯罪や精神異常者の犯罪は、法的には責任を問われないことになっています。 でも、法的な責任とは別に、自分の中での責任の感覚を議論することもできると思います。 僕は、僕の中に別の人格がいたとしても、その人格も含めて自分がした行為としての責任を感じると思います。
なぜそう思うのか。僕にはそれをきちんと説明する理論的な原理のようなものはありません。ただ、そう思うだけです。 しかし、あえて説明しようとするならば、そういうふうに考えるのが「自分らしい」からです。 そうです、テストは他者を調べるためだけのものではありません。 自分の行動や発言がその状況において自分らしいかどうか。自分のファッションが自分らしいかどうか。常にテストしているのは自分自身ですよね。
自分自身を対象化し、自分で自分をテストすることが、自分という存在の自分なりの意味付けを与えているということも言えます。自分らしさとは、いわば、自分が与えた自分自身に対する設計目標です。 またそれと同時に約束を守るとかプライドとか責任感とか人を愛するとかそういう類いの意志の根源になっている自分らしさに対するテストが、逆に自己という不明確なものを統合しているのかもしれません。
「このソフトウェアが完成した!」と言うためには、何が実現されれば良いのでしょうか?
これを明確化するのが、要求分析です。 要するに、どのような機能が確認できればシステムが完成したと言えるのかということを利用者などを含めた全体的な視点で調査分析することです。
ソフトウェアの仕様は、ソフトウェアを実装するために作成する設計図ですが、実装されたソフトウェアが目的を実現していることを確認するためにも利用します。 つまり「このソフトウェアが完成した!」ということは、実装されたソフトウェアが仕様を満たしていることを確認することです。 これは、教育で言えば、その講義を受講した学生がどのような力を身に付けることを目標にするのかということに相当します。 講義がうまくいったかどうかは、言うまでもなく学生のテスト結果で確かめることができます。 要求分析を行い、ソフトウェアの仕様を作成するという作業は、そのソフトウェアの実装どのようなテストに合格したとき「このソフトウェアは完成した!」と言えるかということを定義することだと言うことができます。
テストは冷酷です。テストが嫌なのは、現実を否応なく見せつけるからです。 普段は見ないふりしたり、ごまかしたりしていることが、テストによって丸裸にされてしまいます。これははずかしいし、やはり人間の心はテストされることで傷つきます。
でも、ソフトウェア開発の場合は、徹底的に冷徹な目で利用者の要求やシステムの目的を分析する必要があります。 見ない振りやごまかしはシステムには通用しません。そんなことをしても、必ず後で、現実の問題となって目の前に現れてきます。 システムの目的を誤解の無いように明確に定義するためにも、また、異常事態が起きたときのシステムの振る舞いを考えるためにも、テストを最初に考えるというやり方はとても有効な方法です。
テストをおまけのようなものと見るのをやめましょう。テストは、実はソフトウェアの「自分らしさ」を規定するソフトウェアの意味そのものなのです。