問題解決と眼

近頃は後輩から、「よいプログラムをかけるようになりたいです」という話を聞く。よいプログラムを書きたいという意識それ自体、とてもすばらしいことだと思った。そのときにふと、なにをもって「よい」とするのかといったことについて普段意識することは少ないのではないかと思った。自分自身も仕事としてプログラミングを行う前までは、何を持って「よい」とするのかといった基準のようなものは持ち合わせていなかった。説明のしにくいもやもやであって、それは美とは何か真とは何かといったような文化人類学的なあるいは審美的なものだというような意識すらあった。しかし、これは間違いだ。

極論すれば、あらゆる前提から逃れて「よい」プログラムなどないんだよ。と俺は後輩に言った。拡張性があるとか、読みやすいだとか、ドキュメンティッドであるとか、そういうものをそのままに「よい」というものじゃない。それがある前提に基づいた問題解決策だから、その前提のもとに「よい」という判断ができるだけだ。解決するべき問題の設定、そのモデル化、開発時の状況などによって、問題系決策は束縛されていて、前提とのマッチングによって、それが「よい」だとか悪いだとか導ける。

前提なしの拡張性なんて、入力文字列をevalするプログラムがもっとも拡張性高いことになってしまうしね。それはモデル化にしても同じで、どういう課題に対するどういうモデリングなのかによって、様相が全然違ってしまう。よくあるリンゴやみかんをインスタンシエートするオブジェクト指向のサンプルの空虚なところは、問題設定なしのモデル化だからだ。

とはいえ、よいプログラマ・よいエンジニアというのは確かに存在していて、それは「よい」プログラムを造り出す。彼らは何が「よくない」プログラマと違うのだろうか。知識や経験といえばそれまでなのだが、同じような経験を積んでいてもその成長は大きく違う。地頭のよさだろうか。それも関係はあるのかもしれないが、抽象的すぎる。僕が考えるところの決定的な違い:それは「よい」プログラマには問題解決のための眼があり、よくないプログラマはそれがない。ということだ。眼が経験を有意義にも無為にもする。眼が状況を判断し、自分がおかれている前提を正しく把握した設計を生む。この問題解決のための眼を養うことが、よいプログラマのための条件なのではないかと思っている。

問題解決のための眼とはなにか。それは「視野」「視座」「視点」の3つに分類できるんじゃないだろうか。この3つは混同されがちだが、明確に意味が違う。

「視野」とは、あるポイントからその問題を眺めたときに同時に把握できる領域の広さのことだ。ある問題はある大きな問題に包含されていて、さらに大きな問題構造に含まれているといったことを把握できる眼。広い/狭いで評価するもの。

「視座」とは、どこから眺めるか。高い/低いでとらえるもの。視野がいかに広くても、視座が低ければさらに次元の高い問題を認識できないし、視座が高すぎても抽象論に終始しミクロな解決策が浮かばないなどある。社長が現場感覚を理解しようとしたり、平社員が部長の立場からものを見てみるといったようなこと。組織の階層だけじゃなく、問題をどのように受け止めるかといった姿勢でもある。

「視点」とは、どの角度から見るか。鋭さ/多様さでとらえるもの。問題の構造を把握して、解決策の筋を刺すときに問題の捉え方によってはシンプルになることがある。普段は見えない角度から本質をえぐり出す力。あるいは男性が女性の立場から見てみたり、女性が男性の立場から見てみたりするようなこと。

視座が拡大縮小なら、視点はどの角度にライトを照らすのかといったこと。そのライトのてらす広さが視野。

ここまで読んで、それってどんなビジネスでもいっしょじゃね?と思ったんではないだろうか。そうプログラマだろうが何だろうが、現代において、知的労働をするというのは、問題解決のための方策の構築であって、そのための意思決定の積み重ねだ。

ところで、とりあつかう問題領域によっては、自分自身で意思決定がしづらい場面があるかもしれない。あるいは問題構造の把握が困難なケースもあるだろう。特に全く知らないビジネス領域に関してのシステム作りだとなおさらだ。そういった現場の場合には、優れた「耳」もよいエンジニアの条件となるのだけど、それはまた別の機会に。