Levelopができるまで

4月くらいから開発に参加していたプロジェクトが公開されました。

Levelop.org


練習メニュー共有サービスです。クックパッドのスポーツ版のようなものですね。機能が充実してきたらスポーツ以外にも、楽器や勉強法なども扱えるようにする予定です。

エンジニアとして参加したので作業プロセスや技術的側面にフォーカスして、公開までの道のりを紹介しようと思います。

プロジェクト参加

2014年3月末に、新しいウェブサービス立ち上げを構想しているという二瓶氏に誘われて参加しました。その時点で二瓶氏はすでに開発中のプロジェクトがあり、それの機能追加などをする予定でした。二瓶氏は企画、開発、運用のスキルがありますが一人では作業量が多いので、ちょいちょい声をかけた人に手伝ってもらうというスタイルでした。その時点では他にデザイナーの方がいらっしゃいました。

私はいくつか開発のアルバイトの経験はありましたが、企画から実装、運用まで一切の不満無くできるかというと結構難しいです。しかし、スタートアップ的にやっていくなら、進行方法に対して直接議論すればいいし良い経験になりそうだと思い、喜んで引き受けました。人数が少ないがゆえ好きな領域でスキルを試せるのも良いです。

プラットフォーム

  • レンタルVPS
  • Ruby on Railsバックエンド
  • AngularJSフロントエンド


作業ツール

  • Google Drive: 調査資料、ミーティング資料
  • KanbanFlow: タスク管理
  • Bitbucket: リポジトリや全体のプロジェクト管理

自分の担当箇所

  • SeleniumによるE2Eテストや実施方法,どこまで網羅するかの検討


基本はリモート作業です。週1,2回、大学のフリースペースを借りたりして対面で開発やミーティングをしました。

何回かに一度は知人の学生数人を呼んで、テスト方法について議論したりしていました。E2Eテスト、ユニットテスト、コストのトレードオフなどをまとめられ、かなり有意義でした。

f:id:ishn:20140426142257j:plain

毎回対面で作業する都度、新しいサービスの企画を考えて日々記録していくという遊びも取り入れました。

いったん破棄して再度ブレインストーミング

で、途中まで作業してたのですが、サービスのモデルに致命的な欠陥が見つかり、一旦破棄されました。

何本かアイディアをストックしていたし、既存OSSを応用させてすばやく開発しようという方針になり、改めて5人くらい知人を集めて新サービスのブレインストーミングから始めました。

  1. ソースを応用できそうな既存OSS調査(CMSみたいなのとか)
  2. ターゲットになりそうなユーザー層の調査
  3. OSSとユーザー層の組み合わせのうち最も集客が見込めるところは?

というプロセスを経て、何本か実践できそうなのが見え、そのうちのひとつがLevelopだったわけです。Levelop以外にも、開発リソースさえあればいけそうなアイディアもストックできました。

このころから体制がおおよそ以下のようになってきました。

  • 主力の企画/開発 - 二瓶氏
  • デザイナー x 1
  • フロントエンドエンジニア x 1
  • インフラエンジニア x 1

私はミドルウェアの運用をしたかったので意向を汲んでもらい、インフラエンジニア的な部分を担当することになりました。やったね!

開発

クックパッドライクなCMSレシピブック をforkして作りこみました。これはDjangoで記述されていたので自動的にDjangoプロジェクトになりました。

AngularJSの学習コストが高かっただけに、言語ごと変わってしまったのは大変ですが、二瓶氏が技術よりもサービスに主眼を置いているのでほとんどモチベーション低下を起こすことはありませんでした。この姿勢は大事だと思いました。

コミュニティ機能の実装、新しいモデルに対するテストの調整などがアプリケーションのほうのタスクになりました。

フロントエンドはJSライブラリによるCacooみたいな作図機能の導入がありました。低い実装コストで、見栄えの良い機能ができました。

私は継続して

  • 機能追加
  • 負荷テスト方法の検討
    • 調査資料から、ピーク時のセッション数、運用するとDBはどれくらいのデータを保持するか、sqliteは十分な速度を出せるか?などを考慮

などを行いました。まだ負荷テストは実施できてないんですけどね。

公開の準備

私は直前で

  • デプロイ方法のドキュメント化
  • サポート用のメールサーバー
  • SSL設定
  • Facebookページの作成

なんかを行いました。

プログラム的な部分はあまり貢献できなかったのですが、SSL設定とか普段触れることない部分が経験できました。

課題

作業時間をいかに取るか

研究で忙しい時期は週2度も集まれませんから、毎日30分作業するという方式を導入しました。しかし夜は疲れてしまってほとんど作業にならないという日が続きました。今は週2回を使えるのでいいですが、今後も工夫が必要です。

仕様の共有

現在、ER図をCacooで管理しています。CacooやGoogle Driveのようなツールが充実していて、情報共有の方法はかなり簡単になりました。しかしフルタイムで時間を使えないので、ソースコードリーディングだけで結構時間がかかってしまい中々実作業に入れませんでした。一方でコミット前に各種UMLを書くというのはオーバーヘッドが大きすぎる。

RDocのような仕様書自動生成ツールを導入してみればいいのでしょうか?仕様共有のうまい方法は調査したいですね。

今後

練習メニューの種目は現時点で少ないですから、フィードバックをもとに機能拡充をしていきますが、それ以外で行いたいのは、

  • 負荷テスト生成して、今のVPSプランでどれくらいのアクセスがさばけるか
    • 結果によって別のプランにする
  • Djangoがアレなのでまるごと書き直したい(時間かかりそう)

です。

DjangoWordpressのような思想で設計されていて、tumblrやpinterestのような、毎日の記事投稿を管理するようなモデルに向いています。Levelopは割とアプリケーション然としているので、今後拡充していくうちにDjangoは不利になりそうです。また、APIとフロントエンドの分離も行いたいのですね。

ゆくゆくはMEAN(Mongo, Express, Angular, Node)スタックでの完全書き直しができたらなぁと思ってます。ただ、これは開発リソースが磐石にならないと難しいですね。

あと最近は
tecoビジネスカフェ というコワーキングスペースをみつけたので利用しています。

今後はLevelopで使っている技術ネタをもう少し具体的に書いていこうと思います。