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
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Soichiro Yoshimura
September 27, 2023
Technology
290
0
Share
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
http://event.shoeisha.jp/devsumi/20140213/session/407
以上の発表の発表内容となります。
----
slideshareより移行
Soichiro Yoshimura
September 27, 2023
More Decks by Soichiro Yoshimura
See All by Soichiro Yoshimura
プログラミング教育する大学、ZEN大学
sifue
1
690
いちソフトウェアエンジニアが プログラミング教育をはじめるのに読んで良かった本
sifue
0
250
チームの目標への柔軟な対応
sifue
0
140
並行処理初心者のためのAkka入門
sifue
0
56
2013年末カウントダウン番組におけるAkamai活用事例
sifue
0
130
ソフトウェア設計のすすめ
sifue
0
120
失敗の話
sifue
0
120
6000名以上の高校生に行われた VR教育の実践と課題
sifue
0
6.4k
N高等学校でのSlackの活用
sifue
0
1.3k
Other Decks in Technology
See All in Technology
「QA=テスト」「シフトレフト=スクラムイベントの参加者の一員」の呪縛を解く。アジャイルな開発を止めないために、10Xで挑んだ「右側のしわ寄せ」解消記 #scrumniigata
nihonbuson
PRO
5
1k
React 19×Rustツール 進化の「ズレ」を設計で埋める
remrem0090
1
110
Databricks 月刊サービスアップデートまとめ 2026年04月号
tyosi1212
0
110
freeeで運用しているAIQAについて
qatonchan
0
540
2026年春のAgentCoreアプデ 細かいやつ全部まとめ
minorun365
3
220
Vision Banana: Image Generators are Generalist Vision Learners
kzykmyzw
0
360
毎日の作業を Claude Code 経由にしたら、 ノウハウがコードになった
kossykinto
1
1.3k
試作とデモンストレーション / Prototyping and Demonstrations
ks91
PRO
0
200
そのSLO 99.9%、本当に必要ですか? 〜優先度付きSLOによる責任共有の設計思想〜 / Is that 99.9% SLO really necessary? Design philosophy of shared responsibility through prioritized SLOs
vtryo
0
580
Swift Sequence の便利 API 再発見
treastrain
1
260
『生成AI時代のクレデンシャルとパーミッション設計 — Claude Code を起点に』の執筆企画
takuros
3
2.3k
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
260
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
780
Design in an AI World
tapps
1
210
Making Projects Easy
brettharned
120
6.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
120
Embracing the Ebb and Flow
colly
88
5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
350
BBQ
matthewcrist
89
10k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
220
Into the Great Unknown - MozCon
thekraken
41
2.5k
Everyday Curiosity
cassininazir
0
200
Transcript
Play2/ScalaͰυϝΠϯۦಈઃܭΛར༻ͨ͠ େنWebΞϓϦέʔγϣϯͷ εΫϥϜ։ൃͷצॴ גࣜձࣾυϫϯΰ χίχίੜ์ૹ ٢ଜ ૯Ұ (@sifue)
٢ଜ ૯Ұ (@sifue) • ݩʑɺۀͷۀվֵΛϝ Πϯͱ͢ΔγεςϜίϯαϧ ςΟϯάͰಇ͘SE • झຯήʔϜ࣮گ (࠷ۙFF14)
ͱϓϩάϥϛϯά • ͖ͳݴޠJava • 20124݄ɺझຯͷήʔϜ࣮گ ήʔϜ༻πʔϧ։ൃ͕ߴͯ͡ υϫϯΰ
ࠓχίχίੜ์ૹΛScalaͰॻ͖͍ͯ͠Δ
ͦͦͳͥॻ͖͞Ͷ ͳΒͳ͔ͬͨͷ͔ʁ
201212݄
ίʔυͷٕज़తෛ࠴ • PHPͷίʔυߦ 300ສߦʹର͠ • ίϐʔˍϖʔετ1ສϲॴ • જࡏతෆ۩߹(PMDܯࠂ)͕ 4500ϲॴ •
॥తෳࡶ600ϝιου͕͍͘ ͭଘࡏ • IDEαϙʔτ͕Ͱ͖ͳ͍จࣈྻͷϦ ϑϨΫγϣϯͷଟ͍ɺgrepෆೳͳ PHPͷίʔυ
॥తෳࡶ600ϝιου ྫ͑ΔͳΒऴ൫ͷδΣϯΨ • ਓྨͷӳΛ݁ूͯ͠ෆ۩ ߹ΛೖΕͣʹෆ۩߹վम͢Δ ͜ͱ͕ࠔͳϨϕϧ • ࠓղফ͞Ε͍ͯͳ͍ • ෆ۩߹मਖ਼Λ͢ΔΑΓͦ
ΕʹΑͬͯൃݱ͢Δෆ۩߹ͷ ํ͕ଟ͘ͳͬͯ͠·͏ͱ͍ ͏ɺ·͞ʹෛ࠴ ॥తෳ ࡶ ෳࡶ͞ͷঢ়ଶ όάࠞೖ֬ 10ҎԼ 30ҎԼ 50ҎԼ 75Ҏ্ ඇৗʹྑ͍ߏ 25.00% ߏతͳϦεΫ ͋Γ 40.00% ςετෆՄೳ 75.00% ͍͔ͳΔมߋ ޡमਖ਼ΛੜΉ 98.00%
ͳͥ͜ͷΑ͏ͳࣄʹ ͳͬͯ͠·ͬͨͷ͔ʁ • اըͷཁ݅ͱక༏ઌͰɺιϑτΣΞͷ෦࣭ ϓϩηε࣭Λૄ͔ʹ͢Δ։ൃମ੍ • ଟ͘ͷਓһ͕Ճ͞Ε͍͕ͯͨɺࠜຊमਖ਼ΛڪΕΔ༨ ΓύονϫʔΫతͳमਖ਼͕ଟ࣮͘ࢪ͞Εͨ • ݁Ռɺίϐϖ͔Γͷ1ສߦͷΫϥε4000ߦͷϝ
ιου͕ੜ·Εɺ300ສߦͷ͍ͨΔॴʹ҉ͷӨڹൣ ғΛ࣋ͭίʔυϕʔεʹͳͬͨ
͜ͷΑ͏ͳঢ়گʹରͯ͠ ଧͪग़ͨ͠ۓٸରԠ
1. ֤ਓͷλεΫΛݟ͑Δঢ়گʹͯ͠ɺޮΑ͘Ϧιʔ εΛͰ͖ΔΑ͏ʹ͢Δ 2. ͍Βͳ͍ػೳΛͬͯอकίετΛԼ͛Δ 3. ΧʔϘʔΠݸਓ։ൃ͔ΒΞδϟΠϧ։ൃମ੍Ҡߦ ͯ͠νʔϜͷརΛ׆͔ͤΔΑ͏ʹ͢Δ 4. ظҊ݅ɺಥൃରԠɺվળ׆ಈͷ3ͭͷνʔϜʹ
ׂ͠ɺ҆ఆͯ͠վળ׆ಈΛߦ͑ΔΑ͏ʹ͢Δ
3ϲ݄ؒͷରԠͷ݁Ռ 1. େنͳোͱٳग़͕ࣾݮͬͨ 2. ίʔυߦͷ૿Ճ͕ࢭ·ͬͨ 3. ϝϯόʔ͕ٳΜͰνʔϜ͕ճΔΑ͏ʹͳͬͨ 4. ৬͕ݮͬͨ
ͱ͍͑ɺطʹऴ൫ͷδΣϯΨʹ ݱঢ়ҡ͕࣋ਫ਼Ұഋͩͬͨ
ͦͯ͠ɺχίੜΛॻ͖͢ χίੜ2ϓϩδΣΫτ͕ൃ
తܧଓతͳେن৴ʹ͑ΒΕΔΑ ͏ʹ͢ΔͨΊҎԼͷੑೳΛ୲อ͢Δ͜ͱ 1. εέʔϥϏϦςΟ 2. ҆ఆੑɾϑΥʔϧττϨϥϯτੑ 3. อकੑͱ֦ுੑ 4. ύϑΥʔϚϯε
Ҏ্ͷॱ൪ͷ༏ઌॱҐͰඪΛઃఆ͢Δ͜ͱͱͳͬͨɻࠓͷઃܭͰ αʔόʔΛ͢ͷʹେ͖ͳγεςϜมߋίετ͕ඞཁͰ͋Γɺࠓ ޙ༰қʹεέʔϧΞτͰ͖Δ͜ͱʹओ؟Λ͓͍ͨɻ
20134݄ʹ4ਓͰϓϩδΣΫτελʔτ ࠨ͕୲෦ͷླܓҰ͞Μɺӈ4ਓ͕ϝϯόʔ
εϞʔϧελʔτ/εϞʔϧϦϦʔε ϓϩτλΠϓ։ൃ͔ྃΒ࣮ࡍͷϦϦʔε·ͰΛ6ϲ݄Ҏʹઃఆ͠ɺཁ݅ΛߜΔ ͨΊʹɺཁ݅ͷগͳ͍ࠂܕαΠζͷϓϨΠϠʔͱͯ͠։ൃ͢Δ͜ͱʹͨ͠
ϓϩτλΠϓ࡞Λ͠ͳ͕Βৗʹͦ͜·Ͱ ͷՌΛ̎िؒʹҰγϣʔέʔεͰհ • ৗʹશͯͷؔऀ͕ϓϩδΣΫτͷ͜͜·ͰͷՌΛ֬ ೝͰ͖ΔγϣʔέʔεڥΛ࡞ɻ্ͷεϥΠυͨͩ ͷֆ͕ͩɺ࣮ࡍʹ6݄ʹಈ͘ͷΛͦ͜Ͱհͨ͠ɻ
݁Ռ10݄தʹແࣄɺ ࠂܕϓϨΠϠʔͷϦϦʔεޭ • ه೦͖͢࠷ॳͷ൪νϯΞφΰͰͨ͠
࠷ऴతʹϝϯόʔ13໊·Ͱ૿͑ɺ 12݄ͷಛผ൪Λੜ2Ͱ࣮ࢪ • େنͷଓ͕ఆ͞Εͨͷখྛࢠ͞ΜͷΧϯτμϯ൪Ͱ ੜ2ͷϓϨΠϠʔΛར༻ͨ͠์ૹΛ࣮ࢪɺແࣄޭʹऴΘΔ
ࠓͷ͓͔͜͜Βɺ ͜ͷϓϩδΣΫτͷཪଆΛհ͠·͢ɻ
Play2/ScalaͰͷ େنWebΞϓϦέʔγϣϯ։ൃ
ͳͥScalaΛબͨ͠ͷ͔ʁ
• Java, Scala, PHP, Ruby͔Βͷબ • อकੑͷ؍͔Β੩తܕ͚ͷݴޠΛ͍͔ͨͬͨ • ύϑΥʔϚϯεͷݒ೦ϓϩτλΠϓ࡞ޙʹஅ͢ Δ͜ͱʹ
• ͍ϓϩτλΠϓΛ࡞ͬͨϝϯόʔશһJava/Ruby/ؔ ܕݴޠͳͲͷܦݧ͕͋ΓɺScalaʹ߅ͳ͔ͬͨ • ͨͩ͠ɺ్த͔ΒՃΘͬͨPHP͔ͬͯ͜͠ͳ͔ͬͨϝ ϯόʔ͕ScalaΛΔʹ͋ͨͬͯਏ͍໘͕͋ͬͨ
PHP͔ͬͯ͜͠ͳ͔ͬͨϝϯόʔ͕ ScalaΛΔʹ͋ͨͬͯωοΫʹͳΔࣝ 1. ΞϧΰϦζϜͱσʔλߏ 2. ७ਮؔܕϓϩάϥϛϯά 3. valͱvar 4. implicit
5. ฒߦϓϩάϥϛϯάͷࣝ 6. JVMͱJavaϥΠϒϥϦͷΈ
1.ΞϧΰϦζϜͱσʔλߏ • PHPຊʹૉΒ͍͠ݴޠͰɺجຊશͯͷίϨΫγϣϯΛ arrayͰѻ͏ͨΊɺσʔλߏʹৄ͍͠ඞཁ͕ͳ͔ͬͨ • ࠓ·ͰPHPͷarray͔͠Θͳ͔ͬͨਓʹɺScalaͰྻͱ࿈ ݁ϦετͱπϦʔηοτͱϋογϡϚοϓ…·ͨ͜ΕΒͷෆ มɺՄมɺฒߦίϨΫγϣϯΛ͍͚ͤ͞Δͷ͍͠ • ରࡦͱͯ͠ϓϩάϥϛϯάίϯςετνϟϨϯδϒοΫΛར
༻ͯ͠ษڧձΛ։࠵ɻͰ20໊ʹ࣮ࢪͨ͠ɻ
ϓϩάϥϛϯάίϯςετνϟϨϯ δϒοΫॳڃฤͷษڧձ • ୈ1ճ ࠶ؼؔͱਂ͞༏ઌ୳ࡧ • ୈ2ճ ελοΫͱΩϡʔͱ෯༏ઌ୳ࡧ • ୈ3ճ
ᩦཉ๏ • ୈ4ճ ಈతܭը๏ͱϝϞԽ • ୈ5ճ ϓϥΠΦϦςΟʔΩϡʔ • ୈ6ճ Union-Find • ୈ7ճ μΠΫετϥ๏
2. ७ਮؔܕϓϩάϥϛϯά • ແཧʹద༻͠ͳ͍ • ίʔυࣗମ΄ͱΜͲ͜ͷελΠϧͰॻ͔Ε͓ͯΒͣɺ ϕλʔJavaͱͯ͠ར༻͍ͯ͠Δଆ໘͕ڧ͍ • ͏ʹ؆ܿʹ͔͚Δ͜ͱ͋Γศར
3. valͱvar • valΛపఈ • ՄมίϨΫγϣϯجຊతʹΘͳ͍ • పఈ͔ͨ͠ΒͱݴͬͯͦΜͳʹࠔΔ͜ͱͳ͍ • αʔόʔͰϝϞϦϦʔΫ͕ൃੜͤͣૉΒ͍͠
4. implicit • ϥΠϒϥϦΛআ͍ͯۃྗར༻͠ͳ͍ • ಛʹimplicit converterΛΨϦΨϦͬͨ෦͕ෛ࠴ʹͳΓ ͍͢ • ͻͱ͙ͭΒ͍ͳΒྑ͍͕3~4ݸಡΈग़ͨ͠Γɺείʔϓ
͝ͱʹҧ͏ίϯόʔλʔݺͼ࢝ΊΔͱେม… • ͳهड़ݮΒͤͯྑ͍͕ɺଟ͘ͷ͕implicitͩͱpull requestͰͷίʔυϨϏϡʔͰΘ͔Γʹ͘͘ͳΔ
5. ฒߦϓϩάϥϛϯάͷࣝ • ActorͷτϥϒϧղܾʹͲ͏ͯ͠ඞཁʹͳΔ • ࠓ՝ͰɺࠓޙɺJavaฒߦॲཧϓϩάϥϛ ϯάͷษڧձΛ։࠵͍ͨ͠ • ࣮ࡍActorΛ७ਮͳࢄίϯϐϡʔςΟϯ άͷϑϨʔϜϫʔΫͱͯ͠Θͣɺϫʔ
ΧʔεϨουύλʔϯΛ͏ϥΠϒϥϦͱ͠ ͍ͯͬͯΔଆ໘͕ڧ͍
6. JVMͱJavaϥΠϒϥϦͷΈ • ۀͷதͰগֶͣͭ͠OK • νʔϜʹ1ਓJavaͷΤΩεύʔτ͕͍Ε͍࣋ͬͯͳ ͯ͘େৎ
ϓϩτλΠϓ։ൃͰࡧͨ͠ χίੜ2ͷΞʔΩςΫνϟ
ΠϯϑϥϝϯόʔʹσΠϦʔελϯ υΞοϓʹࢀՃͯ͠Βͬͨ • Γίϛϡχέʔγϣϯ͕ॏཁ • ࠷ॳ͔ΒΠϯϑϥͷ੍ͳͲΛࡉ͔֬͘ೝ͍ͯͨ͘͠Ίʹ ίϛϡχέʔγϣϯίετΛͬͨ • υϫϯΰͰΠϯϑϥӡ༻ͱΞϓϦ։ൃͰ෦ॺ͕͔Εͯ ͓Γݱࡏ੮Λۙ͘ʹ͢Δͷӡ༻͞Ε͍ͯΔ
• σεΫϨϏϡʔΛ࣮ࢪ͢ΔࡍʹؾܰʹΠϯϑϥϝϯόʔ ݺͯॿ͔͍ͬͯΔ
ΫϥυͰͳ͘ΦϯϓϨϛεͱ͍͏બ • IOύϑΥʔϚϯε • අ༻ • ࣾํͱͯ͠ • ͕ͩੈͷதͷྲྀΕతʹWebͷߏஙʹΫϥυΛར༻ͨ͠Γ͢ ΔΑ͏ʹͳ͓ͬͯΓɺσʔληϯλʔେنWebͷΠϯϑ
ϥߏஙʹؔ͢Δϊϋ͕ϨΞʹͳΓɺਓࡐҭɺਓࡐ֬อ ͕՝ʹͳ͍ͬͯΔ
DBͷਫฏׂͱਨׂ • DBʹMySQLΛར༻ • ਫฏׂ • 64bitͷIDͷதʹγϟʔυID(12bit)σʔλλΠϓID(10bit)ͳ ͲΛΈࠐΜͰɺDBͷγϟʔσΟϯά͕༰қʹͳΔΑ͏ʹ͠ ͍ͯΔ •
InstagramͷIDઃܭɺPinterestͷIDઃܭɺTwitterͷsnowflake ͳͲΛࢀߟʹͨ͠ • ਨׂɺαΠζ͕খ͘͞γϟʔσΟϯά͕ෆཁͳڞ༗DBʹ ͷΈద༻͍ͯ͠Δ
̎ͭͷΩϟογϡ தԝredisͱϩʔΧϧredis • ΩϟογϡͰར༻͢ΔϩʔΧϧredis܈ͱதԝͰෳͷwebΠϯε λϯε͔Βར༻͢Δ͍σʔλετΞͱͯ͠ͷதԝredis܈ͱͷ ͍͚ɻͨͩதԝredisσʔλ࠷খԽͷͨΊ͍ͯ͠Δɻ web redis redis redis
redis twemproxy redis
Խํ๏ • MySQLMHAͰԽ • ॳɺGTIDΛ༻͍ͨํ๏ࡧ͕ͨ͠ϑΣΠϧΦʔόʔͷμ ϯλΠϜ͕MHAͷํ͕͔ͬͨͨΊ • ӡ༻ͱͯ͠ɺVIPΛར༻ͯ͠Γସ͑ͯରԠ • redisSentinelͰԽ
• தԝredisͷΈ • Ϛελʔঢ֨ͷࡍʹશͯͷσʔλͷίϐʔ͕ΔͷͰμϯ λΠϜΛগͳ͘͢ΔͨΊʹσʔλΛখ͘͢͞Δ͕ඞཁ
֎෦ڥ͔ΒෛՙΛ͢Δ ΞϓϦέʔγϣϯߏ web༻ websocket༻ όον༻ ཧπʔϧ༻ ֎෦Ϧιʔεதܧ༻ σʔλ ετΞ ΫϥΠ
Ξϯτ ৴ܥ ϝοηʔδαʔόʔ • ߴෛՙ࣌ɺweb͔websokcet͕ඇৗʹॏ͘ͳΔͨΊͦͷଞ ͷػೳΛͰ͖Δ͚ͩಀ͢ߏͱͳ͍ͬͯΔ
websocketΞϓϦ̍ΠϯελϯεͰɺ 5ສϢʔβʔͷࢹௌཧΛ࣮ݱ • nginxͱNettyαʔόʔͰඇಉظIOΛར༻͢Δ͜ͱͰ࠷େଓ͕վળ • REST API͔ΒWebsocketΛར༻͢Δ͜ͱʹΑͬͯଓίετ͕ݮ • ݁ՌɺCPUόΠϯυͷ෦Ͱطଘͷੜ์ૹͷ4ഒͷޮΛ࣮ݱ •
ύϑΥʔϚϯεଌఆํ๏ • gatling͕ૉΒ͍͠ετϨεπʔϧɺϨϙʔτ͕៉ྷ • ͨͩ͠websocket෦ϓϥάΠϯͷύϑΥʔϚϯε͕ग़ͣɺ݁ہ node.jsͰετϨεπʔϧΛࣗ࡞ɻnode.jsૉΒ͍͠ɻ
υϝΠϯۦಈઃܭͷಋೖ
χίੜ2ͰDDDΛ͢Δʹ͋ͨͬͯ ࠷ݶపఈͨ͜͠ͱ 1. ϢϏΩλεݴޠ 2. ϞσϧΛͬͯٞ͢Δͱ͍͏͜ͱ 3. ϨΠϠʔυΞʔΩςΫνϟ 4. ਖ਼͍͠ϞδϡʔϧԽΛߦ͍ɺมߋ࣌ʹಡ·
ͳ͖Ό͍͚ͳ͍ίʔυΛݮΒ͢ 1. ίΞͷৠཹ 2. ൚༻αϒυϝΠϯͷ 5. ΤϯςΟςΟͱΦϒδΣΫτͷ͍͚ UI ΞϓϦέʔγϣϯ υϝΠϯ Πϯϑϥ ґଘํ ґଘํ ґଘํ ਤ: ϨΠϠʔυΞʔΩςΫνϟ ※ DDD: Domain-Driven Design
Play2/ScalaDDDΛ࣮ફ͢Δʹ ͱͯྑ͍ϑϨʔϜϫʔΫ • CoC͕͖ͭ͘ͳ͖͘উखϑΥϧμ͕۷ΕΔ • ϚϧνϓϩδΣΫτػೳͰαϒϞδϡʔϧͷґଘؔΛ࡞ΕɺϨΠϠʔ υΞʔΩςΫνϟͷڧ੍Ͱ͖Δ • υϝΠϯɺΠϯϑϥplayʹґଘ͠ͳ͍ͨͩͷjar •
case class͕ΤϯςΟςΟͱΦϒδΣΫτͷ࡞ͷίετΛԼ͛Δ • ྫ͑ɺΠϯϑϥORMͷϚοϐϯάΫϥεͱυϝΠϯͷΤϯςΟ ςΟΛ͚Δ͜ͱͳͲ͕ۤʹͳΒͳ͍ɻ • play2ΛࣺͯΒΕΔΑ͏ʹ։ൃ͢Δ͜ͱ͕Մೳɻ ※ CoC:ʮઃఆΑΓنʯʢCoC:Convention over Configurationʣ
ͱݴ͑ɺυϝΠϯۦಈઃܭ͕ࣗ ಋೖϋʔυϧ͕ߴ͍
ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ʹೖΔલʹϝϯόʔʹಡΜͰΒ͍͍ͨຊ
ଟ͍͠ɺͲΕஈ͕ߴ͍ʂ खʹೖΓʹ͍͘ͷ͋Δ...
ํ͕ͳ͍͔ΒࣾͰߨशձ
ͦΜͳ࣌ͷڧ͍ຯํ
Youtubeʹ্͕͍ͬͯΔDevLoveͰ ݩ͞Μ͕DDDΛղઆͨ࣌͠ͷϜʔϏʔ • ࣾͰ͜ΕΛݟΔ্өձ͕3։͔ΕΔ΄ͲૉΒ͍͠ө૾ (42) • http://youtu.be/FNEfk-dlIKU
͕ͩϢϏΩλεݴޠͷৢʹɺʑϞσϧ֓ ೦ʹ͍ͭͯاըɺΠϯϑϥΛަ͑ͯͷ͕ٞඞཁ • ͍ۙ࠲੮ͱࡶஊ • ձٞମॏཁ • σΠϦʔελϯυΞοϓ • γϣʔέʔε
• ʑࡉ͔֬͘ೝɺٞ
DDDΛ࣮ફ͢ΔՁͱ
DDDͰͳ͍ίʔυͷྫ • StreamModel.class.phpͷ͍ٞ͠... (1ສߦ) ൪Ͱ͋Γ ൪Λ࡞ΔͷͰ͋Γ ൪Λίϐʔͨ͠Γߋ৽ͨ͠ΓόοΫΞοϓΛͱͬͨΓ͢ΔͷͰ͋Γ ετϦʔϜͰ͋Γ ੜ์ૹͰ͋Γ λΠϜγϑτͰ͋Γ
λΠϜγϑτ༧ͷϦετΛݟΕΔͷͰ͋Γ ϝοηʔδαʔόʔΛׂΓͯΔͷͰ͋Γ ଟࠃ੶ԽΛ͢ΔͷͰ͋Γ Ωϟογϡͱͷ௨৴Λ͢ΔͷͰ͋Γ DBͱͷ௨৴Λ͢ΔͷͰ͋Γ
ਆΫϥεʹ͍ͭͯͷ͍ٞ͠ It’s difficult to talk about a “God class”. ?
ϢϏΩλεݴޠ͕ಋೖ͞ΕΔͱɺ ෳͷνʔϜͰڞ௨ͷݴޠΛͬͯձ͕Ͱ͖Δ • ετʔϦʔͷ༰ʹ͍ͭͯɺνʔϜɺνʔϜؔऀͱͷ͕ٞ͘͢͠ͳΔ • ݁Ռͱͯ͠ɺγεςϜͷ࡞Γʹ͍ͭͯͷνʔϜશମͱཧղ͕ߴ·Δ • Programͱ͍͏Ϋϥε൪Ͱ͋Δ͚ͩͰ͋Δ • Streamͱ͍͏Ϋϥε͕ετϦʔϜͰ͋Δ͚ͩͰ͋Δ
• Liveͱ͍͏Ϋϥε͕ੜ์ૹͰ͋Δ͚ͩͰ͋Δ • ੜ์ૹ͕͏·͘࡞Εͳ͍ͱ͔ɺετϦʔϜׂ͕ΓͯΒΕͳ͍ͱ͔ͦΕ͕ ίʔυ্ͷͲ͜ͷͳ͔͠Θ͔Γ͍͢ • ແϢϏΩλεݴޠ͕Ͱ͖Δࡍʹɺ·ͨIRCͰ͔ͬ͠Γ૬ஊ͢Δඞཁ ͋Γ
ίʔυͱීஈཁ݅ʹ͍͍ͭͯͯ͠Δݴޠͷ ဃ͕গͳ͘ͳΓɺϦϑΝΫλੑೳ͕͕͋Δ • ͨͩ͠ɺυϝΠϯ͚ͩ • υϝΠϯͷϏδωεϩδοΫͷूʹର͢Δҙ͕ࣝࠜ͘ • ݁ՌɺϏδωεϩδοΫͷมߋͷϦϑΝΫλʹڧ͘ͳΔ • Կ͔ੜ์ૹͷ৴Πϯϑϥϝοηʔδαʔόʔͷར༻ͷཁ͕݅มΘ
ΔʹϦϑΝΫλϦϯάΛߦ͕ͬͨɺͳ͘ߦ͑ͨ • աڈ͜͏͍͏͜ͱΛΖ͏ͱͨ͠ࡍɺ͍Ζ͍ΖͳॴʹϏδωεϩ δοΫ͕ඈͼՐ͍ͯͯ͠ɺେࣄɺσάϨଟ͔ͬͨ • ͨͩɺ͏͔ͬΓ͢ΔͱϏδωεϩδοΫ͕υϝΠϯ͔Βಀ͛ͯɺΞϓϦ έʔγϣϯΠϯϑϥʹߦ͖͕ͪͳͷͰɺίʔυϨϏϡʔɺઃܭϨ ϏϡʔͰͷೖ೦ͳࢹͱܧଓతͳϦϑΝΫλϦϯά͕ඞཁͰ͋Δ
ΞϓϦέʔγϣϯͷӡ༻ͱ νʔϜ։ൃ
CapistranoʹΑΔσϓϩΠ • PlayͷઃఆͷςϯϓϨʔτԽΛerbͱymlͰ࣮ݱ • ͍ΖΜͳΠϯελϯεʹಉ͜͡ͱΛॻ͘ઃఆʹ༗ޮ • ઃఆϓϩύςΟ͕ྻʹରԠ͍ͯ͠ͳ͍͕ɺΛಈత ʹม͑Δඞཁ͕͋Δઃఆʹ༗ޮ • capistranoͷॲཧͷू
• minaʹ͠Α͏ͱ͕ͨ͠ࢄσϓϩΠػೳ͕ͳͯ͘அ೦ • ଞʹྑ͍͕͋ΕҠߦ͍ͨ͠ͱߟ͍͑ͯΔ
ίʔυنͱͯ͠ͷ Scala Guide/ Effective Scala • Effective ScalaΛकΒͤΔScalastyleΛ࡞ͬͯgithubͰެ։த • https://github.com/dwango/scalastyle
• CPD (Copy and Paste Detector)ʹΑΔίϐϖνΣοΫ࣮ࢪ
։ൃڥ IntelliJ IDEA Ultimateʹ౷Ұ • ࡉ͔͍࡞Γ͜Έ҆ఆੑ͕ྑ͍ • ձ͕ࣾνʔϜϝϯόʔʹಋೖ • ཧ্ͲΜͳιϑτΣΞͰϝϞாͰ࡞ΕΔ͕…
• ։ൃڥΛ౷Ұ͢Δ͜ͱͰɺڥߏஙυΩϡϝϯτͳͲΛߴ ࣭ʹͰ͖Δྑ͕͋͞Δ • vimmerʹධͳideavim͕͋Δ
JenkinsͷCI/CDӡ༻ • ϝΠϯδϣϒɺϏϧυɺςετɺϝτϦΫεɺύοέʔ δ࡞ɺࣗಈσϓϩΠΛ͍ͯ͠Δ • Github:eʹ͓͚ΔϓϧϦΫΤετݩͷϒϥϯνͷࣗಈ νΣοΫ͍ͯ͠Δɻࣦഊͯ͠Δͱܯࠂ͕…
CI/CDͷՌ • ݱࡏ5ສߦͰɺScala ॏෳίʔυ0ɺscalastyleܯࠂ0ɺࣗ ಈςετͰͷߦϕʔείʔυΧόϨοδ52% • ͱ͍͑ͲɺΛৗʹΑ͘อͪଓ͚ΔʹϦʔμʔ CIͷϝϯςφʔͷܒ׆ಈ͕ॏཁ • ݕূظؒͷେ෯ͳݮ
• ݕূظؒʹࣗಈϏϧυɺࣗಈςετɺࣗಈσϓϩΠͷ ݮޮՌ͕Θ͔Γ͍͢ɻϏϧυ৬ਓͱσϓϩΠ৬ਓΛͳ ͤ͘Δ͜ͱେ͖͍ɻ
Play2/Scala։ൃͷ 1. sbt͕͗͢Δ • proxyΛ࡞ͬͨΓɺྑ͍ϚγϯΛ͏͙Β͍͔͠ͳ͍ 2. Play2ͷscalaςϯϓϨʔτ͕ɺίϯύΠϧ͘ɺจ๏͕σβΠφʔ ʹ͘͞͠ͳ͍༷ • GroovyςϯϓϨʔτͰ࡞ɻ
github/dwangoͰϑΥʔΫͨ͠ ͷΛެ։த 3. ςετͰࠔΔobjectͱtraitͱؔҾ • specs2ͷmockitoͷ੍ɻobjectͷϞοΫ࡞Εͳ͍ɺtraitmixin ͕ඞཁɺδΣωϦΫεύϥϝʔλʔ͕͍ͨؔҾͷϝιου Λ֦ுͰ͖ͳ͍ɻ
εΫϥϜͷಋೖ
ࣗͷΥʔλʔϑΥʔϧ։ൃͱΞδϟ Πϧ։ൃͷϓϩδΣΫτϚωʔδϟܦݧ 1. աڈ4ͷϑΥʔλʔϑΥʔϧ։ൃͱɺେࣦഊͷܦݧ • ཁٻ͕มߋ͞Εͯ͠·͏ͱࠈ • ෆ֬ఆཁૉʹରԠ͢ΔͨΊͷόοϑΝॏཁ • ࠷ޙͷ͠Θد࣭ͤʹ
2. ཁ͕݅֬ఆͰ͖ͳ͍ɺ·ͨɺཁٻͷ༏ઌॱҐ͕ʑมΘΔ߹ • ΞδϟΠϧͱεΫϥϜͷߟ͕͑ྑ͍ • ʑมΘΔνʔϜͷඪͷॊೈͳରԠ͕ඞཁͳWeb։ൃ
ΞδϟΠϧಋೖ·Ͱͷେม͞ • ΈΜͳΨϯτνϟʔτ͕Θ͔Γ͖ͯ͘͢ɺͱ͍͏ • ܒ׆ಈΓϑΣΠετΡϑΣΠε (εϥΠυ࡞ͬͨΓ) • ࣮ࡍͷݱʹ͋ΔϚωδϝϯτͷࠜຊɺΞδϟΠϧͱ͔ ΥʔλʔϑΥʔϧͱ͔ؔͳ͍͜ͱ͕ଟ͍ •
ͷൃݟɺతඪͷઃఆΛ͠ɺνʔϜͰͷPDCAͷ࣮ߦ ͕Ͱ͖͍ͯΕྑ͍ͷ͕ͩͦΕ͕Ͱ͖ͯͳ͍͜ͱ͋Δ • ΧʔϘʔΠ։ൃʹྑ͕͋͞ΔͷͰڧཁ͠ͳ͍΄͏͕ྑ͍͜ͱ • ਐḿ֬ೝ͕ߴίετͰɺυΩϡϝϯτΒͳ͍͕ɺݸਓͷ ύϑΥʔϚϯεΛҾ͖ग़ͤΔ
εΫϥϜϦʔμʔΛҭͯΔͷʹ ૉΒ͍͠։ൃख๏ • ձٞମ͕ݻఆ • JIRA/GreenHopperͳͲͷαϙʔτπʔϧ • ॻ੶͕ॆ࣮͍ͯ͠Δ • ϓϥϯχϯάϙʔΧʔͰͷݟੵΓ͕ɺεΫϥϜϚελʔΛݽཱ
ͤ͞ͳ͍ • શһ͕શͯͷࢠΛ͔ͿΔͷͰஈ֊తʹεΫϥϜϚελʔʹͤ͞ Δ͜ͱ͕Մೳ ਤ: GreenHopperͷը໘
ͱ͍͑ɺεΫϥϜϚελʔͱͯ͠ͷجૅ ࣝඞཁͰผ్࠲ֶͷߨ࠲Λ։͍͍ͯΔ • ϚωδϝϯτΛ௨ͯ͡ϝϯόʔΛ׆͔͢ɺͱ͍͏υϥο Χʔͷߟ͑ํɺΞδϟΠϧͱ૬ੑ͕ྑ͍ ର ڭՊॻ ϝϯόʔٴͼεΫϥϜϚελʔ εΫϥϜϚελʔ εΫϥϜϚελʔ
ΞδϟΠϧαϜϥΠ ΞδϟΠϧͳݟੵΓ υϥοΧʔͷϚωδϝϯτ
εΫϥϜ։ൃͷ՝ • ίχϡχέʔγϣϯίετ͕ͱʹ͔͘ߴ͍ͷͰີͳίϛϡχέʔγϣϯ͕ෛ ୲ʹͳΒͳ͍Έ͕ඞཁ • ϝϯόʔͷཁ݅ఆٛͷೳྗ͕ʹ͖ͭʹ͍͘ • ཁ݅ఆٛͱ͍͏ࣄ͕ετʔϦʔͷཧͱͯ͠؆ུԽ͞Ε͍ͯΔ໘ɺ ֊Խ͕ෆेͩͬͨΓൈ͚࿙Ε͕ൃੜ͍͢͠ •
ཁٻཁ͕݅ਂ͍ίϯςΩετ͖ͷυΩϡϝϯτʹ·ͱ·Δ͜ͱ͕গͳ͍ ͨΊ(ετʔϦʔ͍จॻ)ɺϢʔβʔͷཁٻͷཧղʹݸʑྗ͕ඞཁ • ཁٻ͕ʑมΘΔͷͰϦονͳυΩϡϝϯςʔγϣϯ͕มߋ࣌ʹෛ࠴ʹͳΓ ͕ͪ • ࢁͷࢠΛ͔ͿΕΔਓ΄ͲଟʹͳΓ͕ͪ
χίੜͰͷεΫϥϜͰ ॏࢹ͍ͯ͠Δ͜ͱ
Ϣʔβʔͷཁٻཧղʹରͯ͠ ࣌ؒΛ͔͚Δ • ετʔϦʔͷ࿙Εഎܠʹ͋ΔϢʔβʔཁ݅ͷݟམ ͱ͠Λࢭ͢ΔͨΊ • ۩ମྫ: • ϢʔβʔΠϯλϏϡʔ •
twitterͷϞχλʔ • ཁܝࣔ൘ෆ۩߹ܝࣔ൘ͷ༰ͷڞ༗ • ձٞͷελοϑͰͷࢀՃ
ετʔϦʔͷϙΠϯτΛ େମ2~3ҎͰऴΘΔྔʹ͍ͯ͠Δ • 1εϓϦϯτͰୡϙΠϯτ͕0ͱ͍͏ঢ়گɺݸਓʹ γϣοΫ͕େ͖͍ • ແɺݸʑਓͷϙΠϯτΛ͓͓ͬͽΒʹग़ͨ͠ΓධՁ ͢Δ͜ͱͳ͍͚ΕͲ...
ΈΜͳͰ͓՛ࢠΛ৯ͨΓɺҰॹʹ ήʔϜΛͬͨΓ͢ΔΑ͏৺͕͚͍ͯΔ • ີͳίϛϡχέʔγϣϯͷετϨεΛͰ͖Δ͚ͩݮΒ͢ • ۩ମྫ: • ͓՛ࢠਆࣾ • ϘʔυήʔϜɺωτή
• Ͱ͖Δ͚ͩIRC (ࣾνϟοτ) Ͱࡁ·͢ • ΄Μͱ୭ͱϑΣΠεɾτΡɾϑΣΠεͷίϛϡχέʔ γϣϯΛऔΒͣ։ൃ͍͍ͯͨ͠ਓ͍ΔͷͰ...·ͩ՝
εΫϥϜϚελʔ͕ৗʹϓϨΠϯά ϚωʔδϟʔͰ͋ΕΔΑ͏ʹ͢Δ • ετʔϦʔͷཧղׂͷͨΊʹٕज़എܠͷ͕ࣝॏ ཁɺͰ͖Δ͚࣮ͩػձ͕͋ΔΑ͏ʹ͢Δ • ઐεΫϥϜϚελʔ͕ඞཁͳ΄Ͳͷେ͖͗͢ΔνʔϜ ʹ͠ͳ͍ɻ҆4~7໊ɻ
ΏͱΓΛ࣋ͬͨ։ൃܭը • 1εϓϦϯτͷඪϙΠϯτΛΪϦΪϦʹ͢ΔͱνʔϜ ͕ർฐ͢Δ • ༨༟ͷͳ͍εέδϡʔϧୡ͞Εͳ͍
اըͱ૬ஊ͢Δͱ͖ʹɺෆ֬ఆͳ ࣌ظͱ༏ઌॱҐͱҰॹʹ࣋ͪࠐΉ • ʮ2ʙ3εϓϦϯτʹ։ൃྃ͢ΔΑ͏ͳ༏ઌॱҐ ͚ʹͳ͍ͬͯΔ͕Ͳ͏͢Δ͔ʁʯͱ͍͏Α͏ͳ࣋ͪࠐΈ ํΛ͢ΔΑ͏ʹ৺͕͚Δ • ॏཁͰͳ͘ৗʹཁ݅ͷ༏ઌॱҐͰٞ͢Δ
ΠϯϑϥνʔϜଞνʔϜͱͷڞಉ ࡞ۀ߹ྲྀόοϑΝΛߟྀ͢Δ • ετʔϦʔͷ߹ྲྀʹ͕͖ͭͷɺόοϑΝͷͳ͍ ͷίϥϘϨʔγϣϯۃྗ͠ͳ͍ • ݟੵΓͷࡍʹݟམͱ͕ͪ͠ͳίϛϡχέʔγϣϯίε τཁ݅࿙ΕͷൃݟͳͲͷϦεΫՃຯ͠ͳ͍͚ͯ͘ ͳ͍
χίੜͰͷεΫϥϜͰ ॏࢹ͍ͯ͠Δ͜ͱ 1. Ϣʔβʔཧղʹରͯ࣌ؒ͠Λ͔͚Δ 2. ετʔϦʔͷϙΠϯτΛେମ2~3ҎͰऴΘΔྔʹ͍ͯ͠Δ 3. ΈΜͳͰ͓՛ࢠΛ৯ͨΓɺҰॹʹήʔϜΛͬͨΓ͢ΔΑ͏৺͕͚ ͍ͯΔ 4.
εΫϥϜϚελʔ͕ৗʹϓϨΠϯάϚωʔδϟʔͰ͋ΕΔΑ͏ʹ͢Δ 5. ΏͱΓΛ࣋ͬͨ։ൃܭը 6. اըͱ૬ஊ͢Δͱ͖ʹɺෆ֬ఆͳ࣌ظͱ༏ઌॱҐͱҰॹʹ࣋ͪࠐΉ 7. ΠϯϑϥνʔϜଞνʔϜͱͷڞಉ࡞ۀ߹ྲྀόοϑΝΛߟྀ͢Δ
·ͱΊ • Play2/ScalaେنWebαΠτͰे௨༻͢Δ • Scalaྑ͍ݴޠ͕ͩ͋Δఔͷٕज़ྗΛཁٻ͢Δ • Play2/ScalaͱυϝΠϯۦಈઃܭʹΑΔ։ൃ૬ੑ͕ྑ͍ • υϝΠϯۦಈઃܭอकੑʹߩݙ͢Δ •
εΫϥϜ։ൃϦʔμʔΛҭ͢Δͷʹྑ͍։ൃख๏
Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
࣭ٙԠ