【初心者向け】チーム開発の流れとその時に起きてる事象を自分なりにまとめてみた

エンジニア歴半年ほどの者です。
現在参画している現場で作業している中で、チーム開発全体の流れやそれぞれ使用しているツールの意味を考えてみようと思った結果、
なんとなくで作業していて実は全然理解できていないことや、そもそもよく分かっていなかった事が沢山出てきたので、それぞれ調べてみた結果をアウトプットするために投稿します。

※間違っているところも多々あると思いますので、添削頂けますと幸いです！💦


## 全体のイメージ図
一概には言えませんが今の自分が知る限り、イメージではこんな感じかと思っています。
![スクリーンショット 2022-06-12 14.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/59b58780-42bf-1c27-b1cf-bf18a116c51f.png)

## ①インフラ構築（AWS）
お客様から　”こんなシステムが欲しい”　という依頼をもとに実際にシステムを開発していくのですが、ここでまず必要なことはインフラ構築かと思います。
#### インフラ構築とは
>ひとつのシステムを稼働させるために必要な基盤（インフラストラクチャ）を構築すること。 システムに必要なインフラは主にハードウェアとソフトウェアに大別できる。
具体的にはサーバーやPCなどのハードウェア、インターネットやLANなどのネットワーク、、OSや「ミドルウェア」などのソフトウェアがITインフラに含まれる。

とあります。ということでハードウェア（サーバ・ネットワーク機器等）、ソフトウェアを準備するわけですが、現在はクラウドコンピューティングサービスを利用してインフラ構築をすることが主流とのこと。
そこで出てくるのが、
#### <font color="red">AWS</font>
という感じになります。クラウドを使用すればハードウェアの調達や管理が不要になるので、手間も省けて比較的簡単にインフラ構築もできます。

## ②開発準備（Git・GitHub)
![スクリーンショット 2022-06-12 15.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/95ccae5f-535b-d328-2189-74bcc0a9e389.png)

インフラ構築が完了したので早速開発を開始。しかし開発するアプリケーションがあまりに多機能でとても一人（or少人数or自社専属のエンジニアだけ）では作りきれない...
ということで作成を以下のように行うことにします。

``■他のエンジニア（他企業、フリーランスなど）にも力を借りる``

``■作成する機能毎に作業を分けて、できたものを合体させていく（統合）ことで完成させていく。``

では作業をどうやって分担するのか。
沢山の人達が並行して作業しているのをどうやって管理するのか。
そこで出てくるのが、
#### <font color="red">Git　・　GitHub</font>

ということになります。

最終的に一つにまとめる場所　＝　master（もしくはmain）とし、
そこから切り離し、それぞれの作業場所に持っていって機能作成を始めます。
これら切り離して作業する（Branch）、
切り離したものを合体させる（merge)、
合体させて完成に近づいたものをまた作業場所に持ってくる・また合体させる（pull,push）
その全ての作業をGitで、作業した履歴をGithubなどのバージョン管理ツールで効率よく管理していきます。

## ③作業ブランチでコーディング〜実行
![スクリーンショット 2022-06-12 15.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/dafbd561-4aff-ff0a-5700-b9bbc05c449f.png)
### - ビルド・実行について
---
作業ブランチを作ったので実際に機能をコーディングし、完了したとします。
※参画している現場のプログラミング言語はJavaを使用しているので、Java想定。

プログラミングは書いて終わりではないので、実際に想定通り動くのか、正しい処理を実行するか確認が必要です。
コーディングしたソースコードを実際に<font color="red">実行</font>と<font color="red">テスト</font>していきます。

まず実行する前に、<font color="red">ビルド</font>が必要になります。
ビルドというのは、
>ソースコードに問題がないか解析し、問題がなければ実行できるファイルに変換し、組み立てる

という作業のことです。
ビルドには以下の工程があります。

``**①静的解析 （構文エラーやスペルミスの確認）　※1``

``②プリプロセッサ （定数の数値への置き換えやコメントの削除といったコンパイルの前処理）``

``③コンパイル （人間が読めるプログラムを機械が認識できるように翻訳すること）``

``④リンカ （コンパイルしてできたファイルを一つの実行ファイルにリンク・まとめる）　※2``

<font color="red">※1JavaでEclipseを使用していると、コンパイルは随時、ビルドは自動ビルドが設定になっているので特に意識せずともビルドは終了しているが、使用しない場合はコマンドで随時ビルド作業を行う必要がある。</font>

<font color="red">※2Javaは複数のクラスファイルを一つにまとめて実行ファイルにするという処理はなく、コンパイルで作成された複数のクラスファイルをそのままJREが読み込んで実行している。</font>

### - ローカル環境での実行について
---
ビルドが済んだら実際に実行していきます。
では自身の作業PCの上でどうやって実行を行っているのか。
ここで出てくるのが、
#### <font color="red">ローカルホスト</font>
ということになります。
ローカルホストとは、
>localhostというのは自分のパソコンのこと。
>localhostにアクセスするということは、自分のパソコンにインストールされたウェブサーバーにアクセスするということ。

ということです。
ローカルホストはPCのOSで動いています。（基本mac OSやWindowsが多いと思います。）
ここでPCのOSで実行・テストでも問題ありませんが、別のOS上で実行することもあります。
ここで出てくる別のOSが、
#### <font color="red">Linux</font>
です。
なぜわざわざLinuxで実行するのかというと、

>・速度が速い
・柔軟性が高い
・Webサービスの９割以上がLinux上で動いているので、本番環境に近い

というようなメリットがあるからです。
要するに性能が一番よくて、本番環境に近い状態にできるからです。

さらにこのLinux OS上で、仮想環境を使用するケースもあります。
そこで代表的なものが
#### <font color="red">Docker</font>
になります。
Dockerを使用すると、
>・詰まりやすい環境構築を簡単に整えられる
>・チーム間の環境を統一できる、環境の差異がなくなる
>・本番環境、テスト環境も統一できる

というメリットがあります。

### - ローカル環境内のミドルウェア
OSを決めたら次はWebサーバーが必要になります。必要になるサーバーは基本的には以下の３つです。

■Webサーバー
■APサーバー（アプリケーションサーバー）
■DBサーバー

になります。
ここで代表的なものが以下になります。

■Webサーバー　＝　<font color="red">Apache</font>
■アプリケーションサーバー　＝　<font color="red">Tomcat</font>
■DBサーバー　＝　<font color="red">MySQL、Oracleなど</font>

これらがつながりそれぞれが処理を行うことで、ローカルホスト内で実行が行えています。

**各サーバーの役割と処理の流れ**
![server41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/a071a51a-26fa-38d3-4341-bb4a4cbcf95c.gif)



## ④ビルド・デプロイ
![スクリーンショット 2022-06-12 18.00.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/f1ca6a5a-7c45-6ad1-768b-928206faf134.png)
作成した機能がローカル環境で正常に動作したことが確認できたので、早速masterに合体させていきます。（merge）

合体させたら終了ではありません。今後は複数の機能同士が重なったことでそれらが無事機能し合うかを確認する必要があります。

ここでの作業は簡単なことではありません。
先程は一つの機能であったからビルドや実行を一人で行えていましたが、今度は次から次へと色々な人が完成させた機能を合体させたり、修正したりするわけです。
その度に誰かが手動で以前のようなビルド〜テストを行なっていたらキリがありません...

なら全ての機能を完成させたら一括で合体させて処理すれば良いのではないかとも考えられますが、万が一上手くいかなかった場合、何が原因でうまくいっていないのかを判断するのが大変になります。
その度に原因を探し、見る必要のない機能まで原因を探し時間を無駄にするということになりかねません。

そこで必要になるのが
#### <font color="red">継続的インテグレーション・継続的デリバリー（CI/CD）</font>
#### <font color="red">CI/CDツール</font>
です。

継続的インテグレーションとは、
>開発者が自分のコード変更を頻繁にリポジトリにマージし、その度に自動化されたビルドとテストを実行すること。小さなサイクルでインテグレーションを繰り返し行い、インテグレーションのエラーを素早く修正することによりチームは統合されたソフトウェアをより迅速に開発できるようになる。

という概念です。
つまり、誰かが機能を追加する度にこまめにビルド、テストを行うことで、

無事正常に終了する　＝　<font color="blue">OK</font>
失敗する　＝　<font color="red">直前に合体させた機能（機能等）の中に原因がおそらくあるだろう</font>

ということになり、原因追求と修正が迅速に実行できます。
そしてそれを可能にするのが<font color="red">CI/CDツール</font>です。

CI/CDツールはビルド・テスト・デプロイの大変な作業を合体の指定のタイミングで自動で行なってくれる支援ツールになります。

**ここを無事通過したら、デプロイ（実行環境に配置し利用可能な状態にする）して完了です。
以後この作業を繰り返していくイメージです。**

## まとめ
とても長くなりましたが、チーム開発の流れとしては以下の通りだと感じました。

①ローカルである１機能を作成し、ビルド+テスト
　↓
②正常にローカルでの機能が終了したら、masterに合体させる
　↓
③今度は合体させたものをビルド+テスト
　↓
④①に戻って別機能作成。

AWS、Dokcer、Linux、CI/CDツールはまだ分からないことだらけで、それぞれの仕組みや連携の仕方は正確に理解できていません。今回記載した内容も一例に過ぎないような気がしています...
よろしければその辺の詳しい説明、もしくはご指摘を頂けますと幸いです。

## 参考文献
■ITインフラ、AWS

https://pfs.nifcloud.com/navi/words/it_infrastructure.htm

https://www.resm.jp/faq/answer22/#:~:text=%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%A7%8B%E7%AF%89%E3%81%A8%E3%81%AF%E3%80%81%E3%81%B2%E3%81%A8%E3%81%A4,%E3%81%AB%E5%A4%A7%E5%88%A5%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

https://sitecloud.jp/blog/3196/

■ビルド

https://proengineer.internous.co.jp/content/columnfeature/6308#section102

https://xtech.nikkei.com/it/members/NBY/techsquare/20021008/3/

https://carey.link/java/eclipse-java-initial-setting#:~:text=%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB(javac)%E3%81%AFEclipse%E3%81%A7%E3%81%AF,%E3%83%93%E3%83%AB%E3%83%89%E3%81%8C%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

https://carey.link/java/java-language-devising

https://www.zealseeds.com/tool/Developer/Eclipse/EclipseJava/EclipseHelloEclipse/CompilationAndExecution/index.html

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10226900460

https://www.javadrive.jp/eclipse3/step/index4.html

■ローカルホスト

https://codor.co.jp/django/localhost

https://hajipro.com/local-development-environment-mac/local-development-environment

■ Linux

https://www.youtube.com/watch?v=g1y4pImSUN8

■Docker

https://www.youtube.com/watch?v=kVuHdG50eh8

https://www.youtube.com/watch?v=DNnW4I43wyU

■Web三層構造（webサーバーについて）

https://www.infraexpert.com/info/server17.html

https://kitsune.blog/db-server-summary

https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5

■CI/CD

https://codezine.jp/article/detail/11083

https://www.techmatrix.co.jp/product/cisolution/cisolution1.html

https://blog.aiqveone.co.jp/ci/