プログラマにとって〈できる〉とは何か。

プログラマとして働いていると、特に非プログラマの人から

「hogehogeをfugafugaするようなことって(プログラムで)できるんですか?」

という類の質問をされることが良くある。当然そういうことを聞かれたら

「できると思いますよ。」

と答えるしかない。まともな思考な人が考えるような要求、つまり「iPhoneの画面をダブルタップすると、口やかましい上司を遠隔地へと転送できる」とか「母親をカメラで撮影すると、実家への仕送りを強要しなくなる」とか、そういうのではない要求、というものはたいていの場合、理論上実現可能だからだ。

コンピュータサイエンスに明るいわけではないが、「チューリング完全」という言葉ぐらいなら知っている。コンピュータの世界における「やればできる」に相当する概念といったところか。

つまり、「できますか」という問に「やればできる」と答えていて、さらに、「やればできる」のことを「できる」という言葉で表してしまっているわけだ。

物質世界にくらべて、「やればできる」のが当たり前のソフトウェアの世界だからこそ、その当たり前の答えを使ってしまうと厄介なことが起きる。まず、

「Aさんがhogehogeをfugafugaできるらしいから、やってもらおう。」

という風に自分が頼まれてしまう。そして、自分自身も判断力が鈍っていると

「まぁ、やればできるはずだからやってみるか。」

と安易に引き受けてしまうわけである。プログラムの世界以外なら「やればできる」と「できる」の間にある大きな溝を認識できるのにも関わらず、だ。
こうして、バカな私はその溝に落ちることになる。

パフォーマンスが・・・
このAPIを使用するとメモリリークが・・・
ドキュメントにはそう書いてあるんですけど・・・

オープンソースのライブラリを使おうと思ったんですけど、ライセンスが・・・

様々な問題との果てしない戦いが始まり、終いにはコレを言われるわけだ。

「できるって言ったよね?」

悲しいかな、当初は物腰が柔らかかった人でさえ、冷ややかなタメ口になっていたりする。

とはいえ、「できない」はどうも使いたくない。「やればできる」わけだからそれはそれで論理的ではない。それに、「できない」と言うと仕事が無くなるわけで、そうなるぐらいだったら茨の道を歩んだほうがマシだ。そもそも「できないということを証明する」ことは「できるということを証明する」ことよりはるかに困難で、だからこそ「できない」という答えが正解になることは少なく、非論理的だと考えている。だから、簡単に「できない」などという開発者は現実主義者でもなんでもなく、ただただ信用出来ない。

結論としては、これからも「できる」と言っていこうと思う。
ただし、自分の中で「できる」という結論を出すのは、「できた」後だ。
プログラマにとっての「できる」は「したことがある」であるべきだ。

だからこそ、手を動かすべきだし、なにか作ってみるべきだ。実践から学ぶことは非常に多い。

(実践から全てを学べるという意味ではない。そういう考えの人は得てして、「動けばオーケープログラマ」だったり「フラグ大好きコールバックもループとフラグで実現するよプログラマ」だったりする。)

本当は「できることはできるのですが、僕のスキルでは途中で挫折するか、もしくは時間がかかりすぎるかもしれません、調査期間をNヶ月いただければ・・・」とかなんとか言いたいところだが、そんなやつには誰も何も任せてくれない。自分の成長のために大風呂敷を広げ、一方で自分が「できる」状態ではないことを認識し内心は謙虚でなければいけない。
そうすれば他所様が開発したものを見て

「これくらいなら俺も<できる>けどなぁ」

というようなことを言わなくなるだろう。
ここでも、「やればできる==できる」の間違えが犯されている。