読者です 読者をやめる 読者になる 読者になる

会社の社員総会でNode.jsを使ったリアルタイムクイズアプリをリリースした

僕が所属する会社は、半期に2回全社員が集まって、半期の成績を表彰したりオモシロコンテンツをやっています。

会社が15周年という節目を迎えていることもありいつもと違うことをしようということでwebアプリを使ったクイズ大会をすることになりました。

そこで自分として力を入れたこと・制約の中で諦めたことを書こうと思います。

規格概要

会場にいるユーザーにスマートフォンを使って回答してもらうというもの。 クイズの選択肢の回答集計結果と、早押しや、最終ランキングをブラウザのwebアプリでプロジェクターでスクリーンに写してユーザーに見せます。(クイズのVTRは、会場のスイッチャーを使ってDVDを再生したものを見せます)

f:id:chocopie116:20141006005629p:plain

ユーザー側の操作はユーザー登録と、回答送信フォームの2つの画面のみ。 司会の合図で画面に表示される①②③④のボタンを任意のタイミングで押すだけです。

  • 回答画面

f:id:chocopie116:20141006005639p:plain

  • 司会の回答スタート!の合図とともに管理画面から各問題毎の回答受付開始を設定します。

f:id:chocopie116:20141006005911p:plain

制限時間内に会場にいるユーザーの回答をさばいて、画面に結果を表示するというもの

サーバーは、最近少し触ってみたNode.jsを使ってやりました。 アプリはHerokuにのせました。
最初はWebSocketを使ってやる予定だったので。(後日WebSocketはやめましたが・・・w)

当日は180名ほどの方々にクイズに参加いただきました。 Herokuのlogをtailして見守りながら、内輪向けのプロダクトという奇妙な緊張感に、 終始冷や汗ものでしたが無事システム的な大きなトラブルもなく終わりました。

以下備忘録です。

今回トライ・注力してみたこと

  • 仕事の本業じゃない部分でのシステム構築
    →断ることもできたけど、面白そうだから企画に乗っかってみた。
  • 失敗できないPJで、プロダクションで使ったことのない言語を採用してみた。
    →Node.jsの採用。(プロダクションで使ってみてなんぼでしょの精神。今思うと恐ろしいw)
  • ユーザー側の処理はシンプルに
    →ニックネームでのユーザー登録・回答ボタンを押すだけ。(あんまり複雑なことやるとバグ出る)
  • 初Heroku
    → 最初はWebSocket使えるからという理由でしたが、初めてHeroku使ったけど超便利。
  • サーバーの処理の高速化
    →回答制限時間のあるクイズだったので、ユーザーの回答処理の高速化をやった。ベンチテストをして、回答処理に時間がかかっていたので、アプリ側でDBアクセスをどんどんメモリキャッシュしていった。(前日夜中に先輩に付き合ってもらいましたw)
  • ベンチマークテストを厚めに
    →バグfixも完璧とはいえませんでしたが、とにかくベンチマークテストに時間をかけた。アクセス負荷・実際の処理速度の計測をした。

今回諦めたこと

  • WebSocket
    →2日前に、HerokuでSocket.io動かしたら、最初にコネクション確立するところで、Engine.ioでエラーがでてあせった。ベンチマークのテストもわかりづらいし、プロダクトとして完成させてさっさと完成させてテストしたかったのでpost処理に変更。
  • Node.jsのcallback地獄を綺麗にするため使ったasyncモジュールの読解
    →処理が遅かったときasync moduleのwaterFallメソッドが臭ったけど、とりあえず放置プレーした。

次回トライしたいこと

  • koa
    → yeildちゃんと理解して使いたい。callback減らしてスッキリさせたい。
  • WebSocket使ってもう少しリッチな機能つくりこむ
  • もう少し利用しているライブラリの中身読み込む
  • JavaScriptともうちょっと仲良くなる

最後にデバッグベンチマークテスト・高速化のお手伝い・アドバイスをくださった方々にこの場を借りて御礼を申し上げます。 クイズアプリとして、年末年始の忘年会シーズンの幹事様を助けるサービスとして利用できるようにしたいなとは思っております!