wakasa5の日記

駆け出しエンジニアの勉強録

Railsを学び始めた1年で学んだこと、得たこと

こんばんは!


12月も中旬になり、2018年ももうすぐ終わりですね。今年は1月にエンジニアに転職し、大きな変化を迎えた年でした。


さてRailsを勉強し始めて今月で一年が経ちました。そこで今回はRailsを勉強し始めて1年、エンジニアになって11ヶ月が経ったということで、どういうことを学び、何ができるようになったのかを書いていこうと思います。


エンジニアになったばかりの人で、どうやって勉強していったらいいかわからない方に、少しでも参考になればと思います。

1年前はどんな状態だったか?

一年前は、前職を最終出社して、入社までの1ヶ月の間、会社からRails Tutorialをやるように言われ取り組んでいました。その時どのような状態だったかというと、下記のようなツイートをしていました。

あまりに知識が不足しすぎてるのか、何なのか、なぜ出来ないのか不明な感じになってきてわけわかめ
4:49 - 2017年12月26日

createの際に何故か一部のカラムがnilになるところで3時間くらい詰まってた…
3:25 - 2017年12月27日

ちょっとRailsが裏側でどう動いてるかの解説本が欲しい…なんでこうなるのかがわかんなくてイライラする…今はtestでモデルのbefore_saveが効かなくて、理由が不明
20:02 - 2017年12月27日

Factory Girlが何故かうまくいかないぞ…Rspecでテスト書いたら、UserモデルはふつうにFactory Girlでテストデータ作成できるのに、Relationshipモデルは何故かFixturesの方からテストデータ持ってきてる…なんでだ…
23:54 - 2017年12月29日

もうRailsの挙動が全然わからなくて、何がどうなっているのかわからない状態でした…

そして入社後すぐの時は、

職場の方々が凄すぎて絶望的なまでの差があるので、途方に暮れながら帰ってたけど、途方に暮れてても仕方ないし、目標立てて、計画立てて、一個一個埋めてくしかないんやなと思った。
4:17 - 2018年1月23日

とあまりの自分のできなさに、先輩エンジニアの方にも、どうしたら周りの方みたいになれるのか、背中が遠すぎてわからないですと、泣き言をよくこぼしていました。。この当時は本当に何をどうしたら、いいか途方に暮れていましたね…


それではそういう状態から、どのように勉強していったか見ていきたいと思います。

Railsやgit、Linuxの基礎を学ぶ(12 ~ 2月)

入社して、すぐの時に困ったのは、

・Rails Tutorialを一通りやったものの、実務で使うにはRailsの理解が全然足りない。

・gitのコマンドも開発フローもPull Requestの出し方もよくわからない。

・Linuxコマンドが何をしているのかも、何をやっているのかもわからない。

ということでした。これは実務をやる上では最低限必要なことですが、スクールはphpJavaでしたし、gitによるチーム開発も全く未経験でしたし、環境構築は先生におんぶにだっこでした。そのためまずはここを勉強しました。


この時は下記のような本を読みました。

改訂3版 基礎 Ruby on Rails 基礎シリーズ


入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)


GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)


を読んでいました。入門者のLinuxは今でもおすすめだなと思いますが、Railsだと今なら万葉さんの、「現場で使える Ruby on Rails 5速習実践ガイド」、gitだと、「わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉」、が良さそうだな〜と思います。


これらの書籍と先輩から丁寧に教えて頂いたおかげで、一応業務をこなすための最低限の基礎の基礎ができるようになってきました。

オブジェクト指向LinuxRubyの理解を深める。Vimを使い出す(3 ~ 6月)

上記を学んだことで、まだまだ先輩におんぶにだっこですが、最低限、業務を進めていくということができるようになってきました。しかし、Qiitaの記事や本にないことはわからない状態で、ネット上に書いていないことを知る必要が業務で出た際に、何もできず先輩に聞くしかない状況でした。


そのような中で、現CTOとペアプロする機会があったのですが、その際にQiitaの記事なんか読まずに公式リファレンスやRailsソースコードを読む癖をつけましょうと指摘されました。


まだエンジニア歴2ヶ月の自分にはそんなことできるわけがないやろと思ったものの、Rubyをしっかりと学ばないとダメだと改めて痛感しました。


そこで読んだのが下記の本です。


メタプログラミングRuby 第2版


Rubyのしくみ -Ruby Under a Microscope-



上記の本は、以前の記事でもご紹介した通り、すごく良い本でした。その結果、Rubyに対する理解が深まり、ソースコードや公式リファレンスに対する抵抗が薄れ、それらをしっかりと読む癖がつきました。


またこの当時、業務を進めていく中で、最低限設計の基礎を知るためにオブジェクト思考を学ばなければいけないと感じるようになっていました。そこで下記の本を読みました。


オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方


こちらは、いわゆる自転車本と呼ばれるもので、自分にとっては少し難解な本でしたが、会社の輪読会と友達との勉強会で繰り返し読むことによって、設計の基礎を学ぶことができました。


今でも設計には苦しみますが、本を読んだことで、自分の中の判断基準となるものができたことで、以前よりはまともなアプリが作れるようになりました。


またLinuxも継続して勉強していて、「新しいLinuxの教科書」を読みました。その中でVimを使っつていたのをきっかけにAtomからVimに乗り換えました。


この頃から、実装については少しずつ一人でも進められるようになってきました。

コンピュータアーキテクチャとインフラへの入り口(7 ~ 10月)


この頃には決められた要件を実装するだけであれば、なんとなくできるようにはなってきましたが、効率的でパフォーマンスの高い実装ができず、そういう点で指摘を受けることが多くなってきました。


しかし、その当時はメモリやCPUの動きについてよくわからず、指摘をされてもイメージができない状態でした。そのためCPUやメモリ、プロセスについて学びたいと思うようになりました。


そこで、まず最初に「Goならわかるシステムプログラミング」を会社の輪読会で読み始めました。しかし、システムプログラミングやコンピュータアーキテクチャ初心者の自分にとっては周辺知識がなさすぎて、腹落ちするまで理解できないことが多かったので、並行して、下記の本を読んでいました。


CPUの創りかた


はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ


32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)


コンピュータの構成と設計 第5版 上・下電子合本版


Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識


上記の本は全て読みきったわけではなく、一部しか読めていない本もありますが、これらを読んだことによって、メモリやCPU、プロセスについての理解が一気に深まり、今までブラックボックスだった世界が少しはイメージできるようになりました。


低レイヤは、最近の実用性重視の風潮では軽視されがちですが、プログラムはメモリやCPU上で動くことがほとんどですし、FWと比べると変化が少ない領域なので、知っておいて損はなく、長期で使える知識だと思います。


またこの頃から社内のインフラも触らせてもらうことが増え、その際にも低レイヤ知識は非常に役立ちました。


インフラはDockerやkubernetesを触っていたのですが、「プログラマのためのDocker教科書 第2版」を読んで、Dockerの基礎的な部分を学び、あとは先輩に教えていただいたり、公式ドキュメントや記事を読んでインフラの業務を進めていきました。

アルゴリズムとデータ構造(10月 ~ 現在)

最近は「みんなのデータ構造」を輪読会で読んでいるので、ずっとアルゴリズムとデータ構造を勉強しています。


最近Atcoderの初心者用のコンテストに参加しているのですが、競技プログラミングはゲーム性が高く楽しいですね。


アルゴリズムとデータ構造もいわゆるCSの分野で、実務に直結するかと言われれば、そうではないものの、こういうデータ構造で作ると遅くなるよなとか、Rubyの内部ではこういうアルゴリズムで動いているのかなどわかって楽しいです。ますますパフォーマンスに対する意識が高くなりました。笑


また、本がC++で書かれているので、C++も勉強していますが、難しいですね…Goを以前やっていなければ、完全に挫折していた気がします…笑

Railsを勉強し始めて1年経って

1年前は下記のような状態でした。

・Rails Tutorialの内容に書いてあることはコピペで書いたりできるが、中身は理解しておらず、書いてないことはわからない。


しかし、周りの方々に教えて頂いたり、上記で挙げた本や他にも様々な本や記事を読み、一年経って下記のことが出来るようになりました。

・Railsの挙動について、公式ドキュメントやソースコードを読むことが苦でなくなり、中身を知りたいと思えば少し知ることが出来るようになった。


・最低限の低レイヤ知識を理解し、キャッシュや処理内容を理解して、メモリやCPUを効率的に使ったコードを少しは書けるようになった。


・Docker, kubernetes, itamaeの各種.yaml/.rbファイルを書けるようになり、先輩のサポートを得ながらだが、ゼロから環境構築出来るようになった。また詰まっても公式ドキュメントを読んである程度は解決出来るようになった。


一年経ってこれだけか、と思う方もいらっしゃると思いますが、自分なりには精一杯やってきた結果なので、個人としては満足はしています。


職場の周りの方々には、いつも助けていただいてばかりで、Rubyもgitもコマンドも全く理解していない状態から、一年でここまで来れたので、本当に感謝しかないです。


とはいえ、エンジニアとしてはまだまだ鍛錬が足りず、設計も未熟だし、フロントエンドFWは全然触れないし、インフラも助けなしでは出来ない状況なので、来年も今年以上に色々と学んで、成長していきたいと思います。


あと自分のエンジニアとしての方向性も定めていかないとな〜と思うので、せっかく年末年始で長期休暇があるので、そこで考えたいと思います。


最後までお読みいただきありがとうございました!
今年も残り少ないですが、良いお年を!