Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
システムリニューアルと サーバーサイドKotlin
Search
Hidenori Maehara
August 24, 2017
Technology
7.3k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
システムリニューアルと サーバーサイドKotlin
Hidenori Maehara
August 24, 2017
More Decks by Hidenori Maehara
See All by Hidenori Maehara
How to Test Server-side Kotlin #kotlinfest
maeharin
11
41k
electron-vueで僕が考えた最強メモアプリ作っている話 / create memo app by electron-vue
maeharin
0
2.5k
10年前のレガシーシステムをVue.js TypeScript Elementでフルリニューアルしている話 #vuejs_meetup6
maeharin
18
45k
10年前のレガシーシステムをサーバーサイドKotlinでフルリニューアルしている話 #jjug_ccc #ccc_g2
maeharin
17
25k
KotlinとSpring BootとDoma2でAPIサーバーを作る #m3kt
maeharin
5
6.7k
Other Decks in Technology
See All in Technology
複数プロダクト組織のAIネイティブ化における戦略 / AICon2026_kude
rakus_dev
0
110
AIとハーネスで育てるトランスコンパイラ / 20260722 Yasushi Katayama
shift_evolve
PRO
0
110
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
250
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
490
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
290
企業でAWS Organizationsを動かすための組織設計の考え方
nrinetcom
PRO
1
110
型は壁、Rustでもバグを直すな、表現できなくせよ
nwiizo
14
2.1k
CSに"SLO"は要らない、経営層に"99.9%"は伝わらない - SREを全社に"翻訳"する3原則
cscengineer
PRO
1
5.2k
AI時代のYAGNI:「爆速で無駄になった機能」からの学び / 20260720 Naoki Takahashi
shift_evolve
PRO
3
350
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
3
300
OPENLOGI Company Profile for engineer
hr01
1
74k
Amplify Gen2でbackend.tsにCDKを定義する/しない事によるCDKの挙動の違いとユースケース
smt7174
1
430
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
41
2.6k
Paper Plane (Part 1)
katiecoart
PRO
1
9.7k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
420
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
340
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
660
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.4k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
250
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
250
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Transcript
システムリニューアルと サーバーサイドKotlin 〜Rubyエンジニア meets Kotlin〜 エムスリー株式会社 前原 @maeharin
自己紹介 • 前原 秀徳 • @maeharin(まえはりん) • エムスリー株式会社 エンジニア •
チームリーダー、グループ会社取締役等を歴任 • 自慢:ブログ記事が、はてぶ1200 ◦http://maeharin.hatenablog.com/
エムスリーって何の会社? ・医療に関するWebサービスを多数展開 ・全世界で約400万人の医師会員 ・日本で約25万人の医師会員
今、私たちは10年に一度の システムリニューアルをしてます!
システムリニューアルの対象システム 医師のキャリア支援事業 (年間売上、数十億規模)
システムリニューアルの背景 • ビジネスに対する、開発スピードの低下 とある事業の今期開発予定だけで 約600人日(2年半) という見積りが!
なぜ時間がかかる? (1)複雑なアーキテクチャ • 複数のサブシステムが存在。データとロジックが重複 • 長年の改修でアーキテクチャが限界 データ重複 200テーブル・2000カラムのう ち、半分くらい重複 ※DB以外に生Luceneも
ロジック重複 複雑な依存関係
なぜ時間がかかる? (1)複雑なアーキテクチャ • 複数のサブシステムが存在。データとロジックが重複 • 長年の改修でアーキテクチャが限界 データ重複 規模感: 200テーブル・2000カラム ※DB以外に生Luceneも
ロジック重複 複雑な依存関係 かなり簡素化してこれ...(^ω^)
主要システム Ruby on Rails なぜ時間がかかる? (2)10年前のシステムが... • ビジネス上優先度の高いシステムはRuby on Railsになっている
• しかし、相対的に優先度低いシステムは10年前のJavaシステム ◦ =>この部分の優先度が高まってきた Javaの独自FW viewの部分はXSLT! 10年前の Javaシステム 7年前の Javaシステム
補足:XSLTとは
補足:XSLTとは
補足:XSLTとは 2001〜2002年頃の技術...(^ω^)
つらい_(:3」∠)_
リニューアルだ!
リニューアル後のアーキテクチャ 重複DBや重複ロジックを廃止 APIに一元化!
リニューアル後の技術スタック 控えめに見積もって 生産性2倍以上! WEBアプリ APIサーバー スマホアプリ
SpringFoxでAPIドキュメント(Swagger)生成 APIドキュメント 自動生成
swagger-codegenでgemを自動生成 Railsアプリ用のgemを自 動生成
なぜサーバーサイドにKotlin?
背景 • Rubyエンジニア10名くらいのチーム(Javaもそこそこ) • 対象システムの規模感:200テーブル、2000カラムくらい • フロントはゆるく。コアはカッチリやりたいモチベーション ◦型が欲しい(型一揆)
Kotlin採用理由(私のチームの場合) • 型:あり。(型推論、null safetyも嬉しい) • エムスリーにはたろう (@ngsw_taro) がいる! Kotlinスタートブック絶賛発売中! エムスリー株式会社
日本Kotlinユーザーグループ代表 長澤 太郎 たろう(@ngsw_taro) • 社内共有ライブラリ:使える(JavaとRuby版が提供されている) • フレームワーク:Spring Boot(問題なし) • 言語の将来性:きっとある(Google I/OでAndroid開発公式言語に) • IDE:IntelliJ IDEA community(無料) • 学習コスト:Rubyエンジニアが親しみやすい構文(後述)
Rubyエンジニアが親しみやすい構文 少しご紹介
リスト操作 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}
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}
if式 Ruby Kotlin val job = if (name == "taro")
{ "エバンジェリスト" } else { "エンジニア" } job = if name == "taro" "エバンジェリスト" else "エンジニア" end
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" })
演算子オーバーロード 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
拡張関数 Ruby Kotlin fun Int.p(): Unit = println(this) 1.p() class
Integer def p; puts self; end end 1.p
スクリプト言語っぽく使うことも可能 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 .
親しみやすい!
リニューアルの進捗・所感 • 開始3ヶ月で進捗50%くらい • サーバーサイドKotlinは自分のチームでは正解 ◦Kotlinの動的言語と静的言語の特徴がチームにフィット ◦Kotlin x Spring Bootは問題なく動く
◦Kotlin自体の学習コストは問題にならなかった • Kotlinかわいい(^ω^)ペロペロ
エムスリー love Kotlin • 別件のリニューアルにもサーバーサイドKotlinを採用予定 • 新規Androidアプリ開発はKotlin • 新規Webアプリ開発の際にも積極的にKotlinを検討
WE'RE HIRING! Kotlinerの方々、 一緒にやりましょう!