高いビルの上から物を落とすとどこに落ちるか?(あるいはプログラマとして心得るべきこと)

何の前触れもなく唐突に表題のような質問を周囲にすると、反応は概ね以下の4点に集約されるのではないか。

  1. えっ?どういうこと?(まっすぐ下に落ちると思うけど、何か引っ掛けかな?)
  2. 落ちる間に地面は東の方向に移動しているわけだから、真下よりちょっと西の方かなぁ?
  3. 地面は動いているけど、物も同じ方向に移動しているので、まっすぐ下に落ちるよ。
  4. 地球は自転しているから、高いところほど速く移動しているので、真下よりちょっと東の方じゃないの。

さて、正解がこの中にあるだろうか?多少の物理を理解している人であれば、4が正解であり、計算も正確にできると考えるだろう。2は何も知らない人の回答と思うかも知れない。

実はこの問題は、100%理科系少年だった僕が中学1年生のときの遠足の途中、歩きながら友達に出した問題である。近くにいた理科の先生がその話を聞いていたようで、問題を出したとき、ちょっと小馬鹿にしたように笑った。しかし、解答が4だということを説明したら、真顔になった。多分その理科の先生は3が答えだと思ったのであろう。そして友達は2と回答するのではと思ったのかも知れない。

しかし、4が本当に正解だったのだろうか?
先日、ふと、このことを思い出し、試しに会社で周囲の人達(ソフト開発者)に個別に同じ質問を投げてみた。さすがに2と答える人はいなかったが、大部分が3と答えた。

以下のような反応も期待したが、残念ながらこういった切り返しをしてくれる人はいなかった。

  1. 高いってどのくらい?宇宙(静止軌道上)まで届くような高さなら遠心力で落ちて来ないんじゃない?
  2. 空気の抵抗を考慮したらどこに落ちるかなんてわからないよ。
  3. 場所によって違うんじゃない?赤道上と北極や南極とでは違うよね。
  4. 月や太陽の影響や地球の公転を考慮したら計算は非常に複雑だよ。
  5. 物って何?「落とす」ということだから、重さのある固形物を想定しているのはわかるけど。ガス風船は落ちないよね。
  6. そんなことしちゃいけないよ。下の人に当たったらどうするの。

中学生だった当時はこのようなことは想定もしていなかったが、改めて考えると別の観点から問題が浮び上る。つまり、設問自体が曖昧で意味を持たなかったのでは?ということだ。質問した方もそれに気づかず、さらに、設問が曖昧であっても、質問を受けた方は暗黙の常識の範囲内で無意識に補ってしまい、意味のある設問に置き換えてしまう。そのこと自体を本人が知らない。

さらに、このクイズのような設問では、ヒントをもらう前にできるだけ自分で考えるということが暗黙の了解になっている。僕は決してクイズの積りで問題を出したわけではないのに、受けた側が勝手にそのように解釈してしまい、頭の中は疑問符でいっぱいなのに、あえて疑問を呑み込んでしまう。

ちょっとお遊びの積りで、10人程にこの設問を出していたが、途中でこれは単にこの話に限ったことではなく、ソフトウェア開発で僕らが日頃遭遇している問題に類似しているのではないかと思えてきた。

ソフトウェア開発で発生する問題の多くはコミュニケーション不足が原因である。コミュニケーション不足を引き起こす原因は、往々にしてその人の都合のよいように勝手に対象を解釈してしまい、確認すべき相手に確認しないことだ。「まさか、そんなことはないだろう」とか「当然、相手はそういう意図だろう」などの事実とは異なる思い込みをしてしまい、本人もそれに気づかないというパターンが多い。

そのような問題を回避するために、要所要所でface to faceのレビューが設けられるが、限られた時間で全てを網羅できるわけでもない。チームのメンバが声を出せば全員に届く範囲にいるような環境があれば理想的であるが、地理的に離れた複数の組織にまたがるような大人数のプロジェクトの場合にはそうはいかない。いわゆる「見える化」は困難であり、実行しようとすると極めて重いプロセスになってしまう。日頃の情報共有は、せいぜいメールやwebベースのプロジェクト管理ツールなど文章ベースで行われるくらいだ。

このような文章だけ(図や写真があっても同様だが)によるコミュニケーションでは、どうしても欠けるものがある。そもそも書かれている文章が舌足らずで意味がわからない、あるいは、多忙状態の中で自分も含め相手もちゃんと読んでくれない、といったことは日常茶飯事である。しかし、どういうわけか、どうとでもとれるような文章でもその真意を確認しないで、受けた方が勝手にいいように解釈してしまうケースが多い。後になって、そういう意味だったのか、と驚くこともある。冒頭で述べた設問の問題と同じなのである。

ある程度経験を積めば、潜在的な問題に対して、なんとなくおかしいといった感覚が発達するものである。それは文章や言葉の端々からくるものであり、相手が本当に意図していることと自分がその文章や言葉から理解した内容との間に微妙に生じたズレからくる心の隅に引っかかる微かな違和感である。

僕らは別々の人間である以上、どんなに文章や言葉で伝えても自分の頭の中にある真の内容を正確に相手に伝えることはできない。それは純粋に技術的な内容であっても、その人の持っている背景知識が異なれば、そのようなズレは容易に生じる。

疑うこと、あるいはちょっとした疑問からコミュニケーションが必要になる。コミュニケーションがなければ、もし潜在的問題があったとしてもそれを顕在化する機会が失われてしまう。しかし、相手の意図がはっきりしない場合に、それを正すような質問をしてもあまり有益でない。なにしろ、本人は何の疑問もなくそのような文章を書いている場合が多い。自分はこう理解したということを相手に伝える必要がある。 それはこういうことだよね?と表現を変えて相手に確認するということで、より正確な意図を知ることができる。face to faceのリアルタイムな会話であれば、一瞬で解決してしまうような問題でも文章となるとなかなかそういかないものである。

このようなことは、人とのコミュニケーションばかりでなく、仕様書や規格書を読むときなども同じである。この場合、その文書を書いた人とは直接的なコミュニケーションはとれないことの方が多い。読む人のスキルの差によって解釈の違いが出てしまう。そこにも「常識」の範囲内での解釈が要求されるが、その常識が人によって異なるのである。書かれてもいないことを信じ込んでいたり、曲解ともとれる解釈をする人に時に出会うこともある。それが間違っているということではない。

支離滅裂で分かりにくいことをくどくどと書いた感があるが、僕らソフトウェア開発者というのは、純粋に人間の頭の中にある形のないアイデアを技術力によって具現化するという無二の職業であり、外界との繋がりによる相互フィードバックによってのみ正しい方向を知ることができるのである。他者との関り合いは不可避であり、僕らは成長するためには、常に何かを吸収し続けるとともに、常に何かを放出し続けなければならない。

そして、どのような職業の専門分野でも突き詰めていくと人間とは何かということを考えさせられるのではないかと思う。僕自身純粋にプログラミングが好きということで続けてきたが、ソフトウェアは人間が作るものであり、そこには良くも悪くも人間の本質が否応なく投影されるということを強く感じている。