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

システムリニューアルと サーバーサイドKotlin

システムリニューアルと サーバーサイドKotlin

Hidenori Maehara

August 24, 2017
Tweet

More Decks by Hidenori Maehara

Other Decks in Technology

Transcript

  1. システムリニューアルと
    サーバーサイドKotlin
    〜Rubyエンジニア meets Kotlin〜
    エムスリー株式会社 前原
    @maeharin

    View Slide

  2. 自己紹介
    ● 前原 秀徳
    ● @maeharin(まえはりん)
    ● エムスリー株式会社 エンジニア
    ● チームリーダー、グループ会社取締役等を歴任
    ● 自慢:ブログ記事が、はてぶ1200
    ○http://maeharin.hatenablog.com/

    View Slide

  3. エムスリーって何の会社?
    ・医療に関するWebサービスを多数展開
    ・全世界で約400万人の医師会員
    ・日本で約25万人の医師会員

    View Slide

  4. 今、私たちは10年に一度の
    システムリニューアルをしてます!

    View Slide

  5. システムリニューアルの対象システム
    医師のキャリア支援事業
    (年間売上、数十億規模)

    View Slide

  6. システムリニューアルの背景
    ● ビジネスに対する、開発スピードの低下
    とある事業の今期開発予定だけで
    約600人日(2年半)
    という見積りが!

    View Slide

  7. なぜ時間がかかる? (1)複雑なアーキテクチャ
    ● 複数のサブシステムが存在。データとロジックが重複
    ● 長年の改修でアーキテクチャが限界
    データ重複
    200テーブル・2000カラムのう
    ち、半分くらい重複
    ※DB以外に生Luceneも
    ロジック重複
    複雑な依存関係

    View Slide

  8. なぜ時間がかかる? (1)複雑なアーキテクチャ
    ● 複数のサブシステムが存在。データとロジックが重複
    ● 長年の改修でアーキテクチャが限界
    データ重複
    規模感:
    200テーブル・2000カラム
    ※DB以外に生Luceneも
    ロジック重複
    複雑な依存関係
    かなり簡素化してこれ...(^ω^)

    View Slide

  9. 主要システム
    Ruby on Rails
    なぜ時間がかかる? (2)10年前のシステムが...
    ● ビジネス上優先度の高いシステムはRuby on Railsになっている
    ● しかし、相対的に優先度低いシステムは10年前のJavaシステム
    ○ =>この部分の優先度が高まってきた
    Javaの独自FW
    viewの部分はXSLT!
    10年前の
    Javaシステム
    7年前の
    Javaシステム

    View Slide

  10. 補足:XSLTとは

    View Slide

  11. 補足:XSLTとは

    View Slide

  12. 補足:XSLTとは
    2001〜2002年頃の技術...(^ω^)

    View Slide

  13. つらい_(:3」∠)_

    View Slide

  14. リニューアルだ!

    View Slide

  15. リニューアル後のアーキテクチャ
    重複DBや重複ロジックを廃止
    APIに一元化!

    View Slide

  16. リニューアル後の技術スタック
    控えめに見積もって
    生産性2倍以上!
    WEBアプリ
    APIサーバー
    スマホアプリ

    View Slide

  17. SpringFoxでAPIドキュメント(Swagger)生成
    APIドキュメント
    自動生成

    View Slide

  18. swagger-codegenでgemを自動生成
    Railsアプリ用のgemを自
    動生成

    View Slide

  19. なぜサーバーサイドにKotlin?

    View Slide

  20. 背景
    ● Rubyエンジニア10名くらいのチーム(Javaもそこそこ)
    ● 対象システムの規模感:200テーブル、2000カラムくらい
    ● フロントはゆるく。コアはカッチリやりたいモチベーション
    ○型が欲しい(型一揆)

    View Slide

  21. Kotlin採用理由(私のチームの場合)
    ● 型:あり。(型推論、null safetyも嬉しい)
    ● エムスリーにはたろう (@ngsw_taro) がいる!
    Kotlinスタートブック絶賛発売中!
    エムスリー株式会社
    日本Kotlinユーザーグループ代表
    長澤 太郎
    たろう(@ngsw_taro)
    ● 社内共有ライブラリ:使える(JavaとRuby版が提供されている)
    ● フレームワーク:Spring Boot(問題なし)
    ● 言語の将来性:きっとある(Google I/OでAndroid開発公式言語に)
    ● IDE:IntelliJ IDEA community(無料)
    ● 学習コスト:Rubyエンジニアが親しみやすい構文(後述)

    View Slide

  22. Rubyエンジニアが親しみやすい構文
    少しご紹介

    View Slide

  23. リスト操作
    Ruby Kotlin
    a.map {i -> i * 10}
    a.reduce {sum,n -> sum + n}
    a.groupBy {i -> i % 2}
    a.filter {i -> i % 2 == 0}
    a.map {|i| i * 10}
    a.reduce {|sum,n| sum + n}
    a.group_by {|i| i % 2}
    a.select {|i| i % 2 == 0}

    View Slide

  24. Set, Range
    Ruby Kotlin
    val setA = setOf(1,1,2,3,4)
    val setB = setOf(1,2,3,4,5)
    println(setA + setB)
    (1..10).forEach {println(it)}
    set_a = Set.new([1,1,2,3,4])
    set_b = Set.new([1,2,3,4,5])
    puts set_a + set_b
    (1..10).each {|i| puts i}

    View Slide

  25. if式
    Ruby Kotlin
    val job = if (name == "taro") {
    "エバンジェリスト"
    } else {
    "エンジニア"
    }
    job = if name == "taro"
    "エバンジェリスト"
    else
    "エンジニア"
    end

    View Slide

  26. lambda
    Ruby Kotlin
    fun foo(cb: () -> Unit) {
    println("start")
    cb()
    println("done")
    }
    foo({ println("doing") })
    def foo(cb)
    puts "start"
    cb.call
    puts "done"
    end
    foo(-> { puts "doing" })

    View Slide

  27. 演算子オーバーロード
    Ruby Kotlin
    class Id(val int: Int) {
    operator fun plus(that: Id)
    = Id(this.int + that.int)
    }
    val id1 = Id(1)
    val id2 = Id(2)
    println(id1 + id2)
    class Id
    attr_reader :int
    def initialize(int)
    @int = int
    end
    def +(that)
    Id.new(@int + that.int)
    end
    end
    id1 = Id.new(1)
    id2 = Id.new(2)
    p id1 + id2

    View Slide

  28. 拡張関数
    Ruby Kotlin
    fun Int.p(): Unit
    = println(this)
    1.p()
    class Integer
    def p; puts self; end
    end
    1.p

    View Slide

  29. スクリプト言語っぽく使うことも可能
    list-folders.kts
    import java.io.File
    val folders = File(args[0]).listFiles { file -> file.isDirectory() }
    folders?.forEach { folder -> println(folder) }
    ターミナル
    $ kotlinc -script list-folders.kts .

    View Slide

  30. 親しみやすい!

    View Slide

  31. リニューアルの進捗・所感
    ● 開始3ヶ月で進捗50%くらい
    ● サーバーサイドKotlinは自分のチームでは正解
    ○Kotlinの動的言語と静的言語の特徴がチームにフィット
    ○Kotlin x Spring Bootは問題なく動く
    ○Kotlin自体の学習コストは問題にならなかった
    ● Kotlinかわいい(^ω^)ペロペロ

    View Slide

  32. エムスリー love Kotlin
    ● 別件のリニューアルにもサーバーサイドKotlinを採用予定
    ● 新規Androidアプリ開発はKotlin
    ● 新規Webアプリ開発の際にも積極的にKotlinを検討

    View Slide

  33. WE'RE HIRING!
    Kotlinerの方々、
    一緒にやりましょう!

    View Slide