AWSの勉強する前に大事なこと：プログラミングを学んで日がまだ浅い人へ


**後輩**: 「先輩、AWSの資格取りたいんで、VPCとか勉強してる所なんですけど、それが何の為にあるかいまいちわかりません。いろんな機能あるし、必要なんですか？」

**先輩**: 「うーむ。ネットワークの基礎が分かってないと、AWSのVPCみたいな応用の部分、ちっとも腑に落ちないんだよ。🚫」

**後輩**: 「え、そうなんですか？」

**先輩**: 「うん。だってさ、ネットワークの基本って、道路や電車の線路みたいなもの。データがどうやって流れるか、どこを通って目的地に着くか、そういうことが基本になるんだよ。🚄🛤️」

**後輩**: 「なるほど、基本の流れを知らないと...」

**先輩**: 「そうそう、例えばさ、VPCってのは、AWS上にプライベートなネットワーク空間を作ること。でも、この「プライベートなネットワーク空間」という概念がピンとこないと、VPCの真価が理解できないんだ。」

**後輩**: 「プライベートなネットワーク空間...」

**先輩**: 「そう。VPCでやるのは、自分だけの安全なエリアを作って、そこにサーバーやデータベースを配置するわけ。だから、外部からのアクセスをどう制御するか、内部でのデータのやり取りがどうなってるか、そういうネットワークの知識がないと、VPCを上手く設計するのは難しいんだよ。🏗️🔒」

**後輩**: 「そういうことか。ネットワークの知識が先に必要なんですね。（汗）」

**先輩**: 「まさにその通り！🎯 VPCはただのツール。そのツールを使いこなすには、基本の「土台」が必要なんだ。ネットワークの基本を理解していれば、VPCを使って、セキュリティが高く、効率的なシステムを作れるようになるんだ。」


**後輩**: 「でも、そんなの知ってますよ！ソーシャルネットワークとか、人脈が広い時にネットワークが広いっていう、あれですよね！」

**先輩**: 「それは日常生活で使う「ネットワーク」で、俺が言っているのはシステム開発という文脈でのネットワーク！　」

**後輩**: 「それでしたら多分大学の時の講義でやったから多分いけます！」

**先輩**: 「じゃあ、今後輩くんが繋がってるパソコンは、ネットワーク層から見てどういう経路を辿ってインターネットにアクセスして、どうやって戻ってくるか説明できる？」

**後輩**: 「ネットワーク層...？（何それ）ちょっとわかりません」

**先輩**: 「ざっとこんな感じ⭐︎↓」


1. **後輩くんがパソコンでウェブブラウザを開く**
2. **ウェブサイトのURLを入力**
3. **ブラウザがDNSリクエストを生成**
4. **DNSリクエストがローカルネットワークを通じてデフォルトゲートウェイに送信される**
5. **デフォルトゲートウェイがリクエストをISPのDNSサーバーに転送**
6. **DNSサーバーがURLをIPアドレスに解決**
7. **解決されたIPアドレスがパソコンに戻る**
8. **ブラウザがHTTPリクエストを生成（IPアドレスを使用）**
9. **HTTPリクエストがデフォルトゲートウェイを通じてISPのルーターに送信される**
10. **ISPのルーターがリクエストをインターネットに転送**
11. **リクエストが複数の外部ルーターを経由**
12. **リクエストが目的地のサーバーのネットワークに到達**
13. **サーバーのローカルルーターがリクエストをサーバーに転送**
14. **サーバーがリクエストを受け取る**
15. **サーバーがリクエストを処理**
16. **必要なデータがデータベースやファイルシステムから取得される**
17. **サーバーがHTTPレスポンスを生成**
18. **HTTPレスポンスがサーバーのローカルルーターに送信される**
19. **レスポンスがサーバーのネットワークを通じてインターネットに転送される**
20. **レスポンスが複数の外部ルーターを経由**
21. **レスポンスがISPのルーターに到達**
22. **ISPのルーターがレスポンスをデフォルトゲートウェイに転送**
23. **デフォルトゲートウェイがレスポンスをパソコンに転送**
24. **ブラウザがレスポンスを受け取る**
25. **ブラウザがレスポンスを解析**
26. **ウェブページがブラウザに表示される**
27. **ユーザーがウェブページを閲覧**
28. **追加リクエスト（画像やスクリプトのロード）が必要な場合は、再度リクエスト**
29. **各追加リクエストに対して、同様のプロセスが繰り返される**
30. **ブラウザセッションの終了**

**後輩**「ネットワーク勉強します」

## なんかいっぱいステップがあるのはわかったけど、結局何で大切なの？

**後輩**「僕はプログラミングがしたいのに！！！」

**先輩**「まあその気持ちもわからなくもないけど、ソフトウェア開発、システム開発の観点からもとても大切なんだよ」


**後輩**「正直あまりピンときません。。（僕はpythonとかNext.jsとか、かっこいい言語を使って働きたい、ハァハァ」

**先輩**: 「ネットワークが大切な理由を説明する前に、まずはレストランの例え話から始めようか。🍴」

**後輩**: 「レストラン？どういうことですか？」

**先輩**: 「ソフトウェア開発って、実はレストランで料理を作るプロセスに似てるんだ。考えてみて。レストランでは、一人のシェフがすべてをやるわけじゃないよね。仕込み担当、調理担当、盛り付け担当...と、それぞれの専門家が協力して一つの料理を完成させる。」

**後輩**: 「なるほど、チームワークが大事ってことですね。」

**先輩**: 「そうそう、そのチームワークが、まさにネットワークの役割なんだ。開発では、各々のコンピュータやシステムがチームメンバーのように機能して、データをやり取りしたり、命令を出したり受け取ったりして、プロジェクトを進めるんだよ。」

**後輩**: 「それで、ネットワークが上手くいってないと、全体の作業が滞るってことですか？」

**先輩**: 「正解！🎯 例えば、ソフトウェア開発では、コードだけじゃなくて、そのコードがどうやって他のシステムやサービスと連携するかが重要なんだ。ウェブアプリを作る時に、データベースや認証サービス、メールサービスなど、さまざまな外部システムとやり取りするでしょ？」

**後輩**: 「はい、そうですね。」

**先輩**: 「このときネットワークが上手く設定されていないと、サービス間でのデータのやり取りが遅くなったり、最悪繋がらなかったりするんだ。データベースからのレスポンスが遅れば、ユーザーの待ち時間が長くなるし、メールサービスが繋がらないと、重要な通知が届かない。これじゃあ、ユーザー満足度は下がるばかりだよね。」

**後輩**: 「確かに、それは良くないですね...」

**先輩**: 「さらに、セキュリティの面でもネットワークは重要だよ。ネットワークがしっかりしていないと、外部からの攻撃に弱くなるんだ。データの流れをコントロールして、不正なアクセスを防ぐのもネットワークの大事な役割だからね。」

**後輩**: 「セキュリティは大事ですよね。」

**先輩**: 「そしてね、クラウドサービスを使う現代の開発では、ネットワークの設計が直接コストにも影響するんだ。データ転送量が多いと料金が高くなるから、効率的なネットワーク設計はコスト削減にもつながるよ。」

**後輩**: 「へー、経済的な側面もあるんですね。」

**先輩**: 「まとめると、ネットワークはデータのやり取りを効率的にするため、セキュリティを保ち、コストを管理するために不可欠なんだ。だから、ネットワークを理解することは、良いソフトウェアを作る上で絶対に必要なスキルなんだよ。🌟」

**後輩**: 「なるほど、ネットワークって本当に色んなところで大切なんですね。勉強してみます！」

**先輩**: 「いいね！分からないことがあったらいつでも聞いてくれ。一緒に学んでいこう！👍」