はじめに
この記事で書くこと
1年前 の自分と比較して特に
・これができるようになってよかった
・これは学んでよかった
と思ったことをゆるく書いていきます。
表題の通り、Matcher株式会社 に新卒入社してエンジニアをやり始めてから 1年間 が経ち
「思い返せば、1年前の自分と比べると色々できるようになったな」
「以前と比べて何ができるようになったのか、何を学んだのか整理しておきたいな」
と考えたためです。
僕が勉強するに際して読んだ記事や本も覚えている範囲で一緒に紹介するので
当時の僕と同じく『エンジニア1年目』の方の参考になれば幸いです。
また、僕は特別頭がいいタイプとかではないので
「実務ほぼ未経験でエンジニアになったら、1年後にはこのくらいできるようになるのかな?」
という目安としても使っていただけるかと思います。
現在の筆者について
Matcher株式会社 で エンジニア/ビジネス職 の両方を担当しています。
2021年 に新卒で Matcher株式会社 に入社し、
半年間営業・カスタマーサクセスといったいわゆるビジネス職としての業務をしたのち
エンジニアに転向して現在にいたります。
現在の業務時間の比率で言うと
『エンジニア : ビジネス職 = 8 : 2』くらいです。
フロントエンド (Vue.js) もバックエンド (Rails) もある程度できるようになって
中程度くらいの大きさのタスクであれば 数日~1週間 で消化できるようになった、
くらいのレベル感です。
1年前の筆者について
ビジネス職に半年間従事したのち、エンジニアに転向した直後で
Vue.js, Rails を絶賛お勉強中。
(大学在学中、最後の半年間ほとんど授業がなく
2020/09 ~ 2021/03 までインターン生としてほぼフルタイムでビジネス職として働いていたため
2021/04 の入社時点で半年間のビジネス職経験があり、入社直後にエンジニアに転向という形です。)
プロジェクトファイルの膨大さに慄き、何がどこに書いてあるか分からない、
何から手をつけたら良いやら分からないような状態。
どのファイルを見ればいいか分かったとて、Vue.js も Rails も両方まだよく分からない。
元々学生時代は生物系の学部に所属しており、
プログラミング経験と言えば大学生向けプログラミングコミュニティ『GeekSalon』にて
Unity を用いたゲーム開発を教えていたのと、1年弱 iOSエンジニア をやったことがあるだけだったため
学生時代も含めて Web開発 は個人開発・実務経験ともにほとんどなし。
できるようになったこと・学んだこと
大別すると、以下 4点 です。
① Linux まわりのこと
② Web 関連の基本的な知識
③ RDB, SQL まわりのこと
④ 責務を分離して開発するということ
① Linux まわりのこと
これまでわけもわからずコピペしていたコマンドの数々が
意味を持った文字列として認識できるようになったためです。
以下 3つ のことを知ったことが大きいのではと思っています。
- "コマンドを実行する" とはどういうことか
- "PATH を通す" とはどういうことか
- Linux のディレクトリ構成
--
"コマンドを実行する" とは
つまり "プログラムファイルを実行する" ことで、
"PATH を通す" とは
つまり "プログラムファイルを呼び出しやすくするための工夫" のことで、
"どこにどんなプログラムファイルが置いてあるか" は
ある程度ルールが決まっていて整理されている。
(Linux のディレクトリ構成)
↑ という形で、自分なりに整理して理解できたのが良かったと思っています。
--
とても勉強になった記事・サイト・書籍:
・PATHを通すとは
・Linuxディレクトリ構造
・bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針
・Linuxコマンドを連続して使うには
・「/bin」「/usr/bin」「/usr/local/bin」ディレクトリの使い分け
② Web 関連の基本的な知識
ここ言う『Web 関連の基本的な知識』とは
・HTTP とは何か
・HTML とは何か
・URI とは何か
・REST とは何か
のような知識のことを指していて、
「Vue.js のコードをどう書くか」
「Rails のコードをどう書くか」
といった内容よりも、もっと土台の知識のことです。
これらの内容を言わずと知れた名著
Webを支える技術 -HTTP、URI、HTML、そしてREST
を読んで学び、
気になった点やしっかりと理解しきれなかった点に関しては
自分で調べて追加で記事を読んでみたり、
といった形で少しずつ勉強していきました。
--
これらの内容を勉強して
「コードを書くのが明らかに早くなった」
「これまで作れなかったプロダクトが作れるようになった」
といったわかりやすい変化・成果は出ていないと思います。
しかし、自分がやっていることひとつひとつに対して
「なぜそれをするのか」
「どういう理由でそのようなやり方をするのか」
といった、意味づけがしやすくなり
「なんだかよく分からないけど手を動かしている」
という領域を減らすことができたことは
個人的にはとても大きな進歩に感じています。
--
Web 関連だけにとどまらず
コンピューターサイエンス関連の知識も圧倒的に不足しているため
これからも少しずつ勉強し続けていきたいと考えています。
キタミ式イラストIT塾 基本情報技術者
↑ こちらのテキストは大学で情報系学部にいると学ぶことができるような
基本的な内容がイラストも交えつつとてもわかりやすく書かれているためおすすめです。
特に、僕のように大学時代に情報系学部で勉強していない人にとっては
Web 関連、コンピューターサイエンス関連の基本知識は
一度ざっくりとでも全体一通り学んでおいて良いことはあっても
悪いことはないと、個人的には考えています。
--
とても勉強になった記事・サイト・書籍:
・Webを支える技術 -HTTP、URI、HTML、そしてREST
・キタミ式イラストIT塾 基本情報技術者
・3 Minutes Networking (3分間ネットワーク基礎講座)
・0からREST APIについて調べてみた
・RESTful Web アプリの設計レビューの話
・HTTPリクエスト/レスポンスの構成要素を初心者にも分かるように解説してみた
③ RDB, SQL まわりのこと
元々はビジネス職としてやっていくに際して
「自分で SQL 書いてデータ取り出して分析できた方が楽そう」
という理由で勉強しはじめたものでしたが、
結果的にエンジニア転向後にもその知識が役立っています。
もちろん RDB (リレーショナルデータベース) や SQL には
全く触れたことがなかったためゼロから勉強しました。
結果、3ヶ月間でデータサイエンス100ノックの SQL 演習問題 100問 を解き切り、
実務である程度使えるレベルになることができました。
↑ のロードマップについては別途記事を書いているので
よろしければご参照ください。
→【SQL】『SQL未経験 → 3ヶ月でデータサイエンス100本ノック全問制覇』までのロードマップ (初心者向け)
SQL 全くの未経験だった自分が 3ヶ月 でできた内容なので
ロードマップの再現性の高さについては確信に近いものを持っています。
--
データの正規化について学び、SQL も読み書きできるようになったため
・DB 設計を考えるとき
・Rails の処理を書く時に発行されるクエリを想像しながら書くとき
・実際に発行されたクエリを見て想定通りかどうか確かめるとき
など、直接的にエンジニアの業務に役立つことはもちろんなのですが
個人的には『スプレッドシート作成スキル』の向上に効いたのが良かったなと感じています。
データの正規化を考えながらシートを作れるようになったためです。
ビジネス職としての動きをするときに
必要なデータを収集・集計して進捗をモニタリングできるように
シートを作ることがままあるため、とても助かっています。
--
僕ができるようになったのは、まさに以下の記事のようなシートの作り方です。
→ プログラマが考える劇的に効率が上がるExcelシートの作り方
シート作成の際に
・Data (入力)
・Operation (演算)
・View (表示)
にタブを分けることで管理がしやすくなる、という考え方です。
(記事を書かれた方は頭文字をとって "DOVパターン" と命名されています)
・Dataタブ ではデータの正規化を意識してカラムを作成
・Operationタブ では表示したい内容に合わせてデータを加工
・Viewタブ では加工されたデータをグラフ等で見やすく表示するだけ
とルール化することで、シートの見通しが圧倒的によくなります。
この考え方がスッと頭に入ってきて実践しやすいのは
データの正規化や Rails の MVCモデル で責務を分離して管理することを
学んでいたからこそだと考えています。
(勉強する前の自分が DOVパターン を見てもピンと来なさそう...)
--
とても勉強になった記事・サイト・書籍:
・Progate【SQL】
・SQL練習問題 一覧まとめ
・データサイエンス100本ノック (構造データ加工編)
・プログラマが考える劇的に効率が上がるExcelシートの作り方
・総務省 - 統計表における機械判読可能なデータ作成に関する表記方法
・キタミ式イラストIT塾 基本情報技術者
・正規化の要点を理解する
④ 責務を分離して開発するということ
こちらについてはまだ
「責務の分離を意識しながら開発できる」
「少なくともあまり良くない実装をしていそうなことはわかる」
というレベルにとどまっており
「呼吸をするように、適切に責務が分離されたコードを書ける」
「よくない実装方法を見たときに、どのような実装方法が最適なのか瞬時にわかる」
という状態になるには程遠いです。
が、リーダブルコードを読んだり色々記事を読んだり
自分が書いたコードに対してレビューをもらったりを積み重ねたことで
「あ、ここはこの書き方してるとレビューで指摘されるから
もう少し工夫して、適切に責務を分離して書いた方が良さそうだな」
という勘が働くようになったというか、
先回りすることができるようになったというか、
少しずつ良くなってきている感覚があります。
--
このあたりの話は、
座学でインプットだけすればいいというものではなく
日々の開発の中で 意識/実践 して、
それに対して レビュー/フィードバック をもらい、
それらを逐一次の機会につながる学びにしていく、という形で
[インプット ⇄ アウトプット] を短いスパンで繰り返しながら進めていくやり方が
最も効率よく学んでいくため方法の 1つ だと個人的には考えています。
今後も自分がインプットしたことを
すぐに次のアウトプットの機会に生かすように取り組んでいきたいと考えています。
--
とても勉強になった記事・サイト・書籍:
・リーダブルコード
・関心の分離を意識した名前設計で巨大クラスを爆殺する
・単一責任原則で無責任な多目的クラスを爆殺する
・【関心の分離/責務の分離】変更に強いプログラミング実践手法
・コーディング入門以前
その他、とても勉強になった記事・サイト・書籍 (雑多)
・railsdm2018で「ActiveRecordデータ処理アンチパターン」を発表しました
・【Ruby】 クラスにモジュールをincludeする方法を図解形式で理解する!
・JavaScript Primer
・入門 Docker
・【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜
・FLEXBOX FROGGY 🐸
・CSSBattle
・ジョイ・インク 役職も部署もない全員主役のマネジメント
・「関数型プログラミング」と「オブジェクト指向」ってなんやねんPython編