Work
Team Development/4 minutes read

京大11月祭のインフラ構築

京都大学の学園祭で、学生団体が企画出展手続きをオンラインで行うためのWeb基盤をチームで構築。

作ったもの

京都大学11月祭で、学生団体が企画を出展するための手続きをオンラインで進められるWeb基盤、PENGUINを制作しました。

PENGUINは毎年継続して開発が行われているプロジェクトで、以前はフロントエンドがDjangoで記述されていましたが、私が11月祭事務局に入局した年にフロントエンドはNext.jsに変わりました。私が開発を主導したのは入局して1年が経ってから、私が大学2年制のときです。

フロントエンドはNext.jsとshadcn/uiで作られ、Vercelに展開されています。

バックエンドはDjango REST Frameworkで作られ、Dockerを使って京都大学のVMに展開されています。

チームの進め方

開発チームには同期が3人、後輩が4人いました。下級生は教育が必要な状態だったので、機能開発と並行して教える必要がありました。機能ごとにフロントエンド設計とバックエンド設計の担当を分け、担当者が実装を進め、私もその担当に自身を組み込むと同時に進捗確認やレビュー、詰まっている箇所の整理をする形式で進めました。

私が担当者となった際、最初にやったのは、関係部署へのヒアリングです。どの部署がどの情報を必要としているのか、学生団体に何を入力してもらう必要があるのかを聞き、機能ごとに要件を分けました。企画内容、場所、備品、食品、各部署の確認などのみならず、特別対応などケースバイケースの処理も必要になるため、複雑な実装計画になることが多々ありました。

教育に関して言えば、正直なところうまくいったとは言いづらいです。短い期間で新しいメンバーを育てながら、同時に本番に載せる機能を作るのは非常に困難でした。自身がプログラミング経験者であり、学習に必要な時間を把握できていなかったことや、十分な引き継ぎがなかったことが原因で、何をどこまで教えれば間に合うのかを適切に判断できませんでした。このプロジェクトにおける一番の反省点といえます。

保守管理とデザインの統一

私が開発を主導した年にはPENGUINでNext.jsが採用されて1年しか経過していないということもあり、担当者ごとにページの構成方針が違ったり、UXの悪い実装があったりといった問題がありました。そこで、ウェブサイト全体で共通のデザイントークンを作成し、加えてshadcn/uiをもとにした統一UIコンポーネントであるPENGUIN UIを作成しました。私の独断で、一人で行った施策でしたが、チーム全体のデザインに対する意識が向上し、結果として良い影響をもたらしたと思います。

セキュリティ対応

前年にインシデントがあったため、本番運用ではセキュリティに細心の注意を払いました。バックエンドを置いているVMに直接アクセスされる状態を避けるため、WebサイトはCloudflareを介すようにし、DDoSやIP直叩きのリスクを下げました。CensysなどにIPが載る前に移行できたので、少なくとも露出を減らす対応にはなったと思います。フロントエンド本体についても、VercelからCloudflare Workersへの移行を検討しました。しかし、移行に十分な時間を確保できなかったことに加え、Next.jsに脆弱性が発見された際のパッチ提供や対応はVercelが最も迅速であると考えられたことから、今回は見送る判断としました。実際に、検討段階でCVE-2025-29927 が発見されました。幸いVercelやCloudflare WorkersでホスティングされているNext.jsプロジェクトが影響を受けるものでありませんでしたが、今後発見される脆弱性もそうだとは限りません。

PENGUINは特に京都大学に所属する学生の情報を保管し、学生団体の情報を扱うシステムです。公開前に可能な限り対策することが非常に重要です。完璧だったとは言いませんが、前年の反省を踏まえて、運用前にできることはしたと思っています。

実装面でも、他のチームメンバーの担当箇所でXSSが発生しうる実装を発見したことがありました。公開前に発見し、未然に対策することができました。

難しかったこと

一番問題になったのは作業量です。私がメンバーの能力を正確に把握できていなかったため、途中で納期に間に合わないペースになりました。その結果、私が作業を巻き取って間に合わせる場面が何度もありました。技術的な難しさよりも、マネジメントの難しさが目立った業務だったと思います。

私自身の業務に忙殺され、他のチームメンバーに業務を割り振ることができない状況にも遭遇しました。どのメンバーがどのくらい能力があって、どの機能なら任せられるのか、どの機能は早めに実装して、どの機能は練習として後輩に回すべきかなど、大局的な目線をもつことの難しさを痛感しました。

私がリーダーとして開発を行ったのは、前述のとおり大学2回生の4月です。そこから新歓期を経て5月にはウェブサイトを公開、11月の学園祭本番まで機能開発に奔走するというタイトなスケジュールの中で指揮を執るのは決して簡単ではありませんでした。

所感

この開発では、プロダクトを作ることより、チームで期限に間に合わせることのほうがずっと難しかったです。要件定義、担当分け、レビュー、セキュリティ、本番運用を短期スケジュールの中でこなさなくてはいけません。所詮は大学生の活動だと舐めてかかった面もありましたが、大きな間違いだったと実感しています。

それでも、11月祭の成功の一端を担う重要な部署のリーダーとして活動できたことは貴重な経験でした。うまくいかなかった部分も含めて、チーム開発で重視すべき部分を学びました。

リンク

student.nf.la (現在のウェブサイトであり、私が開発したものと完全に同一ではありません。)