何をやってたら

「CTOになってしまった」のか

Repro.inc CTO Tomohiro Hashidate / joker1007

プロフィール

  • joker1007
  • 神戸大学 法学部卒
  • SIerから小規模な受託開発会社を経てフリーランスへ
  • 2015/10ぐらいからフリーランスとしてReproに
  • 2016/7からReproのCTO (3ヶ月ちょい :innocent:)
  • パーフェクトRuby, パーフェクトRuby on Rails 共著者
  • 人生における大事なことは「ジョジョ」に学んだ :trollface:

今日話さないこと

  • 組織論
  • チームマネジメント
  • 業務フロー改善
  • スタートアップっぽい苦労話

今日話すこと

  • 技術でビジネスを支えるとは
  • そのために今まで為し遂げてきたこと
    • 何を使って
    • 何を解決したか
    • (何をやった結果CTOになってしまったか :sweat_smile:)
  • プログラマーとしての姿勢

自分はマネージャーではない

バリバリコード書いてるプログラマー

では、CTOという肩書で何をやっているのか

自分のミッション

  • ビジネスの継続に多大な影響を与える課題の解決
  • 技術リーダーとして背中を見せる
    • コードで解決する姿勢
    • OSSエコシステムとの関わり方
    • 設計へのアドバイス
  • コミュニティでのプレゼンスを活かす

一例:Reproの急激な成長

私がReproで働くようになった時期から扱うデータ量が激増している

2015/10時点で一日の生ログは100MBぐらい

現時点(2016/11)で一日の生ログは15GBぐらい

150x Bigger :arrow_heading_up: :arrow_heading_up: :scream:

同じ様なやり方をしていたら

とっくに破綻している。

ビジネスの成長に合わせて、

技術者とアーキテクチャも成長が求められる。

技術でビジネスを支えるとは

ビジネスが健全に継続できる環境を維持し、
そして成長を妨げないこと。

そのためには、適切なアーキテクチャを選定し
実際に形にする能力が必要。

先を読み、調査して、実際に形にするための
開発力がないとやっていけない。

ここ一年間の仕事

バッチ処理にBigqueryを採用

目的

  • 低コストかつスケーラブルなバッチ基盤の獲得が目的


実施したこと/成果

  • fluentdを利用したデータフローの設計と構築
    • サーバーの監視やアラートなどの運用面も
  • fluent-plugin-bigqueryのメンテナになる
  • データ量の成長に合わせてクエリも改善
  • 150xのデータ量になった現在でも、処理時間は一定

バッチ処理の高速化

目的

  • 並列処理可能な処理をハンドリングして総処理時間を短縮する


実施したこと/成果

  • Rubyで管理できるワークフローエンジンを開発
    • DAGベースでバッチジョブを管理可能に
    • 並列実行数の制御
    • ジョブ同士の依存関係の可視化

embulkの採用

目的

  • データの再投入の効率化や、Bigqueryで計算した結果を素早くアプリ側に取り込むため


実施したこと/成果

  • embulk本体、各種プラグインへのパッチ提供
  • プラグイン開発
    • embulk-filter-ruby_proc
    • embulk-output-s3_per_record
    • embulk-parser-avro
  • データ量の増大にも耐えられる高速なデータ転送フローの実現

コンテナ化

目的

  • インフラ管理コストの削減とゼロダウンタイムでのリリースの実現
  • 開発に利用するコンポーネントの複雑化に対応する


実施したこと/成果

  • 複数環境で共通利用できるDockerイメージの設計と構築
  • Amazon ECSの導入
  • 開発メンバーにスイッチングコストを払わせない工夫
    • capistrano上で同一のコマンドでデプロイできるgemを開発
    • 設定ファイルをKMSで暗号化するgemを開発
  • サーバーの9割はECSクラスタに移行完了
  • ゼロダウンタイムリリースと、開発環境構築の効率化を実現

AWS管理のコード化

目的

  • インフラ管理項目の可視化
  • pull reuqestベースでのインフラ管理の実現


実施したこと/成果

  • terraformの導入とconfigの構築
  • RDSとElasticacheを除いた大部分をコードで管理している
  • 新しい環境セットが欲しい場合もファイルを追加するだけで8割は自動構築が可能に

EMRを利用したバッチの高速化

目的

  • 更なるデータ量の増大に対応し、札束で殴れる準備を整える
  • 特に細かいデータ加工処理のスループット


実施したこと/成果

  • embulkをEMR上で実行するための技術調査と環境構築
  • EMR上でembulkを実行するヘルパーgemの開発
  • バッチ処理中の細かなデータ加工等もスケーラブルに処理できる環境を実現

技術的負債の返済

目的

  • 開発効率に悪影響を与える設計上のしがらみを排除する


実施したこと/成果

  • オブジェクト指向的でないコードのリファクタリング
  • テスタビリティの向上
  • 設計のシンプル化
  • 不要な常駐プロセスの廃止
  • コードレビュー

まとめると

モダンな開発環境へ積極的に移行

数々のOSSプロダクトを利用したり作ったりしつつ

スケーラブルな環境を整えてきた

結果CTOになってしまった :sweat_smile:

OSSコミュニティやエコシステムの力を借りることが重要

  • 私は凡百のプログラマだが、そういったことには慣れている
  • ベンチャー企業のリソースはとても限られている
  • 人も時間も充分ではない中で新しいもの生み出していかなければならない
  • 先達の知見を活かし巨人の肩に上手く乗れないと周りのスピードには付いていけない
  • 自分達が作ったものも積極的にOSSとして公開しコミュニティに還元していく
  • 言うのは簡単だが、実際に見える形でやれてる人は少ない

こういったことを当たり前に行う、それを自分の背中で見せていく。