新卒エンジニア研修を振り返る

オールアバウト新卒エンジニアの@hide1357です。

研修を終えて実務に入ったのが7月なのでだいぶ時間が経過してしまいましたが、一年の区切りも近づいてきたということで、今一度新卒エンジニア研修を振り返ってみたいと思います。

# オールアバウトの新卒エンジニア研修について
私が入社した4月はコロナ自粛真っ只中。対面での研修は困難だったため、完全オンラインでの研修となりました。

ただでさえプログラミングの知識が無いのに、いきなりのリモートワークということで、非常に不安を感じていたことを覚えています。

<br>

研修は約2ヶ月に渡り、以下の順に進められました。

1. オールアバウトのエンジニアとしての心構え
2. ツール紹介とマシンセットアップ
3. Git研修
4. Apache、Docker研修
5. e-learning
6. TDD研修
7. Laravelでチャットアプリ開発


<br>

これらを全部振り返っているとあまりにも膨大な量になってしまうので、今回はアプリ研修の中でも特に苦労した記憶のある、「環境構築」の部分をピックアップして振り返りたいと思います。
<br>

オールアバウトエンジニア研修のより詳しい詳細が知りたい方は[こちら](https://about.allabout.co.jp/koto/200918_01)の記事を参考にして下さい。


# アプリ開発の環境構築で壁にぶつかった

アプリ開発最初の関門は、DockerによるLaravelの環境構築です。
ここでいきなり壁にぶつかりました。

特に苦労したのは以下の2点です。

- Dockerがそもそも分からない
- Laravelのwelcomeページが表示できない

## Dockerがそもそも分からない
"Docker"という言葉自体は知っていたのですが、概念や使い方等は全く知らなかったので、ゼロから学ぶ必要がありました。

基礎概念の習得に利用したのは、「[入門Docker](https://y-ohgi.com/introduction-docker/)」というサイトです。
Dockerの基礎が網羅的にまとめられているので、ここでDockerに関する基礎的な知識は学ぶことができました。
<br>

ただ、これだけでは、「具体的にどのようにしてDockerを利用してLaravelが動作する環境を作るのか」まではイメージできなかったので、ネットでググって見つけた記事を参考にすることにしました。

[こちら](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)です。なんとなく分かりやすそうという理由で参考にした気がします。(今考えたら浅はかな理由です。。)
<br>
この記事を参考にすることで、ある程度Dockerfileやdocker-compose.yml、PHPの設定ファイル(php.ini)等の定義ファイルは形にすることができました。


## Laravelのwelcomeページが表示できない
Dockerの基礎的な概念は習得し、さらに定義ファイルもある程度形にすることはできたのですが、ここで第2の壁にぶつかりました。

一向にLaravelのwelcomeページが表示できないのです。
<br>

Dockerに触るのが初めてなのはもちろんのこと、Webサーバーとして採用したNginxに関する知識も皆無だったため、原因の特定に苦心しました。

ただ、試行錯誤を続けた結果、なんとかLaravelのwelcomeページを表示することができました。
<br>
最終的に発覚した原因は以下の2点でした。

- docker-compose.ymlで定義した内容がコンテナ内に反映できていなかった
- Nginxのドキュメントルートが正しい位置を示せていなかった


### docker-compose.ymlで定義した内容がコンテナ内に反映できていなかった
docker-compose.ymlは、いわば複数コンテナの管理ファイルです。

ここにPHP,Nginx,MySQL等のそれぞれのコンテナのイメージおよび必要な設定を定義することで、複数コンテナを連携して動作させることができます。

<br>
一つ目の原因は、このdocker-compose.ymlで定義した内容がそもそもコンテナ内に反映できていないことでした。

具体的には、Nginxの定義ファイルの[volumes](https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/)のパス表記が間違っており、ローカルファイルの内容をコンテナ内に反映できていませんでした。
<br>

最初は全く原因を特定できなかったのですが、メンターの方から「コンテナに入って確かめてみたら？」とアドバイスを頂いたことで気付くことができました。(今となっては当たり前ですが、当時の私には「コンテナに入る」という発想自体がなかった。。)


### Nginxのドキュメントルートが正しい位置を示せていなかった
Laravelはpublicディレクトリのindex.phpで全てのリクエストを捌いています。

そのため、Webサーバーのドキュメントルート(Webサーバーがクライアントからのリクエストを流す場所)にこのpublicディレクトリを指定しないと、Laravelはクライアントからのリクエストを受け取ることができません。

この設定は[Laravelの公式ドキュメント](https://readouble.com/laravel/6.x/ja/installation.html?header=Public%25E3%2583%2587%25E3%2582%25A3%25E3%2583%25AC%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25AA)にもしっかりと書かれています。
<br>

しかし、当時の私にはこのような知識が無かったため設定が完全に抜け落ちていました。具体的には、Nginxの設定ファイルのDOCUMENT ROOTの設定が間違っていました。

```
root /var/www/public;
```
このDOCUMENT ROOTをアプリのパスに合わせて正しく指定したところ、Laravelのwelcomeページを無事表示させることができました。

```
root /var/www/app/public;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913459/c5df5d25-509b-7ebc-bfb8-ff3e8c8153c4.png)


## 新卒エンジニア研修を通して得たもの

今回は新卒エンジニア研修(の一部)を振り返ってみました。

最後に、研修を通して得た学びと教訓をまとめます。

- 何が変化しているのかを細かく確認することの重要性
- 情報の信頼性は均一ではない
- 頭の中に開発フローのインデックスを作ることができた

### 何が変化しているのかを細かく確認することの重要性
今回環境構築に苦戦した理由の一つが、デバッグの考え方が間違っていたことでした。

具体的には、コードを変更した際に、何が変化したのか、また変更が反映されているのかを確認できておらず、最終的な結果(Laravelの画面が表示されるか)だけに目を向けてしまっていました。


研修を通して、デバッグの際には一気にコードを変えるのではなく、細かくコードを変えてみて、その都度何が変化したのか(変化しなかったのか)を確認することが重要だと学びました。


### 情報の信頼性は均一ではない
私は研修で、「なんとなく分かりやすそう」という安直な理由でQiitaの記事を参考にしました。

もちろん、参考になる部分は大いにありました。

しかし、結果的にはそこに載ってある実装を盲信しすぎたことで、問題の発見が遅れてしまいました。
<br>

この経験から私が学んだのは、「情報の信頼性の差異」です。

ネット上には数多の技術記事があります。
それらは、検索結果には同列に表示されるため、全てが同じ信頼性を持っていると錯覚しがちです。

しかし、実際にはそれぞれの記事の信頼性は全く異なります。


公式ドキュメントのようにその技術の専門家が丁寧に書いたものもあれば、経験の浅い技術者が軽い気持ちでメモ程度に書いたものもあるからです。

<br>


参考にする記事の信頼性は、実装の信頼性に直結します。

なるべく信頼性の高い情報を参考にする、もしくは信頼性を念頭に置いた上で参考にする記事を選択することが重要だと学びました。


### 頭の中に開発フローのインデックスを作ることができた
研修でGit,Docker,Laravel,CircleCI,GCP等の技術に触れ、また「環境構築 -> 開発 -> デプロイ」の流れを一通り体験したことで、頭の中に一連の開発プロセスのインデックスを作ることができました。
<br>

要は、一番しんどい「学習初期の壁」の段階を研修を通して越えることができたのです。

そのため、実務の中でも「基礎概念から学ぶ」みたいなことはほとんどしなくていいため、比較的低い学習コストで開発を進めることができています。


# 学んだ教訓を定着させる
「研修で学んだこと」と題して語ってきましたが、正直、今でもここで挙げたことが全て完璧にできている訳ではありません。

実務の中で、「なんとなく分かりやすそう」という理由で公式ドキュメントではなくブログを参考にしてしまうこともありましたし、信頼性の低い記事を参考にした実装を注意されたこともありました。


しかし、何も意識しないで作業をこなすのと、少しでも意識するのとでは、成長度合いに大きな違いが出てくると思います。


少しでも改善ポイントを頭において作業を進めることで、地道に適切な考え方を定着させていきたいです。