みんなのマーケットでCTOをしている戸澤です。
このブログでは、みんなのマーケットの働き方やプロダクト開発で得た知見を共有していきます。 成功事例を載せるだけでなく失敗や苦慮していることも記事にして、読んだ方と議論してお互いに成功方法を探り、より知見を深める場にもしていきたいと思います。
最初となるこの記事では、会社の説明や技術スタックを紹介していきます。
会社
みんなのマーケットは、ハウスクリーニングや畳の張替えなど生活に関わるサービスを扱うプラットフォーム「くらしのマーケット」を運営するスタートアップです。 お掃除系のプラットフォームと思われることがありますがお掃除に限ったものではなく、リフォームや出張シェフ、出張DJなど幅広く生活に関係する203カテゴリのサービスを扱っています。
その弊社は2011年1月に創業し、今年で8期目を迎えました。 東京・五反田に本社、宮崎に支社があります。 部署は4つあり、テクノロジー本部、マーケティング本部、コンサルティング本部、コーポレート本部です。
働き方
特徴は、ルールが少なく自由な職場環境であることです。自由な職場環境の一例として次のものがあります。
- 18時以降ならアルコールOK(ビール、ほろよい、宮崎の焼酎等を完備)
- ダンベル、チンニングスタンドで筋トレ可
- ゲームOK
- 自宅勤務OK
- ネコが2匹いる
このような自由なルールがあるからといって、仕事時間にずっとゲームしたり自宅勤務ばかりで会社にまったく来ないといったメンバーはいません。 各メンバーのセルフマネジメントができているため、ルールが少なく自由な職場環境でも仕事が進められています。 また、数週間に一度のペースで、希望者どうしでたこ焼きを作って食べたり、キャンプにいったり、金継ぎ教室をオフィスで開いたりしています。
勤務時間も自由で、コアタイムなしのフレックス制を採用しています。そのため、出社時間は決まっていません。 たとえば早い人は9時に出社して18時に退社、遅い人は12時に出社して22時に退社するなどの各々の生活リズムにできるだけ合わせて働けるようになっています。
テクノロジー本部
テクノロジー本部のメンバーは、エンジニア(Web、スマホアプリ)、デザイナー、インフラ、ディレクターからなります。 普段は3チームに分かれて、新機能の開発、これまでリリースした機能の改善を進めています。 ディレクターだけでなく、エンジニア、デザイナー、インフラのメンバー全員が自分のメインの仕事をするだけでなく一緒にプロダクトのUXを考えて、どうすれば課題を最適に解決できるかを考えながら開発を進めています。
開発マシンは、全員MacBook Pro13"と27"モニタ(人によっては2台)を使っています(入社するときに必要なスペックを確認しています) 周辺機器も自由に使うことができ、REALFORCE, トラックボール、トラックパッドなどを導入しています。
また、朝会を開いてその日にやることの確認と問題の共有をして早期解決を目指しているほか、開発でわからないことがある場合は、すぐに聞ける雰囲気(集中モードのときは守られます)でペアプログラミングしながら教えてもらうなどしています。
技術スタック
創業当初より開発言語としてPythonを採用しています。 中途入社される方でPythonの開発経験がある方は少なかったですが、Pythonの特徴である可読性、習得のしやすさのおかげで早い段階で実際のシステム開発を進めることが実現できています。
初期はエンジニア1名で開発を進めていて、システム構成はPython2系 + Django + MySQL + Apache + さくらVPSでした。 初期の開発スピードの重視と仕様変更により、次第に初期システムはスパゲティコードになりました。 この状態では、変更に長い開発時間が必要で、変更するとリグレッションも頻発し、スタートアップのスピードが重視されるビジネス要件に耐えられなくなりました。 また、1名ではなんとか解読できていたコードも、エンジニアが2名、3名と増えていくにしたがって、解読困難になり、2015年秋にフルスクラッチでのシステムのリプレイスを開始しました。
リプレイスでは、アーキテクチャはマイクロサービスを、言語はPython3系, Node.js(TypeScript)を採用しました。 また、同時にプロビジョニングからデプロイまでのしくみも整備し、ユニットテスト、UIテスト、コーディング規約、コードレビューを徹底し、可読性の高いソースコードを維持しています。
アーキテクチャ
アーキテクチャとして、マイクロサービスを採用しています。 マイクロサービスをAPIとして、マイクロサービスがDBと通信します。Node.jsではそのAPIを使って、CRUDするしくみです。
バックエンド
マイクロサービスは、PythonのWebフレームワークのDjangoとFlaskで実装しています。 リプレイス当初はもともと開発経験の多いDjangoでスピード感をもって開発できるようにと採用しました。 現在は、マイクロサービスではDjangoほどリッチな機能は不要なので、新しいマイクロサービスからFlaskで実装しています。 また、最近ではHaskellのマイクロサービスも誕生しています。
マイクロサービスのAPIにCRUDし、クライアントにレスポンスを返すNode.jsでは、開発しやすくするために型定義が使えるTypeScriptで実装し、コンパイルして生成されたJavaScriptを実行しています。 また、Node.jsではノンブロッキングI/Oとイベントループのメリットを活かし、大量のクライアントからのリクエストとマイクロサービスへのリクエストを同時に処理できています。
フロントエンド
フロントエンドでは次のフレームワークや言語、ツールを採用しています。
- Angular
- webpack
- Sass
- Grunt
- 画像やjsファイルの圧縮のモジュール
AngularもTypeScriptを使って実装しているため、型安全な開発ができています。
アプリ
SwiftとKotlinを開発言語に採用しています。 Kotlinは書きやすく開発効率が上がり、またNull Safetyなため、アプリのクラッシュが大幅に減りました。
インフラ
スケールが容易なAWSを採用しています。
導入しているツールは次のとおりです。
- プロビジョニング、デプロイ: Ansible, whiptail
- ログ: Logstash, Elasticsearech, Kibana
- 監視: CloudWatch, CloudWatch Logs, Prometheus, Grafana
- DB: PostgreSQL(RDS), Redis(ElastiCache)
- プロセス管理: Supervisord, PM2
- キャッシュ: Varnish
- アプリケーションサーバ: uWSGI
- Webサーバー: OpenResty
- タスクキュー: Celery
Varnishは、マイクロサービスを使うにあたって、すべてのリクエストが毎回マイクロサービスまで到達してしまうと負荷が高くなることを軽減するために、マイクロサービスとNode.jsの間に配置し、マイクロサービスのレスポンスをキャッシュしています。
QA
導入しているサービスは次のとおりです。
- CI: CircleCI, Drone.io
- UIテスト: Appium, Selenium
- ドキュメント: Sphinx, Qiita
- バージョン管理: GitHub
開発環境
エディタは、PythonはPyCharmで、TypeScriptはVisual Studio Codeを使って開発するエンジニアが多いです。
社内ツールに、Tako(タコ)と呼ばれるブランチ毎のステージング環境を作るしくみがあり、ブランチ毎に動作確認を行っています。また、Ika(イカ)と呼ばれるツールでは、UIテストを自動化しています。
主な開発内容
テクノロジー本部では、くらしのマーケットに関わるすべてのプロダクトを開発しています。
- くらしのマーケットのWeb
- 店舗向けスマホアプリ
- 一般ユーザー向けアプリ
- 社内向け管理画面
- 社内向け電話システム (IVR)
課題
チームが技術的課題として抱えているものです。
- Angularの速度
- バックエンドの速度向上
- 増えるデータ量への対応(DB, ログ分析)
まとめ
- 会社がみんなのマーケットで、やっているサービスがくらしのマーケット
- セルフマネジメントを重視した自由な職場環境
- マイクロサービスでNode.js(TypeScript)とPythonが主な開発言語
- 速度向上、データ増加への対応が優先課題
- 興味がある方はぜひお気軽に連絡してください (コーポレートサイト https://www.minma.jp/ )
技術スタックはかなり省略して書きましたが、詳細については今後の記事で紹介していきます。
次回は、インフラ担当による、supervisordのプロセス監視の紹介です。