ERENOA
← Works に戻る 業務委託 · 2026/5 - 現在

大学向け LMS のリアーキテクチャ

作ったもの
メッセージ/お知らせ機能の MVC 化(完了)と、テストの実行画面の MVC 化(進行中)。
担当
業務委託。2 機能の設計・実装・検証。Controller の再編と、テスト画面の実行系を主に担当。
難所
PC とスマホの別実装、古い世代のコードとの同居、5 言語対応。利用者の操作を保って移すこと。
どう解いたか
古い処理をそのまま呼び、DB の突き合わせとブラウザの自動巡回で検証。「消してよい証明」を作る。
PHP 8.2 / 7.4PostgreSQLモジュラー MVCJavaScriptCSSPlaywrightPHPUnitPHPStanPsalmGitLab CIDocker ComposeClaude Code

紹介

大学で使われる学習管理システム(LMS)の開発に業務委託で参加。コードの中には、手続き型の古い画面、旧来の MVC、新しいモジュラー MVC の 3 世代が同居している。担当した 2 つの機能を、古い世代から新しいモジュラー MVC へ移した。

Case study / 02

制作と担当

メッセージ/お知らせ機能と、テスト画面の MVC 再設計

長く使われてきた大学向け学習管理システムで、手続き型と画面の二重実装が残る機能を、モジュラー MVC へ移した。利用者の体験は変えずに。

業務委託として 2 機能の設計・実装・検証を担当。Controller の再編と、テスト画面の実行系を主に担当。

メッセージ/お知らせ機能の MVC 化

期間:2026-05〜07

  • フレーム分割の手続き型で、PC とスマホが別実装だった機能を、ルーターと権限の境界で分けた 7 つの Controller と 3 つの共通部品へ移した。
  • 1,514 行あった巨大な基底クラスを撤廃。
  • PC とスマホを 1 つのテンプレートに統合。入力フォームは 1 つの DOM にし、表示だけ CSS で出し分ける。
  • 5 言語(日本語・英語・韓国語・簡体字・繁体字)の文言を、履歴を保ったまま移し、13 のテンプレートを翻訳関数経由にした。
  • 送信の認可を作り直した(管理者・閲覧者は常に可、教員・学生はコースの所属と役割を検証)。設計判断を ADR として 3 本残す運用を、このチームで初めて入れた。
  • 古い画面を削除する前に「消してよい証明」を作った:参照の検索、73 本のリモートブランチとの突き合わせ、回帰テスト、テスト資産の確認。
  • 移行の途中で、実際の不具合を 6 件見つけて直した(無限再帰、PHP 8 での致命的エラー、通知の未読件数、言語ラベルの欠落など)。
テストの実行画面 · 移行中3 つの実装を、1 つのテンプレートへ。
PC · 1 問ずつPC · 全問一括スマホ
共通テンプレート既存の設問描画を、そのまま呼ぶ。
旧画面の回答後 DB新画面の回答後 DB

新旧の DB を突き合わせ、同じ結果を確かめる。

テストの実行画面の MVC 化

期間:2026-08〜・進行中

  • 同じ機能が「PC で 1 問ずつ」「PC で全問一括」「スマホ」の 3 つに分かれて実装され、設問タイプを 1 つ足すにも 3 か所の修正と 3 回のテストが要った。これを 1 つのテンプレートへまとめる。条件は、利用者の体験を変えないこと。
  • 方針:
    • 古い処理を正とし、書き直さずに呼ぶ(設問の描画は既存の部品をそのまま使う)。
    • フレーム分割の「枠割り」は残し、仕組みは捨てる(1 ページ+flex で同じ配置)。
    • 互換は段階的に:旧 URL への互換の入口を残し、特殊な教材は古い実装へ委ねる(ストラングラー方式)。
    • 「同じ」は検証で証明する:新旧で回答したあとの DB を突き合わせる。
  • 12 の設問タイプ × 一括/制限時間/未回答/一問一答/しおりからの再開/ランダム出題/アンケート/レポート × PC/スマホ、の組み合わせを実機で検証。
  • 着手前の調査は、AI のサブエージェント 4 本を並列に走らせて 1 日で行った。中核の 4 クラス(最大 4,579 行)、テスト 9 本、大学ごとのカスタマイズ約 15 か所、5 言語 × 66 キーの文言などの隠れた依存を台帳にし、32 画面を洗い出した。
  • スマホ画面から古い jQuery Mobile を外した。

検証のやり方

  • 「HTTP 200 なら正常」とは見なさない。致命的エラーの画面も 200 を返すため、本文の目印の検査と、画面写真の差分を Playwright で自動巡回する仕組み(21 の URL)を標準にした。
  • アクセシビリティ(WCAG 2.0 1.4.3 のコントラスト)の検査を Playwright と Firefox で自動化し、Firefox の検査パネルと結果が一致することを確かめた。

現場での AI 駆動開発

  • Claude Code のスキルを 3 本自作:
    • MR・CHANGELOG・コミットの書式:マージ済みの MR 200 件と、実際に書かれた 66 件から書式を統計で取り出した(最初の版が少数派の書き方に倣っていたのを、自分で見つけて直した)。
    • アクセシビリティの自動検査(上記)。
    • 手動テストの台本の書式。
  • 設計判断を ADR に残し、「なぜ他の案を捨てたか」を必須にした。
  • Notion・Figma と Claude Code をつなぎ、資料とワイヤーフレーム(13 案 × PC/スマホ)を作った。

規模

2026-10-15 時点

  • 期間:2026-05〜(約 5 か月)
  • コミット:約 170 / 主に触ったモジュール:3 つ(メッセージ・お知らせ・設問)
  • 品質の仕組み:PHPUnit、PHPStan、Psalm、PHP_CodeSniffer、GitLab CI(PHP 7.4 と 8.2 の両方で実行)

構成

  • 移行の前:フレーム分割の手続き型ページ(PC 用)+スマホ用の別実装 + 巨大な基底クラス
  • 移行の後:ルーター → 権限の境界で分けた Controller 群 → 1 つのテンプレート(PC/スマホを CSS で出し分け)→ 5 言語の文言
  • テスト画面:3 実装(PC 1 問ずつ/PC 一括/スマホ)→ 1 テンプレート。古い設問描画はそのまま呼ぶ。新旧の DB を突き合わせて同じことを確かめる。