ハッカソンで優勝する技術


この記事は[クラウドワークス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/crowdworks) の 22日目の記事です。
昨日は@hisamura333さんによる「[awsとslackで今日の献立を教えてくれるのを作った](https://qiita.com/hisamura333/items/efeee2cf48948ac96d21)」でした。超絶面白かったですね！！

[クラウドワークス](https://crowdworks.jp/)の[クラウドテック](https://crowdtech.jp/)というサービスでエンジニアインターンをしている @taigamikami です。ハッカソンが好きで、様々なハッカソンに出没しています。

最近の戦績としては、以下のような感じです。

| コンテスト名| 結果 |
|:--:|:--:|
|第3回 ジロッカソン開発部門|優勝|
|JPHACKS2018@Tokyo |最優秀賞|
|JPHACKS2018| BestAudienceAward|
|Hack U 2019@Tokyo| 最優秀賞 |
|Hack Day 2019 | 最優秀賞 |

## ハッカソンとは？
Hack(ハック):computer: + Marathon(マラソン):running: = Hackathon(ハッカソン)
技術者が一定期間集中的にプログラミングやサービスの考案などを共同作業で行い、その技能やアイディアを競う大会です！

最近では、オープンな大会に加え、社内ハッカソンも増えている印象です。

- [Facebook](https://www.youtube.com/watch?v=T2iTAiwWyZU)
- [Netflix](https://www.youtube.com/watch?v=zlQthZ3f-3M)
- [LinkedIn](https://www.youtube.com/watch?v=PUwEEOhcK3s)
- [NTTデータ](https://www.youtube.com/watch?v=jDiTEvZeRgs)
- [adidas](https://www.youtube.com/watch?v=WvfM0suhroo)

adidasがやってるのはびっくり:eyes:
ハッカソンから生まれたものとして[Facebookのいいねボタン](https://www.itmedia.co.jp/news/articles/1205/25/news042.html)が有名ですね:thumbsup:

弊社クラウドワークスも2016年にバグ修正ハッカソンなるものをやっているのを発見しました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/377cf30c-b941-b73d-b906-c81bf8be0332.png)
[バグ修正ハッカソンを行いました！|クラウドワークスエンジニアブログ](https://engineer.crowdworks.jp/entry/2016/02/09/104905)


### ハッカソンの良さ
* 数日(1,2日)で終わる
* チーム開発である
* 賞品が出る(HackDay: アメリカSXSW)
* 短期間で圧倒的成長ができる
* 他の人の作品を見るのも楽しい

→ 数日でポートフォリオに載せれる作品が作れて、賞ももらえて、圧倒的成長ができるのでコスパは最高だと思いますw。

# ハッカソンで勝つ方法
私自身がハッカソンで勝つ確率をあげる手順について順番に説明します。

1. チーム作りはバラエティに富むように組む
2. アイディアづくりは基本真似て、オリジナル要素を組み込む
3. プロトタイプを作り、高速で検証する
4. PDDで始める
5. 実装には事前準備必須
6. 本番は英雄になれ


## 1. チーム作りはバラエティに富むように組む
* フロントエンド(アプリ)エンジニア
* バックエンドエンジニア
* データサイエンティスト(機械学習屋)
* デザイナー
* 動画・プレゼンクリエイター

基本的にはこんな感じのメンバーがいると最強だと思います。
アイディア出しの時点だと、もっと多種多様な人が関わってくれると良いですね。

ここに上げた全種類の人が揃っていなくても、勝つことはできます(Hack U時とかフロントとバックエンドの2人だけだったし...)
動画クリエイターがいると発表のインパクトが一気に大きくなる印象です。

## 2. アイディアづくりは基本真似て、オリジナル要素を組み込む
アイディアがハッカソンにおいて一番重要であるといっても過言ではないかもしれません。

ハッカソンは、大きく2つの種類がありますが、どちらの場合も事前準備することが大切ですが、今回は主にテーマがない後者について書きます。

* 解決すべき課題やテーマがあるもの（例: SPAJAM2019本選「ホーム」など）
* 課題がなく自由なもの（例: JPHACKS 「〇〇x Tech」など）

### アイディアのネタの集め方

- **日常の不満や疑問を集めておく**

これは身近な人やTwitter:bird:などで集めるといいかもしれません。
お母さんや学校の友達、職場の同僚などにユーザーインタビューしたりすると意外な観点が見つかりますよ！

**ユーザーインタビュー**については以下の記事が良さそう
[クラウドワークスのユーザーインタビュー設計手順を大公開！](https://designer.crowdworks.co.jp/entry/userinterview-template)
[失敗から学んだ、ユーザーインタビュー23の心得](https://goodpatch.com/blog/user-interview-technique/)



- **日常のオモシロを集めておく**

Twitter:bird:とかにはよく落ちてますね。
例)金魚自身が水槽を動かす
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Water tank controlled by fish <a href="https://t.co/An46lUUutj">pic.twitter.com/An46lUUutj</a></p>&mdash; Space Explorer Mike (@MichaelGalanin) <a href="https://twitter.com/MichaelGalanin/status/1204411853159297033?ref_src=twsrc%5Etfw">December 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

6秒商店さんのツイートなどもアイディアの種になりやすいです。
https://twitter.com/6sec_shop

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">印を結ぶと開く金庫です。<br><br>The world&#39;s most replaceable Jutsu.<a href="https://twitter.com/hashtag/6%E7%A7%92%E5%95%86%E5%BA%97?src=hash&amp;ref_src=twsrc%5Etfw">#6秒商店</a> <a href="https://twitter.com/hashtag/6secshop?src=hash&amp;ref_src=twsrc%5Etfw">#6secshop</a> <a href="https://t.co/zXMSylAkgE">pic.twitter.com/zXMSylAkgE</a></p>&mdash; 6secShop/6秒商店 (@6sec_shop) <a href="https://twitter.com/6sec_shop/status/1152050657425145856?ref_src=twsrc%5Etfw">July 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

* **過去の大会の受賞作品を分析する（オススメ)**

大会によっても審査委員や評価されている項目が様々で、アイディアなどをどう作品に落とし込むかも大事な要素です。
また、過去作品をインスパイヤするのもありだと思います。

| 大会 | 過去優秀作品 |
|:--:|:--:|
|HackDay |[Hack Day 2018](https://hackday.jp/2018/#prize-winner), [Hack Day 2017](https://hackday.jp/2017/#award-block), [Hack Day 2016](https://hackday.jp/2016/#award-block) |
|JPHACKS|[JPHACKS 2019](https://jphacks.com/information/result-report2019/), [JPHACKS 2018](https://jphacks.com/2018/result/), [JPHACKS 2017](https://jphacks.com/2017/result/)|
|SPAJAM|[SPAJAM2019](https://spajam.jp/2019/final/result/), [SPAJAM2018](https://spajam.jp/2018/final/result/), [SPAJAM2017](https://spajam.jp/2017/final/result/)|


「もうそれあるから作るの微妙だよね？」的な発言を聞きますが、本当に新しく、見たことがないものを頭の中で考えることは不可能です。また、競合(類似のサービス)がないということは、その市場に需要がないということであり審査員の共感を生むことができません。
**すでにあるものを真似し、そこにオリジナルのスパイスをかけることで新たな価値を生み出すことができるのです！！**

例えば、HackDayで優勝した[おそうじぶーぶー](https://www.youtube.com/watch?v=HNjXZwRTybU&feature=youtu.be&t=7525)は `掃除機`, `ラジコン`, `カメラ`の足し算です。
それぞれ既存のものに対してスパイスをかけまくるとオリジナルになるのです。
![スクリーンショット 2019-12-17 17.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/934c8670-6570-6872-aed4-fb3625a7b71b.png)


## 3. プロトタイプを作り、高速で検証する
プロトタイプを作ることで、アイディアが正しいか高速に検証することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/3aabaafb-dd9f-d383-9ee5-1e36dd530760.png" width="460px">

以下のプロトタイプツールをよく使っています。

- ペーパープロトタイプ
- [Prott](https://prottapp.com/ja/)
- [Invision](https://www.invisionapp.com/)
- [Adobe XD](https://www.adobe.com/jp/products/xd.html?sdid=19SCDRPN&mv=search&s_kwcid=AL!3085!3!177569227836!e!!g!!adobe%20xd&ef_id=WKJNvQAAASzxRSRZ:20170306085410:s)
- [FluidUI](https://www.fluidui.com/)

などがあります。デザイナーでなくとも直感的に使いやすいものばかりなのでぜひ使ってみてください:bow:


- 価値仮説シート

クックパッドさんやグノシーさんがよく使用していると聞きますね。
以下の表の〇〇にアイディアについての文脈を当てはめることで、そのアイディアが誰の何をどんな形で解決しているのかが整理され説得力のあるアイディアが作成しやすくなります。

|対象|具体的な文|
|:--:|:--|
|ユーザー|〇〇は、|
|欲求|〇〇したいが、|
|課題|〇〇なので、|
|製品の特徴|〇〇することに価値がある|

## 4. PDDで始める
プロトタイプを作り終わったら、実装する前に発表資料のフレームワークを作成しておきます。そう！**プレゼン駆動設計 PDD(Presentation Driven Design)**です。
### なぜPDDで開発するのか？
作成したものが、どんなにすごく実用的なものであっても**伝えることができなければ何も意味がありません**。
審査員の印象に残らなければ、ブースに来てすらもらえないかもしれないためです。作成する際には、実際の利用シーンを審査員に想像させることが重要です。
また、先に実装してしまうと無駄な部分を作りすぎてしまうことが多く、ただでさえ短い時間がもったい！ので、プレゼンで主張したいポイントを先に絞り込みそれに合わせて実装を行うという手法を取ることがオススメです。

発表資料に関しては、発表が上手な人達を参考にしましょう。
HackDay2018のチームむっちりの発表が簡潔でわかりやすいです！
https://youtu.be/VEbOvV7_BWw?t=8750

### おそうじぶーぶーでのPDD
HackDayで優勝した際のおそうじぶーぶーの例です。

1.　解決する課題や満たされる願望のスライドを作成

おそうじぶーぶーを作成した際には、まず問題点のスライドを作成しました。
<img width="800" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/2a2e772a-4629-383c-82e0-636403b6825b.png">



こうのように問題点を整理すると何を解決すべきかが自明となるので、無駄な遠回りをすることを防ぐことができ、チームメンバーが共通の問題イメージを持ちやすくなります。

2.　課題に対するアンサースライドを作成

課題に対して、それを解決しアピールしたい機能のスライドを作ります。
今回は動画にしましたが、実機でデモができる時はデモのほうがウケが良いですね。
<img width="800" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/a6383584-1eea-0bc1-0d29-d842d1e11f04.png">


この穴抜きになっている箇所を埋めるように実装すればいいのです。
何をすれば良いのかわかりやすいですよね！


3.　実装をし、動画・画像を挿入し完成

穴抜きの箇所を埋めるように実装すれば完成です。
<img width="800" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/0b18ef32-84b6-b205-ffbf-7749cb7c0f21.png">

これが私の考えているPDDです。

## 5. 実装には事前準備必須
ハッカソン中にやったこともない方法を調べて、実装するのは困難です。(時間が長いハッカソンでは可能かも...)
機械学習のモデル生成やフロントエンド・アプリなどの画面実装など使い回しができるものを個人開発などで用意しておいたり、知識を蓄えておくことで、ハッカソン中にそれを応用し実装を爆速にすることができます。
興味を持った技術などにはなるべく手を触れておくことです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/f27ad287-5dea-c7c7-7988-8cb40496780d.png" height="300px">

## 6. 本番は英雄になれ
緊張せずに発表するだけです！もしかしたら世界を変えることができるかもと英雄になった気持ちで発表しましょう！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/76ab0f93-c783-ae91-1cd5-76ff78a514d1.png)




## 今まで実装してきた作品例
最後に、私が誇る仲間達とこれまで作って来たものの例を何点か紹介します。

#### [ShowTime](https://speakerdeck.com/taigamikami/showtime-hack-u)
ShowTimeはプレゼンテーション中のポーズに応じて、効果音やスライド操作ができる作品です。
ポーズとスライドアクションは設定画面でカスタマイズすることができます。

##### 実装方法
ポーズの認識には、[OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)というリアルタイムに顔体DeepLearningの一種で、単眼カメラで顔〜足までの骨格を検出してくれるアルゴリズムを使用しています。
![out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/0cd3728b-3f0a-96a5-bffd-f7862b41cb62.gif)


設定画面は、Nuxt.jsで書いていますが[vuedraggable](https://sortablejs.github.io/Vue.Draggable/#/simple)というライブラリを応用し、ユーザーが直感的な操作ができるようUXを高めました。
![out_setting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/26317bb8-103d-6fa0-7b10-30b3e82cb7a5.gif)


全体の実装は以下のリポジトリにあります。
<a href="https://github.com/pocket-dan/showtime"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/pocket-dan/showtime.png" width="460px"></a>

#### [ばえるーポン](https://www.youtube.com/watch?v=5-lMbg_ud0s&feature=youtu.be&list=PLvb1WfRXGO-A183MkEAhhvD_K2jIWFQc5)

ばえるーポンは食べ物の写真のインスタ映え度を深層学習で自動的に判定し、その評価に応じて割引クーポンを発行するサービスです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/c13d4c4f-3917-eac7-61a3-caa6dd9ad912.png" width="500">

##### 実装方法
インスタ映え度の可視化には、心理物理学的なアノテーションを実施し、Googleが開発した画像に対して技術面と審美面の両方で訓練できるCNN（Convolutional Neural Network）ベースの画像評価モデルである[NIMA](https://arxiv.org/pdf/1709.05424.pdf)とリアルタイムに高速でオブジェクトを検出するDeepLearningの一種である[YOLOv3](https://pjreddie.com/darknet/yolo/)を使用しました。
インスタ映え度のしっかりした定義がないので、`心理物理学的な美しさ × 食べ物写真の構図` という定義からインスタ映え度を算出しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/fd0623c1-a456-db09-c866-803eb42c90cf.png" width="500">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154845/b28a0406-a9f8-984a-2a58-2d8ae6274f60.png" width="500">

全体の実装は以下のリポジトリにあります。
<a href="https://github.com/jphacks/TK_1810"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/jphacks/TK_1810.png" width="460px"></a>

## みんなもハッカソンやろ！
Facebookのいいねのようにハッカソンで世界を変えることができるかも！！

明日は @k-waragai さんの「HackMDをオンプレ運用して日報を自動化してみた」です。お楽しみに。

## 参考になる資料

[虚無から48時間でiOSアプリをリリースする😴 / 48 hours iOS app - Speaker Deck](https://speakerdeck.com/koooootake/48-hours-ios-app)
[Cookpad Summer Internship 2018, 5 days Product Course](https://speakerdeck.com/dex1t/cookpad-summer-internship-2018-5-days-product-course)