プログラミング授業の課題採点DX化アプリ

https://github.com/KinuGra/shooting-star-2605

Next.js

TypeScript

Java

PostgreSQL

ECS

大学のプログラミング授業における、課題採点業務をDX化するアプリ

zatu

kfff

fe01

推しアイデア

実際の大学の講義のリアルな社会課題を解決!

作った背景

授業のコード提出をいちいち学生の席を回って確認... 課題をパワポやPDFで生徒に告知... 紙にフローチャートを書いて提出。。。 大学の授業がこんなアナログであっていいわけがありません。

推し技術

Spring Boot AWS

プロジェクト詳細

概要

大学のプログラミング授業における、課題採点業務をDX化するWebアプリ。学生が提出したコードをジャッジサーバーで自動採点し、教員・TAの採点負担を削減する。

背景・課題

大学のような法人のDX化が遅れているという社会課題を解決する。

現状、教授が手動でコードを読んだり、TAが動作確認してハンコを押しており非効率。 これを効率化し、教員・TAの負担を減らす。

機能概要

学生向け機能

  • 授業参加 — 招待コードで授業に参加
  • 課題提出 — コードを提出(複数回可)
  • 即時採点 — ジャッジサーバーによる自動採点+教師のコメント
  • 成績確認 — 採点結果・成績一覧を確認

フロー: 授業参加 → 課題提出 → 即時採点 → 成績確認

image image

オーナー・教師向け機能

  • 授業作成 — 授業を作成・管理
  • 課題作成 — 内容・テストケース(in/out)・期限などを設定
  • 提出管理 — 生徒ごとに提出を確認
  • 採点修正 — 自動採点結果の修正・コメントが可能

フロー: 授業作成 → 課題作成 → 提出確認 → 採点修正

image

image

技術

フロントエンド

  • Next.js
  • SWR, react-hook-form
  • orval codegen
    • useSWRを用いたAPI呼び出しhooks, zodのバリデーションを自動生成
  • Zod
  • Biome

バックエンド

  • Spring Boot / Java
  • Spring Security — JWT認証
  • Spring Data JPA / Hibernate — ORM
  • PostgreSQL — データベース
  • springdoc-openapi 2.6.0 — OpenAPI仕様自動生成・Swagger UI
  • JJWT 0.12.3 — JWTトークン生成・検証
  • Spring Boot Validation — リクエストバリデーション(@Valid)
  • Spring Boot DevTools — ホットリロード(開発環境)

インフラ

  • Docker
  • PostgreSQL
  • ECR, ECS
  • Terraform
  • main pushをトリガーに自動でデプロイ

アーキテクチャ図

Claude CodeとDraw.io MCPを使用して作成。 image

挑戦・成長

チーム開発の進め方を体得

手戻りなくスムーズに開発を進めるには、メンバーとこまめにコミュニケーションを取りながら進めること、そしてタスクを適切に分担・配分することが重要だと、実体験を通して学んだ。仕様書の整備や Issue 管理と合わせ、チームを円滑に動かす視点が身についた。

新しい技術への挑戦

初挑戦の Spring Boot をキャッチアップしながら実装をやり切り、手をつけられていなかったジャッジサーバーも形にした。未知の技術にも臆さず踏み込み、最後まで作り切る力がついた。

技術選定の深掘り

いつもより根拠を持って技術選定に向き合い、他言語と比較した Java のメリット・デメリットを具体的に理解。「なんとなく選ぶ」から「比較・根拠を持って選ぶ」へと判断の解像度が上がった。

チーム開発で工夫したこと

開発体制・進行管理の整備

チーム開発を効率化し、認識のズレをなくすために、進捗の可視化とドキュメント整備を徹底しました。

1. Discord 整備 — 進捗の常時可視化

  • GitHub の通知(Webhook)を Discord に連携
  • コミットや Issue・PR の動きがリアルタイムで流れるようにし、いつでも進捗を確認できる状態を構築

2. 仕様・ドキュメントの徹底整備(docs/ 配下)

  • システム仕様 / DB 設計 / 各種ツールの使い方 / デプロイ方法を docs/ に集約
  • 狙い:
    • MTG の時間が取りづらい中でも、メンバー間の認識の相違をなくす
    • ドキュメントを参照するだけで開発を進められる効率的な体制に
  • 副次的メリット: Claude Code に仕様書ベースで実装させやすく、仕様ドリブン開発との相性が抜群

3. GitHub Projects による Issue 管理

  • 各メンバーの「今やっていること / これからやること」が明確に

具体的な工夫:

  • FigJam でアイデア出しを可視化し、認識を共有しやすくした
  • Issue ドリブン開発で、GitHub にドキュメント・プロジェクト管理を一元化
    • Issue ベースでタスクを細分化・明確化し、複数の実装が混ざったぐちゃぐちゃなコミットを防止
    • 担当・進捗を可視化し、開発しやすい状態に

技術選定・技術活用

このアプリに適した技術選定を行うことで技術を適切に活用。

Java / Spring Boot

  • 成績という重要データを扱うのでデータ消失、誤集計が許されない → 堅牢性が求められる
  • TSは型が実行時に消える(コンパイル時のみの保証)、PydanticはAPIの境界でのバリデーションが中心で言語自体は動的 → Javaは言語の土台が静的型付けで、ロジック全体をコンパイル時に検査。実行時もJVMが型情報を保持するため、不正な型操作は例外で弾ける
  • Node.jsやPythonに比べて高負荷に強い:JVMの標準マルチスレッドで、一斉提出時も多数の同時リクエストを安定処理
  • 並行処理ならGoも強い、むしろ有利な面もあります。ただ今回は権限制御・採点修正・コメントなど業務機能の拡張が多いプロダクトなので、認証認可やORMが標準で揃うSpringの方が、限られた時間で堅牢に作れると判断しました。
  • KotlinもSpringが使えて、null安全で簡潔なので有力候補でした。ただ今回はチーム初のSpring Boot挑戦で、まず情報量が最も多いJavaで土台を固めたかった。Kotlinは次のステップとして考えています

PostgreSQL

  • 構造が決まっていて関係性・集計が多いデータは、リレーショナルDB(SQL)が向いている。
    • Firebase(NoSQL)は集計・JOINが苦手で、関係性の強い採点データに不向きなので不採用
  • SQLiteより同時書き込みに強く、MySQLより高機能
    • PostgreSQLは標準準拠で高機能、データ整合性に厳格で、成績という消失・誤りが許されないデータや将来の機能拡張に対応しやすい。
  • Supabaseとの比較
    • ① 速くなるのはCRUDだけ。難所は残る
      • Supabaseが時短できるのはデータの読み書きAPIのみ。本体であるジャッジ実行・採点ロジックは結局バックエンドが必要。どうせ作るならSpring Bootに一元化した方がシンプル。
    • ② 速さの裏でセキュリティリスクが上がる
      • フロントから直接DBを叩くと権限制御をRLS頼みになる。成績システムでは「他人の点数・コードを見せない」「成績を書き換えさせない」が必須で、RLSでの作り込みはミスると情報漏洩・改ざんに直結。バックエンドを挟めば認可を1か所で確実に管理できる。

遊び心

  • 着せ替え機能 image image imageimage

zatu

@zatu