2016/06/05

プログラムからどう学ぶか

ソフトウェアエンジニアをやっていてよかったと思えるのは、自分よりすごいと思える人が山程いることだ。たくさんいる。使っているライブラリや言語、OSを作っている人たちがいて、「ああわたしは今のままじゃこういう設計はできないだろうな」ということをよく思う。前回の記事 でも書いたのだけど、ビジネス的なエンジニアリングはそれはそれで必要な仕事がある。とはいえ一個人のプログラマとしては、 それはそれでものを実装するということ自体で価値を出し続けたいのである。

これは演奏にも近い。私はクラシックギターを弾くけれど、「ああ、あの演奏家の律動性は素晴らしいな」「この表現はどのように考察して作っているのだろう」「なぜあの演奏には感動してしまうのだろう」ということをたびたび経験する。音楽自体はプログラミングとは違って直接的な体験ではありながらも、音をだすことを丁寧に見ていくとちゃんとした技術と、あとはやはり感性がある。ベースとしてのテクニックがないと綺麗な音は出せないが、綺麗な音が出せたからいい音楽というわけではない。これもまたプログラムを書くことにすごく似ている。

自分がとあるプログラムについて「すごいな」と思うときは2つある。それはその字面の技巧的なところをみるときと、もう一つはデザインをみるときだ。昔は前者の、こと技巧的な方について目を向けて複雑さや物量の多さに目をとられることが多かった。今もなくなったわけではないけれど、いくらか自分自身でプログラムを書く量が増えてくるとプログラムそれ自体に感心することは減ってくる。最近は後者に感嘆することがある。なぜこのデザインになったのかということである。

ここでいうデザインというのは、「何をして、何を捨てたか」という取捨選択と、「その選択に対してどのように抽象を使ってアプローチしているか」ということだ。ソフトウェアそれ自体はシンプルでありながら、強力でありうるということはよくあることだ。その設計のシンプルさをみるとき、ライブラリの一機能をみるとき、そういったものにすごく心を奪われる。シンプルに設計できるときというのはたいてい、そこで書くべきもの以外のほぼ全てのものごとを把握していて、どうしてもその部分は何らかの実装をしなければならないといった状態になっているものが多いように思う。その一点をついて、もちろん字面の上でもシンプルに実装されていると最高なのであるが、何かを達成している機能というのには大変感心させられる。かつ、その物事が普段私が問題としているものだったとしたら、それはもう自分の設計力では到底できないであろうということがわかるのである。

そうした設計をみたときにそれを「感性だ」と言い切ってしまうこともできるのだが、じゃあどのようにそれを自分でもできるようになるか、ということを考えないと進歩は止まってしまうように感じている。なので手を止めずに、なぜそのように判断されたのかということをなるべくログだったりドキュメントを読んで把握しようとすることを普段はやっていることになる。「これは素晴らしいプログラムだ」と思うのは良いのだが、なぜそれが素晴らしいと思ったのかを考えなくなってしまうと、いつまでもそういったプログラムを書けるようにはならないのである。