仕事ができない感から完全脱却してみる
わたしは未だに自分が「仕事ができない」感がある。いや、たぶん思い込みじゃなくて、本当にそうだと思う。周りと比べても意味はないのだが、明らかにプログラミングのスピードが遅いし、ソリューションや思考の精緻さに欠ける。アメリカのテックカンパニーの人員削減が盛んだしいつ首になってもおかしくないと思う。
「向いていない」エンジニアへのあこがれ
アメリカで自分がしたかったことは、今度こそ胸を張って「エンジニアです」といえるようになること。何かを作れる人間になること。これは今までの人生で一度もかなっていないことだ。だから、正直なところ「向いていない」と自覚している。
だから、自分と一緒に働いているVincentに聞いてみた。彼は私よりずっと若いけど仕事をしっかりできる。私よりずっとプログラミングも素早いしロジックをよく覚えているし、複雑なリファクタリングもこなせる。
同僚の要領を得ない回答
彼にどうしたらそういうことができるか聞いたら「このリポジトリをずっと触っていたらできるようになりますよ」と言っていた。わしは同じことしても全くそうなってへんのやけど。
実は同じようなことをほかの同僚に聞いたこともあるが、要領を得たことはない。彼らはなぜ、自分が「できる」のかあまりに自然でわからない様子だ。
転機は突然に訪れた。何とかしないといけないということで、最近は自分の時間をすべてプログラミングに費やしていたのだが、やはりうまくいかない。根本的な何かが間違っているという感覚だけがあった。
そんなとき、毎日見ている Tomo Fujita というギタリストの動画を見た。彼はバークリーで世界一流のミュージシャンにギターを教えている世界一流のギターリストで講師だ。
- Tomo Fujita USA Website (tomojustfunky.com)
「なんとなく」できているから
世界の5本指に入ったことのあるとんでもない人なのだが、彼がレッスンのビデオの中でうまくギターが弾けていないことについて次のように語っていた。
そのあとに彼が勧めていた練習方法は、たくさんのギターの教本に乗っている方法だった。ギターを置いて、両手をつかって、アクセントをつけながら、ものすごくゆっくりのテンポから、三連符の頭、真ん中、お尻、それぞれにアクセントをつけて手を叩くこと。
自分は「あああああああ、これだぁ」衝撃的な感覚を感じた。なぜ衝撃かというと、それは、きっとギターを弾いたことある人ならみんな見たことある、誰でも知ってる練習方法だった。で、自分はそれ出来ているの?
「簡単な」ことが出来ているだろうか?
昔の自分は「そんなん簡単や」とおもって、ちょっとやってみて「ああ、できるわ」とおもってちゃんと練習したことはなかった。でも、今改めてやってみるとテンポ40でもちゃんとやろうとしたら難しい。すぐにできない。「なんとなく」だったら「出来た風」に感じるかもしれないけど。
これは自分のギタープレイにも表れている。自分は速く弾くのはできる。でも、リズムがちゃんとしていないので、簡単なストロークでも、気持ちいい演奏ができない。つまるところは、誰もが知っている「基礎」がちゃんとできていないのだ。そして、「基礎」をちゃんとやるのは「誰でもできる」ことだけど習得には「時間が掛かる」のだ。
Googleプログラマ
振り返ると自分のプログラミングも全く同じ現象だった。自分は、簡単なコードは「簡単や。すぐできる」と思っていた。実際プログラムはかけるけど、覚えていないからGoogleでサーチして、「こんな感じ」でコーディングする。一応ものはできる。でも次回も調べる。多分。で、そのプログラムって本当に「できた」んだっけ?
思えば同僚はみんな、ややこしい構造でもすぐ理解できて、まるでピアノを弾くようにコーディングする。彼らのコードレビューするときに、アトミックになってなかったり、もっとこうしたほうがクリーンコード的にいいよと思うこともあったが多分私は彼らより「時間はかかるけど、やろうとおもったら誰でもできる基礎」ができてないのでは?
新たな作戦
そう思った自分は次のように作戦を変更した。
・定時後や、週末にプログラミングをするのは変わらないが、仕事はしない
・C#の言語仕様を勉強する
・LeetCode(コーディングインタビューの準備のためのサイト。プログラミングの問題が出題されて、鍛えることができる)を一番簡単なレベルから毎日やる
時間は誰もが24時間だから、時間の割り当てを変えるのが重要なので、私は今後も当面はプログラミングを最優先する。ただ、単に同じことをやっていても自分の「プログラミングが遅い、精緻ではない」という問題の解決にならない。だから、仕事をするのではなく、自分のフリーの時間に、「誰でも知っている方法で、プログラミングを0から勉強しなおす」という作戦をすることにした。
改めてプログラミングを「はじめて」みる
自分が今、C#のプログラミングを全く知らないとすると、何から始めるだろう?おそらく、チュートリアルから初めて、データ型や、キーワード、クラスなど誰でも知っていることを勉強していくだろう。
だから、自分も「簡単だ」と馬鹿にせず、本当に1からやり直してみた。すると、自分が「ふわっと」わかっているけど、「ちゃんと」理解していなかったり「即座にコーディングできない」ことがたくさん見つかってきた。
だから私はあわてず、急がず、期待せず、先ほどの Tomo先生が言われるように、一つ一つ読んで、コードを書くようにしている。
出来るようにする練習
また、コーディングインタビューを受けたときに半年ぐらい準備したLeetCodeも、最も簡単なBeginnerがやるコースから始めることにした。知識だけではなく、「出来るようにする練習」が必要と感じたからだ。
以前は、コーディングインタビューを突破するためだったので、受験勉強のような感じで「出来ればいい」というノリだったが、今は1問に時間をかけて、できた、じゃあ、これLinqで同じことしたらどうなるかな?とか考えながら複数の解法でとけるようにしたり、メモリや速度の違いを見たりしている。以前やったときは、必死で正直つらかったけど、今は簡単なことからやっているので、なんだかとても楽しい。
基礎が出来ている人は少ないのかもしれない
人生もうすこしで52年だけど、振り返ってみて「人生、この秘密さえわかれば人生一発逆転」みたいな都合の良いものはなかった。結局のところ、誰もが知っていることの積み重ねなのだ。そして、自分の同僚が「できる」ことに関して要領を得ないのは、きっと彼らからしたら「誰でも知っている、どこの本にも書いている」ことを普通にして普通にできている」からだろう。
そして、今更思うことなのだが、誰でも知っていて、実際にじっくりと時間をかければ誰でもできる「基礎」をちゃんと出来ている人というのは少ないのではないだろうか?もしかすると、これが自分が長年探し続けている「出来ない感」の解決の最後のピースではないだろうか。
継続して様子を見てみよう。