Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

補足:XSLTとは

Slide 11

Slide 11 text

補足:XSLTとは

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

つらい_(:3」∠)_

Slide 14

Slide 14 text

リニューアルだ!

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

リスト操作 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}

Slide 24

Slide 24 text

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}

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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" })

Slide 27

Slide 27 text

演算子オーバーロード 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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

スクリプト言語っぽく使うことも可能 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 .

Slide 30

Slide 30 text

親しみやすい!

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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