2012年3月28日水曜日

コミュニケーションは誤解を解くことが肝要

最近色んな人と喋っていて気付いたのだけれど、コミュニケーションを円滑に進めるためには、「いかに早期に誤解を解くか」が肝要なんだと気付いた。

前提を間違えた結論は全て偽

論理学において、前提が偽であるならば、結論は常に真だけど、現実においてこれは誤りで、現実では前提が異なっているならば、得られた結論は全てニセモノであると考えるのが正しい。
他人と議論を進める場合、前提を確認した後、議論を展開していくのだけれど、前提を間違えて議論を展開した場合、殆どの場合結論は合致しないのだけれど、稀に合致したとして、それは合致とは言えない。だって前提条件が違うんだから。
例えば、「TPPは推進するべき」という結論で合致したとして、片方が「日本の農業は強い、だから開放しても安心だ」という前提に立っていて、片方が「日本の農業は弱い、だが更に手厚い補償をするので安心だ」という前提に立っていたとすると、結論は同じでも、思考の過程が全く違ったものになる。
簡単な議論ならいいけど、複雑な議論になるにつれ、前提が違っているとなると、意味が無かったものになるコミュニケーションの量が膨大になる。早い段階で軌道修正を行わないと、進めていったところで、やっぱり前提が違いましたね、戻りましょう、となると、それは膨大な時間の消費になる。

では、どうやって議論の道筋が正しい、つまり誤解の無いことを確認すればよいのか。

理解は自分自身の言葉によってしか生まれない

「レジデント初期研修用資料~~医療とコミュニケーションについて~~」という書籍に、以下のような記述が存在する。以下引用する。

理解というものは、最終的に「主治医から押し付けられた見解の型枠を、自分の言葉で満たす」作業として完成する。 資料「レジデント初期研修用資料~~医療とコミュニケーションについて~~」58頁

これは医療の現場以外にも通じると僕は考えていて、これは一般化すると「聞き手の理解は『話者によって話された内容を、聞き手の言葉で満たす』という作業として完成する」こととなる。
話された後、「分かった」「なるほど」で終わってしまう人ほど、何にも理解していなくて、「それはつまり~~ということですか?」「要するに~~ということですか?」と返し、了解が得られた時は、かなりの確率で安心出来る。
なので、区切りの良い所で、相手に理解した内容を語ってもらうのが、恐らく一番良い策になる。
もっと言えば、あえて質問が起こるように、説明をやや舌足らずにするのが、意外にも良策であるのかもしれない。
分かり易い説明は、質問の必要性を奪ってしまうから。

現実の運用

しかしこれを現実の世界に適用するとなると、また勝手が違う。
このような慎重なコミュニケーションが必要な状況というのは、顧客への説明だとか、上司への報告だとかになるが、基本的に社会人は時間がない。ぐだぐだと舌足らずな説明を行い、質問させようとすると、途端に無能の烙印を押され、二度と会話してくれなくなること請け合いである。
現実的な運用方法としては、誤解がなされていると思った段階で説明を加えつつ、話の最後に、箇条書きのような調子で確認し、念の押す、といったところが関の山だろう。
ここで重要なことは主張のコンポーネント化になる。
自分の言いたいことを、「前提」「思考過程1~n」「結論」というピースに分け、箇条書き形式にすることで、聞き手の理解をスムーズにする。

長々と書いてみたけれど、やっぱり、頭の中で考えたことを現実に適用するのは難しいな、という結論に至った。
現実の運用についてはもう少し追記したいこともあるのだけれど、それはまた今度の話。

2012年1月17日火曜日

TopCoder 529 過去問


卒論が終わりました。CS関連に全力注入出来るのがうれしいです。早速SRM 529 の過去問を解きました。

今回から、やるだけの問題は載せません。面白くないので。

Div2 Hard

MinskyMistery Div2

マーブルに関するゲームを行うというもの。
ゲームの詳細を書くのは面倒くさいので割愛。
この問題は、与えられたN(>=2)に関する約数のうち、1を除く最小のものと最大のものを足したものを出力する問題に帰着出来る。ちなみに素数の場合は例外で、自身と1を足したものを返す。
N<2の時はループが終了しない。
なので気付いてしまえば瞬殺。

コード


#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <deque>
#include <queue>
#include <functional>

using namespace std;

#define REP(i,s,e) for (int i = int(s); i != int(e); i++)
#define rep(i,e) REP(i,0,e)
#define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ALL(c) ((c).begin(), (c).end())
#define ll long long
#define VI vector<int>

class MinskyMysteryDiv2 {

 public:

 long long computeAnswer(long long N) {
  if(N < 2) return -1;
  for(ll i = 2;i*i <= N;i++) if(N%i == 0) return i + N/i;
  return N+1;
 }

};