$30 off During Our Annual Pro Sale. View Details »

サービス開発速度に着目したソフトウェアアーキテクチャ/Software architecture for effective service development at Cookpad

サービス開発速度に着目したソフトウェアアーキテクチャ/Software architecture for effective service development at Cookpad

東京大学 メディアコンテンツ特別講義I

Issei Naruta

June 15, 2018
Tweet

More Decks by Issei Naruta

Other Decks in Technology

Transcript

  1. サービス開発速度に着目した
    ソフトウェアアーキテクチャ
    成田 一生

    クックパッド株式会社 執行役 CTO
    2018/06/15
    ϝσΟΞίϯςϯπಛผߨٛ*

    View Slide

  2. ੒ాҰੜ ͳΔ͍͍ͨͬͤ

    !NJSBLVJ
    ΫοΫύουגࣜձࣾࣥߦ໾$50
    ೥ੜ·Ε
    Ѫ஌ݝग़਎

    View Slide

  3. 4/4
    ࡱӨ
    ˞ൃදࢿྉ͸ࣄޙެ։͠·͢
    γϟολʔԻ



    ͝͸Μ ✔

    View Slide

  4. 今日話すこと
    • サービスを素早く開発し、

    長く運用するということ
    • サービスや組織の成長に合わせて

    どのような技術投資をしてきたか

    View Slide

  5. View Slide

  6. 毎日の料理を楽しみにする
    Make everyday cooking fun !
    Since 1997

    View Slide

  7. ྉཧϨγϐ౤ߘɾݕࡧαʔϏε

    View Slide

  8. શੈք

    ݄ؒར༻ऀ਺໿ઍສ
    ༗ྉձһ໿ສਓҎ্
    ˞೥݄࣌఺
    !"
    #
    ! શੈք໿ສϨγϐ

    View Slide

  9. 会員事業 広告事業
    Revenue sources
    (ユーザー向け:月額280円) (クライアント向け)
    ˞੫ൈ͖

    View Slide

  10. 100ヶ国でNo.1を目指して

    View Slide

  11. 英語

    View Slide

  12. インドネシア語

    View Slide

  13. スペイン語

    View Slide

  14. アラビア語

    View Slide

  15. 食文化の数=言語の数?

    View Slide

  16. スペイン語が公用語
    25%以上の割合で話されている
    10 - 20%の割合で話されている
    5 - 9.9%の割合で話されている
    スペイン

    View Slide

  17. 食文化の数≠言語の数
    • 国や地域が異なれば

    気候 / 食材 / 味の好み / 信仰

    などが異なる

    View Slide

  18. 23言語 / 68か国
    対応
    ※2018年6月時点

    View Slide

  19. View Slide

  20. 歴史

    View Slide


  21. View Slide


  22. View Slide


  23. View Slide


  24. View Slide

  25. %$

    View Slide

  26. ΤϯδχΞ਺ͷมભ
    #
    ########
    ########
    ###
    ########## ########## ##########
    ########## ########## ##########
    ########## ########## ##########
    ##########

    ਓ͘Β͍
    ਓ͘Β͍

    View Slide

  27. Japan
    Indonesia
    Lebanon
    Hungary
    Spain
    US
    Cookpad Developers are in:
    UK
    Taiwan
    and more…
    Greece
    India
    Russia
    ೥݄࣌఺

    View Slide

  28. View Slide

  29. ೥ೖࣾ౰࣌ɺ
    ΤϯδχΞ͸ਓఔ౓

    View Slide

  30. μΠχϯάςʔϒϧͰશһू·ΕΔ

    View Slide


  31. ਓఔ౓

    ʢܙൺणΦϑΟεʣ

    View Slide

  32. શһ෼ͷ੮͸ͳ͍

    View Slide


  33. View Slide


  34. શੈք໿ઍສϢʔβ݄

    View Slide

  35. 組織・サービスの成長と
    技術の関係?

    View Slide

  36. 「開発しやすさ」
    への投資

    View Slide

  37. 初期から

    「素早い開発サイクル」を

    経営レベルで重視していた
    →なぜ?

    View Slide

  38. サービス開発は

    難しい

    View Slide

  39. サービス開発は
    とにかく難しい

    View Slide

  40. サービス開発の難しさ
    ゴールが分からない
    Ϣʔβͷཉٻ͸ຊਓΛؚΊͯ୭ʹ΋Θ͔Βͳ͍
    Ϣʔβͷཉٻ͸࣌ؒͱͱ΋ʹมΘ͍ͬͯ͘
    今いる場所がわからない
    ։ൃऀ͸ࣗ෼ͷαʔϏεΛਖ਼͘͠ཧղͰ͖ͳ͍

    View Slide

  41. ΰʔϧ͕نఆͰ͖Δ
    ੡඼ઃܭ
    ΰʔϧ͕نఆͰ͖ͳ͍
    αʔϏε։ൃ

    View Slide

  42. Measure
    Learn
    product
    idea
    data
    Build
    仮説から

    プロダクトに
    プロダクト

    からデータに
    データから
    仮説に
    BML ループ

    View Slide

  43. サービス開発の必殺技は無いけど、

    学びのサイクルを仕組みにすることは

    できる
    →いかに高速に失敗できるか

    View Slide

  44. 技術選定

    View Slide

  45. サービス開発と技術選定(1)
    早く作って早くリリースできること
    実際のユーザに当てない事には、
    仮説の価値は分からない

    View Slide

  46. サービス開発と技術選定(2)
    コードの寿命が長い
    作って終わりではなく、長い改善の道
    環境の変化への追従(技術、人)
    技術的負債になりにくくするには?

    View Slide

  47. サービス開発と技術選定(3)
    組織・事業継続性
    来年もその技術って存在するの?
    エンジニアに嫌われる技術を選ぶことの意味

    View Slide

  48. サービス開発に必要な技術
    速く書けて、みんなが読めて、

    長期間のメンテがしやすい言語/フレームワーク

    View Slide

  49. そんなのあるのか

    View Slide

  50. Ruby on Rails
    はギリギリそう

    View Slide


  51. View Slide

  52. Rails?
    当時は事例も少なく、

    そこまで流行っているわけではなかったが…
    記述量が少なく、可読性が高い

    アジャイル開発に向いているとされていた
    現在ではコミュニティが成熟し、定番に

    View Slide

  53. 「レールに乗る」

    View Slide

  54. IUUQTCBTFDBNQDPN

    View Slide

  55. IUUQTTQFBLFSEFDLDPNB@NBUTVEBUIFSFDJQFGPSUIFXPSMETMBSHFTUSBJMTNPOPMJUI

    View Slide

  56. View Slide

  57. 恒例の rake stats ൛

    +----------------------+-------+-------+---------+---------+-----+-------+
    | Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Controllers | 32806 | 26480 | 311 | 2746 | 8 | 7 |
    | Helpers | 13384 | 10888 | 17 | 1234 | 72 | 6 |
    | Models | 74920 | 59022 | 1303 | 6642 | 5 | 6 |
    | Mailers | 1727 | 1389 | 40 | 170 | 4 | 6 |
    | Workers | 0 | 0 | 0 | 0 | 0 | 0 |
    | Chanko units | 6401 | 5333 | 2 | 160 | 80 | 31 |
    | Libraries | 33764 | 28140 | 381 | 2463 | 6 | 9 |
    | Feature specs | 44276 | 35545 | 0 | 177 | 0 | 198 |
    | Request specs | 781 | 615 | 0 | 0 | 0 | 0 |
    | Routing specs | 406 | 328 | 0 | 0 | 0 | 0 |
    | Controller specs | 49339 | 40751 | 6 | 77 | 12 | 527 |
    | Helper specs | 4152 | 3431 | 0 | 9 | 0 | 379 |
    | Model specs | 65320 | 53596 | 2 | 55 | 27 | 972 |
    | Worker specs | 0 | 0 | 0 | 0 | 0 | 0 |
    | Chanko unit specs | 3012 | 2400 | 0 | 1 | 0 | 2398 |
    | Library specs | 16327 | 13544 | 17 | 78 | 4 | 171 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Total |346615 |281462 | 2079 | 13812 | 6 | 18 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    Code LOC: 131252 Test LOC: 150210 Code to Test Ratio: 1:1.1

    View Slide

  58. 1,300 models

    View Slide

  59. でかいと何が起こるのか
    起動に時間がかかる
    テストに時間がかかる
    静的解析系ツールが動かない
    ライブラリが動かない
    デプロイが大変
    レールに乗れない

    View Slide

  60. コードや環境の老朽化

    View Slide

  61. ͳͥਓ͸
    全部書き直しͨ͘
    ͳΔͷ͔

    View Slide

  62. 2010頃
    全リニューアル計画

    View Slide

  63. リニューアル計画 (2010)
    • エンジニア15人くらい
    • コードが巨大・複雑すぎて、新機能の実装が困難
    • そもそも今のサービスはこれでいいのだろうか?
    • コードもサービスも理想的な状態にした、

    俺たちの考えた最高のクックパッドにしよう
    w Α͠ϑϧεΫϥονͰॻͧ͘

    View Slide

  64. リニューアル大失敗

    View Slide

  65. 何が起こったのか
    「サービスのコアバリューを抽出する」
    「綺麗なコードでイチから書き直す」
    の両方を同時にやろうとした
    ˠ͍ͭ·Ͱܦͬͯ΋࣮૷͕ऴΘΒͳ͍

    View Slide

  66. 仕様の整理と
    リファクタリングを
    同時にやらない方がいい
    ֶͼ

    View Slide

  67. 手遅れになってから
    やらない
    ֶͼ

    View Slide

  68. 2007年の Rails 移行は

    なぜうまくいったのか
    エンジニア5人
    Rails に詳しい社員 0人
    それほど日本で流行ってない

    View Slide

  69. 当時の関係者の証言
    • サービスの機能がまだ少なかった
    • すでにぼろぼろだったから、

    それ以上失敗しようがなかった
    • そもそもそんなに成功していなかった
    ‣ (移行はしたが、当初かなり不安定だった)
    • 若かった

    View Slide

  70. ではどうすればいいのか

    View Slide

  71. 本当に欲しいものは

    何だったのか?

    View Slide

  72. なぜ書き直したかったのか
    • サービスの継続的な改善がしたかった
    ‣ 謎の複雑なレガシーコードが多すぎて

    機能の改善や追加が困難

    View Slide

  73. ϨΨγʔίʔυΛ

    શ෦ॻ͖௚͞ͳͯ͘΋

    ։ൃ଎౓Λམͱͣ͞

    ܧଓతͳվળ͕Ͱ͖ΔΑ͏ʹ
    ͢Ε͹͍͍ͷͰ͸

    View Slide

  74. ϦχϡʔΞϧࣦഊ͕ੜΈग़ͨ͠
    Chanko

    View Slide

  75. Chanko
    本番環境でのトライ&エラーを

    支援する Rails 用 gem
    Unit という単位で既存コードへのパッチを記述
    IUUQTHJUIVCDPNDPPLQBEDIBOLP

    View Slide

  76. ৽σβΠϯ

    View Slide

  77. 既存コードの書き換え
    • レガシーコードをいじるリスク
    • 雑に書くと予期しないエラーになる場
    合があるかも
    • 新デザインを気軽に検証したいだけな
    のに!

    View Slide

  78. " #
    既存のコード A を、スタッフユーザのみに対して
    ベータ版のコード B に置き換えたい
    ただし、B は冒険的な実装なので、例外が発生するかもしれない
    既存の Controller のコード ベータ版のコード

    View Slide

  79. ελοϑͳΒ#
    #Ͱྫ֎͕ى͖ͨΒ"
    ελοϑҎ֎ͳΒ"
    ϑϥάͰ෼ذ͍ͤͯ͘͞ͱίʔυ͕ԚΕ͍ͯ͘

    View Slide

  80. ベータ機能の Unit
    既存の Controller のコード
    "
    #

    Chanko では、Unit というファイルにベータ機能のロジックを記述する
    invoke 条件を満たした場合に、既存ロジック (A) の代わりに Unit (B) が実行される
    B が例外を起こした場合は、元の A が実行されるため、ユーザにはエラーが返らない
    JOWPLF৚݅

    View Slide

  81. 無事に価値が認められたら
    本番の品質のコードに仕上げる
    既存コードを書き換え、Unit ファイルを消す

    (通称 Un-chanko)

    View Slide

  82. Chanko
    • 既存のコードをほぼ汚さずに機能の置
    き換え実験ができる(Chanko Unit)
    • もし Unit 内で例外が起きたら、既存の
    コードが実行される
    • Chanko Unit は汚く書いてもいいけ
    ど、Un-chanko 時にはリファクタリン
    グしようね、という運用

    View Slide

  83. Measure
    Learn
    product
    idea
    data
    Build
    プロダクト

    からデータに
    データから
    仮説に
    BML ループ
    仮説から

    プロダクトに

    View Slide

  84. Chanko で実現したこと
    • 本番環境をステージングのように

    使えるようになった
    • 本物のデータ、本物のユーザ
    • 「スタッフ限定」「10%限定」で

    サービスの価値検証

    View Slide

  85. すばやく開発しつつ
    すぐに本番で検証
    しかもコードは汚れにくい
    (消しやすい)

    View Slide

  86. コード品質

    View Slide

  87. コード品質はビジネスに
    影響するか?

    View Slide

  88. クックパッドの答え:
    YES

    View Slide

  89. コードの品質
    • 可読性
    • メンテナンス性
    • バグの有無
    • セキュリティ

    View Slide

  90. コードの品質が影響するもの
    • 開発効率
    • 属人性
    w ίʔυͷण໋

    View Slide

  91. どこまでやるべきか?
    やりすぎない
    「綺麗なコード」を書くこと自体が目的ではない
    事業フェーズにとって必要な品質までを目指す

    View Slide

  92. コードレビュー
    質の高いコードレビューがコード品質を
    ある程度担保する
    負の遺産を残しにくくなる

    View Slide

  93. コードレビューアンチパターン
    • 些細な文法の好みで揉める
    ‣ インデント、括弧など
    ‣ とにかく不毛

    View Slide

  94. コード規約があると
    コードレビューの効率が
    良くなる
    ֶͼ

    View Slide

  95. IUUQTHJUIVCDPNDPPLQBETUZMFHVJEF

    View Slide

  96. View Slide

  97. 特徴
    そんなんどっちでも
    いいだろというのも
    結構決めてる

    View Slide

  98. 3年くらい運用してみて
    • 最初は反対意見も多かった(僕も)
    • ビジネスのコードレビューなのに文法の
    しょうもない論争が展開される、

    みたいなのを見かけなくなった
    ‣ 文法の論争はスタイルガイドの方で

    やればよい
    • あってよかったスタイルガイド

    View Slide

  99. J04"OESPJEͰ͸ࣗಈίʔυϨϏϡʔCPU %BOHFS
    Λར༻
    IUUQEBOHFSTZTUFNT

    View Slide

  100. 自動レビューbot
    • コーディングスタイルの Lint
    • 静的解析によるバグ検知
    • OSSライセンス情報のチェック
    • アプリのビルド
    • deploygate 等への配信

    View Slide

  101. ˞೥݄࣌఺
    ࠓिͷϨϏϡʔίϝϯτ਺
    ࠓिͷ13਺

    View Slide

  102. コードレビューの

    生産性は

    開発効率において

    死活問題

    View Slide

  103. 効率よく開発しつつ
    メンテナンス性を保てる
    ようにするための工夫

    View Slide

  104. マイクロサービス

    View Slide

  105. IUUQTTQFBLFSEFDLDPNB@NBUTVEBUIFSFDJQFGPSUIFXPSMETMBSHFTUSBJMTNPOPMJUI

    View Slide

  106. 「モノリシック」な

    サービス

    View Slide

  107. View Slide

  108. View Slide

  109. サービス分割のイメージ
    API

    View Slide

  110. API
    認証
    ユーザ
    基盤

    View Slide

  111. API
    認証
    ユーザ基盤
    決済

    View Slide

  112. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ

    View Slide

  113. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ
    Web

    View Slide

  114. マイクロサービス
    # #
    決済
    動画基盤
    Web
    ## # #
    #
    αʔϏεΛҙຯͷ͋Δ୯ҐͰ෼ׂ͢Δ͜ͱͰ
    ҰͭҰͭ͸খ͘͞ɺ։ൃ͠΍͘͢ͳΔ

    View Slide

  115. メリット
    • 小さなアプリケーションとして

    開発できる
    • メンテナンスしやすい
    • 責任感が持ちやすい
    • 組織のスケーラビリティ

    View Slide

  116. デメリット
    • 結合テストが困難
    • システム全体が爆発的に複雑に
    ‣ 障害の伝播問題
    ‣ 管理の困難さ
    ‣ 監視、可視化

    View Slide

  117. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ
    Web

    View Slide

  118. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ
    Web

    View Slide

  119. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ
    Web

    View Slide

  120. API
    認証
    ユーザ基盤
    決済
    動画基盤
    レシピデータ
    Web

    View Slide

  121. View Slide

  122. 世の中の流れは
    マイクロサービスへ
    • Docker を中心としたエコシステムが
    急速に発達
    • 技術的な「定石」ができつつある

    View Slide

  123. サービスメッシュ
    • マイクロサービス同士を

    適切に連携させて、

    うまく制御する技術

    View Slide

  124. &$4UBTL
    LTQPE

    サービスA
    サービスB サービスC
    αʔϏε͝ͱʹϓϩτίϧΛ࣮૷͢Δඞཁ͕͋ͬͨ
    ίϯςφ

    View Slide

  125. αΠυΧʔͱͯ͠ಈ࡞ͤ͞Δɺ

    ϚΠΫϩαʔϏε޲͚ϓϩΩγ

    View Slide

  126. &OWPZͰαʔϏεؒͷ௨৴Λந৅Խ
    ɾαʔΩοτϒϨʔΧʔ
    ɾϩΪϯάɺ؂ࢹ౳ͷڞ௨Խ
    サービスA
    サービスB サービスC

    View Slide

  127. 1SPNFUIFVTQSPNWJ[ʹΑΔαʔϏεؒ௨৴ͷՄࢹԽ
    ʢ࣌ؒʹ༨༟͕͋Ε͹σϞʣ

    View Slide

  128. 進捗

    View Slide

  129. rake stats
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Controllers | 53487 | 43106 | 578 | 4326 | 7 | 7 |
    | Helpers | 16467 | 13482 | 19 | 1544 | 81 | 6 |
    | Models |109238 | 86118 | 1938 | 9700 | 5 | 6 |
    | Mailers | 2259 | 1821 | 47 | 209 | 4 | 6 |
    | Workers | 797 | 678 | 23 | 38 | 1 | 15 |
    | Chanko units | 12737 | 10967 | 20 | 373 | 18 | 27 |
    | Libraries | 52295 | 43235 | 649 | 3954 | 6 | 8 |
    | Feature specs | 56569 | 45583 | 0 | 192 | 0 | 235 |
    | Request specs | 46276 | 39906 | 0 | 18 | 0 | 2215 |
    | Routing specs | 614 | 495 | 0 | 0 | 0 | 0 |
    | Controller specs | 64188 | 53000 | 6 | 128 | 21 | 412 |
    | Helper specs | 84918 | 70300 | 3 | 71 | 23 | 988 |
    | Model specs |163524 |135337 | 5 | 130 | 26 | 1039 |
    | Worker specs | 1156 | 959 | 0 | 1 | 0 | 957 |
    | Chanko unit specs | 9214 | 7596 | 0 | 11 | 0 | 688 |
    | Library specs | 26054 | 21809 | 25 | 125 | 5 | 172 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Total |699793 |574392 | 3313 | 20820 | 6 | 25 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    Code LOC: 199407 Test LOC: 374985 Code to Test Ratio: 1:1.9

    View Slide

  130. rake stats
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Controllers | 32806 | 26480 | 311 | 2746 | 8 | 7 |
    | Helpers | 13384 | 10888 | 17 | 1234 | 72 | 6 |
    | Models | 74920 | 59022 | 1303 | 6642 | 5 | 6 |
    | Mailers | 1727 | 1389 | 40 | 170 | 4 | 6 |
    | Workers | 0 | 0 | 0 | 0 | 0 | 0 |
    | Chanko units | 6401 | 5333 | 2 | 160 | 80 | 31 |
    | Libraries | 33764 | 28140 | 381 | 2463 | 6 | 9 |
    | Feature specs | 44276 | 35545 | 0 | 177 | 0 | 198 |
    | Request specs | 781 | 615 | 0 | 0 | 0 | 0 |
    | Routing specs | 406 | 328 | 0 | 0 | 0 | 0 |
    | Controller specs | 49339 | 40751 | 6 | 77 | 12 | 527 |
    | Helper specs | 4152 | 3431 | 0 | 9 | 0 | 379 |
    | Model specs | 65320 | 53596 | 2 | 55 | 27 | 972 |
    | Worker specs | 0 | 0 | 0 | 0 | 0 | 0 |
    | Chanko unit specs | 3012 | 2400 | 0 | 1 | 0 | 2398 |
    | Library specs | 16327 | 13544 | 17 | 78 | 4 | 171 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    | Total |346615 |281462 | 2079 | 13812 | 6 | 18 |
    +----------------------+-------+-------+---------+---------+-----+-------+
    Code LOC: 131252 Test LOC: 150210 Code to Test Ratio: 1:1.1

    View Slide


  131. NPEFMT

    NPEFMT

    View Slide

  132. 分割方針
    • 開発が活発な部分を切り出す
    • サービスとして再利用性が高い部分を
    切り出す
    • チームの境界で切り出す
    • 完璧より実利を目指す

    View Slide

  133. おわりに

    View Slide

  134. おわりに (1/5)
    • 開発効率への技術的投資を

    クックパッドは

    組織的・戦略的に行ってきた
    • (ただし失敗もある)

    View Slide

  135. おわりに (2/5)
    • クックパッドは「毎日の料理を楽しみ
    にする」サービス開発の会社
    • サービス開発はめちゃくちゃ難しい
    • 最高の道具を使ってやっと

    打席に立てる程度

    View Slide

  136. おわりに (3/5)
    • サービスに「完成」はなく、

    事業が続く限り

    ずっと開発し続けるものである
    ‣ BML ループ
    • そのために必要なことはなにか?

    View Slide

  137. おわりに (4/5)
    • サービス開発の技術選定で大事な要素
    ‣ 早く作って、早くリリースできる
    ‣ 捨てやすい
    ‣ スケーラビリティ

    (組織、トラフィック)
    ͓ΘΓ

    View Slide

  138. おわりに (5/5)
    • マイクロサービス?
    ‣ 組織のスケーラビリティのために

    やむを得ない選択
    ‣ 世の中のインフラがマイクロサービス

    前提になりつつあり、いいタイミング
    ͓ΘΓ

    View Slide

  139. IUUQTUFDIMJGFDPPLQBEDPN

    View Slide

  140. ԠืకΊ੾Γ
    ΫοΫύουɹΠϯλʔϯ

    View Slide