Slide 1

Slide 1 text

Developers Summit 2018 Kansai
 2018/09/28 なぜYahoo!カレンダーは PHPからKotlinへ技術移⾏を進めるのか ヤフー株式会社 おかだ のぶお @bulbulpaul

Slide 2

Slide 2 text

˞:BIPPΧϨϯμʔΞϓϦͷྦྷܭμ΢ϯϩʔυ਺ʢ೥݄೔ूܭ࣌఺ʣʹͳΓ·͢ɻ

Slide 3

Slide 3 text

!3 すべての⼈の「今から」を より楽しく、より有意義に ࣸਅ: Ξϑϩ  サービスビジョン

Slide 4

Slide 4 text

!4 カレンダーの拠点 Ho Chi Minh ⼤阪 東京 / 紀尾井町 東京 / 豊洲 ⾼知 • 国内4拠点 • 国外1拠点

Slide 5

Slide 5 text

!5 @サーバーサイド  東京(紀尾井町) Engineer x 3 + SRE x 2  ⼤阪       PM x 1 + Engineer x 2  東京(豊洲)   Engineer x 7 + SRE x 1  ホーチミン   PM x 1 + Engineer x 2 + 通訳 x 1          合計: 20名のチーム

Slide 6

Slide 6 text

about me おかだ のぶお @bulbulpaul Yahoo!カレンダー Backend Engineer Python, Kotlin, Rust !6 name: id: service: job: lang:

Slide 7

Slide 7 text

も く じ

Slide 8

Slide 8 text

[ 話すこと ] • Yahoo!カレンダー サーバーサイドの変遷と現状、抱える課題 • インフラの技術移⾏とこれから • なぜKotlinへ技術移⾏をするのか [ 話さないこと ] • 細かなアーキテクチャ !8 もくじ

Slide 9

Slide 9 text

Yahoo!カレンダー サーバーサイドの変遷

Slide 10

Slide 10 text

!10 変遷  2000年 Ҿ༻: https://web.archive.org

Slide 11

Slide 11 text

!11 変遷  2005年 Ҿ༻: https://web.archive.org

Slide 12

Slide 12 text

!12 変遷  2012年 Ҿ༻: https://web.archive.org

Slide 13

Slide 13 text

!13 変遷  2014年

Slide 14

Slide 14 text

!14 変遷  2016年

Slide 15

Slide 15 text

!15 変遷  2017年 モバイルアプリとWebを統合

Slide 16

Slide 16 text

!16 変遷  2017年 スマートフォンWeb Yahoo! JAPANアプリ内
 カレンダー

Slide 17

Slide 17 text

サーバーサイドの 抱える課題

Slide 18

Slide 18 text

!18 課題 • アプリケーションが細かく分割されすぎていて
 修正コストが⾼い • PHPのアプリでFWを使っておらず個別の実装が多い • スケールが簡単にできない • 運⽤⾯でのコストが増え続ける このままでは安定して価値提供ができなくなる可能性も…

Slide 19

Slide 19 text

!19 価値とは • プロダクトとしての価値 ➡圧倒的なかんたんさ ➡圧倒的な⼼地よさ • サーバーサイドの価値 ➡ユーザー体験を⽀えるスループット, レイテンシ ➡ユーザーが増えても安定して可動する

Slide 20

Slide 20 text

!20 360ສUU ݄ؒΞΫςΟϒϢʔβʔ 10ԯ݅Ҏ্ ྦྷܭ༧ఆ݅਺ -2018 Q1- ࿙Εͳ͍ ফ͑ͳ͍ ࢭ·Βͳ͍

Slide 21

Slide 21 text

技術のあり⽅を再検討 Why What How

Slide 22

Slide 22 text

どうありたいのか

Slide 23

Slide 23 text

!23 Goal setting • 技術移⾏は⽬的じゃなく⼿段 • チームで話し合い、⾃分達の考えを⾔語化

Slide 24

Slide 24 text

ユーザーの為の時間を最⼤化

Slide 25

Slide 25 text

!25 Why • システムの為の作業 < ユーザの為の時間 • 場当たり的な選択ではなく少し⻑い⽬線で • 後向きな選択じゃなく、前向きな選択をしたい • もっと多くの⼈に価値提供を続けていく為の戦略的選択

Slide 26

Slide 26 text

「適切な」技術選択をする

Slide 27

Slide 27 text

!27 適切な技術選択 • 組織が⼤きくなり、拠点も増え、システムも⼤きくなった • 過去の最適解が現在の最適解ではなくなっている • その中で⼀定のレベルを担保するためには
 ⾔語やFW, システム的な制約を設けたい • インフラもより課題に合ったスケールしやすい環境へ

Slide 28

Slide 28 text

現⾏ Infrastructure !28 Language Middleware

Slide 29

Slide 29 text

技術移⾏ !29

Slide 30

Slide 30 text

⾔語 !30

Slide 31

Slide 31 text

インフラ !31

Slide 32

Slide 32 text

インフラの技術移⾏ !32

Slide 33

Slide 33 text

!33 課題 • アプリケーションが細かく分割されすぎていて
 修正コストが⾼い • PHPのアプリでFWを使っておらず個別の実装が多い • スケールが簡単にできない • 運⽤⾯でのコストが増え続ける

Slide 34

Slide 34 text

インフラ !34

Slide 35

Slide 35 text

構成 !35 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDC ๺۝भDC

Slide 36

Slide 36 text

サーバ増設 !36 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS VMを作成

Slide 37

Slide 37 text

サーバ増設 !37 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS Chefで
 環境構築

Slide 38

Slide 38 text

サーバ増設 !38 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS L4認証設定

Slide 39

Slide 39 text

サーバ増設 !39 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS VIPへ追加

Slide 40

Slide 40 text

サーバ増設 !40 GSLB VIP VIP FE, Proxy FE, Proxy VIP App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS L4認証設定

Slide 41

Slide 41 text

SREてぃえうーっf」」」」」 !41  Stack Model

Slide 42

Slide 42 text

 Stack Model SREてぃえうーっf」」」」」 !42

Slide 43

Slide 43 text

SREてぃえうーっf」」」」」 !43  Stack Model

Slide 44

Slide 44 text

!44

Slide 45

Slide 45 text

!45 インフラ移⾏ • 適切にマイクロサービスとして制御しやすいインフラへ • スケールアウトのしやすさ ➡オートスケール等の活⽤ • 耐障害性ももちろん重要 ➡オートヒーリング

Slide 46

Slide 46 text

Scale out !46 Node Node Node Node k8s Cluster Pod Pod Pod Pod Pod Pod Pod Pod

Slide 47

Slide 47 text

Scale out !47 Node Node Node Node k8s Cluster Pod Pod Pod Pod Pod Pod Pod Pod Pod Pod Pod Pod

Slide 48

Slide 48 text

Auto healing !48 Node Node Node Node k8s Cluster Pod Pod Pod Pod Pod Pod Pod Pod

Slide 49

Slide 49 text

Auto healing !49 Node Node Node k8s Cluster Pod Pod Pod Pod Pod Down… Node Pod Pod

Slide 50

Slide 50 text

Auto healing !50 Node Node Node k8s Cluster Pod Pod Pod Pod Pod Down… Pod Node Pod Pod

Slide 51

Slide 51 text

Auto healing !51 Node Node k8s Cluster Pod Pod Pod Pod Node Pod Pod Down… Node Pod Pod

Slide 52

Slide 52 text

Auto healing !52 Node Node k8s Cluster Pod Pod Pod Pod Node Pod Pod Down… Node Pod Pod Pod Pod

Slide 53

Slide 53 text

Auto healing !53 Node Node k8s Cluster Pod Pod Pod Pod Node Pod Pod Down… Node Pod Pod Pod Pod

Slide 54

Slide 54 text

kubernetes !54 Node Node k8s Cluster Pod Pod Pod Pod Node Pod Pod Down… Node Pod Pod Pod Pod 認証は?

Slide 55

Slide 55 text

!55 AuthN, AuthZ • コンテナ化でIPベースの認証ができない • 適切なリソースの管理が必要 L7でAuthN, AuthZをする必要がある

Slide 56

Slide 56 text

!56

Slide 57

Slide 57 text

!57 Athenz • RBAC(ロールベースアクセス制御) System • IPに依存しない • Host毎にRoleの登録が不要でスケールしやすい • 他のインフラに依存しない

Slide 58

Slide 58 text

!58 認証形式 • Serviceという単位でアクセスを管理する
 IPの特定が不要、トークンを⽤いた⾝元特定 • ⾝元特定にも秘密鍵でデジタル署名されたトークンを
 ⽤いる事でPaaS, CaaSでの利⽤が可能 認証 Service 秘密鍵 公開鍵 トークン

Slide 59

Slide 59 text

!59 スケールのしやすさ • IPに依存しない為、⾼速なスケールアウトが可能 • 同じServiceとして扱う場合、アクセス権限が共有できる Service A IP : aaa IP : bbb IP : ccc IP : ddd IP : eee 追加 追加 認証 IP : ddd Service B

Slide 60

Slide 60 text

Appの追加 !60 VM VM VM VM CF Cluster App App App App App

Slide 61

Slide 61 text

Appの追加 !61 VM VM VM VM CF Cluster App App App App App App App App App App App App

Slide 62

Slide 62 text

Appの追加 !62 VM VM VM VM CF Cluster App App App App App App App App App App App App

Slide 63

Slide 63 text

⾔語 !63

Slide 64

Slide 64 text

PHP → Kotlin? なんで ?

Slide 65

Slide 65 text

!65 Why • システム全体で⾒たときに
 コードの可読性や挙動の把握が現状しづらい点がある • 実⾏時のエラーではなくコンパイル時に気づきたい • 可能な限り静的な解析や型等を導⼊する事で最低限の
 品質担保をしたい

Slide 66

Slide 66 text

!66 Why Kotlin? • Null Safe • sealed class • 型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える

Slide 67

Slide 67 text

• Null Safe • sealed class • 型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える !67 Why Kotlin? 制約と規律

Slide 68

Slide 68 text

• Null Safe • sealed class • 型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える !68 Why Kotlin? ⾼い利便性

Slide 69

Slide 69 text

!69 Why Kotlin? 巨⼈の肩に乗れる • Null Safe • sealed class • 型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える

Slide 70

Slide 70 text

型, 型推論 !70

Slide 71

Slide 71 text

!71 型がある幸せ • Kotlinは型が厳格でコードの挙動も把握しやすい • sealed class 等の制約もかけやすい • IDEの強⼒なサポートもあり振る舞いに問題がある場合
 エラーになるので意図しないミスも防げる • 型推論があるので冗⻑にならず簡略に書け便利

Slide 72

Slide 72 text

!72 Sealed class // sample.kt sealed class Protocol{ abstract val seq abstract val id } data class SampleProtocol(val seq, val id) : Protocol 同⼀ファイル内のみ継承可能 ※異なるファイルから継承しようとするとコンパイルエラー

Slide 73

Slide 73 text

!73 型推論 val name = “デブサミ” // String, val name: Stringとなる val count = 2018 // Int, val count: Intとなる // Spring JDBCのコード例 val count: Long = jdbcTemplate.queryForObject( “SELECT count(*) FROM user”) 左辺の型推論

Slide 74

Slide 74 text

NullSafe !74

Slide 75

Slide 75 text

!75 Null Safe val task: String? = null  // nullable val name: String = “okada” // non null name.contains(“ok”) // 実⾏可能 task.contains(“ok”) // コンパイルエラー

Slide 76

Slide 76 text

制約で最低限の規律ができる

Slide 77

Slide 77 text

KotlinのFramework? !77 どうなん?

Slide 78

Slide 78 text

!78 Framework • 基本的にJavaのエコシステムを活⽤できる • Spring Framework v5からKotlin Support • SpringBootも使えるので導⼊コストも低い • Kotlinで実装されたFWもある(Ktor, Spring Fu, etc ) • 現時点ではSpringBootが周辺ライブラリも揃っている状況

Slide 79

Slide 79 text

活⽤してるJavaの エコシステム !79 何使ってんの?

Slide 80

Slide 80 text

• Athenz(認証 / 認可) • Pulsar Client (MQ) • Hystrix
 (サーキットブレーカー) Use library • SpringBoot (Framework) • MVC • Batch • Moshi (Json parser) Javaライブラリ Kotlin対応ライブラリ !80

Slide 81

Slide 81 text

JavaライブラリのKotlin対応 なにが違うん?

Slide 82

Slide 82 text

• Kotlinらしく書ける • 動かない等は無い • 場合によっては⾔語特有の部分で
 意図しない挙動になる場合もある !82 Kotlin support

Slide 83

Slide 83 text

public class Example { public T create(Class clazz) { try { return clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } !83 example 1

Slide 84

Slide 84 text

// Kotlin val example = Example() example.create(Foo::class.java) !84 example 1 // Java Example example = new Example() example.create(Foo.class)

Slide 85

Slide 85 text

val example = Example() example.create(Foo::class.java) !85 example 1 Example example = new Example() example.create(Foo.class) kotlin.reflection.KClass java.lang.Class

Slide 86

Slide 86 text

import kotlin.reflect.KClass fun Example.create(kclass: KClass) = create(kclass.java) val example = Example() example.create(Foo::class) !86 example 1 Kotlinらしい書き⽅!!

Slide 87

Slide 87 text

@Controller class ExampleController(val foo: Foo, val bar: Bar?) { @GetMapping(“/article”) fun article(@RequestParam id: String, @RequestParam tag: String?) } !87 example 2 オプション 必須 @RequestParam(required = false) String name

Slide 88

Slide 88 text

PHPからKotlin? !88 どうなん?

Slide 89

Slide 89 text

!89 ⾔語の移⾏ • 学習コストはあるものの、⾔語移⾏で躓く等は発⽣していない • ⾔語⾯での仕様や制約を上⼿く使って
 全体での品質向上等へつなげる • 「作りたいもの」を作りやすい技術を選ぶ事で
 ⽣産性を⾼める • チーム内の定性的な反応としては
 「開発が楽しくなった!!」との声も!

Slide 90

Slide 90 text

Next Challenge

Slide 91

Slide 91 text

!91 Challenge • システム • 部分的にPHP -> Kotlinへ移⾏中 • 後々Java -> Kotlinも移⾏したい • インフラ • Istio, Envoy を使ってカナリアリリース可能な環境の構築

Slide 92

Slide 92 text

技術移⾏ !92

Slide 93

Slide 93 text

ユーザーの為の時間を最⼤化

Slide 94

Slide 94 text

チームづくり どうしとん?

Slide 95

Slide 95 text

!95 チーミング • 距離がある分コミュニケーションコストは⾼い ➡だから価値あるコミュニケーションにはコストをかける • お互いを知るためにメンバー間で1on1 • チーム全体でお互いの期待値を全体で合わせる ➡ドラッカー⾵エクササイズ

Slide 96

Slide 96 text

!96 期待値合わせ • お互いの期待値を合わせるために
 以下の項⽬を ➡ 得意なコト ➡ 貢献しようとしてるコト ➡ メンバーからの期待されているコト 必ずしも期待されてることが正じゃないように注意

Slide 97

Slide 97 text

!97 他にも • 4拠点で毎⽇の朝会で顔を合わせる場を作る • ペアプログラミング • 全体の開発⼒や知識レベルの底上げの為のハンズオン

Slide 98

Slide 98 text

ま と め

Slide 99

Slide 99 text

!99 まとめ • 技術移⾏はあくまで⼿段 • より「ユーザーのための時間を最⼤化」させるという⽬的の為に
 技術移⾏をし、適切な技術選択を進めている • KotlinやFWの仕様や特性を⽣かして、品質や⽣産性を⾼める • インフラもよりモダンな環境へ移⾏することで
 ユーザーが増えても変わらない価値提供をする
 取り組みをしています • 技術だけじゃなくチームづくりも並⾏して⾏うことで
 前向きな選択ができる強いエンジニアリング組織にしていく事も重要

Slide 100

Slide 100 text

さ い ご に

Slide 101

Slide 101 text

!101 Mix Leap https://about.yahoo.co.jp/hr/

Slide 102

Slide 102 text

!102 Mix Leap ൃ৴ ަྲྀ ڞ૑ 「発信」「交流」「共創」の3つを軸に 「関⻄圏のクリエイターを⽀援」するためのイベント

Slide 103

Slide 103 text

お わ り