← 前へ: Phase 1 | 目次 | 次へ: Phase 3.1 →
実行前に共通セットアップと各Phaseの確認手順を確認してください。演習コードはwork/で前のPhaseから引き継ぎます。
このフェーズでは、WEBrick 1.9.2のソースコードを読み解きます。
WEBrickはRuby 3.0から標準ライブラリに含まれないため、現在はGemとして導入します。この教材ではRack 3の動作確認用Webサーバとして使いますが、WEBrickはローカル開発・学習・テスト向けです。本番環境向けのWebサーバとしては使用しないでください。
Phase 1で自分で実装したHTTPサーバと比較しながら、
- 実務レベルのHTTPサーバが何をやっているのか
- 自分の実装との違いは何か
- なぜその設計になっているのか
を理解することが目的です。
以下を説明できる状態になること:
- HTTPサーバの責務の全体像
- リクエスト処理の流れ
- なぜ自作コードでは不十分なのか
- 実務コードにおける設計の考え方
- Phase 1を完了していること
- 自作HTTPサーバのコードを説明できること
このフェーズではすべてを理解する必要はありません。
重要なのは:
「全部理解しようとする」のではなく
「構造をつかむ」こと
以下の順序で読み進めてください:
- エントリーポイントを特定する
- リクエストがどのように処理されるか追う
- クラスの責務を理解する
- 自作実装と比較する
まずは実際に動かします。
セットアップガイドで作成した演習ディレクトリwork/で依存Gemを確認します。
bundle installWEBrickの細かなバージョンは問いません。冒頭のソースリンクは読解の参照例であり、その版のインストールを必須にはしません。以下をwebrick_server.rbに保存し、bundle exec ruby webrick_server.rbで起動してください。
require 'webrick'
server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "127.0.0.1")
server.mount_proc '/' do |req, res|
res.body = "Hello from WEBrick"
end
trap 'INT' do server.shutdown end
server.startブラウザでアクセス:
http://localhost:3000/
以下を確認してください:
WEBrick::HTTPServer.newは何をしているか?startメソッドはどこに定義されているか?
startメソッドの中で何が起きているか説明する
以下の流れをコードから追跡してください:
- TCP接続の受け付け
- リクエストの読み込み
- リクエストオブジェクトの生成
- ハンドラ(mount_proc)の呼び出し
- レスポンスの生成
- クライアントへの返却
- 処理フローを図または文章で説明する
以下のクラスを調査してください:
- HTTPServer
- HTTPRequest
- HTTPResponse
それぞれの責務を一言で説明する:
| クラス | 責務 |
|---|---|
| HTTPServer | ? |
| HTTPRequest | ? |
| HTTPResponse | ? |
Phase 1の自分のコードと比較してください。
- 自分の実装には無かった機能は何か?
- なぜそれが必要か?
- どの部分が抽象化されているか?
- ヘッダのパース
- エラーハンドリング
- 複数リクエスト対応
- Keep-Alive
以下の問いに答えてください:
- なぜリクエストがオブジェクトになっているのか?
- なぜレスポンスもオブジェクトなのか?
- なぜ処理をブロックで渡すのか?
- WEBrickがどこでログを出しているか調査
- エラーが起きたときどうなるか?
- 複数リクエストはどう処理されるか?
以下を提出してください:
- リクエストからレスポンスまでの流れ
- 自作実装との違い
- 学んだこと
- 「自分の実装はなぜ単純すぎたのか」
- コードの流れを説明できるか
- 抽象化の意図を理解しているか
- 自作コードとの差分を認識できているか
- 「なぜ」を考えているか
- コードの解説をさせる
- 処理の流れを整理させる
- 設計意図を質問する
- 「要約して終わり」
- 理解せずに写す
→ 必要なのは「構造理解」
→ まずは流れを追う
→ 比較が最も重要
このフェーズの目的は:
「コードを書く力」ではなく
「コードを読む力」を身につけること
優れたエンジニアは必ず:
- 他人のコードを読める
- 設計意図を理解できる
- 自分の実装との違いを説明できる
このフェーズでその基礎を作ります。