give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

プログラミングを学ぶにあたって詰まったこと 〜ソニックガーデンの伊藤さん編〜

Twitterとかを見てると、最近「プログラミングを学ぶにあたって詰まったこと」というテーマのブログ記事をよく見かけるので、僕もちょっと書いてみます。

僕が今まで「プログラミングを学ぶにあたって詰まったこと」と言えば・・・う〜ん、これと言ってぱっと思いつかないんですよねえ、プログラミングの学習自体においては。

この理由としては、

  • 辛い思い出は全部忘れた
  • 少しずつ階段を上ってきたので苦労しなかった
  • 苦労を苦労と感じなかった
  • 簡単なことしかやってないので実は何もスキルが付いてない
  • 実は天才だった

のどれかなんじゃないかと思います。はい。

強いて言うなら、SIer時代に「次はJava案件をやるからオブジェクト指向を勉強しといて」って言われて、Javaの本を買って読んだけど本を読んでもオブジェクト指向が全然ピンと来なかったことぐらいでしょうか?

しかし、この件も今思えば、「オブジェクト指向を勉強しといて」と言われた割には、結局その案件の中身はVBの焼き直しみたいなコードばかりで、オブジェクト指向の知識はさほど要求されませんでした。なので、別に何も困らなかったんですよね。

オブジェクト指向に関してはその後、めっちゃ面白いJava案件に2つほど巡り会い、優秀な先輩プログラマの手ほどきを受けながら楽しく勉強できました。
そこで「オブジェクト指向、めっちゃ面白い!」となったので、それからは自分でオブジェクト指向関連の本をめっちゃたくさん読みまくって「オブジェクト指向、完全に理解した」っていうぐらいになりました(笑)。
僕はこんな感じでオブジェクト指向を習得したので、「大変だった」「苦労した」という記憶はあまりありません。

ところで、先ほど半分ふざけたような「理由」をいくつか挙げましたが、これってふざけているようで実はホントなんじゃないかと思ったりします。

辛い思い出は忘れた

まあ、これは文字通りです。
もしかすると苦労してた時期もあったのかもしれませんが、今となっては「これ」という記憶が思い出せません。

少しずつ階段を上ってきたので苦労しなかった

最初に入ったSIer時代は「ちょっとずつ難しい課題」を与えられていた気がします。
そのぶん、成長の上昇カーブは緩やかだったかもしれませんが、ひいひい言いながら階段を上るような苦労をした記憶はありません。

苦労を苦労と感じなかった

プログラミングって楽しいんですよね。
新しい知識を学ぶのも面白いし、「よっしゃ動いた!」っていう感覚を味わうのも楽しいし。
僕は昔からプログラミングをクイズを解く感覚でやってきているので、「わかった!」とか「解けた!」っていう喜びを感じると、それまでの苦労はすべて吹っ飛ぶのかもしれません。

簡単なことしかやってないので実は何もスキルが付いてない

これは少しネガティブな理由ですが、ちょっと当てはまってるかもしれません。
コンピューターサイエンスとか、機械学習とか、そっちのガチの数学の知識が必要になりそうな領域はほとんどやってないんですよね。
もしそういう知識を習得しようとすると、「楽しい楽しい」ばかり言ってられなくなるかもしれません。

実は天才だった

一番ふざけた理由ですね(笑)。
まあ、天才は言い過ぎだと思いますが、でも僕は昔から学校の勉強は得意な方だったんで、プログラミングの学習もまあまあスムーズにできてるんじゃないかなーと思うことはあります。
学校の勉強をこなす感覚でプログラミングの学習を進められているというか。
ただし、文系出身なので、さっきも言ったように理系レベルの数学の知識を要求されると刃が立ちません😅

プログラミングの習得以外で苦労したこと

上で述べたように、プログラミングの習得ではあまり苦労した記憶はないのですが、これまでの仕事を振り返ると「いやあ、あれは大変だったなあ」と思うことはあります。
たとえば、こんな感じです。

  • 最初に入ったSIerで体験したデスマーチ案件(毎日ほぼ終電、土日も出勤が何日も続いた苦しい思い出w)
  • たちの悪い💩コードを量産しまくるくせに、自分の書いたコードに対してどこまでも自信満々で非常に扱いづらかった前職の同僚
  • ソニックガーデンに入って周りのプログラマに追いつけるようになるまでの2〜3年間

このように、大変だった思い出はいくつかあるのですが、あまり技術的な問題ではありません。
ソニックガーデンに入って大変だった思い出も「ソニックガーデンのプログラマに要求される総合力」が不足していたのが原因であって、「プログラミングそのもの」がボトルネックになってたわけじゃないんですよね。

もちろん、RailsやRSpecの知識が不足していて大変だった、という記憶はありますが、それはあくまで知識量の問題であって、Railsの○○○がなかなか理解できなくて苦労した、というわけではありません。
フレームワークやライブラリのクセに振り回されて実装に時間がかかった、という記憶もありますが、それも結局知識量や経験値だけの話だと思います。

もしこの先プログラミングで苦労する可能性があるとすれば

もうこの年になると「プログラミングはほとんど理解した」と言ってもよい・・・と思ったのですが、「いや、こういうのは苦労しそう」というトピックをいくつか思いつきました。
ひとつは先ほども言ったように、コンピューターサイエンスや機械学習など、数学的な知識やセンスが要求されそうな分野です。

あとは、関数型プログラミングのモナドやC言語のポインタなんかも現時点ではほとんど理解していません。
もしこの先、こういった知識が必要になると、「うおー、プログラミング、わからん!!」と頭を抱えたりするかもしれません。

楽しくできればそれでええやん、という開き直り?

その一方で、コンピューターサイエンスや機械学習、ポインタ等をがんばって今から覚えたいか?って言われると、そうでもないんですよね〜。
もちろん、できて困ることはないし、むしろできた方が絶対良いというのは理解できるんですが、「自分の好きな領域か?」とか「お金を稼ぐため、もしくは自分の中のコンプレックスを克服するため以上のモチベーションが果たしてあるか?」と自問自答すると、「うーん・・・」っていう感じなんですよね。
RubyやRailsは大好きで、(これでご飯が食べられるなら)このままずっとやり続けたい!!って思うんですが。

年齢的にも「この先プログラマとしてどう立ち振る舞っていくか」っていう将来のプランをそろそろ考えなきゃいけないなーと思っているので、ちょっとこのあたりはまた時間があるときにじっくり考えてみたいと思います。

ただひとつ言えるのは、自分の好きなことをやっているときは楽しいし、人から見れば苦労に見えることでも本人は苦労と感じない、ということです。
これはこれで、プログラマの仕事をやっていく上で大切にしなければならない観点のひとつなのではないでしょうか?(と言って、自分がRubyやRailsを続けたい理由を正当化してみるw)

まとめ

というわけで、このエントリでは僕自身の「プログラミングを学ぶにあたって詰まったこと」を書いてみる・・・つもりが、後半はなんかちょっとあさっての方向に議論が飛んで行ってしまいました。

まあ、どこを切り取っても僕の個人的なポエムですが、何かみなさんの参考になる点があれば幸いです😅

2019.1.22追記

そういえば、過去に僕が詰まったことを2つ思い出しました!(やっぱり忘れてたw)
その話を追記しておきます。

Rubyのブロックがわからなかった

僕が一番最初にRubyの勉強をしたのはウサギが表紙のRuby本です。
当時は仕事でRubyを使う予定はなく、個人的な趣味としてこの本を読んでいました。

プログラミングRuby―達人プログラマーガイド

プログラミングRuby―達人プログラマーガイド

この中にたしかこんなコードがブロックのサンプルコードとして載っていた気がします。

3.times do
  print "Ho! "
end
#=> Ho! Ho! Ho!

しかし、これだけ見ても「ブロック」が何なのかよくわかりませんし、それまでJavaでfor (int i = 0; i < array.length; i++)みたいなコードばかり書いていた僕は、このコードがループ処理になっていることすら想像が付きません。
しかも出力しているのが"Ho! Ho! Ho!"で、そもそも「"Ho! Ho! Ho!"って何やねん?いったい何がしたいねん??」というところから意味がわかりませんでした。(これがサンタクロースの笑い声だと知ったのは、これよりあとの話です)
結局この本は最初から最後まで「ブロックがようわからん」と思いながら読んでいた記憶があります。

・・・という思い出があるので、僕が「プロを目指す人のためのRuby入門」(通称チェリー本)を執筆したときは、当時の自分でも理解できるようにブロックについてできるだけ詳しく説明しました!!

f:id:JunichiIto:20200122072800p:plain
「プロを目指す人のためのRuby入門」4.3.2項より抜粋

RailsのルーティングとRESTの概念がわからなかった

僕がRailsを使って初めてのサンプルアプリを作ろうとしたときの話です。
何かデータをCRUDする画面を作ろうとしていたと思うのですが、

  • 新規登録はcreateアクションで、HTTPメソッドがPOST
  • 更新はupdateアクションで、HTTPメソッドがPUT/PATCH
  • 削除はdestroyアクションで、HTTPメソッドがDELETE

という関係になっていることがわからず、「えっ、えっ、どうしたらデータを更新できるの??世の中にはGETとPOSTの2種類しかないんじゃないの??」「えっ、REST?RESTって何??」といろいろ混乱した記憶があります。

しかもRailsのルーティングって、これだけでCRUDで使う5つアクションを定義できちゃうんですよね。

resources :users

これにもビックリ、というか、「routes.rbを見ても何が定義されているのかさっぱりわからん!!」と思いました。

それまでずっとStrutsを使っていて、StrutsはRESTの概念がない&アクションの定義はすべて明示的に行うWebフレームワークだったので、いろんなことが暗黙的に決まってしまうRailsの考え方に、なかなか付いていけなかった記憶があります。


あと、このエントリに書いた「僕があまり苦労しなかった理由」をもう一つ思いついたので、それも書いておきます。

わからないことはそれが必要になるまで後回しにしていた

これは比較的最近のアプローチなのですが、何かを新しいことを学ぶときに2〜3回考えてもよく理解できないことがあれば、諦めてさっさと次に進む、ということもよくやっています。
で、実際にその知識が必要になったときに、もう一度そのポイントを勉強し直します。
必要に迫られたときが一番モチベーションが高く、学習効率が良くなるので、遅延評価もしくはJust in Time(JIT)方式で勉強するのも意外とオススメです。

この学習方法については以下のエントリで詳しく説明しています。
blog.jnito.com

今回の追記は以上です!