はじめに
こんにちは!
先日、日本最大級の学生エンジニア向けイベント「技育祭」のハッカソンに参加し、チーム『怠惰な大学生』として『Social Guillotine』というタスク管理アプリを開発しました。
本記事では、この開発経験を通じて得られた「目的意識を持ったサービス設計」「チーム開発の推進」、そして「次につながる技術選定への反省」について、思考プロセスを中心に振り返ります。
1. なぜ作ったのか? - 課題の源泉は「自分自身」
私たちのチーム名は 『怠惰な大学生』 。この名前が、開発したプロダクトに関係しています。
課題定義:我々の敵は「自分自身」
- 「明日やろう」と思って、気づけば遅れ提出…
- 「あと5分…」のスヌーズが、気づけば1限の終了時刻…
こんな経験、ありませんか? 私たちは、この 「どうしようもない先延ばし癖」 という、自分たち自身のリアルな課題をハッカソンのテーマとして設定しました。
上流工程で最も重要だと考える 「誰の、どんな課題を解決するのか」 という問いに対して、私たちは「怠惰な大学生(自分たち)の、タスクを実行できないという課題」という答えを持って開発をスタートしました。
解決策:「罰ゲーム」と「AIの褒め言葉」によるアメとムチ
単なるリマインダーでは、他のタスク管理アプリと同類になってしまう。そこで、行動経済学の「損失回避性」に着目し、究極のアメとムチを設計しました。
- ムチ(罰ゲーム): 設定した期限を破ると、自分で設定した反省文が Discordに自動投稿 される。
- アメ(AIからの褒め言葉): タスクを期限内に完了させると、 GoogleのGemini API がその頑張りを全力で褒めてくれる。
この「アメ」と「ムチ」によって行動変容を促すことが、私たちのサービスのコアコンセプトです。
2. どう進めたのか? - 役割分担とGitHub Flowによるチーム開発
2日間という限られた時間で、以下の機能を実装しました。
- ユーザー認証・管理
- タスクのCRUD機能
- 統計・ランキング機能
- グループ機能
- バッジによるゲーミフィケーション
- Discord Webhook連携
- Gemini API連携
これを実現できたのは、明確な役割分担と開発プロセスの確立があったからです。
| 役割 | 担当 | 主な技術・タスク |
|---|---|---|
| バックエンド | メンバーM | Python (Flask), SQLAlchemy, DB設計 |
| フロントエンド | メンバーM, 私 | HTML, CSS, JavaScript, UI/UX設計 |
| API連携 | 私 | Gemini API, Discord連携, Git管理 |
私は主に フロントエンドと外部API連携 を担当しました。特にこだわったのは、 「どうすればユーザーが危機感を持ってくれるか」 という部分です。
開発は GitHub Flow をベースに進めました。
-
mainブランチを保護 - 各機能ごとに
featureブランチを作成 - 実装完了後、Pull Requestを作成
- チームメンバーによるレビューを経て
mainブランチにマージ
このプロセスを徹底することで、コンフリクトを抑えて開発に取り組もうと思ったのですが、実際にはコンフリクトがでてしまい、開発に支障をきたしました。一回のコミュニケーションエラーですらこのようなエラーに繋がるなんて、チーム開発の大変さを実感しました。
3. 何を学び、次にどう活かすのか? - 自己反省と今後の展望
このハッカソンを通じて、多くの成功体験と、次への明確な課題を得ることができました。
【良かった点】目的意識を持った開発プロセス
- ユーザー中心設計の実践: 「怠惰な自分たちが本当に使いたいか?」を問い続け、機能の優先順位を判断しました。これは、上流工程で求められる要件定義のスキルに直結すると感じています。
- チーム開発の経験: GitHub Flowを用いた開発プロセスは、円滑な共同作業に不可欠でした。メンバーと一つの目標に向かって開発する経験は非常に貴重だと感じました。
【自己反省】技術選定における目的意識の甘さ
今回、バックエンドはFlask、フロントエンドはVanilla JS(ライブラリなしの素のJavaScript)で実装しました。これにより、Webの基本的な仕組みを理解できたという利点はありました。
しかし、正直に言うと、これは 「チームメンバーが最も慣れている技術」 という理由での選定であり、「このサービスを将来的にどう成長させたいか」という視点が欠けていたと反省しています。
もし今、もう一度このアプリを開発するなら、私は以下のような技術選定を提案します。
-
UI/UXの刷新 →
React/Vue.jsの導入:- 理由: コンポーネントベースの開発は保守性を高め、SPA化による滑らかなユーザー体験は、ユーザーの利用継続率に大きく貢献するため。
-
リアルタイム性の強化 →
WebSocketの導入:- 理由: グループ内でのタスク達成状況をリアルタイムに通知することで、より強い相互監視と連帯感を生み出すため。
-
保守性の向上 →
Dockerによる環境構築の徹底:- 理由: 開発環境の差異をなくし、誰でもすぐに開発に参加できる状態を作ることで、開発効率を最大化するため。
「なぜこの技術を選ぶのか?」
この問いに対して、サービスの成長戦略と結びつけて答えられるようになることが、上流工程を目指す私にとっての次なる目標です。
まとめ
今回のハッカソンは、「グループ開発に慣れる」という当初の目標を達成できただけでなく、 「目的意識を持った開発とは何か」 を深く考えるきっかけとなりました。
最後までお読みいただき、ありがとうございました。