等しいのスコープ
「これとこれは同じ」認識であるとき、その「同じ」がどのレベルで等しいかは文脈によって大きく変わってきます。
ミートアップ後に軽い立食パーティーがあって、紙コップにお茶を注いでみんなに配る場面を想像してみましょう。
そのお茶が「烏龍茶」だろうが「緑茶」だろうが「麦茶」だろうが、基本的に「お茶」として配ると思います。
最初は烏龍茶のペットボトルで注いでいたのが、途中でなくなってしまい、新たに緑茶のペットボトルを買い足して緑茶を配るようになっても、基本的には同じ「お茶」として配ると思います。
この時、烏龍茶も緑茶も大枠として同じ「お茶」の扱いになります。
烏龍茶が途中で緑茶に変わっても、出されたお茶に対して「さっきと違う!」といって騒ぎ出す人はほとんどいないでしょう。
いたらキチガイなので、そっとその人とは距離を取るようにしましょう。
提供側もお茶の種類の違いをそこまで気にする人はいないと思います。
上記の例だと、烏龍茶も緑茶も「お茶」として一緒の扱いにまります。
次に、普段冷蔵庫に麦茶をストックしている家庭を想像してみましょう。
その家庭で子供に「いつものお茶買ってきて」とおつかいを頼みました。
その結果、烏龍茶を買ってきてしまったらどうでしょう?
もちろん「違うお茶」として扱われ、返品に行かされるか、その場は怒られてしぶしぶ烏龍茶を冷蔵庫に突っ込むことになるでしょう。
同じ「お茶」でも、状況によって一緒と扱われたり、扱われなかったりします。
今回想定した2つの状況は、比較的、一緒にしてよいかダメなのかが分かりやすいですが、状況によっては互いに認識をしっかり合わせないと「一緒」にしてよいかどうかの判断が難しい場面もあります。
例えば、スーパードライを常飲する人があまりビールに興味のない部下にビールのお使いを頼んだとしましょう。
頼んだ人は「あいつとはよく飲みに行くし、自分はいつもスーパードライ頼んでるからスーパードライ買ってくんだろ」とほぼ無意識に思い込んでおり、頼まれた側は銘柄の違いに無頓着な人で「特売で売ってる適当なやつでいいや」と思って金麦を買ってきました。
頼んだ側は「ビール=スーパードライ」の認識でしたが、頼まれた側は「金麦∈ビール」ぐらいの認識でした。
なんだったら金麦は厳密には「ビール」ですらありません。
この場合、頼む側はしっかりと「ビール」ではなく「スーパードライ」とちゃんと商品名を提示しておけば、ちゃんと自分の飲みたいビールを買ってきてもらえたはずです。
「こうと言えば当然こう受け取られるだろう」という思い込みは、我々が普段仕事をする上でも割とよく発生しており、その結果起こる伝達不備により、大なり小なり様々な問題が日々発生し続けています。
ビールの例で見たように、特段意識をしない限り「自分の解釈と相手の解釈は違うんじゃないか?」という懐疑心は生まれません。
日常会話レベルであれば、多少齟齬が発生しても大きな問題にはなりませんし、話のテンポの方が大事だったりもするのであまり気にしなくてもいいですが、仕事上の話になってくると、これが積もりに積もって最終的にはデスマーチを生み出したりします。
ですので仕事上でしっかり仕事を進めようと思ったらまずはじめに、言葉が持つ解釈のスコープ(範囲)を互いに同じ認識になるようにしないといけません。
この作業をドメイン駆動設計ではユビキタス言語と言ったりします。
ドメイン(仕事の領域)において、関係者みんながある言葉に対して同じ認識を持つことは大事です。
複雑な仕事をつつがなく遂行するためには、ビールという言葉を漠然と大きな括りとしてのビールという認識のままで運用するのは危険なのです。
みんながビールをスーパードライだと認識している間はいいですが、ある日、ある人が「え?サッポロ黒ラベルじゃなかったの?」という日が来ればプロジェクトに火が燻りはじめ、いずれ炎上していくでしょう。
バカみたいな例えですが、炎上案件もこういった小さな齟齬が積み重なって最終的には取り返しのつかないところにまできてしまうのです。
こうならないために、最初に「我々の間ではビールといった場合、スーパードライを指すようにします」という認識合わせと明文化が必要なのです。 (ちなみに、スーパードライにも複数の商品があるので単一の商品を特定できませんし、350mlか500mlなのか瓶なのかといったより細かい分別が可能ですし、そういったより細かいレベルまで認識合わせをする必要もあるでしょう)
さて、「一緒」や「等しい」には、各人の間で認識のズレが存在し、人によっていろんな解釈の仕方があると分かりました。等しいと等しくないの境界線は意外とボヤけているのです。
「等しい」という簡単な言葉をしっかり運用しようと考えるだけでも、
1.人によって言葉の解釈が違うことを認識する
2.言葉の解釈を明確にする
3.その言葉の解釈を相手に認識させる
といった手順を踏まえた上で、やっと「等しい」が「等しく」なるのです。
「等しい」という基本的な言葉ですら多様な解釈が存在するのに、仕事上ではさらに多様な言葉が跋扈し、解釈の違いを生みだし、表現・伝達の難易度を上げています。
人と人との間で認識を統一するのは、実はとても大変なのです。
ついでにいうと「等しいとはなにか?」と自問する能力はプログラミングにおいてもとても大切な姿勢です。
プログラミング上にはたくさんの「等しい」があります。
評価式「1 == 1」があった場合、それが
オブジェクトが表現している値が等しいのか?
オブジェクトのクラスの型が等しいのか?
オブジェクトの中身(メモリ上のビット配列が一致している)が等しいのか?
オブジェクトの実体自体(メモリ上の同じ番地を指している)が等しいのか?
といった様々な可能性が考えられます。
そして実際に手を動かしながら「この式だとこの条件で等しくなる、このレベルまでの等しさを比較するためにはこうやって書かないといけない」といった学びを得ていくのです。
こういった自問力がバグを未然に防ぐ実装力を身につけさせ、また、バグを解決する糸口となる知識を授けてくれるのです。