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
Soichiro Yoshimura
September 27, 2023
Technology
0
210
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
http://event.shoeisha.jp/devsumi/20140213/session/407
以上の発表の発表内容となります。
----
slideshareより移行
Soichiro Yoshimura
September 27, 2023
Tweet
Share
More Decks by Soichiro Yoshimura
See All by Soichiro Yoshimura
プログラミング教育する大学、ZEN大学
sifue
1
430
いちソフトウェアエンジニアが プログラミング教育をはじめるのに読んで良かった本
sifue
0
170
チームの目標への柔軟な対応
sifue
0
85
並行処理初心者のためのAkka入門
sifue
0
26
2013年末カウントダウン番組におけるAkamai活用事例
sifue
0
69
ソフトウェア設計のすすめ
sifue
0
65
失敗の話
sifue
0
62
6000名以上の高校生に行われた VR教育の実践と課題
sifue
0
5.9k
N高等学校でのSlackの活用
sifue
0
1.1k
Other Decks in Technology
See All in Technology
彩の国で始めよう。おっさんエンジニアから共有したい、当たり前のことを当たり前にする技術
otsuki
0
150
【2025年度新卒技術研修】100分で学ぶ サイバーエージェントのデータベース 活用事例とMySQLパフォーマンス調査
cyberagentdevelopers
PRO
5
7.3k
4/16/25 - SFJug - Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
1
100
LangfuseでAIエージェントの 可観測性を高めよう!/Enhancing AI Agent Observability with Langfuse!
jnymyk
1
220
React ABC Questions
hirotomoyamada
0
110
The Tale of Leo: Brave Lion and Curious Little Bug
canalun
1
120
フロントエンドも盛り上げたい!フロントエンドCBとAmplifyの軌跡
mkdev10
2
270
Devinで模索する AIファースト開発〜ゼロベースから始めるDevOpsの進化〜
potix2
PRO
7
3.4k
クォータ監視、AWS Organizations環境でも楽勝です✌️
iwamot
PRO
1
310
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming
tomzoh
1
230
JPOUG Tech Talk #12 UNDO Tablespace Reintroduction
nori_shinoda
2
140
SREからゼロイチプロダクト開発へ ー越境する打席の立ち方と期待への応え方ー / Product Engineering Night #8
itkq
2
680
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
52
7.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
The Language of Interfaces
destraynor
157
24k
Agile that works and the tools we love
rasmusluckow
328
21k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Faster Mobile Websites
deanohume
306
31k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.5k
GitHub's CSS Performance
jonrohan
1030
460k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
13
1.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
135
33k
Designing for humans not robots
tammielis
252
25k
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ͱυϝΠϯۦಈઃܭʹΑΔ։ൃ૬ੑ͕ྑ͍ • υϝΠϯۦಈઃܭอकੑʹߩݙ͢Δ •
εΫϥϜ։ൃϦʔμʔΛҭ͢Δͷʹྑ͍։ൃख๏
Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
࣭ٙԠ