ハッカソンを楽しむために

こんにちは。一億年振りに筆を取る気になりました、たまです。

1-3日間でwebサービスを作るハッカソンに何回か参加して、とてもハッカソンが好きになったので布教活動です。

※私が参加していたのはあくまでもWebサービス開発がメインの会だったので、ネイティブアプリ、ブロックチェーン、データ分析などのハッカソンはまた勝手が違うかもしれません。その点ご了承ください。

ハッカソンとは

ハッカソン(英語: hackathon 、別名:hack day ,hackfest ,codefest )とはソフトウェア開発分野のプログラマやグラフィックデザイナー、ユーザインタフェース設計者、プロジェクトマネージャらが集中的に作業をするソフトウェア関連プロジェクトのイベントである。 (wikipedia引用)

webサービスのハッカソンというと、色んなバックボーンの人が複数人でチームを組み、期間内にサービスの案出しからリリースまでをやるという感じになります。

大まかな流れ
1. ハッカソンのルール説明
2. 開発
3. 会のまとめ

これだけです。1と3は運営の方がいい感じにやってくれるはずなので、2でどういう風に進めると楽しめるかについて私なりの考えをまとめます。

自己紹介編

基本運営の方がチーム分けをします。自己紹介をしましょう。

参加した目的、スキルセット、普段の仕事、趣味辺りを話します。仕事と趣味の話は、サービスの企画の時に役立つ可能性があるので抵抗のない方は話しておくことをオススメします。この時点で大体デザインをする人と実装をする人に分けられるとおもいます。チーム次第ではデザインをする人がいない場合もあります。

ここで絶対にやってはいけないことが、自分の能力を盛ることです。ハッカソンは合コンではありません。後からバレる嘘をついて、足を引っ張る羽目になってもしょうがないので、チームに可愛い女の子がいても正直になりましょう。

企画編

サービスの企画を考えます。テーマが与えられる場合もありますが、私が参加していたのはほとんど初心者向けだったのもあり、自由テーマでした。

私がやった中では
1. 皆んなで雑に案出しをする
2.「制限時間」と「技術的制約」の2つで出来そうなものに絞る
という流れでやると、比較的進めやすかったように思います。

ペルソナの設定、マネタイズ、グロース的な視点も取り入れられるともっと話が盛り上がって楽しいかなと思いつつ、時間制限のある環境ではかなりコスト高な内容なのでまだやったことはないです。

要件定義編

出した案をまとめる時間を取りましょう。最初にちゃんと決めておかないと、実装後にやっぱりここを変えたいみたいな時間は大体の場合ありません。実際のビジネスでも同じ体験をしたことがある人は無限にいるはず。

機能の洗い出し

ここから具体例がないと説明しづらいので、仮にInstagramみたいなものを作ると仮定して話をします。Instagramの主要機能を洗い出すとこんな感じでしょうか。洗い出しの際には優先度も決めましょう。結局タイムラインが見れない投稿フォームができたで終わったら悲しいですよね?

優先度の高い順
1. 投稿順にタイムラインが見える
2. 画像の投稿ができる
3. 文章と紐付けて投稿ができる
4. ユーザ登録ができる
5. ユーザのログインができる
6. ユーザと投稿の紐付けができる
7. ユーザが投稿にイイねできる

他にも実際のInstagramにはタグ、検索、メッセージや画像編集も有りますが、3日とかのハッカソンだとこれだけ実装してデプロイできれば上々だと思います。もちろん余裕がある人はどんどん作り込みましょう。

ページの洗い出し

さっき使ったInstagramの例を引き続き使います。さっきの機能を満たすページ要件は大体こんな感じでしょうか。

優先度の高い順
1. タイムライン
2. 投稿フォーム
3. 入会ページ
4. ログインページ
5. ユーザページ

5ページはかなり量がある方だと思います。機能とデザインをマージするときに、どうしても機能部分が後から追加が必要になりがちなため、デザインは先行して進める必要があります。見せたいところはこだわって、入会やログインの部分はサクッとした見た目にして開発フローを回しましょう。

技術選定編

やることが決まったので、チーム内で話し合って技術選定をしましょう。チーム内で実装をメインでする人のスキルセットでANDを取るのがいいと思いますが、デプロイできないと悲しい感じになるのでスピードもある程度考慮に入れましょう。例えば私の技術スキルセットはこんなです。

できる✨
バックエンド:JavaまたはKotlinを用いたspring、Ruby on Rails、Flask(Pythonの軽量フレームワーク)、echo(Golang)
フロントエンド:Vue.js、React.js、Next.js、Nuxt.js、jQuery
インフラ周り:Heroku、firebase

できないorやりたくない💫
バックエンド:PHP全般
フロントエンド:Angular、HTML、CSS
インフラ周り:AWS、GCP(普段使いの構成がterraformになってるわけでも無いので、ここに時間をかけたくない)

こんな人がいたらどうするか例を挙げておきます。

1. javaしか書けない
javaは他の言語と比較しても開発スピード面で不向きだと思います(私はこれで1回失敗しました)。静的片付けから動的型付けはそれなりに学習コストが低いと思うので、教えつつになったとしても別の技術を選定することをお勧めします。

2. railsしかできない
そういう人が来た場合はrails+Herokuの構成を選びます。

3. purescriptを使いたい
私は一度も書いたことない上に関数型もよくわかりませんが、バックエンドとフロントエンドを分担でやるならフロントを任せてしまって使うのはありだと思います。

書いてて気づきましたが、PHPしかできない人と会ったことがありません。その場合はフロントとバックで分担ですかね。いろんな人がいると思うので、フレキシブルに選びましょう。

相手を無視して技術選定をするならNuxt + firebaseを私は選びます。本番の環境構築にかかる時間が一番少なく、ある程度色んなことができます。学習コストも低めだし、VuetifyなどのUIコンポーネントでかなり見た目も誤魔化せます。オススメです!

実装編

デザインをする人がいる場合は、デザインができる前はDB設計をしたり、環境構築をしたた後、ロジック部分を実装しましょう。デザイン(コーディング含めて)ができたらマージしてロジックがちゃんと動くか確認しましょう。

デザインをする人がいない場合はUIコンポーネントを拾ってきて見た目はごまかしましょう。こっちは見た目が質素になりがちですが、その分機能でカバーしましょう。

DB設計だけは巻き戻しがかなり大変なので皆んなで一緒にするのがいいと思います。あとは黙々と実装するのみです。

発表編

できたものを発表しましょう。できたものが微妙でも発表次第では誤魔化せます。逆に発表が微妙なのはいいものができてても微妙な感じになります。

「プレゼンはテンポ、プレゼンは声、つまるところプレゼンとは歌」という左利きのエレンに出てくるセリフが最近刺さり過ぎてプレゼン力を高めたい年頃です。

おわりに

なんだか最後話が逸れましたが、ハッカソンに興味を持っていただけたら幸いです。色々と書きましたが、やっぱりハッカソンの醍醐味は知らない人と何かを作り上げるという体験そのものでしょう。技術だけではなく、ビジネスやデザインといった面で得られるものはたくさんあると思います。もしどこかで同じチームになった人がいたら一緒にいいものを作りましょう!