知っていてこだわらない、それがいいソフトウェアエンジニアの条件なんだと僕は思うんだ

週末の午前中、カフェでアイスコーヒーを飲みながらふとポエムでも書いてみようかと思い立ってしまったので、ちょっと前からよく考えていることを書く。本当に思いつきで書くので乱文になる可能性が高いけどご容赦いただきたい。そもそもブログを書くこと自体が相当久しぶりだ。

僕ももう 30 をすぎて、プログラマの世界ではさすがにもう若手とは呼べなくなり、教育っていうのはおこがましいけど、まあ自分より若い人たちの指導みたいなことをやらないといけない立場になってきたからこそ、「いいプログラマとはどういう人なんだろう。この人たちはどういうことを学べたら幸せだろう。」ということをよく考えるようになった。そういう話をする。

プログラマは手段のスペシャリストである

世の中には目的・手段論みたいな論調が存在する。 「それは手段だよね。目的をはき違えたらダメだよ。」という話はいたるところでよく耳にするんだけど、僕はこれを結構ナンセンスな話だなと思っている。目的と手段というのはスコープによって異なってくるし、そういう意味ではかなり強く文脈に依存していると思うからだ。

例えば「大学受験に合格する」という誰かの想いがあるとする。これは高校 3 年生や予備校生にとっては目的になりうる。そのために彼らは一生懸命勉強しているんだから。でも長い人生の中においては大学に入学するということ自体が別の何かに対する手段だ。 ビジネスの現場においてある人が目的だと思っている KPI の達成だって究極的には利益を上げるための手段だし、その会社の存在そのものが営利とは別の何かを成し遂げるための手段かもしれない。事業の数字をきちんと作るというのはプロジェクト内では目的だけど、株主総会では完全に手段だ。目的・手段論なんてそんなもんだと僕は思う。

目的と手段なんて今その状況において対象としているスコープに依存する。だからそれが目的なのか手段なのかなんて気にしなくていい。まして我々が生業としているプログラミングなんて多くの場合において手段だ。プログラミングが目的のケースなんて計算機科学の研究者くらいじゃないだろうか。(そしてそれも別の応用研究から見れば手段だ。)

昔、誰かが「プログラマは手段のスペシャリストだ」と言ってたんだけど、これはその通りだと僕も思っていて、だから僕らは、偉い人に「それは手段だよね」って言われても堂々と「ええ、だってそれが僕らの専門性ですから」って言い返せばいい。手段のスペシャリストだからこそ、目的が何であれ、僕らはそれを達成することに注力すればいい。それが僕らの仕事なんだよ。

手段へのこだわりがエンジニアをスペシャリストにする

ただ、プログラマに関して言うと、いやプログラミングに限らずソフトウェアエンジニアリング全般がそうだと思うけど、ある分野に精通してそれを手段として使いこなせるようになるためにはそれなりの時間と経験を要するし、それは結構狂気に似た没頭が必要だと思う。それこそ「目的なんか知るか。俺はこの技術が使いたいんだ!」っていう態度が結果的にその人をその技術のスペシャリストに導くことも多いし、自分が置かれている状況を理解していわゆる"大人な選択"をするようでは没頭しているとは言えないことも多い。

そういった手段へのこだわりや情熱を持たず、その時点での目的に対して必要最小限の技術の使い方しか学ばず、早い段階でバランスのとれたエンジニアに成熟してしまった人は、平時には高いパフォーマンスを発揮するんだけど、目指すべき方向性が変わってしまったときや緊急の対応が必要な時に頼りにならない。

僕はそういう「大人で、聞き分けのいい」ソフトウェアエンジニアになりたいと思わないし、自分の後輩や同僚にもそうなって欲しくないと思う。

知っていてこだわらない、それがいいソフトウェアエンジニア

例えば、初めて自転車に乗れたときの感動を今でも覚えている人はいるだろうか。かっこいい乗り方、速くこげる乗り方、疲れない乗り方、子どものころにはそんないろいろな方法を練習した人も今では単に移動の手段で使っている人が多いのではないかと思う。

目的だったものが手段になるということはそういうことだと思う。かっこいい自転車の乗り方も知ってる、疲れないこぎ方も速くこげるこぎ方も知ってる、だってかつてはそれに強いこだわりをもって必死に練習したんだから。でも今は単にある場所まで移動したいだけだからそのために必要最低限の使い方をするんだ、と。

エンジニアリングもそうなんだよ。あるプログラミング言語の得意とすること・苦手とすること、データストアとして RDB が得意なこと・NoSQL が得意なこと、各アプリケーションフレームワークの設計思想、そういうのは熱狂的なまでのこだわりとそれなりの量の経験の先にしか身につかない気がするんだけど、さらにその先にそれを手段として使いこなせるようになるんだと思っていて、そのときにこそ熱狂的な情熱からちょっと冷めて物事を俯瞰的に見れるようになるんだと思う。

もちろん情熱を失ったほうがいいと言いたいわけではないし、必ずしも俯瞰的な見方をしたほうがいいというわけでもない。ある領域へのこだわりや情熱は個人の嗜好性の範囲ではずっと持ち続けていいと思う。 ただ多くの開発現場がチームでプロジェクトを進めていく以上、チームで目的とすることとそれを実現する手段の整合性は重要で、そのためには目的と手段のスコープの切り替えが大事になってくると思っている。 そういう意味で、熱狂的な情熱と周辺領域まで含めた俯瞰的な視点の切り替えを繰り返していくことは大事で、その結果だんだん目的と手段のスコープの切り替えが上手になっていって、手段としての専門性の深さと目的との整合性をうまくとれるような、そんな理想のエンジニアになれるんじゃないかなと思うんだ。

僕が理想とする「知っていてこだわらない」エンジニアというのはそういう人で、僕自身も今後もそれを目指していくし、僕が若者に伝えていきたいこともそういうことなんだよなぁ。