開発合宿

第2回オオミシマスペース忘年ハッカソン

こんにちは、freee 株式会社でエンジニアをしている増田です。この記事は、裏freee developers Advent Calendar 2018 の 15日目の記事です。

僕は2018年の5月にfreeeに転職しました。愛媛県今治市の大三島という島に住んでいて、リモートワークで働いています。

副業として夫婦で古民家を改装した一棟貸しのオオミシマスペースという宿を運営していて、その宿を盛り上げるイベントとして以前ハッカソンをやりました。そのハッカソンが好評だったので、12月1日に第2回目のハッカソンを開催しました。今回はそのレポートです。

頑張らないハッカソン

ハッカソンのイメージは開始から解散まで、残り時間を気にしながら、別チームとの激しい戦いをイメージされる方も多いかもしれませんが、オオミシマスペースのハッカソンは頑張らないし、戦いません。島の雰囲気も楽しんでもらえるよう、皆で島の食堂へランチを食べに行ったり、温泉に入ったり、宴をしたり、犬の散歩に行ったりします。

そのため実装時間は8時間ほどしかありません。

そんなゆるいハッカソンですが、Compassでイベントを企画したところ、前回の参加者+2名の計6名が集まりました。集まったのは広島、岡山、高知、愛媛のエンジニア。

事前打ち合わせ

参加者の多くは普段リモートワークで働いているエンジニアたちで、連絡はgitterで取り合い、1週間前にオンラインでハッカソン当日の流れとテーマぎめを行いました。

当日の流れ

12/1(土)

  • 10:00 スタート
    • モクモク 何作るか打ち合わせ
  • 12:00
    • ランチ
  • 13:00
    • コーディングタイム (4H)
  • 17:00 温泉
  • 18:00 ごはんーー!
  • 20:00   ビール片手にコーディング LTもやるよ!

12/2(日)

  • 6:00 小太郎とおさんぽ
  • 7:00 朝ごはん
  • 8:00
    • コーディング(4H)
  • 12:00
    • 振り返り
    • 時間によって流れ解散

テーマぎめ

オンラインミーティングまでに、それぞれ事前に興味のあるテーマや、やりたいことを考えてきてもらいました。猪の撃退、Stripe決済、SORACOM IoTボタン、Oculus WebVR、スボラ飯ガチャといろいろなアイディアが上がったのですが、スボラ飯ガチャってなんなんだ!と突っ込まずにはいられませんでした。

他のメンバーも気になっていたようで、発散フェーズでは皆ノリノリで意見を出し合っていました。献立を考えるのは面倒なので、時短で、片付けが楽で、栄養が取れるズボラレシピを、Stripeで課金すると、いい感じのレシピを返すものを作ろう!というふわっとしたテーマと当日のスケジュールが決まり、各自詳細を膨らませて、当日集まることになりました。

僕はゲーム課金やガチャをやったことがなかったので、Youtubeでガチャの動画をみて必死にスボラ飯ガチャの妄想を膨らませていたのですが、ハッカソンで出来上がるのか不安でしかありませんでした。


ハッカソン当日

12月1日 10時大三島集合、自己紹介をしつつ、お互いバックグラウンドが異なるので、スキルマップを作って、何をどうやって作るのかの基準をすり合わせました。僕はサーバサイド寄りのRails使い。他の人はというと、フロントが強かったり、node.js書けたり、Python使いだったり、C#使いだったり。

各自持っているスキルを宣言して、スキルマップを作成

そして、それぞれが抱くスボラ飯ガチャについて意識のすり合わせをしました。

実装に与えられた時間と、皆のスキルと、技術的に興味のわくモノというバランスを鑑みて決まった仕様はこちらです。

  • ズボラ飯レコメンドサービス
  • 想定利用者
    • 主婦や主夫
    • 調味料や調理器具が揃った家庭向け
    • 買い出しや、片付け時間もかけたくないズボリスト
      • 冷蔵庫にある食材を有効活用
    • 残りHPが少ない方
  • 利用シーン
    • Webインターフェース ☓
      • ズボラーはWeb検索などしない
    • アプリ △
      • ハッカソンでやるには時間が取られそう
    • LINEのボット 👼
      • 主婦層はLINEを使ってそう
      • Bot追加なら手軽に普及しそう
      • ハッカソン的にも画面を作り込まなくて良いので他の部分に集中できる
  • 動作イメージ
    • イメージはクロネコヤマトの再配達
      • 初回はボタンを押して、家にある食材を入力
    • レシピサイトからとってきたデータを、独自のズボラスコアでスコアリングして、より手間の少ないレシピのタイトルをリコメンド
    • 興味が湧けば詳細なレシピを表示

まず実現するためのシステム構成を考えて、担当者の割り振りました。

  • LINE のボットを作るところ
  • LINE ボットからのリクエストをAWS Lambdaで1次受けするところ
  • ズボラレシピの検索結果を返すところ Rails
  • レシピ参照用の画面を返すところRails
  • レシピを収集するところ Python

そして、ER図を作ったところで午前が終了。ランチを食べに行きました。

お昼ご飯


ランチから戻ってきてからは、Rails newをしたり、AWSアカウント開設したり、Heroku環境を構築したり、LINEの仕様を調べたり、レシピのクローラーを作ったりと、各々パラレルで作業を進めました。

前回のノウハウを活かし、同じ部屋で作業をしていたのですが、テキストやURLの共有するのにGitHubのアカウントさえあればチャットが出来るGitter を使って同じ部屋にいながらチャット経由で情報を共有しました。また、設計や決定事項は、DropboxのPagerを使いました。

1日目の実装時間はあっとゆう間に過ぎていきました。
まだ、各パートの間の結合も出来ておらず、本当に動くものができるのだろうか?と不安も残しつつ、スケジュール通りに温泉に行って夜の宴が始まりました。

晩ごはん

宴はオオミシマスペースの定番メニューになりつつある、お刺身盛り合わせと、猪レモン鍋、そしてお昼にお持ち帰りで買っていた大三島ブリュワリーの地ビールで乾杯です。

頭をかなり使ったのもあって、12時過ぎにはもうヘトヘト。
気がつけば布団で寝ていました。

2日目

朝は6時に起床して、柴犬の小太郎と一緒に浜辺を散歩しました。その後、朝ごはんを食べたら実装再開です。お互いの部分が結合し始めて、少しずつ動くものが出来上がってきました。最後の方は完成に向けて、皆が臨機応変に動いて無事時間内に動くものが出来上がりました。🎉🎉🎉

出来上がったもの

概要

Bot名:ズボラッシュ

手元にある食材からズボラレシピを返してくれるLINEボット

LINEにズボラッシュを追加して、トークを開始すると、「食材、気分、時間」のボタンが現れて、食材ボタンを押すと、使いたい食材を聞いてきます。
食材を入力して送信すると、その食材が含まれたレシピの中から食材数や手順から弾き出されたズボラスコア(お手軽度)が高いレシピを返してくれます。

アーキテクチャ

インフラ周り

システム構成図はこんな感じです。LINEのボットの通信を受ける部分は、AWS上に構築し、レシピを返す部分はHeroku上に構築しました。

LINE Bot応答部分

LINE Botは皆経験がないなか、広島から参加のみっちゃんがやりたいと手を上げてくれました。LINEのボタン部分(リッメニュー)は1枚の画像で、まさかのクリッカブルマップ。
押されたボタンの通信先に、Lambdaを設定し、食材が渡されてきたらRailsへディスパッチする仕組みを作ってくれました。DynamoDBを使っているのはLINEとのやり取りはステートレスなので、状態管理のためにDynamoDBを使っているとのこと。デプロイはServerless Frameworkを使ってコマンド一発でデプロイ完了です。 Very Cool!

レシピ返却部分

RailsでLambdaと通信するAPI部分と、レシピを編集、LINE端末から参照できる部分に分かれて実装しました。Railsはモデリングがキモです。ホワイトボードにER図を書いていたところ、さかぺ先生SQL EditorというER図作成ツールを画面に写し始め、サクサクとモデリングが進みました。このツール買いです。

Lambdaと通信するAPI部分は、と広島のさかぺ先生とペアプロをしながら作りました。高知から参加のウエッキーはRails習得中のため、レシピ登録や参照する機能を担当してもらいました。ライブラリを活用して生産性の高いView職人でした。

データ収集スコアリング部分

尾道のほぼろはPython使い。レシピサイトからズボラレシピをクローリングしてくる部分を担当してもらいました。Pythonでは有名なクローラーScrapy をクラウド上で動かすサービス を試しに使っていました。Railsプロジェクトに取り込みやすいようデータのクリーニング、レシピサイトの内容を手順や材料などに別れた構造化データの作成に取り組んでくれました。

僕は、構造化されたJsonファイルをRailsに取り込むスクリプトを作成し、岡山のダッシュは、料理の手順や、材料の数などからズボラスコアを算出するロジックを作ってくれました。サラサラと計算ロジックを書けるのは素晴らしいです。


まとめ

雑感

  • 企画からスタートし、実装時間が8時間と短かったにもかかわらず、動くものが出来上がったのはすごい
    • 特に最後の追い込みがすごかった(パズルのピースが急にハマりだす感じ)
  • スキルマップを構築するのは有効
    • タスク振り分け時にスキルに合わせたチーム分け、タスク振りができる
    • これなら次回以降に異なるスキルを持ったエンジニア同士でも楽しくハッカソンができそうだと感じた
    • スキルが違うからこそ、気付きが有り、学びがあった
  • 最後に各自担当した箇所の紹介と振り返りをしたことで、自分の知らない領域にも興味をもつことが出来た
  • 地方でも高いスキルを持ったエンジニアがいることを再認識
  • イベントを楽しんでもらえてよかった

クロールしたレシピサイトのデータを公開するのに問題があるため、サービス公開には至っていませんがとても楽しい題材でした。

地方に暮らすと勉強会が少なく、エンジニアと交流する機会が減ってしまうというデメリットを感じていましたが、今となってはイベントを企画すれば人が集まってくれる環境と関係が築けました。

また今度は、庭でBBQができる時期にハッカソンやりたいな〜と思っています。
興味がある方はぜひご参加くださいー!


裏freee developers Advent Calendar 2018 の 16日目はmihyaeru21さんです!

オオミシマスペースで初のハッカソン

 

03/03〜04 にオオミシマスペースでハッカソンを開催した。
集まったのは、中国・四国地方でリモートワークを実践しているWebエンジニア4名。

ハッカソンってなに?

「ハッカソン」(hackathon)とは、広い意味でソフトウェアのエンジニアリングを指す“ハック”(hack)とマラソン(marathon)を組み合わせた米IT業界発祥の造語で、もともとはプログラマーやデザイナーから成る複数の参加チームが、マラソンのように、数時間から数日間の与えられた時間を徹してプログラミングに没頭し、アイデアや成果を競い合う開発イベントのことをいいます。weblio

できたもの

日本初?!コンソール(黒い画面)から宿を予約できるyadokari command!

エンジニア目線でおもろい事に振り切ったプロダクトを作ったw
現在最終調整中で、近日公開予定。

やったこと

準備

実際のハッカソンのイベントでは、何を作るのかその場で考えて、チームメンバーの意見をすり合わせて、物を作り始めることが多いのだが、今回の場合、参加者も事前に決まっているし、オオミシマスペースでは集中してものづくりをしたかったため、イベントの1週間前に1度打ち合わせをして、ある程度方向性を決めてから進めることにした。

DAY 0(2/25)

appearinで事前MTG。議事録はDoropboxのpaperを見ながら皆で書き込む。

メンバーは、広島、岡山、尾道、大三島と別れているので、テレビ会議でハッカソンの打ち合わせ。
普段からリモートワークをしているメンバーだけあって、スムーズに事が進んだ。

事前準備では以下の方向性が決まった。

  • つくるもの
    • 作るものは宿に関するものにテーマを絞り、
      エンジニア目線でおもろい事を当日まで各自温めるのが宿題
  • ざっくりスケジュール
    • 3/3(土)
      • 10:00 スタート
        • 何作るか打ち合わせ
      • 12:00 ランチ
      • 13:00
        • コーディングタイム (5H)
      • 17:00 温泉
      • 18:00 ごはんーー!
      • 20:00 ビール片手にコーディング LTもやるよ!
    • 3/4(日)
      • 6:00 小太郎とおさんぽ
      • 7:00 朝ごはん
      • 8:00
        • コーディング(4H)
      • 12:00 状況見ながら柔軟に。
  • 晩御飯の自炊について
    • 海鮮盛り合わせ
    • 猪鍋しよう
    • お酒を買ってきてもらう(島はお酒が高い)

DAY 1(3/3)

午前10時にオオミシマスペースに集合。
つくるものは、僕ととくみん(嫁)で盛り上がっていた、コマンドラインから宿を予約できたら面白いよねというアイディアがベースとなった。

テーマが決まると対話型コマンド実現のために各自調査タイム

さすがエンジニア、テーマが決まればアイディアが色々出てくる!宿の予約を受け付けるWebAPIを僕が作り、コマンドラインからの宿予約を他の3人が担当することになり、同じ言語でやっても面白くないのでなんと! Ruby, Python, Node.jsの3言語でそれぞれ実装することなった。

仲良くハンモックでミーティング

実装の意識合わせをするために、WebAPIの荒削りなエンドポイントの設計までをみんなでやって、決まった時点でランチライム。

午後からは、各々の担当パートに別れて黙々と実装。
1時間毎に進捗確認&軌道修正をして進めた。

Postman 久しぶりに使ったが手元のツールからWeb上のドキュメントに即時反映され、エンドポイントの意思疎通に役立った。

僕はと言うとPostManを使って、みんなが通信するべきAPIの内容を詳細に決めつつ、Railsを使って、エンドポイントを構築していった。

同じ部屋で作業をしているのだが、テキストやURLの共有する手段が必要になってきた。そこでチャットツールがあったほうがスムーズだということになり、GitHubのアカウントさえあればチャットが出来るGitter を使って同じ部屋にいながらチャット経由で情報を共有した。リモートワーカ的発想。

18時には作業を終えて、温泉に入って美味しいご飯!

カンパーイ!

お刺身盛り合わせ。 うんまっ!

お刺身盛り合わせに、大三島イノシシレモン鍋。

お酒もたっぷり呑んで夜遅くまで語り合った。

DAY2(3/4)

僕は6時に起きて、1時間ほどコーディング。 僕担当部分の遅れを取り戻した。

心配していた天気も良く、散歩に連れて行ってもらえてた小太郎もご機嫌。

7時過ぎにみんなが起きてきたので、柴犬の小太郎と一緒に浜辺をお散歩。
ドローンを飛ばして記念撮影もした。

朝食を食べたらラストスパート。
とくみんも参加して、プログラム公開ページの作成を手伝ってもらった。

Heroku上でAPIを動かし、ログにコマンドからの予約のInsert文が流れた時は本当に拍手が起こった

各コマンドから、予約情報を入力し、Webサービスに予約が表示されると拍手が沸き起こった。
各コマンドを、パッケージ管理元のリポジトリに登録したことで、世界中の人たちが簡単に宿の予約をコマンドラインから簡単に行えるようになった時には感慨深いものがあった。 コマンドは近日公開予定。

Pythonのナウい記述方法について解説。 分かりやすい!

12時に作業を終え、各自書いたソースコードをTVモニタ写し、黒板も使ってお互いにレビューしたのも学びがあってとてもよかった。最後に、隣の伯方島に塩ラーメンを食べに行って解散した。

感想

  • むちゃくちゃ楽しかった。 またやりたい!
  • そして、実装時間が少ない割(8H)には動くものがちゃんと出来たのが良かった。
  • 創るだけでなく、地元の食材を食べることが出来たし、気晴らしに散歩や温泉に行ったの良かった。
  • 参加してくれたメンバーの満足度も高く、また定期的にやりたいと言ってくれいたのが嬉しかった。

このど田舎の島に、エンジニアが集まってイベントをするのを夢見てオオミシマスーペースという場を作り、実際にエンジニアが集まってイベントが出来たことが本当に嬉しかった。初めての試みだったが大成功だったと思う。今後も定期的にイベントを開催したいし、僕ではない他のエンジニア達が合宿を企画し、人が集まる楽しい場になって欲しいと願っている。