研修が終わって配属されたと思ったらまた研修・・・！？

# はじめに
こんにちは！GxPの野本です。<br>この記事は[グロースエクスパートナーズ Advent Calendar2023](https://qiita.com/advent-calendar/2023/gxp) の19日目です。

私は、今年の4月にいわゆる文系未経験という形でIT業界に飛び込みました。弊社では、入社後7月中旬まで研修をおこなっており（詳しい内容は、[新入社員研修の内容を過去の自分に紹介しよう！～技術編～](https://qiita.com/asaka271/items/a48c66ce3b4197e1b6d8) まで）、研修終了後に配属先が発表され、各々案件に携わります。
例にもれず私も配属先が発表され、自分の技術力に大きな不安を抱えながらも、どんな案件/どういった内容をやるのかドキドキしながら向かい、配属先の最初の説明でこう言われました。
<br>**「うちでも研修をおこなっていただきます。」**<br>
ということで、本記事では、新卒未経験だった私が配属後の研修で何を感じそして何を学んだのかを書いていこうと思います。

# 配属後研修
### ■ 概要
配属後研修は2か月間おこない、内容は一言で表すと、**環境構築研修**というもので、与えられたLinux・Windowsの各サーバーに指定されたサービスを構築し、それをネットワーク経由でクライアントに提供するといった内容でした。
要件としては、以下の4つが用意されていて、
* サーバー要件
* サービス要件
* ネットワーク要件
* セキュリティ要件

要件に対しての仕様定義として、
* 許容仕様：記載された動作でも許容されるが、望ましい動作では無いため可能な限り回避すること
* 必須仕様：その仕様の実現は必須とする
* 拡張仕様：実現が必須ではないが、可能な限り実現すること

これら3つが設定されています。

そしてこの研修の肝となる部分、実はルールとして、
**「質問してはいけない」** 
といったものが設定されていました。もう少し詳細に話すと、質問された側はその答えを言ってはならず、相談を受けるのはいいが、提示できるのは調べ方や考え方のみといったものでした。つまり質問者（私）は自分自身の力のみで要件を満たすサービスを構築しなければならないということです。


### ■ 取り組んだこと
具体的な研修内容についてはここでは割愛し、[おまけ](#おまけ)として記載しております。

正直この環境構築研修の仕様書を渡されたとき、私は内容の9.5割を理解することができませんでした。なぜなら配属前の研修では、開発手法（プロジェクトの進め方）や開発時に最低限必要となるであろう言語やシステム・考え方を学んできたからです。

また、この研修では、ネットワークなどの配線や、OS・必要なソフトウェアのインストールなど、そもそもコンピューターが動くようにするところから始まります。ちなみに私はディスプレイに映像を出力する段階で初日2時間かかりました。HDMI・DisplayPort・DVIなどの映像端子の存在をこの時初めて知ったからです。つまり、サービスを構築するという研修のスタートラインに立つことですら、難しい状態だったのです。

しかし、概要でも説明した通り、これは**質問をしてはいけない研修**です。

そこで私がどういう行動をしたのか。それは唯一動いていた手元のノートPCでひたすらに調べることでした。手元にある情報をもとに、何をどのようにしたいのかを簡潔に検索し、出てきた内容の単語でわからないものがあったら検索し、そしてまた検索し、とわからないことを一つずつ、時間はかかりますが潰していきました。<br><br>

例えば、「Linuxサーバーでは、Dockerを使用し各サーバーを立ち上げること。」といった指示があって、そもそもDockerというものがわからないときは、とりあえず【Docker とは 初心者】のように検索します。ここでポイントなのは、**初心者・わかりやすく・入門**といったワードを含ませることです。

【Docker】とだけ検索した場合、最初に出てくるのは[公式サイト](https://www.docker.com/ja-jp/#)の日本語版となり、その中でDockerについての説明は、
>Dockerは、開発ツール、サービス、信頼できるコンテンツ、自動化を提供します。単独で、または組み合わせて使用することで、セキュアなアプリケーションの配信を加速します。
Dockerは、開発者が面倒な環境構成や管理を行わずに、どこでもアプリケーションを構築、共有、実行できるようにします。

というものになります。これでわかる方はもちろんいると思いますが、経験の浅い人にとっては、母国語で書いてあるのになぜか内容を理解することができないという状況に陥ります。（経験談）

そこで【Docker とは 初心者】と調べた場合はどうなのか。検索結果には技術ブログやサイトの記事が出てくると思います。ただ、これは書いた人個人の解釈をもとにしているものなので、私としては少なくとも記事を3つ見ることをお勧めします。そうすると、3人の方が言っている内容で共通の単語であったりが見えてくると思います。それをまとめると、
>Dockerとは、コンテナ型の仮想環境でアプリケーションを作成し、それを配布して、他の人が同じように実行できるようにするプラットフォームである。

のようになります。この段階でまだわからない部分があれば同じように調べることを繰り返し、わからない部分が無くなった時点で、初めの指示に戻ります。そうすると何を指示されていたのかが理解できるようになります。なぜならわからないところが無いからです。

そして、その調べてわかった用語や手順は、メモ帳やConfluence(情報共有ツール)の個人ページなどに残すなど、インプットした知識をアウトプットするということを意識しておこなっていました。なぜなら、わからないところをすべて潰す＝短期的に新しい知識がたくさん入ってくることになり、知らないことが多すぎた自分にとっては、インプットのみだと脳のキャパシティ的に、すべてを覚えていることはできなかったのです。なので、理解したことを自分の言葉で文字に起こし、情報の整理することで、記憶の定着化も図れますし、忘れてしまっても、今度はその自分のメモを見ることで、調べるという行為の時間短縮にもつながっていきます。

以下は実際に私が当時書いた単語まとめです。
（今見返すとこんなことまで書いているんだという気持ちになりますが、当時はわからなすぎて必死でした・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629105/bbc327cd-a5fc-39c1-46df-1aa39d27a086.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629105/5262b67d-c74c-8a0f-3134-2b0153540f1f.png)

:warning:上記の例はわからない単語が出た順になっていますが、誰かほかの人に単語まとめを使ってもらう予定がある場合や、単語数が増えた場合は、ページの見やすさを求めたほうがよいので、単語を種別にわけるなどの整理の工夫をする必要があると思います。（整理することも知識のアウトプットにつながります）<br>
このように知識のインプットとアウトプットをすると、日に日にわからない単語が減るのはもちろん、今までは「なんとなく出来ました！」と終わらせていたのが、きちんとやった内容の中身が理解できているので、「この設定をこうしたから出来ました！」と自分がやったことを説明できるように少しずつなっていきます。<br>
上手くいかない場合でも、今までは調べても解決策が出てこない・・・と途方に暮れていましたが、どこで上手くいっていないのか、ここの設定ファイルの内容でここの挙動が決まるが中身はおかしくないか、逆にこの部分は他のサービスでは正常に動いているのか、など理解している内容をもとに、切り分けて考えていくことで、どこに問題がありそうなのかを絞りこみ、問題解決に向かうことができるようになりました。<br>

例えば、クライアントPCからルーター経由でLinuxサーバー内のDockerで作成したコンテナ（仮想サーバー）に接続をしたいが、通信が通らないとなった場合、クライアントPCからルーターへは通っているのか、クライアントPCからLinuxサーバーへは通っているのか、コンテナにだけ通っていないということはDocker周りで問題があるんだな、ではコンテナ自体にファイヤーウォールはあるのか、あるとしたらそれを一時的に無効化することはできるのか、無効化して通ったらそこが原因だなというように、ある程度問題がある場所を絞り込んでから、予測を立てます。
そうすると、解決方法の調べ方も【Linuxサーバー Docker コンテナ 接続したい】のようなふんわりとしたものでなくて、【Docker ファイヤーウォール】【Docker 外部接続 設定ファイル】【Docker ネットワーク 仕組み】のように詳細に考えることができるようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629105/c343430e-0f7d-ae02-57c4-e2ca46b4b283.png)



### ■ 学んだこと
まとめとして、私が配属後研修で学んだことは、環境構築をするうえでの知識はもちろんですが、調べる力の重要性と思考・知識のアウトプット、問題の切り分け方の3点になります。

**調べる**という行為自体は、今回の研修の「質問はしてはいけない」というルールや、そもそも職種にかかわらず、日常的におこなっている活動だと思います。
しかし、技術や業界が急速に変化する環境においては、調べるといった行為にプラスして、質が求められると考えています。こうした環境で、適応する力＝調べる力 が高まると、最新の動向を素早くかつ効果的に理解し、自身のスキルや知識をアップデートすることができます。

思考・知識のアウトプットに関して、調べた内容を自分のものとして定着させるための効率的な方法となり（【アウトプット　脳科学】と検索すると記事が出てきます）、問題の切り分け方に関しても同様で、問題が起こっている範囲を絞り込むことによって、解決までのステップを効率的におこなえます。どちらも定着することによって再度調べなくてもよい・問題ない部分まで確認する必要がなくなるという時間的なロスがなくなり、結果効率化につながっているのです。

効率化されると何が生まれるか。そうです、時間です。
その時間があると何ができるのか。そうです、より多くのことを学ぶことができますね。

つまり、技術者としての成長と、調べる力の重要性、思考・知識のアウトプット、問題の切り分け方の研修で学んだ3つのことは、密接に関係しているのです。


また、調べることが出来ても、なぜ出来たのかわからなかったら成長には繋がりにくかったり、知識が不足していたら問題がどこにあるのか絞り込めなかったり、先ほども話題に出しましたが、問題を絞り込まずに調べると問題解決への時間が遠のき非効率であったりと、どれかが欠けたら、それはうまくいかないのです。


# 最後に
結局この研修の意図と、私が学んだことの答え合わせはしていませんが、研修を終えて、「確実に研修前より成長したな」、そう思うことが出来たのは確かです。

現在は、案件に配属され、そこでも新しい知識ばかりの毎日です。
チームで開発をしているということもあり、いかに自分の状況を他の方にわかってもらうか、といった点において、思考のアウトプット力が求められるなと感じています。ですが、まだまだ自身の知識不足で、きちんと伝わった！といったことが少ないので、引き続き、配属後研修で学んだことを念頭に置いて、業務に励み、技術者として成長していきたいと考えております。

拙い文章になりましたが、ここまで読んでいただきありがとうございました！

# おまけ
### 具体的な研修内容
具体的な研修内容を各要件ごとに説明します。（許容・拡張仕様は除く）
#### サーバー要件
##### ◎Linuxサーバー
* Dockerを使用し各サーバーを立ち上げること。それぞれ別の仮想サーバー(コンテナ)として実現すること。
* コンテナ群は、Docker-Composeで構成を定義・実行すること。
* コンテナイメージは、[Docker Official Images](https://hub.docker.com/search?image_filter=official&q=&type=image) のみ利用可能とする。
* 以下のサービスが利用可能であること
  * DHCPサーバー
  * DNSサーバー(ネームサーバー)
  * NTPサーバー
  * FTPサーバー
  * SSHプロトコルによるリモートアクセス：SSHという通信プロトコルを使用して、クライアントPCから立ち上げたサーバー（コンテナ）に対してリモート接続をおこなう

##### ◎windowsサーバー
* 以下のサービスが利用可能であること
  * SMBサーバー
  * FTPサーバー
  * WEBサーバー
  * RDPプロトコルによるリモートアクセス：RDBという通信プロトコルを使用して、クライアントPCからWindowsサーバーに対して遠隔操作をおこなう

#### サービス要件
##### ◎Linuxサーバー
DHCPサーバー：有線・無線で接続されたクライアントPCに対し、IPアドレス・サブネットマスク・Gateway・DNSサーバーアドレスの払い出しが行えること。リース期間は1時間とする。

DNSサーバー：クライアントPCに対し、WEBサーバーの名前解決機能を提供すること。NTPサーバーに対し、インターネット上の名前解決機能を提供すること。

NTPサーバー：クライアントPCおよび各サーバーに対し時刻同期機能を提供すること。上位NTPサーバーは、独立行政法人情報通信機構（NICT）公開NTPサーバを利用すること。

FTPサーバー：クライアントPCからFTPクライアントソフトを利用し、ファイルのアップロード/ダウンロードが出来ること。

##### ◎windowsサーバー
SMBサーバー：クライアントPCからエクスプローラーを利用し、ファイルのアップロード/ダウンロードが出来ること。

FTPサーバー：Linuxと同様。

WEBサーバー：HTTPプロトコルで単体のページが表示出来ること。

#### ネットワーク要件
##### 概要
* 環境構築時/メンテナンス時に、全ての機器は一時的なインターネットへのアクセスが出来ること。
* 運用時、NTPサーバーおよびDNSサーバーは、インターネットへのアクセスが出来ること。他の機器はインターネットへのアクセスが出来ないこと。
* クライアントPCは、各サービスに対し有線・無線経由で接続できること。

##### IPアドレス/ネットワークセグメント
* クライアントPC、Linuxサーバー、Windowsサーバーのネットワークセグメントは、それぞれ分かれていること。
* 各装置のIPアドレス設定は、別で配布されるIPアドレス表に従うこと。
* クライアントPCのIPアドレスは、Linuxサーバー上のDHCPサーバーから付与されること

##### 無線LAN
* 無線LANには、WPA2-PSKで接続すること。
#### セキュリティ要件
##### ◎windowsサーバー
Windowsサーバーのファイアウォールは有効とすること。アクセス許可設定を追加する場合、必要最低限であること。
<br>