開発合宿で何を考えてどう作ったか

こんにちは。はてな社長の id:chris4403 です。
この記事ははてなエンジニアアドベントカレンダー2014の14日目です。元エンジニアということでカレンダーに参加させていただきます。

先日、はてなのサービス開発合宿が開催されました。
合宿の開催概要については、先日チーフエンジニアのid:onishiエントリを書いているのでそちらをご覧ください。

私もいちエンジニアとして参加したので、合宿の間、何を考えてどうやって作ったのかを書き記そうと思います。今後合宿に参加する人の何かの参考になればと思います。先に断っておきますが、あんまり技術的な話は出てきません。

day 1

AM

今回の合宿は、合宿の1週間ほど前に、作るサービスや機能の具体的なアイデアを持っている人が、参加者の前でプレゼンを行い、一緒に作る人を募るというチームビルドのフェーズがありました。私もそこに向けて、リッチメディアを扱うサービスのアイデアを考えていたのですが、実際はプレゼンの前にほとんどのチームがなんとなく出来上がっていました。私を含め数名がプレゼンを行ったのですが、そのときに私が獲得できたチームメンバーは、ゼロ。合宿に行く前にチームビルドに失敗してしまいました。無念。

ここでひとつの選択をすることになります。もともとの予定通り、リッチメディアを扱うサービス(スマホアプリ)をひとりで作るか、そもそも作るものをひとりでもなんとか形になりそうなものに変えるか、あるいは他のチームにジョインするか。

他のチームにジョインは、割りと全体的にチームがいい感じにできあがっていたので、そこにのこのこと参加するのも足手まといになりそうだなという予感があり、却下。結局、作るものを変更して合宿に臨むことにしました。
実際は、2日ほどひとりでアプリを作る方法を模索してみたのですが、リッチメディアをいい感じに扱いたいということで、Titanium Mobileでサクッと戦略が使えず、iOSとAndroidの両方をひとりで同時にやるのは不可能だと判断しました。

合宿初日

さて、いよいよ初日を迎えました。滋賀の合宿会場組は、朝から移動します。私は、はてなの京都オフィスで合宿に参加するグループでしたので、滋賀組よりも少し余裕をもって開始することができました。

合宿でサービスを作る場合、以下の2つの考え方があります。

  • 合宿が終わったあと、そのまま(多少の修正はある)リリースできる品質で作る
  • あくまでプロトタイプと割り切って、合宿が終わったらコードを捨てるつもりで作る

リリースまで狙いたいところでしたが、自分のプログラミング力と、期間、チームのメンバー数(ひとり!)を考えて、後者を選択しました。

言語は書き慣れたPerl、WAFはAmon2、O/R MapperはTengを選択。選択理由は以下の通りです。

  • Perl
    • サーバーサイドは書き慣れたPerlで。クライアント側はTitanium Mobileで作ることも一瞬考えましたが、iOSとAndroidで試せるようにするには、Webサービスの形にとどめておくのが良さそうと判断
  • Amon2
    • 過去にプロジェクトで使ったことがあり、個人でも手元でプロトタイプを作る際に便利に使用していたため
  • Teng
    • 使い慣れた技術でとはいえ、何かしらやったことがないものも取り入れたいという気持ちがあり、名前は知っていたけど使ったことがなかったため

Amon2は、ログインのプラグインではてなID(OAuth)のものが用意されており、簡単にログイン部分を作ることができました。環境を用意して、手元でログインできるまで30分ほどでした。

「テキストと画像が投稿できて、閲覧するユーザーはその投稿に対するフィードバック(良い/悪い)を投稿する」という簡単なサービスにしたので、投稿のエンドポイント作って、投稿してDBにデータを格納するというところまでで、初日の午前中は終了しました。

PM

ランチをオフィスで食べて、作業へ戻ります。
午後は、画像を投稿できるようにする作業。
画像の投稿の取り扱いですが、アプリケーションサーバーに保存するか、Amazon S3のようなストレージサービスに保存するか、データベースの中に保存するか、といくつか方法がありましたが、今回はデータベースの中に保存するようにしました。

データベースに画像用のテーブルを作成して、投稿用のページからPOSTされた画像を格納するようにしました。また画像の出力は、出力するページが1つしかなかったので、base64にエンコードした値をdataスキームでページに直接書き出すという方法を取りました。

また、投稿へのフィードバック用のテーブルと、エンドポイントを作成し、「いいね」「悪いね」のような評価を投稿できるようにしました。ここまでやって夕方くらいになったので、他チームで作業していた id:motemen にお願いし、開発用のサーバーにデプロイできるように設定してもらいました。
合宿では、最終日に作ったもののプレゼントデモを行うようになっており、その際にみんながサービスを触れる状態にしておく必要があります。合宿2日目に入ると、各チーム作業が白熱してくるので、初日のうちにデプロイ出来る状態にしてもらうという作戦でした。

普段デプロイ作業に慣れているだけあり、1時間もしないうちに、手元のiPhoneからテスト環境にデプロイされたサービスを閲覧できるようになりました。

自分でもデプロイ出来るように手順をまとめたところで、夜の懇親会タイムに突入。会社のセミナールームに寿司とビールが運ばれてきました。少し寿司をつまんで、各チームの進捗をなんとなく把握したところで、作業へ戻りました。このときに、他チームで企画として参加していたid:sawaccioに、テスト環境のURLを教えて、ちょっと使って感想を聞かせてとお願いしておきました。

他のチームは夜遅くまで色々とやっていましたが、私は帰宅。テスト環境のサービスを触りながら、翌日どういうことをしていくかをまとめます。この時点でシステム的な不具合もいくつか見つかっていました。

  • 投稿した文字が化ける
  • 大きな画像が投稿できない

day2

AM

出社して、いきなり合宿モードに。まずは不具合の解決に着手します。
前日あたりをつけていましたが、投稿した文字が化ける問題は、テスト環境に作成したデータベースの文字コードの問題でした。ローカル環境ではutf8だったものが、テスト環境ではlatin1で作成されていたので、テスト環境のテーブルをutf8で作りなおしました。これで文字化けは解決。

画像の投稿は、昨夜懇親会のときに、他チームのエンジニアに「デプロイしたんだけど、大きな画像の投稿ができないんだよね」というような相談をしたところ、proxyの設定ではないかというアドバイスをもらったので、早速チェック。やはり、テスト環境ではPOSTされるデータサイズにproxyで制限をかけていたので、当該サービスのproxyの設定を修正しました。nginxの設定ファイルに以下の1行を加えます。

    client_max_body_size 1024m;

設定を反映したところ、POSTがサーバまで到達しましたが、Internal Server Errorが発生してしまいました。画像を格納するテーブルのカラムサイズが足りないのが原因だったので、blob型だったカラムをmediumblob型に変更しました。
反映後、画像投稿を確認した所、再度エラー。今度はMySQLのmax_allowed_packetのサイズを超えているというエラーでした。
テスト環境のデータベースを確認すると、max_allowed_packetのサイズが確かに小さかったので、大きな値に変更しました。

mysql> set global max_allowed_packet = 4194304;

再度、画像投稿を確認したところ、正常に投稿できていました。本当はmy.cnfに記述するのが恒久的で良いのでしょうが、楽をしてしまいました。

色々とはまりながら、ここまで進んで午前中が終了でした。

PM

お昼前に、昨日テスト環境を教えたid:sawaccioから、フィードバックは「いいね」「悪いね」のような形ではなく「コメント」の方がいいのではというアドバイスをもらいました。ちょっと悩みましたが、サービスのコンセプト的にももう少しコミュニケーション要素があったほうが良さそうという感触だったので、テーブルを増やし機能を追加しました。このとき、もともとあった「いいね」「わるいね」の機能は削除することにしました。

そうこうしていると、id:onishiの合宿の記事にある「合宿新聞」に、合宿のプロダクトのリリース報告をするチームが現れました。発表前に使ってもらおうという作戦ですね。私も、言葉で説明するよりも触ってもらった方が良いサービスだったので、同じように「合宿新聞」で告知を行いました。

合宿を盛り上げるため、また合宿に参加してない人も巻き込んで会社全体で盛り上がるため、「合宿新聞」という企画を考えてみました。

サービス開発合宿 - Hatena Developer Blog

社内リリース後は、細かい不具合や、デザインの調整などを行い、帰宅。

day3

AM

午後から合宿の成果発表会なので、プレゼン資料づくりから。
そんなに言葉で説明するものでもないので、30分もかけずにさらっとつくって、発表の準備はOK。つづいて、発表ギリギリまサービスの微調整。昨日社内リリースしたおかげで、何人かの方が使っていただいて、2〜3人で使っていたときよりも、もう少し利用イメージが湧くようになりました。もう少しここはこういう情報出したほうがいいな、ここは出さないほうがいいなという判断をして、ギリギリまで手をいれていきました。

PM

午後は、滋賀の合宿所から戻ってきたメンバーと合流して発表会。発表のあとは、1人3票で投票を行い、順位を決めました。
私のサービスは、1票しか入らず、残念ながら最下位。他のチームのクオリティと比べても、まあ妥当な順位かなと思いました。

その後、Twitterで社員の方から励ましの言葉をかけていただけたのは嬉しかったです。

まとめ

3日間の開発合宿で、どのタイミングでどういうことを考えながらサービスを作ったのかを簡単に振り返ってみました。
そのままリリースするプロダクトを作らない場合、つまりプロトタイピングに特化した合宿にする場合は、何を試したいのかフォーカスする部分をしっかりと考え、作るものと作らないものをうまく切り分けて時間を使うのが良いと思います。ひとりだと、「こういうのつくろう!」と勢いをつける自分と、「本当にそれいるの?」と冷静になる自分をうまくコントロールしないといけませんが、複数人で合宿する場合は、ワイワイやりながら取り組めるので良いですね。次の合宿は誰かと組みたいと思いました。

はてなでは、社長と開発合宿を過ごしてくれるエンジニアを募集しています。


採用情報 - 株式会社はてな