公立はこだて未来大学の学内ハッカソンであるP2HACKS2024の参加記です。
はじめに
このハッカソンのPostPBL部門(プロジェクト学習を経た学部3年生以上向け)に複雑系コースの友人3人で参加しました。そして、「LLMが感情にあった楽曲を提案する」というプロダクトを開発しました。
私は、主にバックエンドの開発に携わりました。(またフロントの一部機能の実装にも挑戦してみたものの、難儀した模様...。)
そして、なんとなんと
ありがたい事に、このPostPBL部門にて最優秀賞をいただきました。
突如として優秀なプロジェクトマネージジャーに化けた友人と、ローカルLLM開発へ果敢に挑んだ友人...。この二人と複雑系コースで親交を深め、こうやって開発できたこと。これだけで学費の元は取れたといっても過言ではありません。ありがとう。
受賞がなかったとしても、かなり貴重な9日間だったため、せっかくなので実践したこと、学んだことなどなどを書き残したいと思い、筆を取りました。書きたいことは山々なのですが、今はとりあえず、以下3点に絞って書き残そうと思います。
PBLでの経験が活きた場面について(PBL成果発表会直後のハッカソンだったため)
マネージメントと自己管理について(9日間で約30時間のバイト勤務の中での開発だったため)
心残りについて
それではまずは「PBLでの経験が活きた場面について」
PBLでの経験が活きた場面
まず初日は、私はバイトがあったため、コンセプト立案に関しては完全にお二人に任せました(熱い信頼)。
そして帰宅後、こんな図が...!
LLMでただ文章を出力させるだけでなく、音楽を提案するというコンセプトがとても良き!ユーザー側の流れとシステム側の流れがわかりやすい!何より、こんなアプリがもしあったら使いたい!と、かなりテンションが上がりました。
しかし、(使いたい技術が先行してしまっているのでは...?)という不安も同時に感じました。具体的には、「プロンプトを受けてLLMがプレイリストを作る」という手段の部分に目的が置かれているように、自分の目には映りました。
ここでプロジェクト学習の経験がフラッシュバック。それはおおよそ9月か10月か…一部の機能の設計・開発を盲目的に注力した結果、前期に明確にしたはずの"プロダクトの強み"が失われてしまっていた...なんてことが実際にありました(これがなかなか辛い)。
今回のプロダクトに当てはめて説明してみます。例えば、図の[PROMPTING]部分。「LLMがより良いプレイリストを作る」ということをチームとしての第一の目標とした場合、「精度を高めるために感情を詳細に入力できるようにしよう」という意思決定をチーム全体で選んでしまう可能性があります。この選択は単調作業をユーザーに強いることへ繋がり、まるでロボットの支配で人間が労働させられるディストピア作品と化してしまいます。本来あったはずのプロダクトの価値が失われてしまうなんてことがあっては、元も子もありません。
こういった望ましくない方向への開発を防ぐために、「このプロダクトをなぜ作るのか」「この機能は何のためなのか」といったストーリーを明確にし、その認識をチーム全体で共有している必要があります。
さて、では今回のハッカソンにおいては、どう対応したか。
まずはユーザーの各機能における、「ユーザー側の流れ」「アプリ側の流れ」「ユーザーが得られる報酬」をこのように分解し、明確にしました。(上図はメンバーへ共有用、下図は発表スライド)
そして、このアプリ独自の強みを従来アプリとの比較で明らかにしました。(上図はメンバーへ共有用、下図は発表スライド)
正直、この明確化によって、当初送られてきた概略図になんらかの変更があったかというと、特にありません。が、メンバーそれぞれが各機能の実装を自信を持って取り組めることに繋がったのではないかと感じています。(他二人がどう思ってるか知りませんが...メモ:ちゃんと反省会したい)
ここで書き残しておきたいのは、「ストーリーの明確化は、ユーザー体験をより良くするだけでなく、チーム開発における意思決定を堅実に行うための基盤となる」ということです。そして、プロジェクト学習で得たこの知見を、今回のP2HACKSを通して再確認できた、ということもかなり重要であると感じています。
このような場面は他にも多々ありますが、それに関してこの粒度で書き残すのは大変なので箇条書き...
入出力を最優先で決定すること、大事
チームでの意思決定をちゃんと文字で記録すること、大事
発表練習、大事(←PBLでは発表練習を課外でも密に行った。それをP2Hacksでも実践していて感動した。)
コードは綺麗な方がよい(←PBLではかなり可読性の悪いコードを書いてしまった。)
などなど
P2HACKSのPostPBL部門は、ある種、プロジェクト学習の経験を通してプロットされた一つの点を、それの再現性を確かめて線にすること(プロジェクト学習で体験したものは、特異な事象なのではなく、普遍的な事象である、ということの認識)のきっかけになった、有意義なイベントでした。
(運営やスポンサー企業の方々には感謝です。)
マネージメントと自己管理
前述したとおり、今回のハッカソンは9日間で約30時間のバイト勤務の中での開発でした。正直、参加態度としてはいかがなものかと自分自身でも思いますが...なにより、心身の健康を維持しながら楽しく開発できたので、それについてもしっかり書き残そうと思います。
ですが、前置きをしておくと、これは彼のマネージメントによるものが大きいです。
なので、まずは彼のマネージメントの手腕についてメンバー目線で書かせていただきます(←偉そう)。
まずは準備段階。彼は、事前にPythonの開発環境に関する調査を行い、開催前日に「Python勉強会」と称してそれを共有する機会を設けました。機械学習や数値計算といった場面でPythonを書くことが多い我々を尊重し、開発言語にPythonを選んでくれつつ、弱みであった共同開発をするときのお作法などについて詳しく共有してくれました。
そして開発段階。各部品の入出力の意思決定を最優先で行いました。
これはプロジェクト学習時においても彼は実践していて、それも上手くいっていました。この方法のメリットとしては、
早い段階で、仮データの入出力が本番同様に動く→一安心できる。
後はその中身を良くしていくことに専念できる→それぞれの専門性が高い状況下においても、技術差があるような状況下においても、各自がその学習・開発に注力できる。
全体像を把握することができる→文脈がチーム全体で共有され、とるべきコミュニケーションや意思決定が明確になる。
という3点があると感じています。実際、私はバックエンド開発をちゃんと行ったのは今回のハッカソンが初めてであり、SQLiteによるDB操作に関する学習を要する状況でした。そんな中、まずは最低限の入出力(過去のユーザーのアクティビティの読み書き)のためにCRUD操作を提供する抽象クラスを定義し、それに従ったJsonの読み書きを行うクラスを作成。そしてその後はRDBやSQLiteの学習、DBに関するクラスの実装に専念しました。かつ、それを並行しながら、フロントエンド開発やLLM開発を行う他2人と、適宜コミュニケーションを取りながら擦り合わせを行いました。
そしてなによりこの方法が、私の9日間の心身の健康を保証してくれたとも感じています。入出力が定まってしまえば、一人の作業の遅延により、チーム全体の開発が滞ることがないため、「みんなの迷惑にならないように、今日は徹夜してこの機能を完成させなきゃ…」という事態を避けられました。
お陰様で、0時前には就寝し、7時頃に起きるという、日本人の平均睡眠時間分の睡眠が保証されました。
最後に自己管理についてですが、
基本的にはchatGPTに相談。
設計に関わることに関してはPMに相談。
ちゃんと寝る←PMのおかげ。
睡眠の質を上げる←寝る前のストレッチなど
くらいです。
心残りについて
最後に心残りについてだらだら書き残します。
まず、Three.jsによる記録のビュアライズです。このプロダクトの開発にあたり、メンタルに関するヘルスケアアプリをいくつか触ってみたのですが、どれも記録のビジュアライズがとてもきれい!「これからも、このアプリを使い続けよう」とユーザーに思わせる工夫を感じました。また、それに加えて、ストレッサーの可視化が出来たら、ユーザーにとって有意義なのではないかと思っていろいろ練りに練ったものの…結局、夢半ば、Three.jsは諦め、UnoCSSで実装しました。
またLLMがSpotifyの検索クエリを生成している間の待ち時間にも、飽きさせずリラックス出来るような描画もThree.jsで実装してみよう!という話もあったのですが。。やはり、私自身のThree.jsの経験・場数が足りず、どれほどの時間を要するか未知数であったため、これも断念しました。
また、DB設計についても、よちよち歩きの赤ちゃん実装のため、改善できるところが山のようにあるのではないかと感じています。ですが、今の技術レベルでは、具体的にどこを改善できるかという検討すらついていないため、まずはしっかりDB設計について学びたいと思います。
さいごに
さてさて、鉄を熱いうちに打ったわけですが、こうやってまとめると色んな気づきがあったことがわかり、ちょっと嬉しいです。本当に友人2人には感謝。
この9日間で得た技術・経験をこれからもなんらかの形で活かしたいと思います。特に、春休みには、フロントエンド側ではThree.jsを、バックエンド側ではDBをフル活用した、面白いものを作れたらいいなーー(←使いたい技術先行マン)
まずはプロジェクト学習の最終報告書を頑張ります…。