Sunbathing sheep

Sheep named aki

Webエンジニアになって最初の42日間で学んだこと

はじめに

この記事はエンジニアになって研修期間中にFBCというプログラミングスクルーで学んだことを書いています。実務や職場のことについては特に触れていませんので、その点ご了承下さい。

どんな人に向けて書いているか

エンジニアを目指している方や、エンジニアになったばかりでこれから体型的に基礎を固めていきたいけど、独学でやると知識が偏りそう。プログラミングスクールに入って学習してみたいけど、沢山あるしプログラミングスクールはなんか怪しいと思って一歩前に進めない人に向けて書いています。

なぜエンジニアを目指している方に向けて書こうと思ったのか

私はもともとスクールは怪しいと思って、1年以上(1800時間程度)独学で学習してWebエンジニアになったのですが、入社して約2ヶ月の研修期間中にフィヨルドブートキャンプ(FBC)というプログラミングスクールのカリキュラムを受けさせて頂きました。このカリキュラムの内容がとても良くて、しかもRubyで開発している人なら誰もが知っているあの有名な人に直に教えて頂いたりと、独学時代に知っていれば絶対入っていたなと実感しているので、同じようにエンジニアを目指している人に向けて書きたいと思いました。

どんな内容になっているか

私が学んでことをFBCのカリキュラムを各タイトルとして300字程度で簡単にまとめてお伝えしたいと思います。ブログなので、技術的な内容にはあまり触れていいませんが、気になるタイトルがあれば学習やスクール選びの参考にしていただければと思います。またここに記載のタイトルは私が行ったカリキュラムだけで、FBCのカリキュラムのごく一部になります。

私の学習スタイル

初めに私の学習スタイルについて簡単に触れておきたいと思います。同じようなスタイルの方は相性がいいかもしれませんので参考までに。例えば新しく触れる技術については、心理的に開き直った状態でとりあえず分かるものから手を動かしてみる。そして、分からないことはググったり本で調べて、まずはざっくりと雰囲気や全体像を掴んでから、まとまったドキュメントを読んで理解する。でも分からない時はサッと誰かに聞きたい。ということをやっていました。自分主導で考えてあれこれやるのが好きなタイプなので、このような学習スタイルなんだと思います。FBCでは気軽に質問できる環境もありますし、提出した課題に対して驚くほど手厚くレビューが返ってきますので、一人で悩み込んで前に進めないという不安はありませんでした。

42日間で学んだこと

それでは42日間の記録について、つらつらと書いていきます。

【day1~2】 HTMLの基本を理解する

ここでは<h1>などのタグの重要性について理解が深まりました。ブラウザは目で見るだけではなくて耳で聞く人もいて、そういう時に文章の中の「この部分は見出しである」、「この部分はリストである」という印を付ける作業をしていないと長い文章をダラダラと聞かされることになるのでウェブアクセシビリティはとても悪い。 だからタグは文字を大きくとかそういう「見た目」だけの話しではなくて、むしろ耳で聞くユーザーのことを意識しながら様々なタグを使い分けることが大事だということを学びました。

【day3】 Markdown を使って HTML を書く

Markdownは、HTMLタグとは異なり、HTMLで可能な表現の一部を実現するために開発されたものであることを学びました。Markdownで作成したテキストは、HTMLに変換されてWebページ上に表示されます。Markdown記法は、シンプルで覚えやすく、見やすいテキストを簡単に作成することができます。デベロッパーツールを使用して、Markdownで記述されたテキストがどのようにHTMLとして認識されているかを比較することで、より理解を深めることができました。

【day4~5】ssh の基本を理解する

SSH(Secure Shell)は、ネットワーク内のコンピューター間で安全なデータのやり取りを行うためのプロトコルという概念は知っていましたが、どうやって接続先のコンピューターの認証を行っているのか知りませんでした。他にもウェルノウンポートなどネットワークの知識を学ぶことができました。今までコードを書くことに目が向きがちでしたが、ネットワークの知識もsshの学習を通じて学ぶことができ、インフラ方面の興味がより湧いてきました。

【day6】SSL/TLS の基本を理解する

通信をセキュアに行うために「共通鍵暗号」と「公開鍵暗号」を使用していることを知り、更に証明証には「ルート認証局」の署名をチェックしていることも分かりました。ルート認証局は、証明書の発行元の機関で、信頼できる機関が署名したものであることを確認するために重要ということを学びました。

【day7】GitHub の基本を理解する

Gitコマンドが何をしているのか分からなかった私でも、Gitコマンドが何をしているのかイメージできるようになりました。ローカルリポジトリについても理解が深まり、.gitファイルがローカルリポジトリであること、そしてこのファイル内にはリポジトリ、圧縮ファイル、ツリーファイル、コミットファイル、インデックスファイル、そして設定ファイルなどが含まれることが分かりました。

【day8】Ruby初級

TryRubyは、Ruby初心者にとって最高の教材だと思います。インプットとアウトプットが同時にできるため、自分でコードを書いて実行することで理解が深まると感じました。そして、ゼロからわかるRuby超入門の読み方も、公式リファレンスの読み方を優しく解説してくれたため、今後他のドキュメントを読む際にも役立つと思います。

【day9】FizzBuzz問題ruby

有名な課題だと思いますが、この課題から実際にコードを書き始めました。初めは実装の内容をコメントで記していましたが、コード自体に意味を持たせるという方向で実装しましょうというアドバイスを頂いたことでその後の実装でも意識するようになり、大きな学びとなりました。

【day10~11】カレンダーのプログラム(ruby)

calコマンドをRubyで作るということをやりました。-mで月を、-yで年を指定できるというオプションも実装しました。ここではメソッドの命名やrequire関数を使用して、標準ライブラリやインストールしたライブラリを渡すことができることを学びました。また、shebang(シバン)やPATHについて学ぶことができました。

【day12】rubocop の使い方を知る

rubocopを使うことで、人の目では見落としがちな細かい部分を指摘してくれるので、rubocopに限らずこういった仕組みを活用して、人力に頼らない仕組みについて学ぶことができました。

【day13~24】lsコマンドを作る1~5

研修期間の中で一番印象深かったカリキュラムで、この課題はlsコマンドの仕様を読み解いて、どうやって実装するか考えて実装するという流れを自分一人で行います。そのため実装まで時間のかかるカリキュラムでした。やっと実装が終わったと思って課題を提出してもそもそも仕様を見直しが必要ということもありますので、当初は精神的にも辛いところがありました。ただ、この課題のおかげで自分で調査して仕様を考えることができたのは自分にとって大きな成長に繋がったと思います。この目的には、環境の変化が目まぐるしいこのWeb業界で、今まで実装したことが無いような機能を開発することになる。その中で仕組みを変えることも大事だが、「今の仕組みや環境の中でどう進めていくか」という柔軟でスピード感のある働き方も重要だという意図が込められていると個人的には感じています。考え方のバリエーションが増えたことは自分にとって財産です。

【day25~26】nginxの基本を理解する

自分でレンタルサーバーを借りて、指定されたOSで環境構築するという課題でした。環境構築中にでたエラーの切り分けも大事で一つずつ読み解きながら進めることが大切だと感じました。この経験は後に実務の環境構築でも役に立ちました。また、nginxを学ぶ中でWebサーバーの基本的な仕組みについて理解を深めることができました。

【day27~28】nginx で VirtualHost を使って複数のドメインのサイトを立ち上げる

自分で購入したドメインを使ってサーバに接続するということを実装しました。ログも別々のディレクトリのlogファイルに吐かれる設定しました。Nginxがリバースプロキシであるということや、ロードバランシングも行っているなど、まだまだ覚えることは多いですが、手を動かしながら学べたことでネットワークの知識を広げることが出来ました。

【day29】nginx で SSL 対応サイトを作る

オレオレ認証を使って、nginxでSSL対応のページを立ち上げることを実装しました。SSL対応の設定は、Webサイトのセキュリティを向上させるために必要不可欠なものです。今回、nginxを使ってSSL対応のページを立ち上げることができたことは、自分にとって大きな成果となりました。

【day30】PostgreSQLの基本を理解する

PostgreSQLの設定をするときに出たエラーの対処が印象的で、ネット上の記事を見ながら原因の切り分けをしましたが、書いてあることが嘘だと見抜くことが少しずつ出来るようになってきたことで成長を感じましたし、公式ドキュメントを見る癖もついてきたと思います。また、OSやPostgreSQLのバージョンを確認することが出戻りを減らし、エラー特定にもつながることも学びました。

【day31】データベース設計の基本を理解する

ここでは、Tweeterの機能を読み解いて自分でER図を作成するということをしました。Tweeterの機能でツイート、リツイート、引用リツイートの関係性やどんな機能になっているか整理するだけでかなり勉強になりました。詳細はネタバレにもなるので、割愛します。

【day32~35】SinatraでシンプルなWebアプリを作ろう

独学の時はRailsというフレームワークを使用していましたが、Railsのありがたさを理解するためにも別のフレームワークSinatraでWebアプリを作るということ実装しました。XSS(クロスサイトスクリプティング)対策も実際に自分のサービスにXSSを仕掛けてどういう悪さをするのか試しながら対策をすることができました。

【day36~38】テスト技法

テストの考え方は奥が深く、短期間で全てを理解することは難しそうですが、実際に課題を通じて技法を学ぶことは今後のエンジニア人生において重要だということが分かりました。テストは破壊的な作業で、「正しく動作しないこと(エラー)」を発見しようとするものです。それに対してプログラミングは、創造的で「正しく動作させることを目標」とした作業です。新しいことを学んで、自分の考え方がアップデートされていくのが実感できた課題でした。

【day39】TDD の基本を理解する

テスト駆動開発は以下のRED、GREEN、REFACTORという3つの作業サイクルを細かく繰り返してプログラミングを進めていくということを学びました。

【day40~41】オブジェクト指向プログラミング

オブジェクト指向を学ぶために、カリキュラムではありませんが砂糖水を作るというデザインパターンを参考に実際に手を動かしながら学んだり、全体をイメージするのにノートに手書きで図を書いて頭を整理しながら学習を進めました。また、書籍の「プロを目指す人のためのRuby入門」の7章の中で紹介されているコードを実際に手元で書いて動かしながら良く分かっていない部分を一つ一つ理解しながら学習を進めました。その結果、自分に足りていないものは オブジェクト指向に向き合うための思考力』 ということが痛いほど良く分かりました。

【day42】Railsでテストを書く

ここでようやくRailsを触ることが出来ました。ここでは、同じsystemテストを実行しているのに、成功する場合と失敗する場合があることに気づきlogをひたすら追って調べるということをしました。調べていくと、JSを使って画面を書き換えるWebアプリはCapybaraがJSの処理を待たずに次へ進もうとすると部分一致するワードがそこにあれば想定とは違う挙動になって、テストが落ちやすいということが分かりました。Turbolinksと呼ばれるRails標準の画面描画ライブラリが裏でこっそり動いていたことが原因でしたので、CapybaraにTurbolinksの完了を待って次の操作を実行する方向で実装しました。

まとめ

今まで個人開発で得た知識が、点から面になっていくことを実感しています。FBCのカリキュラムを進めたことで、自分は「どんな技術を知らないのか」、「どれぐらい理解しているのか」、「今後何を学んでいくと良いのか」客観的に把握することが出来ました。また、カリキュラムを進めていく中で、分かった気にならずに一つずつ理解して学習していくことの大切さを身を持って学びました。興味のある方はFBCのお試し期間で実際に体験してみて下さい。

bootcamp.fjord.jp

感謝

FBCのメンターを運営されている全ての関係者の皆様と、このような貴重な時間を下さったGMOペパボに心から感謝します。何か話しを聞いてみたいという方がいれば、気軽にTwitterでDM下さい。

twitter.com

最後までお読み頂きありがとうございました。