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

When it’s ready.

出来るまで出来ない

hack4jpのハッカソンに参加した>オフライン京都会場

史上稀な超タイトスケジュールで開催された Hack for Japanに参加しました。詳細は公式サイト(https://sites.google.com/site/hackforjapan/ )を参考にしてください。このプロジェクトは、今日で終了ではなく今後も震災に関する問題にITで貢献しつづけるため継続されます。

イベント自体は、19, 20, 21の3日間で開催されました。前2日間は、オンライン上でアイデアソンを行い、最後の1日は、各地のオフライン会場で実装を行うというスプリントハッカソンという感じの超タイトなスケジュールで実行されました。告知も実行も突然であったため、予定が合わずに参加できなかった方も大勢いるかと思いますが、前述のとおり引き続き開発は続いていますし、まだまだ各プロジェクト共にリソース不足状態である為、まだまだ、活躍の場はあるかと思います。今後は、各プロジェクトがステータスをオープンにし色々なリソースを以下に取り込むかが進捗具合に大きな影響を与えるかと思います。

今回「デマだったー」プロジェクトに参加し、実装時間4時間で経験した多くのことを共有出来ればと思います。

チームについて

今回のチームは、初めて顔を合わせた6名でした。お互い得意分野もバックボーンも知らない状態からのスタートで、ハッカソンのチームとしては恵まれた状態では有りません。Javaベースの人やiOSベースの方も居たのですが、チームの半数がGAE経験者というのがプロトタイプ完成への決め手となりました。

目的の統一

まず、ハッカソンの目的そのものの目的を設定しました。「作業時間終了までに何がしか動作するものを作成する」これをまず決めました。作業時間の確認をすると締切りまで4時間しかなく若干涙目になりましたが、逆に4時間しか無いことで本当に必要なことを見定める必要があると、全員の意識が統一されていった様に感じました。

既にサーバー側とクライアントのプラグインが動作していたので、既存の物をV1としてアーキテクチャの確認を行いました。合わせてソースを眺めながらアーキテクチャをメモ帳で起こしていきます。ハッカソンの数時間で充実したサーバーとリッチなクライアントを作成するのは難しいと判断に至ったので、今回はサーバーを中心に実装を行い、動作を可視化するためのシンプルなサンプルWebインターフェースを作成する作戦を取ります。選択と集中です。メンバー内で目的が統一されているため非常にスムーズに事が進みました。

まず作ってみる、問題があれば修正するという手順もあるかと思いますが今回は4時間という限られた時間で6人で設計と実装をするイテレーションを2回行えるほど時間の余裕が無いため設計にある程度の時間を割きました。

設計段階

サーバー側を設計するに当たり、必要な機能を洗い出します。CRUDの項目をたてて、「デマだったー」に必要であろうエントリーや参照系の機能を羅列していきます。この段階もメモ帳に手書きで書き起こします。それらの機能を、RESTfullにアクセスできるようにエンドポイントにアサインしていきました。この段階で、ダブっているAPIや、不必要なAPIリファクタリングを行いました。このことが、実装時間の節約と混乱の排除に繋がり事前に時間を割く意味が有りました。初対面同士で設計を行う時に、特に重要に感じたことはスタッフ内での用語統一の必要性です。一般的な作成日時や更新日時といったものは特に意識統一はいりませんが、”ユーザー”と言ったときに、投稿した人を指すのか、参照している人を指すのか、受取る人によって理解がブレると、状態説明の会話が成り立たなくなります。誤解が発生する用語には、とりあえず何でもいいのでユニークな呼び名をつけて誤解が少なくなるようにすることがとても大切。名前は意味不明な呼称を適当に付けていても、理解が進むうちに適切な呼称が発明されることも今回得た貴重な体験です。呼称を何にすべきか議論することは本質ではなく時間の無駄です。好きな食べ物や、好きな色でいいのでとにかく誤解のないユニークな呼称をあててコミュニケーションを先にすすめることが重要。

資料作成

ここまでで、紙ベースの基本設計書(とは言ってもA43枚程度)が1時間くらいで出来たので、wave上に専用のページを作成し、清書を行いつつ詳細設計に落としこんでいきました。
https://wave.google.com/wave/#minimized:nav,restored:wave:googlewave.com%252Fw%252B0l92bRwYA.4
紙と違い、複数のメンバーで同時編集が可能なので紙での作業より記入時間が短くてすみます。初めからwaveでやっていても良かったかも知れませんが、紙のいいところはみんなの視線が1箇所に集まりアイデアを選択していって合意形成しやすい点です。目的と基本設計がメンバーで統一されているため、wave上でもそれほど混乱なく資料作成が進んでいきました。ここまでは、全く実装をしてないため曖昧なところが多々有りましたが、漏れ無くダブりないモデルとエンドポイントが出来ました。

実装開始

過去のソースを、ハッカソン用に用意されたリポジトリーにコピーし http://code.google.com/p/hack4jp/ 各自がチェックアウトしサーバー班とクライアント班にわかれひたすら実装です。ここからは、あまり記憶がないのですが、事前設計を丁寧に行なっていたため、全体のことはあまり考えず、エンドポイントごとに必要な機能を各人がバラバラに実装していきました。モデルでReferencePropertyを使っていた為、投稿系に時間がかかってしまい参照系のほうが先に出来てしまいました。そんなことが出来たのも短時間だったけど事前にモデルとエンドポイントを事前に設計してたおかげです。有って良かった設計書。このころになると、具体的なリクエストパラメータや、レスポンスのJSONパラメータが見えてくるので同時並行で詳細設計書を煮詰めていきます。@nitoyonさんが恐るべしスピードでwaveを熟成してくださいました。ラスト20分で、新規投稿や参照は可能になったのですが、「デマだったー」の肝であるデマレート(参照Tweetがどの程度デマだと思われているのか)を計算する部分が未実装でした。時間が間に合わなければハードコードすることもあったかと思いますが、ペアプロしていた@mzsm_j さんが「やりましょう!」と断言、アドレナリン出まくり状態のまま実装し、締切りぎりぎりでデマレートの動作確認まで至りました。

ここで感動する出来事が有りました。それまでは、サーバーサイド一辺倒でエンドポイントを手打ちして生JSONを確認していたのでうすが、このままではあまりにもミテクレがよろしくない。テスト用の投稿フォームをクライアント班が前半に作ると言ったまま全く確認をしていなかったのです。ところが、既にUIはテストフォームではなく、jQueryMobileでイケテルUIが完成していたのです。メチャ感動しました。みんなで設計をして、waveで仕様書を起こし、その後スタンドアローンで実装をしたのにサーバーサイドとUIが一発でエラーなく動いたのです。サーバ班のコミット頻度もそんなに高くなかったので、クライアントを実装するのは仕様書を参考にするしか無かったはずなのに完璧に動作していました。鳥肌たつ経験をしました。

諦めた色々な事

今回のサーバーはGAE/Pで実装した。ユーザー認証がないと不正なデマ登録が発生し「デマだったー」自体がデマの塊になりかねないのですが、GAEの認証は物々しいのでTwitterに認証を任せたかったのですが、15分ほどチャレンジして敷居が高そうだったので即諦め後日実装としました。

デマレートは、デマフラグを集計して算出擦る必要があり現在は投稿時に再計算を行っていますが漏れが発生する気がするのでその対策を考えないといけないねというまま、未実装

ランキング表示に、現在はデマレートのみをソートに使用していますが、1件だけしか投稿されてないデマ情報はデマレート100%となり常時トップに表示されてしまうため、ランキングの表示を調整しなくてはいけないと問題点は認識していますが、そこも未実装

ハッカソン感が変わったハッカソン

 前日に京都行きを決めてから、京都に付いたのは3-4時間後でした。事前に準備も全くしていかずに当日会場についてから全ての事が起ったのですが、とても充実した時間が過ごせました。会場には、8チームありそれぞれのチームがそれぞれ濃い時間を過ごしていました。ハッカソンが終わっても継続こそが真の目的、必要や問題があり続ける限りプロジェクトは終わらないそんなハッカソンは今まであまり無かったし、一人でプロジェクトを継続するのは不可能で、その仕組を作り続けることもしていかなくてはならない。オープンソースの歴史から見習うことはたくさんあるかと思うが、OSSはプログラマのためのツールが多い。文句があるならパッチくれ的な雰囲気がなくもない。Hack4jpでは、被災者向けのプロジェクトであるためその人達にパッチを期待するのは筋違いだし、成果物はライブラリではなくサービスそのものだったりする。不具合や不満点は、何もしなくても集まってくると思うが機能追加は難しい。今後は小さなサービスでも新サービスをリリースする際にはABテストかけて定量的に分析し、ユーザーにアンケートなどすることなく有効性を確かめなていく手法が今後重要になってくると思う。

「狙って撃つ」のが正しい時もあるが、弾に限りがないのなら、「撃ってから狙う」「撃ってから狙う」でも変わらない。とりあえづ、狙ってばかりじゃなくて、撃ってみよう!