ソフトウェアエンジニアとしての能力を高める方法について考えてみた

早朝の寝る前ぐらいの時間にぼやっと下記の様なツイートしたらちょっと反応を貰ったので、取り留めは無いが自分なりに考えていることを書いてみる。

タイトルは雑に書いたけど、能力を高めるというと範囲が広過ぎるので、技術的な意味でできる事が増える、ということをテーマとして話をしていこうと思う。基本的に自分の考え方の話なのでそこは御留意ください。

ツイートした通りで、状況や対象に依って割合は変わるかもしれないが基本的にそのためにやることは3つしかないと思っている。

  • 出来る限り公式に近いドキュメント、もしくは信頼できる著者による書籍を読む。場合によっては論文を参照する。
  • それを使ってみる。とりあえず動く小さなアプリなりツールなりが書けるのが一番良い。
  • それを利用しているOSSのコードを読む。フレームワークやライブラリ自体だったら一旦動くものを書いてからコードを追う。

実際には、とにかく公式ドキュメントを読んで書いてを繰り返すことが多い。つまり、ただ読んで書いてをやり続けるだけということになる。

公式のドキュメントが分かり辛いという例は無くは無いと思うが、基本的に技術要素として重要なことは公式のドキュメントかソースコードを見れば大体書いてあるので、改めて他の人が説明することはほとんど無い。自分の理解のために自分の言葉で言い換えてみるというのは意味があると思うが、他人向けの説明資料を作っても余り現実的な効果は無い。というかそんなので本当に理解できるんだったら、既に俺よりよっぽど分かっている。(じゃあ何も書かなくていいかというとそんなことも無いと思うので、それはまた機会があればブログにしようかと思う)

とは言え、↑みたいなことをやるのは時間も気力も必要で、学ぶのに全く苦労しないということは無い。基礎知識が足りないので遠回りしないと分からんことも一杯ある。

なので、やるためのエネルギーを捻り出さなければいけない。自分なりに考えられる動機は4つある。

一つ目は興味(楽しさ)だ。単純に気になるし面白いと思うからやってみたい知りたいと思えば、多少の苦労も乗り越えられる。

二つ目は責任。言い換えると仕事で必要だからやる、ということ。それを使わないと仕事が進まないんだったら苦労してでも学ぶしかない。この時、最悪他の人が何とかしてくれるだろうとか思ってしまうともう駄目で動機が消滅してしまう。

三つ目は危機感。今のまま自分が出来ることが増えていかなければ、いずれプログラマとしての信用を失うかもしれない、それは嫌なので不安から逃れるために新しいことを学びたいと思う。

四つ目は利益(金)。これが出来れば利益に直結するということであれば、利益のために多少の苦労を乗り越えることが出来る。ただ、その利益が信じられるものでないと大した動機にはならない。

他の人がどう考えているかは分からんけど、自分として割と想像が付くのはこんなところだ。もちろん何かを学ぶ時に、どれか一つにドライブされているという様なことはなくてこれらの複合で成り立っている。

興味と危機感は内発的動機で、方向性がポジティブかネガティブかという点で異なるが最終的には自分の意志(MP)に依存している。これで動けるなら他人に頼らなくて良くなるし理想的だと思うが、実際のところこのリソースは有限だと思う。好奇心が尽きたらと考えるとめちゃくちゃ怖い。

一方で責任と利益は外発的動機で、環境・状況によって与えられるものだ。自分の曖昧なリソースに頼らなくていいので分かり易い。

これを自分の目線から見ると、内発的な動機は自分でコントロールするもので生き方や物の考え方をどうコントロールして生きていくかという問題で、外発的な動機は自分で考えても仕方が無いので状況に合わせて行動するということになる。

一方で人を育てる・人を動かすという視点からすると、当人の興味や危機感なんてものは全くコントロールできないが、その人に与える責任や利益は会社側の立場からコントロール可能な物事と言える。

という訳で、自分としては自分じゃない誰かの能力を底上げするということになると、もう実際にやらせて責任を負わせるかこれが出来たら給与を上げるよと確約するしか無いと考えている。

「お前がやるんだよ」レベルまで責任を与えられると良いのだが、実際の所はギリギリになったらケツを持つことは上司の仕事になるだろうが。

言い換えると、「出来るかどうか分からんがとにかく責任を負って仕事をやってみる」しか成長する方法は無いんじゃないかという話だ。この責任から逃げるのも自由だが、それで成長できるかというと相当の才能が要ると思う。少なくとも自分程度の頭では無理だ。

出来ることだから仕事でやるんじゃなくて、仕事でやるから出来る様になる。

取り留めが無い感じだが、最終的な結論としては「もし出来なかったら辛いし、良く分かってないがとにかくやってみる」みたいな精神で仕事できるかどうかが職業エンジニアとしての能力向上に重要で、そういうエンジニアを増やしたい企業としてはとにかく耐えられる人間に責任を移譲してやる事をやらせるということになる。この時スケジュール上の遅延や失敗のリスクを覚悟しなければならないし、失敗した時に過剰に責めてはならない。何もペナルティが無い状態を責任を負っているとは言い辛いので、最低限何らかの評価は必要だと思うけど。

結局のところ、自分がよく例えで持ち出しているが、HxHの天空闘技場で強めに念能力でぶん殴られて生き残るみたいな方法しか普通の人間が壁を越える方法は無いのではと思う。非常にモヒカン的で生存バイアスに支配された考え方であることに自覚はあるが、どうしても他の方法がよく分からないし実感が湧かない。