フューチャーアドベントカレンダーの3日目のエントリーです。昨日は@ma91nさんのテックリードから先のマネジメントロールを経験してみてでした。
「プログラミングの技術を磨き続けよう」「アウトプットが大事」「趣味でもコードを書こう」とか、いろいろなアドバイスが溢れる昨今ですが、何をするにしても第一歩でひっかかるのが「ネタ選び」です。ネタ選びの戦略はいろいろあると思いますが、僕なりの方法とか、僕が選んではないがこうすればいいのでは?といったことを紹介します。
ネタとは
学校の授業やら宿題やらはカリキュラムが決まっています。その与えられた課題、あるいはこれからやるとわかっている課題をいかにうまく乗りこなすかが評価のポイントとなります。
一方で、趣味の勉強とかは「何をやるか」から決める必要があります。夏休みの自由研究とかが近いかもしれません。手っ取り早い方法としては、入門書に沿った学習やら、資格試験などがあります。しかし、これでは周りとは差が出ないです。社会人の勉強は「他と一緒」よりも「差別化戦略」であると思います。もちろん、市販の書籍でも、最後まできちんと到達して実際に手を動かすだけでもレアな本(OS作るやつとか)とか、同一ジャンルの書籍を全部網羅した!とか、資格試験もAWS全部突破した!とか突き抜ければ差別化にはなります。一方で、最初から差別化を目的としようとしてもうまくいかなかったりするところが難しい点です。
自分のモチベーションのメカニズムを知る
次のブログエントリーは12年ほど前に書いたものです。
ストレングスファインダーとかが有名ですが、さまざまな「性格分析」手法が世の中にあります。自動車免許を取りに教習所に行った人は何かしらの適性検査を受けた経験があると思います。世の中の人の「思考のクセ」を統計的にバラけるように質問リストを作り、それに回答することで自分のクセがわかるというものです。「思考のクセ」は「性格」とも言えます。その手の書籍を見たりとか、今までの経験とかを考察して、まず自分が何に喜びを感じるのか、というのを知るのが大切です。自分に合わない方法を続けてもストレスです。趣味の勉強でストレスを感じては意味がありません。
もう絶版になってしまっているし、元のウェブサイトも消えてしまっているので(アーカイブは見れます)、上記のブログエントリーで紹介している手法を学ぶ手段はないのですが、上記の性格分析だと、優劣に喜びを見出すタイプ、他の人に喜んでもらうのに喜びを見出すタイプ、収集に喜びを感じるタイプ、自分の道を追求するのに喜びを見出すタイプがあります。僕は3つ目と4つ目のハイブリッド型ですね。まあどのような分析法でも、何かしらの自分の特徴が出てくると思います。
それぞれのタイプごとに最適な手法、自分がストレスを感じずに続けられる手法を選びます
- 優劣に喜びを見出すタイプであれば、競プロとか、資格試験の攻略など
- 他の人に喜んでもらうのに喜びを感じる人は、勉強会の開催やコミュニティ運営、OSSへのコミットなど
- 収集に喜びを感じる人はでは資格試験や、さまざまな言語の網羅を目的とした勉強など
- 自分の道を追求するのに喜びを見出すタイプは、自分の理想とする世界を実現するコードをひたすら書く、競プロのスコアアップなど
この中で、同じ対象のものがいくつか出てきていますが、同じ対象でもそれに向かうモチベーションが変わります。誰かを打ち負かす、全体の中で何位になったか、という気持ちで競プロに参加してもいいし、自分のスコアを淡々と上げて競プロの総合ランクを上げていきたいという気持ちで競プロに参加してもいいし、同期の仲間と一緒に競プロに参加するのを楽しむという目的で競プロに参加してもいいし、同じ対象でもそこに向き合うモチベーションが何かを把握するのが「持続」には大切です。
↑みたいに考えること自体が「自分の道を追求する」タイプな気もしますが、一年に一日、このブログを読んでいる時だけでも自分のモチベーションに思いを馳せてもらえると、いつもと違う新年が迎えられると思います。
自分がかつて好きだったものを思い返してみる
自分がモチベーションが上がるクセ(性格)がわかったら、次にターゲットを考えていきます。まあこちらを先に考えてもいいです。
僕は以前夢中になったのはBeOSというOSです。マイナーOSなので、ソフトウェアを自分でビルドしたりコードを直したり、あるいはゼロから移植しようとしてみたり、いろいろチャレンジしました。1つのソースでいろいろなところで動く、というポータビリティの高さ、というのが僕の中で価値みたいになりました。それはWindowsとLinuxで同じように動くPythonにのめり込んだり、ネイティブコードになってくれるのにクロスコンパイルも得意なGoにハマったりしたのに繋がったと思います。クロスプラットフォームなGUIフレームワークを作ってみたり、React/Angular/Vue/Svelteで動くWeb UIコンポーネントを必要ないのに選んでしまうのは、BeOSの呪いだな、と我ながらに思います。
もう1つは鉄道模型ですかね。Nゲージ。鉄道好きには色々なベクトルがあって、ダイヤの本を読むのが好きな人、実物が好きな人、乗るのが好きな人、写真を撮るのが好きな人、といるのですが、僕はそれらはあまり興味はないもののスケールモデルは好きです。大きな本物ではなくて、小さくエミュレーションしたのが好きということで、クラウドそのものは興味はないが、Dockerとかを使って手元で動くサーバーレスな検索エンジンを作ったり、というのに繋がってますね。だいぶ前にMessageQueueとかを昔作ってみたりもしました。実際にできたものを本物のクラウドサービスで動かすのはあまり興味はないんですけどね(検証のためにGCPとかAWSで走らせたりはする)。これも、死んだじいちゃんに買ってもらった100系新幹線のNゲージの呪いだな、と我ながらに思います。
アイキャッチの写真はアメリカ旅行にいったときに見つけて買ったNゲージの車両と、スーパーで売ってた鉄道模型のレイアウト集の雑誌です。定年退職したらレイアウト作るんだ・・・
どういう対象が好きが分かれば、モチベーションを比較的保ちやすいと思います。あとは、興味がないパターンも明確にわかっているとモチベーションが下がるのを防ぎやすくなります。
上記のパターンは完全にソフトウェア単体の興味ですが、もし他に趣味があって、それを補助するシステムを作ってみたい!みたいなのはありかと思います。あとは、内部起因のモチベーションではないかもしれませんが、業務を楽にするシステムとか、業務で使うかもしれないライブラリを試食してみる、というのもモチベーションを引き上げるのに使えたりします。
勉強のペースを保つ仕掛けを考える
人間の記憶力は永続化されません。アウトプットを何かしらの形にしておくと、忘れてしまっても思い出せるようになります。
最近はここの技術ブログに書くことも多いですし、ソフトウェアはソースコードという形でgithubとかにPushしたり、勉強会で発表したり、ですね。勉強会はオープンな勉強会もあれば、社内の勉強会もあります。
技術ブログではよく連載企画をやっています。GoConの発表にもエントリーしたりしていますが、こういうのに手を上げて、締切を作ってしまうとモチベーションが高まります。うっかりゲームをやって一日が終わることもなくなります。今みなさんが参加しているアドベントカレンダーもそうですね。
最後に残すものをイメージしながら手を動かすのが良いです。
まとめ
まとめてしまうと面白みはあまりないのですが、3つの要素を紹介しました。
- モチベーションを発生させる
- モチベーションを維持する
- 記録に残す
実際にはこれらは独立したものではなくて、順番も上から綺麗にはまることもないと思います。例えば、Goの勉強会で発表したいから、Goを使ったネタを探そう、みたいな最後がスタートになることもありますし(3→2)、Goの中をとことん突き詰めてみよう、というところから書籍になってみたり、HTTPのヘッダーを調べているうちに書籍になってみたり(1→3)、パターンはいろいろありますが、なんとなく振り返ってみると、自分のモチベーションのパターンにはまっているな、ということが多いですね。
「本を読んで勉強しました」ではなく、自分なりの個性がついつい発揮されてしまう勉強のネタ探し、ぜひ来年の勉強で参考にしてもらえるとうれしいです。
明日は@k-hndさんです。