Skip to content

Latest commit

 

History

History
285 lines (166 loc) · 6.15 KB

phase-2.md

File metadata and controls

285 lines (166 loc) · 6.15 KB

Phase 2: 既存実装の読解(WEBrick)演習

← 前へ: 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サーバのコードを説明できること

重要な前提(読み方)

このフェーズではすべてを理解する必要はありません。

重要なのは:

「全部理解しようとする」のではなく
「構造をつかむ」こと


読み方の戦略

以下の順序で読み進めてください:

  1. エントリーポイントを特定する
  2. リクエストがどのように処理されるか追う
  3. クラスの責務を理解する
  4. 自作実装と比較する

演習課題

Step 1: WEBrickを動かす

まずは実際に動かします。

セットアップガイドで作成した演習ディレクトリwork/で依存Gemを確認します。

bundle install

WEBrickの細かなバージョンは問いません。冒頭のソースリンクは読解の参照例であり、その版のインストールを必須にはしません。以下を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/

Step 2: エントリーポイントを探す

以下を確認してください:

  • WEBrick::HTTPServer.new は何をしているか?
  • start メソッドはどこに定義されているか?

課題

  • start メソッドの中で何が起きているか説明する

Step 3: リクエスト処理の流れを追う

以下の流れをコードから追跡してください:

  1. TCP接続の受け付け
  2. リクエストの読み込み
  3. リクエストオブジェクトの生成
  4. ハンドラ(mount_proc)の呼び出し
  5. レスポンスの生成
  6. クライアントへの返却

成果物

  • 処理フローを図または文章で説明する

Step 4: クラスの責務を理解する

以下のクラスを調査してください:

  • HTTPServer
  • HTTPRequest
  • HTTPResponse

課題

それぞれの責務を一言で説明する:

クラス 責務
HTTPServer ?
HTTPRequest ?
HTTPResponse ?

Step 5: 自作実装との比較

Phase 1の自分のコードと比較してください。

観点

  • 自分の実装には無かった機能は何か?
  • なぜそれが必要か?
  • どの部分が抽象化されているか?

例

  • ヘッダのパース
  • エラーハンドリング
  • 複数リクエスト対応
  • Keep-Alive

Step 6: 「なぜこの設計か」を考える

以下の問いに答えてください:

  • なぜリクエストがオブジェクトになっているのか?
  • なぜレスポンスもオブジェクトなのか?
  • なぜ処理をブロックで渡すのか?

発展課題

課題1: ログ出力を追う

  • WEBrickがどこでログを出しているか調査

課題2: 例外処理を追う

  • エラーが起きたときどうなるか?

課題3: 並列処理の理解

  • 複数リクエストはどう処理されるか?

成果物

以下を提出してください:

1. 処理フロー図

  • リクエストからレスポンスまでの流れ

2. 比較レポート

  • 自作実装との違い
  • 学んだこと

3. 気づき

  • 「自分の実装はなぜ単純すぎたのか」

レビュー観点

  • コードの流れを説明できるか
  • 抽象化の意図を理解しているか
  • 自作コードとの差分を認識できているか
  • 「なぜ」を考えているか

AI活用(重要)

OK

  • コードの解説をさせる
  • 処理の流れを整理させる
  • 設計意図を質問する

NG

  • 「要約して終わり」
  • 理解せずに写す

よくある失敗

1. 全部読もうとする

→ 必要なのは「構造理解」


2. 細かい構文に引っ張られる

→ まずは流れを追う


3. 自分のコードと比較しない

→ 比較が最も重要


このフェーズの本質

このフェーズの目的は:

「コードを書く力」ではなく
「コードを読む力」を身につけること


最後に

優れたエンジニアは必ず:

  • 他人のコードを読める
  • 設計意図を理解できる
  • 自分の実装との違いを説明できる

このフェーズでその基礎を作ります。


← 前へ: Phase 1 | 目次 | 次へ: Phase 3.1 →