はじめに
2020年12月に 無意識なテスト - CAT GETTING OUT OF A BAG を投稿しました。無意識なテストというのは ”意識して触っているわけではないのにバグを出せてしまうテスト” のことです。わたしがそう呼んでいるだけで一般的なテスト用語ではありません。この記事を3行で説明すると、こんな感じです。
- 意識して触っているわけではないのにバグが出せます
- 無意識なテストはこんな特徴があります
- なぜこんなことができるのかはよくわからないけど、無意識(意識下)に強い影響を与えてそうな2つの習慣を紹介します
先日、認知科学*1の面からプログラミングを理解する本 プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ を読みました。「なんとなくそうだろうな」と感じていたことが、わかりやすい例とともに科学的に解説されていて、ある種の爽快感がありました。
本記事は、認知科学の面から「無意識なテスト」を理解しようとしたものです。とくに10章『複雑な問題をより上手に解決するために』が役立ちました。
まずは 元の記事 を読んでいただいて、ここに戻ってくるのが、おすすめの読み方です。
本題に入る前に
本題に入る前に、脳内で生じる認知プロセスを簡単に説明します。(括弧内はコンピュータに例えたときのイメージです)
- 短期記憶:読み聞きしたばかりの情報を一時的に保持する(RAM)
- 長期記憶:長期間覚えておきたい情報を保持する(HDD)
- ワーキングメモリ:短期記憶や長期記憶を使って情報を処理する場所(CPU)
それぞれの認知プロセスは互いに協調しあっています。たとえば、あるストーリーをテストしてバグを見つけるときはこんな感じです。
- ユーザーストーリーやテストケースを目で見て読むことで脳に取り込まれます
- 読んだ内容は短期記憶に読み込まれています
- その間に、長期記憶から数日前に朝会で議論になっていたことや、過去に起きた問題などを思い出します
- どのようなバグが起きそうかを考えるために、短期記憶の情報と長期記憶の情報(経験に基づく個人的な記憶や事実)が、ワーキングメモリに渡されます
- ワーキングメモリが活性化し、新しいテストのアイデアが形成されます
何かを考えるときにはワーキングメモリに負荷がかかります。ここが大事なポイントです。
プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ(図1.2 P.11)
無意識なテストを理解する
10章『複雑な問題をより上手に解決するために』に、プログラミングと問題解決のスキルを向上させるための2つの手法が書かれています。
- 自動化してより大きな問題や難しい問題に時間を割けるようにする
- 長期記憶を強化して、より簡単に問題を解決できるようにする
手法1の自動化ですが、自動化と聞いて、TDD、テスト自動化、最近話題のChatGPTでのコード自動生成を想像してしまいました。そうではなくて、ここでの自動化とは「自分の脳が小さな作業を考えずにできるようになること」です。人間は考えるときにワーキングメモリを使いますが、考えずにできるようになれば(=自動化できれば)その分のワーキングメモリが空き、時間的にも余裕が生まれ、より大きな問題や難しい問題を解くことにリソースを割り当てられるよね、というロジックです。
手法2は、問題を解くときは長期記憶の情報を使っています。だから問題をうまく解けるようになるには長期記憶を強くすればよい、というロジックです。
長期記憶を強くするってどういう感じだろう? と疑問が残りますが、読みすすめます。
長期記憶には手続き記憶と宣言的記憶が保存できる
長期記憶には異なるタイプの記憶(手続き記憶、宣言的記憶)が保存できます。
プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ(図10.2 P.195)
手続き記憶(以下、潜在記憶)の例として、タッチタイピング、間違えたときのCtrl+Z、バグがありそうな行に自動的にブレークポイントを置くなどがあります。潜在記憶を十分に訓練しておくと、その記憶を呼び起こすことに、脳はほとんどエネルギーを必要としなくなります。たしかにこれらの操作はほとんど何も考えずにできますね。
手法1は、特定のスキル(本書ではプログラミング)をタッチタイピングと同様、何も考えずにできるようにしてしまおうというものです。無意識なテストっぽい!
無意識なテストはテストスキルの自動化:潜在記憶
いわゆる直感と呼ばれるものは、実際には、以前に解いたことのある問題と似たような問題を解いたときに起こるもので、なぜそれをすべきかはよくわからないまま、何をすればよいのかだけがわかるのです。(P.195)
無意識なテストの特徴として「気がついたらやっていた」「頭で考えるというより身体が勝手に動いている」を挙げています。引用した文章(P.195)を読んだときに(ああ、これだ)と思いました。無意識なテストは「テストスキルの自動化:潜在記憶」でした。
本書を読むまで、無意識なテストとスキルの自動化は結びついてませんでした。テストの自動化ってそっちかい!といった感じです。無意識なテストをしながら、別のことを考えたり、テーマの異なる問題に気づいたり、悪巧みのアイデアが降りてきたりするのも、無意識なテストで脳みそ(ワーキングメモリ)に余裕が生まれたからだ、と説明がつきます。
潜在記憶は繰り返し実践することで作られる
特定のスキルを何度も練習して、何も考えずにできるようになったら、そのスキルは自動化された(潜在記憶になった)と考えることができます。潜在記憶は考えることではなく繰り返し実践することで作られます。プログラミングに関するスキルを自動化したいならプログラミングを、テストに関するスキルを自動化したいならテストしなよってことですね。
1回反復するごとに、あなたはほんの少しずつ強くなっていくのです。(P.203)
本書ではプログラミングに関する潜在記憶を強化する具体的な方法が載っています。
元の記事では、テストスキルを自動化するための(と書いてもいいですよね)2つの習慣を紹介しました。毎日繰り返すことも入っているので、テストに関する潜在記憶を強化する方法としては、案外いい線をいっているのではないかと思います。わたしは無意識なテストを完全に理解しました。
長期記憶の強化
無意識なテストを完全に理解したので、これで終わりにしようかと思ったのですが、本書の10.4『コードとその説明から学ぶ』に、手法2の説明が書いてあったので、もうすこし続けます。
手法2は「長期記憶を強化して、より簡単に問題を解決できるようにする」というものでした。他の人がどのように問題を解決したかを知ることで、同じ問題や似たような問題に出会ったときにより簡単に解けるようになる、と書いてあります。本書はプログラマー向けなので、既存のコードについて学び、そのコードがどのように設計されたかについて、説明を受けるとよいとも書かれています。
ちょっと当たり前すぎて拍子抜けしました。これが「長期記憶の強化」につながるというのがいまいちピンときません。学んだことが長期記憶に保存されるのは普通のことのように思えるし、そのことと強化の関係がよくわからない。
でもね、ワーキングメモリの認知的負荷を使った説明を読んで「なるほど!」と思いました。
ワーキングメモリがいっぱいになるといろいろまずい
何かを考えるときにはワーキングメモリに負荷がかかります。ワーキングメモリがいっぱいになると、適切な思考ができなくなります。扱う問題が難しかったり、一度に多くの問題を相手にすると脳がパニックを起こします。これは自分でも何度も経験があります。
ワーキングメモリがいっぱいになると、脳はさらにもうひとつできないことが出てきてしまいます。それは情報を長期記憶に戻して保持すること。問題を解くことに負荷がかかりすぎると、記憶に残せなくなってしまうのです。大変な思いをして問題を解いたはいいが、その問題や解決策を記憶として残せないので、後から思い出せません。言われてみれば、心当たりがありますが、これは盲点でした。
プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ(図10.6 P.205)
本書では、生徒たちを二つのグループにわけて、問題の解き方を詳しく説明したもの(範例)を渡したグループと渡してないグループで同じ問題を解かせる実験結果(範例を渡したグループのほうが問題を解く力がつく)が載っています。
これを読み、知っていることは出し惜しみしないで教えたほうがいいんだな、という思いを強くしました。同時に、前に若者と一緒にテストしたときに、わたしが出し惜しみせずに大量の情報を爆速で話しながら、開発中の製品を手荒く触っていたせいで、若者の長期記憶にはたぶん何も残らなかったであろう、ということにも気づいてしまいました。教えればいいってもんじゃない。
ワーキングメモリをいっぱいにしない工夫
他の人がどのように問題を解決したかを知ることは、同じ問題や似たような問題を解く際に、ワーキングメモリの認知的負荷をおさえる効果があり、知ったことや学んだことを、しっかりと長期記憶に保存(強化)できると理解しました。必要なことにリソース(ワーキングメモリ)を割り当てるテクニックとも言えます。
普段、脳のワーキングメモリの認知的負荷なんて意識してなかった(知識もなかった)ので、この考え方は非常に面白かったです。製品開発は簡単ではなく、複雑で難しいことのほうが多いです。だから本当に考えたいことに自分の脳を使いたい。ワーキングメモリを空けるために、どんな工夫ができるだろうと考えています。*2
おわりに
無意識なテストを認知科学の面から理解してみました。無意識なテストはテストスキルの自動化:潜在記憶ということがわかりました。無意識なテストは複雑な問題をより上手に解決するためのテクニックです。
無意識なテストを完全に理解した!