どういう技術者になって欲しいか (2)

この記事はiCARE Devチームのアドベントカレンダーの第2レーン15日目の記事です。14日目に引き続き荻野が担当します。昨日の記事で比較的この業界の経験が少ない人も仲間になってもらっているということを経緯を含めて書きましたが、ではそういう技術者としては発展途上の人たちに、将来どうなって欲しいかということを今日は書きます。

いろいろあるんですが以下の3つに絞りました。会社の若手に語りかける感じになってしまった。

論理的であること、批判的であること

プログラマは論理の機械であるコンピュータを操る仕事なので、その仕事に従事しているならば自動的に論理的な人間であろうと期待されてしまう節があります。しかしながら、様々な心理学的実験などから、人間は必ずしも常に論理的に思考しているわけではないことが明らかになっており、プログラマも人間である限りはその癖から完全には逃れられません。そういったことを意識して、つとめて論理的であって欲しいと思います。事実や仮説から出発して、論理を積み重ねて思考する癖を付けて欲しいと思います。
様々な実装上の選択肢があってそのうちのひとつを選ぶとき、なぜそれを選択したのかをきちんとロジカルに説明できないといけません。起きたことをリーダーに報告する際にも、確実なことと推測されることは区別して伝えて、どういう推測を積み上げてその結論に辿りついたかを説明できるようになって欲しいと思います。
また、論理的であることと同様に科学的に重要な態度として、健全な批判精神も必ず持っていて欲しいと思います。新しい機能をなにか実装する際に、似た既存の実装があったとしても無批判にそれを真似てはいけません。なぜその実装になっているのか、他に手段はなかったのか、考えた上で実装を選択できるようになることが理想です。自分が論理を重ねて正しいと確信したことと目の前の現状が異なっていたときは、遠慮せずにすぐにそのことを伝えて欲しいと思います。矛盾が見えているのにそれを報告しないというのは科学的な態度とは言えません。あなたの目の前にある事実としか思えないプロダクトも、たくさんの技術者の健全な考えによって出来上がってきたのです。なにか問題を発見したときにそれを黙殺したり報告しなかったりするということは、極端に言えばそれによってプロダクトの健全な発展を止めるということになります。黙っていてはダメです。

なにかの専門家であるということ

その前に。皆さんの入社前から作られているそれなりの規模のプロダクトに対して、健全な形で疑いを挟んで意見を述べるためには、自分の持っている技術に対してのそれなりの自信が必要です。RailsであれVue.jsであれ、自分がこの部分についてはきちんと理解しているという実感がないと、批判の目も持てないものです。

では、その自信はどのようにして身につけるのでしょうか。身も蓋もない言い方になってしまいますが、経験を積むしかないのです。とにかくたくさん、成功も失敗も含めて、時間を費して取り組むことが結局はいちばんの近道です。もちろん漫然と時間を過ごしていてもダメで、目標に向かって耐えざる努力が必要です。これを苦しいことと思うと続きません。苦しまずに、自然な努力を重ねることができる状態に持っていくことが必要です。それにはどうすべきでしょうか。

解決策のひとつは、得意な分野をつくるということです。好きなこと、得意なこと、これだけはまわりの人に負けないということ、そういったことは趣味と同じです。気がつくと膨大な時間をそれに費してしまっている。寝る間も惜しんで熱中できるなにかを作ってください。その分野は特に気負うことなく自然と勉強が進んでしまう、そういう状況に自分を置いてください。

専門分野はどう見つければいいのでしょうか。これも身も蓋もない話ですが、いろいろやってみるしかないと思います。仕事を通じてでも、自分で探してでも、ある程度のボリュームをきちんと全力でやってみることです。ちなみにこの話には罠があって、なにかを真剣にやり始めたときにしばらく経つと「この分野は自分がかなり出来るかも知れない」と思う瞬間が来ます。しかしそこで満足せずにもっと上を目指して自然な努力を続けていると、突然自分が無力に感じられるときがきます。それでも諦めずに続けていった、その先が本当に専門分野の入口に立てたときです。興味がある方は「ダニング=クルーガー効果」で検索してみてください。

話が逸れましたが、この専門分野を見つけるという過程を出来れば20代のうちに、と書こうとして30代でこの業界に入ったメンバーがいることも思い出したので、ともかくあと3〜5年くらいで、やり切っておくと良いでしょう。実は私自身が若いときにこれといった専門分野を持たず、得意なものを作ることに失敗した人間です。おかげでその後の時代にかなり苦労をしました。皆さんはいまから取り組んでください。

開かれた心を持っていること

上の2つは私が思う優れたプログラマの特徴の代表的なものですが、他にもいくつもそういった良い技術者としての特徴を挙げることができます。おそらくこれからたくさんのそういった特徴のことを見聞きすることっしょう。これは、と思うものはどんどん取り入れて行ってください。その際に大事なのは、技術者が共通で持っている文化を理解しているということです。

どんな態度の技術者が尊敬を集めているのか、凄い人はどんなインプットを日頃しているのか、AとBという選択肢があったときに出来る先輩は常にAを選んでいるとしたらそれはなぜか、日々の仕事の中でも、それ以外の場所でも、周辺にヒントは無数にあります。無数にあるヒントを全て自分の糧にしましょう。ただ真似をすればいいというわけではありません。その行動の奥に隠された動機や理由まで理解しながらその行動をなぞってみて、はじめて同じ効果が現れるのです。行動の表層だけではなく、中心から受け取るようにすること。これはその分野を構成する文化の理解に他なりません。

経験を積んだプログラマがなんとなく共通で持っている文化というものがあります。これを貪欲に自分に取り込んでください。そのために時には、自分がこうでなくてはならない、といった固定観念を捨て去ることが必要です。そして、別のなにかを受け入れるためには常に開かれた心でいなくてはなりません。

これは完全に余談ですが、私の友人のあるオーストラリア人のプログラマは、日本人のプログラミング文化を理解するために『ジョジョの奇妙な冒険』を全巻購入して読破し、それが日本で仕事をする上で間違いなく役に立ったそうです。開かれた心による文化理解の極端な一例だと思います。

まとめ

ここまで書いてきた3つの要素は、どれも特定のプログラム言語やフレームワークなどに依存するものではありません。具体的に明日のタスクが速く進むようになるとか、そういった効果があることでもありません。でも、だからこそどんな時代であってもそのときの流行や市場の状況に関係なく通用する、普遍的な能力や自信に繋がるのです。私は皆さんにただ目の前のタスクをこなすだけの技術者にはなって欲しくありません。皆さんがiCAREと関わったからには、次にどこに行っても恥ずかしくない普遍的な技術を備えていってもらいたいと思っています。

なんだか偉そうなことを書いてしまいましたが、最近入社してDevチームに入ってくれた方の指針になってくれることを願います。今週からは荻野塾(これも偉そうな名前ですが)も始めるので、こんな感じのことをいろいろと伝えて行けたらいいなと思います。一緒にがんばりましょう。