プログラマの成長について考えてみる
2013.12.16
プログラムを書いていて、次に何を学習するべきか と考えることが度々あった。
その度に
「プログラマ 成長」
「プログラマ ロールモデル」
「プログラマ 1年目 本」
なんておもむろにGoogleの検索フォームに入力して、
世の中で話題になっている人のロールモデルを参考にしようと色々見ては、その人が「小さな頃から親にハードを与えられていじって遊んでいて…」というように、幼少の頃からコンピュータに深い馴染みがあることを知って「ああ 自分のケースとは合わないな」なんて思ったり
ウィザードと呼ばれている人達の論文を読んでは「もっとコンピュータに詳しくなろう」と思い立って、
Web系にも関わらず 何の脈絡も無く、突然 SICPや分厚いアルゴリズム本をかじり出しては途中で挫折したり、
( 学習した事が現実的にどういった形で結びついているのかわからないから現実感が湧かない )
そんな事を繰り返していた。
正直、「プログラマとして成長をするには何をするべきか」なんて考えている時点でナンセンスだなというのはよくわかっている。
考えている暇があったら情熱や好奇心に突き動かされてどんどん探検していくべきだっていうのもわかっている。
分かっているけど、ずっとどこか腑に落ちないままモヤモヤしたままだった。
というわけで「これではいけない」と思い直し、成長が遅い自分に対する反省の意味も込め、自分の中で「成長する人」の定義を文献を参考にしたり先輩に聞いたりしてはっきりさせてみた。
結果、以下の結論にたどり着いた。
学ぶ技術を現実の具体的なシーンに落とし込み、
何らかの目標達成に結びつけることができているかどうか
プログラマとして成長の遅い自分の場合
「Jenkinsを勉強してみよう」
「ドメイン駆動設計をやってみよう」
「アルゴリズムを勉強してみよう」
「デザインパターンを勉強してみよう」
この背景にある思いは、「とりあえず勉強すれば何となく技術力が上がりそうだから」。
このモチベーションで勉強すると、学ぶのに時間がかかるし、モチベーション維持が難しいし、身になりにくい。
プログラマとして成長の速い人の場合
「今 実際にこういう問題に直面していて、この技術が必要になるからこの技術を勉強する」
実際に自分の周囲の成長するエンジニアを見ると、個人の趣味の延長線上での技術的な問題であれ、組織やチームの中での技術的な問題であれ、継続的に 具体的で「頑張れば解決可能なレベル」の課題を設定している。
また、「目の前にある技術的な問題を解決する!」という強い動機を組織の制約無く「個人」で持ち続けるのは難しいけれど、そこもしっかりとできるように うまく自分自身に仕組みづくりができているような気がする。
例えば ハッカソンに参加したり、LTで発表してみたり、実際にプロジェクトを立ち上げてシステムをつくってみたりする中で新しい技術を取り入れてみたり。
純粋に興味とか好奇心とか情熱とかに動かされる 成長の速い人って、
無意識的にうまくそこら辺の課題設定ができてるんじゃないかな。
じゃあ、とりあえず「課題設定」すれば良いの?
何でもかんでも課題設定すれば良いというわけでもない。
以下はアメリカの行動心理学者 アトキンソン氏の数式。
「モチベーション= 動機の強さ × 主観的な成功確率の高さ × 成功報酬の価値の高さ」
これに照らし合わせて考えると、
「モチベーションの高さ = 基となる目標達成への意欲・情熱の強さ × 自分の現在のレベル観 × 達成後のイメージの明確さ」
みたいな感じになる。
自分にとって難しすぎる課題(現在の技術レベル・分野とはかけ離れた課題)を解決しようとすると、
よほどその課題が具体的で且つ、その特定の課題解決に対する執念が無いと厳しい。
ヘタをすると「何となく将来に結びつきそうだから」に陥りかねないし、
そうなってしまったら「とりあえず勉強すれば何となく技術力が上がりそうだから」の状態と変わりなく、モチベーションの維持も難しい。
だったらまずは自分に近い所から着実にレベルアップしていって、困難な課題の詳細が具体的にイメージできる状態になってから臨んだ方が良い。
というわけで、個人で技術を高めていく場合は 現状の自分のスキルセットに近しい分野から課題設定をしてアウトプットをしていくと良いかもしれない。
例えば…
いきなり「プログラミング言語」→「アーキテクチャ」に飛ぶのは現在のレベル観から考えて少し難しく、
アーキテクチャに対する具体的な課題もイメージしづらいため、
「プログラミング言語」→「フレームワーク」→「MVC」→「アーキテクチャ」
というように段取りを踏んでいきながら 各地点で課題設定・解決を行っていく…という具合である。
要点
・学ぶ技術を現実の具体的なシーンに落とし込み、何らかの目標達成に結びつけることができているかどうか。
・まずはイメージ可能な具体的な問題として落とし込めるレベルのものを課題として設定して、それを解決していく。
・個人で技術を高めていく場合は 現状の自分のスキルセットに近しい分野から課題設定をしてアウトプット。
追記
読んでみれば「なんだ、こんなもの当たり前じゃないか」という感じですが、自分自身 文章にするまでずっとモヤモヤしていました。もし同じような事で悩んでいる人がいたとしたら、その人達の助けになるよう記事として残します。
また、これはプログラマ1年目の戯言です。
ご意見・アドバイスがございましたら随時コメント頂ければ幸いです。
Written by Nisei Kimura ( 木村 仁星 )