見出し画像

プログラミングの上達の為に努力を一切辞めてみる

実際にうまくいくかは全くわからないのだが、タイトルのことを試してみようと思っている。

私はサーバーレスのプラットフォームを作っているチームに所属しているが、周りにはスーパースターのようにコーディングが出来る人がゴロゴロいる。自分もそうなりたいので必死に頑張ってきたのだが、1年目を目前にして、自分があまり進化していないことに気が付いた。これは何かを変えないといけないサインだと思った。

1年を過ごしてみて良かったことは、自分的には相当無茶なチャレンジなので、まずサバイバル出来ただけでも自分を褒めてあげたい。自分のキャリアは、コンサルタント、PM、エヴァンジェリスト、DevOps という感じなので、プログラマもやっていたが、正直プログラミングスキルは褒められたものではない。だから、このチームに入ったのだ。

2週間のスプリントの中で何とか成果を出そうと頑張って、気が付いたら自分の時間のほとんどを仕事に使っていることに気が付いた。正直相当疲労も溜まっている。これは、誰かに言われたものではなく、自分が不安だから自分がやっているだけなのだが、自分でももうやばいと感じ始めた。

最初の対策

自分の強みを考えたときに、PMやコンサルは長年やってたけど、そのスキルは今のソフトウェアエンジニアのロールでは役に立たないと思っていたが、そうでもないらしいと分かってきた。アメリカのかどうかわからないのが、自分のチームの場合、ストーリはいつもあいまいで、そのあいまいなストーリを明確化するのは、自分のロールだ。だから、PMとか、コンサルをやってた時のスキルはそういうところで使える。

自分マネージャを雇う

だから、プロアクティブにマネジメント出来る人は喜んでもらえる感じなので、自分もスキルを解禁することにした。自分をマネジメントする時間を設けると同時に、自分を客観視する「自分マネージャ」の人格を作ることにした。私は自分でいうのもなんだが、めっちゃ努力だけはする。ただ問題はいつも、どんなに頑張っても普通の人のように「出来るようにならない」だった。だから出来なかったら時間をぶち込むのみというノリで出来るまで頑張る。自分はなんてダメなんだといつも思う場面。ここで、自分の別人格の、「自分マネージャ」から、牛尾剛君を第三者視点で評価して指示を与えるようにした。

自分へのフィードバックを自分で作る

そうすると、「こいつ、成果は出てへんけど、がんばってはいるよな」とか、「こいつ疲れてるから、そろそろ休ませんと効率明らかに落ちてるやん」とか、「こいつは、自分で出来へんと思い込んでいるけど、それは努力のせいやなくて別の要因だから、システマティックに解決すべきやな」とか、「わしがマネージャやったら、こんな遅くまで仕事させへんわ。効率わるいし」と、自分視点でない見方をするようになった。結構気が休まるようになった。無理をすることも減っていった。

プログラマはスピードが重要

しかし、アメリカでプログラマをやっているとコードを書くスピードが重要だと思い知らされる。誰も早くかけとか、締め切りとかうるさく誰も言わない。ただ、コードが早くかけると、面白い仕事がそいつに回ってくるからだ。「ああ、こいつこれが得意やから、この人にやってもらおう」的なノリだ。だから、面白い仕事をしたかったら、「この分野わし出来るで~」というのをコードで証明しないといけない。自分の技術的な強みといえば、DevOps 関連技術やコーディングとか、Application Insights のコーディングとか、自分のチームにはそんなにいない Go や、 k8s のコーディングが出来るところだろう。しかし、私はそんなコードを書くのは早くない。どうやったら同僚の2倍のスピードで価値あるプルリクエストを量産できるだろう?

完全に正反対のアプローチをとる

自分は「技術イケメンプログラマ」の友達が沢山いる。彼らを見ていると、自分との「違い」を感じる。それはキャリアとか純粋な腕とかではなくて、元も子もない「センス」みたいなものが全然違うと感じている。でも、頭の良さがそこまで違うとは思えない。(たまにものすごいのもいますけどw)

自分は今までクソほど努力しているのになぜか何も出来るようにならない。プログラミングも何十年とやっているのに、こんな程度だし。多分コンピュータサイエンス出てる人に一瞬で負ける感じ。1年やってもダメなのだから多分何かを変えないといけない。そこで考えたのが「努力」だ。自分が唯一の利点と思っている「努力」そして「アウトカム」を求める姿勢。これが、プログラミングの上達を阻害してるという仮説を立ててみた。

技術イケメンの研究

技術イケメンの皆さんの行動や言動を観察してきたが、どの技術イケメンを見ても、しんどそう、とか、追い詰められてそうみたいな人はいない。プログラミングを楽しんでいるし、焦ってないし、ゆったりしているし、他の人生も楽しんでいる。めっちゃ努力しているでという人もいない。好きやからやってるだけやでみたいな感じ。

一流を目指すのをやめる

やはり一流が周りにいると、「自分も一刻も早く彼らのようにならなければ」ととっても焦った気持ちになる。でも、残念ながら自分の実力では、明日から自分がクリスや、しばやんのようにはなれない。1か月後でも1年後でも無理だろう。それをまず受け入れることから始めないといけない。でも5年後なら彼らほどでなくても良いプログラマーにぐらいならなれるかもしれない。自分が今からすぐに彼らみたいになろうとするからしんどくなるわりに、無理しているので成果が出ないのかもしれない。

だから、自分はまず自分の今のレベルから、1歩上をまずは目指すことにする。

しんどいことは多分間違っている

先に、先に進もうとすると、実は実力が身に付きにくい。極端な話をすると、コピペは瞬間生産性最強だが、意味も考えずコピペをしていたら、実力は全く身につかないし危険であるし、毎回ググるしかないから、中期的な生産性が向上しない。

自分が出来ているレベルを四分割して考えることにした。

Level 1 :  自分が何もググらずにすっと実装できる
Level 2:   問題をどう解決するかはすぐに思いつくが、具体的な方法は忘れて
    いるので、ググる必要がある
Level 3:   自分は解法を知らないが、スパイクソリューションをしたら出来そうなもの
Level 4:   自分だけでは、解決が難しい、もしくはものすごく時間がかかるもの

今までは、Level 4を出来るようにならねば、、、というのが焦りがあるので必死にやるのだが、自分がやると1日つぶれたり、それでも理解が中途半端だったりする。正直この時は自分の出来なさ加減もあって、相当つらい気分だ。そして、成果も出ない。これは、自分が問題に対して実力不足すぎるパターンだ。そういえば、プログラマの生産性を今のマネージャに相談したらこんなことを言っていた

最初は慣れないリポジトリをやり始めると2時間かかってしまうだ。でも、3か月もすると5分で終わるようになるよ

なるほどと思う一方、私は4時間、いやもっとかかるんですけど、、、と内心思ったりした。じゃあ、彼女と私の違いは何だろう?自分はエヴァンジェリストやコンサルが長いせいか、Level 2 の知識は結構あったりする。例えばリフレクションとか、動的クラスローディングとか、コンカレントなプログラミングのコンセプトも「知っている」が「Googleが必要」である。
 最近生産性とは、いかに「Level 1」を増やすかということの気がしている。Level2 がそこそこある私の場合、Level 3 や Level 4 の増加よりも、Level 2 を Level 1  に持っていくことを考えたほうが生産性が実は高いのではという気付きだ。

楽しくないことは何かがおかしい

そして、プログラマは怠惰であるべきという言葉があるが、自分が「楽しくなくて、苦しい」と思うときは、「無理」があるサインだろう。自分のレベルにあってないことをやっても上達しない。

人生で多分唯一「出来るようになった」ギターの例を考えると、究極のコツは「他の人がびっくりするようなスローなテンポ、自分がここちよく弾けるスピードでメトロームと一緒に練習する」と要約できるのだが、プログラミングに当てはめると、自分が心地よく弾けるテンポではければ、もっと遅いもので練習すべきだ。つまり、プログラミングの場合、Level 1 の自分がコントロール感覚があり、いつでも書けるものをゴリゴリに増やしていくといろいろいいことがあるのではと気が付いた。自分が何も見ずに心地よくコーディングできるものを増やす。コントロール出来るのを増やすのだ。

脳の負担を減らす

プログラマの生産性に必要なものとしては、コードリーディングの正確さとスピードもあると思うが、こういうことをやるときに、頑張るのではなく、いかに「自分の脳の負担を減らすには?」と考えるのが良いのかもしれない。コードリーディングが遅い原因は、コードを見たときにどういう挙動をするか明確にすぐにイメージできないから、もしくは構造の把握が下手であるということがあるかもしれない。Level 1 のものが増えるとおそらく脳の負担は激減する。例えば、Forループの挙動に対して自信が持てないとかないだろう?だから、ループを見ても一瞬で理解できる。そういうのを他のコーディングにも広げていけばよい。そしたら、脳の負担が減るから、もっと重要で細かい部分に目が配れるようになるだろう。

 後者の構造の把握は、パターンやイディオムや、その言語のライブラリの癖に慣れてくると理解するスピードが上がるかもしれない。だから、重要なことは、自分がしんどいと思う「努力」は一切辞めてしまうこと。自分でも怖いけどしばらくトライしてみようと思う。

Level 3 と Level 4 の解決策

Level 3は素直にラーニングコースとかでさっと学んでしまうのが良いだろう。問題は4だ。どうしたらいいだろう?やらない。も一つの選択だ。自分には手に負えないと認めてしまって、その分野のラーニングコースをやってみると底上げされて Level 3 に降格してくるれるかもしれない。もしくは人に頼ってみるのも良いかもしれない。重要な問題は「今の自分では解けない」としっかりあきらめること。自分のレベルが上がってくるといつの日かそれが、Level3になっているかもしれない。しかし、今の自分がやるのは時間の無駄だ。割り切って他の部分で生産性を最強にしてやるぜ。

まとめ

今の自分には無理なものがあるのを認めて、そこは手をつけず、自分の Level 2 の知識をいかに Level 1 に落とし込んでいくのがに注力する。努力や、頑張るのではなく、楽しく、自分の脳の負担を減らすにはどうしたらいいかを考えて怠ける方法を考えることにしてみる。どうなるかはお楽しみ。


この記事が気に入ったらサポートをしてみませんか?