議論がねじれているときは、互いの認識を一から確認した方がいい

経験上のことだけど、議論がねじれるのは、その前提となっている条件や、用語の意味といったことで、互いの認識がずれているのが原因であることが多い。
よって、議論がねじれてまとまらず堂々巡りになっていると感じたら、前提条件や用語について、ひとつずつ互いの認識が一致しているかを細かく確認した方がいい。

ここ数日関わっていた、「ローカル変数を抽象型にアップキャストする・しない」という議論がまさにそれだったので、実例として紹介したい。


ことの発端は、keisuke_n 氏や odz 氏が『ローカル変数は抽象型にアップキャストせず、具象型にしたほうがいい』と書いたことに対し、こちらが『抽象型でも具象型でもどっちもいいんじゃないの? 具象型にアップキャストしないほうがいいとまで言い切る理由が分からない』と疑問を呈したことから始まる。


で、この話は紆余曲折あって議論がまったくまとまらなかった。あまりにまとまらないので、用語の意味や前提条件を一から確認したほうがいいと思い、いくつか質問してみた (こことかここね)。すると、やはり互いの認識に大きなズレがあることが判明した。


ズレている例その 1。

> 3’. 「アップキャストしなくてもよい」と「アップキャストしないほうがいい」は違う、
>   という理解でいいでしょうか。

3’はい。 「アップキャストしなくてもよい」は断定的(常に具象型にせよ)で、「アップキャストしないほうがいい」は、基本的には「具象型にした方がいい」が、「抽象型」にする場面もあるという意味です。

http://d.hatena.ne.jp/kwatch/20080312#c1205904591


自分としては、「アップキャストしなくてもよい」は、「抽象型へアップキャストしてもいいし、しなくてもいい」という意味、つまり「許可または選択」を表しているつもりで使っていた。しかし少なくとも keisuke_n 氏は『断定的(常に具象型にせよ)』という意味でとらえていた。自分とはまるっきり逆である。

自分で書いたのを読み返してみると、『(抽象型へ) アップキャストしてもいいし、しなくてもいい』と何度か書いてある。これがまさか『断定的』ととられるとは思ってもみなかった (しかも『常に具象型に』という意味に!)。正直、「具象型にしたほうがいい」のほうがずっと断定的だと思う。


ズレている例その 2。

> その両意見とは、具体的にどういう意見ですか。

具体的に書けば、

  • 局所変数への代入は具象型で本当にいいか疑問だ、あるいは抽象型にすべし
  • 局所変数への代入は具象型でもいいんじゃないか

ソースは面倒なので省きます。

http://d.hatena.ne.jp/kwatch/20080312#c1205904591


ここでいう『両意見』とは、自分としては

  • (a) 抽象型にアップキャストしてもいいし、しなくてもいい (抽象型でも具象型でもどっちでもよい)
  • (b) 抽象型にアップキャストしないほうがいい (具象型にしたほうがいい)

であろうと思っていた。前者がこちらの意見、後者が keisuke_n 氏や odz 氏の意見である。しかし、これも見事にズレていた。

これから推測するに、どうも keisuke_n 氏や odz 氏側は、こちらの主張が『ローカル変数では抽象型へアップキャストすべし』だと思っているようだ。しかしこれは完全に誤解である。自分は何度も (a) を主張していた。例えば:

リンク先のエントリ、読ませていただきました。しかし、「ローカル変数の場合はキャストしないほうがいい」とまで言いきる根拠はわかりませんでした。「キャストしてもいいし、しなくてもいい (どっちでもいい)」ということならわかるのですが。

Re: 型宣言は汎用的にすべきか? - kなんとかの日記

この点で、完全に認識がズレている。こちらの主張が相手に正しく伝わっていない。
#というか、『具象型で本当にいいか疑問だ、あるいは抽象型にすべし』というのがどこから出てきたのか、けっこう不思議。


また keisuke_n 氏や odz 氏の主張は (b) の「抽象型にアップキャストしないほうがいい」であるが、彼らはどうもこれを『局所変数への代入は具象型でもいいんじゃないか』というぐらいの意味で使っている可能性がある。

「しないほうがいい」は英語でいえば should not であり、must not ほどではないがかなり強い表現である。そのため、「抽象型にアップキャストしないほうがいい」という文言は、自分から見ると抽象型へのアップキャストを「禁止」まではいかなくとも「否定」しているのだととらえていた。だからこそ、それはおかしいんじゃない? と疑問を呈していたわけだ。

しかし、もし keisuke_n 氏や odz 氏が『局所変数への代入は具象型でもいいんじゃないか』というぐらいの弱い意味で「抽象型にアップキャストしないほうがいい」と書いていたなら、話はずいぶん変わる。『局所変数への代入は具象型でもいい』ということにはこちらも賛成なので、何の疑問もない。

ここでも認識のズレがある。『しないほうがいい』を「否定」ととらえるのか、それよりずっと弱い意味でとらえるのかである。両者の印象はだいぶ違う。


 


・・・とまあこのように、議論の前提となる事柄においては、このくらい認識にズレがある場合が多い。根本的なところでこれだけ認識にズレがあるんだから、議論がねじれるのは当たり前だ。

ここで紹介した例は、決して特殊な例ではない。どちらかが、相手を打ち負かしてやろうとしてわざと変な解釈をしたとか、知らないことをさも知っているかのように振る舞ったとか、そういう要素は入っていない。それでもこれだけのズレが生じてしまった。このようなことは、誰の場合でも、どんな議論でも、ごくごく普通に起こりうる。

ここで重要なのは、このくらい分かって当然だろうとか、こんな簡単なことは説明する必要がないだろうとか思っていることが、実は完全に認識がズレていることがある、ということである。これはほんとに重要なことだ。だからこそ、当たり前と思っている事柄をひとつずつお互いに確認しあうことが必要である。そうでないと、堂々巡りのねじれた議論からは抜けだせない。

ただ、細かく確認していく作業は手間がかかるし、当たり前と思うことを一つずつ質問するので相手をうんざりさせてしまいやすい。2 番目の例でも、『このコメントではどうでもいいんじゃないでしょうか。#何もかも説明させようとしているように感じられます。』とか言われてしまったが、別にいやがらせをしたわけじゃなくて、小さいところから認識があっているかを確認していかないと、議論が前に進まないから質問したのである。これについては、こちらの説明不足であった。皆さんはこのような失敗をしないように注意されたい。