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
240
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
600
いちソフトウェアエンジニアが プログラミング教育をはじめるのに読んで良かった本
sifue
0
200
チームの目標への柔軟な対応
sifue
0
110
並行処理初心者のためのAkka入門
sifue
0
40
2013年末カウントダウン番組におけるAkamai活用事例
sifue
0
90
ソフトウェア設計のすすめ
sifue
0
90
失敗の話
sifue
0
94
6000名以上の高校生に行われた VR教育の実践と課題
sifue
0
6.1k
N高等学校でのSlackの活用
sifue
0
1.2k
Other Decks in Technology
See All in Technology
AIAgentの限界を超え、 現場を動かすWorkflowAgentの設計と実践
miyatakoji
0
130
Flaky Testへの現実解をGoのプロポーザルから考える | Go Conference 2025
upamune
1
420
[2025-09-30] Databricks Genie を利用した分析基盤とデータモデリングの IVRy の現在地
wxyzzz
0
470
o11yで育てる、強い内製開発組織
_awache
3
120
後進育成のしくじり〜任せるスキルとリーダーシップの両立〜
matsu0228
6
2.3k
いまさら聞けない ABテスト入門
skmr2348
1
200
about #74462 go/token#FileSet
tomtwinkle
1
290
自動テストのコストと向き合ってみた
qa
0
110
Access-what? why and how, A11Y for All - Nordic.js 2025
gdomiciano
1
110
Escaping_the_Kraken_-_October_2025.pdf
mdalmijn
0
130
コンテキストエンジニアリングとは? 考え方と応用方法
findy_eventslides
4
890
OpenAI gpt-oss ファインチューニング入門
kmotohas
2
960
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
A Tale of Four Properties
chriscoyier
160
23k
Being A Developer After 40
akosma
91
590k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
32
2.2k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
Done Done
chrislema
185
16k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
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ͱυϝΠϯۦಈઃܭʹΑΔ։ൃ૬ੑ͕ྑ͍ • υϝΠϯۦಈઃܭอकੑʹߩݙ͢Δ •
εΫϥϜ։ൃϦʔμʔΛҭ͢Δͷʹྑ͍։ൃख๏
Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
࣭ٙԠ