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
190
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
いちソフトウェアエンジニアが プログラミング教育をはじめるのに読んで良かった本
sifue
0
150
チームの目標への柔軟な対応
sifue
0
75
並行処理初心者のためのAkka入門
sifue
0
11
2013年末カウントダウン番組におけるAkamai活用事例
sifue
0
62
ソフトウェア設計のすすめ
sifue
0
59
失敗の話
sifue
0
53
6000名以上の高校生に行われた VR教育の実践と課題
sifue
0
5.8k
N高等学校でのSlackの活用
sifue
0
1.1k
N予備校プログラミングコースでのNode.js
sifue
0
980
Other Decks in Technology
See All in Technology
Amazon Q Developerの無料利用枠を使い倒してHello worldを表示させよう!
nrinetcom
PRO
2
110
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
1
190
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
560
AIエージェント元年@日本生成AIユーザ会
shukob
1
190
実は強い 非ViTな画像認識モデル
tattaka
2
1.2k
コンテナサプライチェーンセキュリティ
kyohmizu
1
140
急成長する企業で作った、エンジニアが輝ける制度/ 20250227 Rinto Ikenoue
shift_evolve
0
120
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
340
LINEギフトにおけるバックエンド開発
lycorptech_jp
PRO
0
250
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
600
内製化を加速させるlaC活用術
nrinetcom
PRO
2
140
ウォンテッドリーのデータパイプラインを支える ETL のための analytics, rds-exporter / analytics, rds-exporter for ETL to support Wantedly's data pipeline
unblee
0
120
Featured
See All Featured
Code Review Best Practice
trishagee
67
18k
Side Projects
sachag
452
42k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.4k
Become a Pro
speakerdeck
PRO
26
5.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
250
Mobile First: as difficult as doing things right
swwweet
223
9.4k
Building Applications with DynamoDB
mza
93
6.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
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ͱυϝΠϯۦಈઃܭʹΑΔ։ൃ૬ੑ͕ྑ͍ • υϝΠϯۦಈઃܭอकੑʹߩݙ͢Δ •
εΫϥϜ։ൃϦʔμʔΛҭ͢Δͷʹྑ͍։ൃख๏
Ҏ্ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
࣭ٙԠ