Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新米エンジニアがレガシーシステムを死に物狂いでグロースハックした話 #xpjug / 2017...
Search
yuzutas0
PRO
September 16, 2017
Programming
8
49k
新米エンジニアがレガシーシステムを死に物狂いでグロースハックした話 #xpjug / 20170916
XP祭り2017 の発表資料です。
https://yuzutas0.hatenablog.com/entry/2017/09/20/083000
に補足を記載しています。
yuzutas0
PRO
September 16, 2017
Tweet
Share
More Decks by yuzutas0
See All by yuzutas0
OLSにおける推定量β1=共分散÷分散の導出 / 20230517
yuzutas0
PRO
2
620
民間企業におけるデータ整備の課題と工夫 / 20220305
yuzutas0
PRO
15
7.5k
累計参加者8,500名! #DataEngineeringStudy の43スライドから学ぶ、データエンジニアリングの羅針盤 / 20220224
yuzutas0
PRO
15
5.2k
あの人の自分戦略を聞きたい!2022 #devsumi / 20220218
yuzutas0
PRO
3
4.1k
データ基盤による利益最大化と初期構築プロセス / 20220209
yuzutas0
PRO
10
6.6k
Engineer Career Lounge#1「エンジニアの成長戦略を考える」 #ECLounge カンニングペーパー / 20211217
yuzutas0
PRO
3
1.5k
Data Management Guide - 事業成長を支えるデータ基盤のDev&Ops #TechMar / 20211210
yuzutas0
PRO
19
25k
[投影資料]『実践的データ基盤への処方箋』の刊行にあたって #TechMar / 20210210-2
yuzutas0
PRO
1
3.6k
DXを妨げる要因と実現へのアプローチ by @yuzutas0 / 20211022
yuzutas0
PRO
55
46k
Other Decks in Programming
See All in Programming
CSC305 Lecture 17
javiergs
PRO
0
270
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
970
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
230
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
sg4k0
0
360
【CA.ai #3】Google ADKを活用したAI Agent開発と運用知見
harappa80
0
240
関数実行の裏側では何が起きているのか?
minop1205
1
410
認証・認可の基本を学ぼう前編
kouyuume
0
150
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
180
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 1
philipschwarz
PRO
0
120
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
10
11k
Integrating WordPress and Symfony
alexandresalome
0
120
Module Harmony
petamoriken
2
610
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Code Reviewing Like a Champion
maltzj
527
40k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Agile that works and the tools we love
rasmusluckow
331
21k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Visualization
eitanlees
150
16k
Mobile First: as difficult as doing things right
swwweet
225
10k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
4 Signs Your Business is Dying
shpigford
186
22k
Transcript
৽ถΤϯδχΞ͕ϨΨγʔγεςϜΛ ࢮʹڰ͍ͰάϩʔεϋοΫͨ͠ 2017-09-16 (Sat) XPࡇΓ2017 presented by @yuzutas0
ɹSho Yokoyamaɹ@yuzutas0 ɹɹ • ϦΫϧʔτςΫϊϩδʔζ • ೝఆεΫϥϜϚελʔ
• ࣮͏৽ถͰͳ͍
࣮͏৽ถͰͳ͍ ↓ ࣌ΛৼΓฦΔͱ ʮ݁ՌతʹΞδϟΠϧϓϥΫςΟεΛ ద༻͍ͯͨ͠ͷͰʁʯ ↓ ͜ͷػʹࡇΔ
ɹຊ͢༰ ৽ถΤϯδχΞ ͍εΩϧϨϕϧ 19νʔϜ͔Βಉ࣌ґཔ ଟ༷ͳεςʔΫϗϧμʔ 10ɾେن ϨΨγʔγεςϜ 4ϲ݄Ͱ120Ҋ݅Λ͘͞ ϢʔβʔΞΫγϣϯ2.8ഒ
ࢼߦࡨޡ ϘτϧωοΫΛ1ͭ1۪ͭʹղফ x ݁ՌతʹΞδϟΠϧϓϥΫςΟε
੍͕ଟ͍ͱ͖ͦ͜ • ϘτϧωοΫͷಛఆͱղফ • ثʢΞδϟΠϧϓϥΫςΟεʣ → ظؒͰՌΛ্͛Δ͜ͱ͕Ͱ͖Δ ɹ͍͑ͨ͜ͱ
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
ɹϦϘϯϞσϧͷϝσΟΞ ΫϥΠΞϯτ اۀ ΧελϚʔ Ϣʔβʔ ࠂΛग़͢ ใΛ୳͢ ࢠɹ8&#αΠτʢ1$εϚϗΨϥέʔʣɹ
ϞόΠϧΞϓϦʢJ04ɺ"OESPJEʣ IUUQGSFFJMMVTUSBUJPOTHBUBHOFUIUNM
ڝ߹ͷ಄ ↓ ظؒͰϢʔβʔΞΫγϣϯΛ૿ͦ͏ ↓ ଟͷνʔϜ͕ಠࣗͰPDSαΠΫϧΛճ͢ ɹάϩʔεϓϩδΣΫτ
ɹAPج൫Λ୲ ͜͜ͷ
ɹAPج൫Λ୲ ͜͜ͷ ͜͜ͷ
ɹAPج൫Λ୲ ͜͜ ͜͜ͷ ͜͜ͷ
ɹWebAPI։ൃ
ɹ19νʔϜ͔Βґཔ͕ͳͩΕࠐΉ
ɹWebAPI͕શγεςϜͷதܧͩͬͨ 50+ ͷαϒγε 3500+ tables 100,000+ columns ‘00ͷSEOରࡦͷ໊ ίϯςϯπྔͷଟ͞Ͱ্Ґදࣔ
ෳαΠτͷ༰Λޓ͍ʹܝࡌ͋͠͏༷
ɹࢪࡦΛࢧ͑Δׂ ࢪࡦ ࢪࡦ ࢪࡦ
ɹࢪࡦྫ ࣌·ͩະख़ͩͬͨ ϞόΠϧΞϓϦʹը૾Λग़͢ ϝϧϚΨͷ࠷దԽϨίϝϯυ ʢ৴όον → WebAPI → Solrʣ
IUUQTTVQQPSUUNPCJMFDPNDPNNVOJUZQIPOFTUBCMFUTEFWJDFTBQQMFJQIPOF IUUQTQJYBCBZDPNFOMFUUFSNBJMNBJMJOHFNBJMNBJMCPY
ɹԹײ 1ՕॴͰӨڹ֬ೝΛଵͬͯ ͕ى͖ͨΒɺؔ࿈γεςϜ શମ͕μϯ͠͏Δ 1ͭͰ։ൃҊ͕݅ΕͨΒ ۄಥ͖ͰଞͷҊ݅·ͰΕͯ શνʔϜͷܭը͕Ԇ͢Δ ΫΦϦςΟ ΞδϦςΟ
ɹॳ݄࣮ 6ରԠ / 27ґཔ
ɹͲͷνʔϜࢪࡦ͕ଧͯͳ͍ ࢪࡦ ࢪࡦ ࢪࡦ Blocker ❌
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
ɹεςʔΫϗϧμʔ͕ଟ͗͢Δ
νʔϜͰʮޒ݄ӍߴΥʔλʔϑΥʔϧʯͱݺͿϓϩηε͕ࣗવͱߏங͞Εͨ ɹΰʔϧ ɹํ๏ ɹ։ൃϓϩηεߏங ҆ఆԽ ߴԽ ηϨϞχʔ يಓमਖ਼ ΞΠςϜ
ՄࢹԽ
ɹࣾͷ։ൃඪ४ɾςϯϓϨ͋ͬͨ • େͳϧʔϧ܈ ʹ ͙͢ʹ͑ͳ͍ ɹɹɹɹɹɹɹɹɹʮ뱌ʯʹֻ͕͔࣌ؒΔ • ͦͷ࣌ʑͰඞཁͳͷ ʹ ϓϧϕʔεͰඋ
ɹɹɹɹɹɹɹɹɹʢͤ͟ΔΛಘͳ͔ͬͨʣ IUUQTQJYBCBZDPNFOMJCSBSZCPPLTNPOUFTTPSJTIFMG
νʔϜͰʮޒ݄ӍߴΥʔλʔϑΥʔϧʯͱݺͿϓϩηε͕ࣗવͱߏங͞Εͨ ɹΰʔϧ ɹํ๏ ɹ։ൃϓϩηεߏங ҆ఆԽ ߴԽ ηϨϞχʔ يಓमਖ਼ ΞΠςϜ
ՄࢹԽ ҆ఆԽ ΞΠςϜ ՄࢹԽ
ɹ՝ཧ • Excel্Ͱ՝ϦετΛཧ ɹɹগ͠Ͱʮͩʂʯͱࢥͬͨ͜ͱىථ • εΫϥϜʹ͓͚ΔোϦετ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹҊ݅ཧ • ಉ༷ʹExcel্ͰҊ݅ϦετΛཧ ɹɹཁ݅ɺɺظݶɺ༏ઌɺଞνʔϜӨڹ • εΫϥϜʹ͓͚ΔϓϩμΫτόοΫϩά
ɹλεΫཧ • νʔϜڞ༗ͷςΩετϑΝΠϧͰTODOཧ ɹɹ“िͷλεΫҰཡ” ͱ “ணखத࡞ۀͷ୲ऀ” ΛՕॻ͖ • εΫϥϜʹ͓͚ΔεϓϦϯτόοΫϩά
IUUQXXXGSFFQJLDPNGSFFJDPOUYUpMF@IUN
͙͢ಡΈʹ͘͘ͳΔ → KISSͷపఈ → ݁Ռͱͯ͠τϤλΣΠ ɹʲλεΫཧʳ “.txt” for Lean
কདྷ·Ͱશ෦ॻ͘ͷ× = ͦͷिͷλεΫ͚ͩ ʢλΠϜϘοΫεͷ֓೦ʣ ϚϧνλεΫ× = ্͔Βॲཧ ʢWIP੍ݶɾҰݸྲྀ͠ʣ TODO TODO TODO TODO TODO
νʔϜͰʮޒ݄ӍߴΥʔλʔϑΥʔϧʯͱݺͿϓϩηε͕ࣗવͱߏங͞Εͨ ɹΰʔϧ ɹํ๏ ɹ։ൃϓϩηεߏங ҆ఆԽ ߴԽ ηϨϞχʔ يಓमਖ਼ ΞΠςϜ
ՄࢹԽ ҆ఆԽ ηϨϞχʔ يಓमਖ਼
ɹҊ݅ͷ༏ઌॱҐ • 19νʔϜͱͷݸผௐˍݴήʔϜΧΦεʹͳͬͨ • શମϛʔςΟϯάͰिʹ1ճ͚ͩ༏ઌॱҐΛશһͰೖΕସ͑ ɹɹɹۄҊ݅ ʼ ͕খ͍͞Ҋ݅ ʼ ͕େ͖͍Ҋ݅
• εΫϥϜʹ͓͚ΔόοΫϩάϦϑΝΠϝϯτ
ɹνʔϜͷঢ়گڞ༗ • ͜·Ίʹ෦ڞ༗͍ͨ͠ 㱻 ઌͷ࡞ۀʹूத͍ͨ͠ • ස৭ʑࢼͯ͠11-2ճ͕ఆண • εΫϥϜʹ͓͚ΔσΠϦʔϛʔςΟϯά
IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹଞγεςϜӨڹͷ֬ೝ • ϦϦʔεલʹվम༰Λिʹ1ճͷԣஅϛʔςΟϯάͰ࠷ऴ֬ೝ ɹɹͦͷࡍʹ֤ؔҐ͔Βʮ͜ͷΛҙࣝ͢ΔͱΑΓྑ͘ͳΔʯͷϑΟʔυόοΫ • εΫϥϜʹ͓͚ΔεϓϦϯτϨϏϡʔ ϦϦʔεԆظ
ͦͷ··Goʂ Өڹʹݒ೦͕͋Δʁ Yes No
ɹϚΠϧετʔϯཧ • ଞνʔϜͷܭը͕ࠞཚ → ീํ͔Βʮ͍ͭͰ͖ͦ͏Ͱ͔͢ʁʯ • िʹ1ճ “ͦͷिΔ͜ͱ” ͱ “ࠓޙͷݟ௨͠”
Λཱͯͨ͠ ɹɹҊ݅ͷݟੵΓࣗવͱʮ0.5ɺ1ɺ2…ʯͷ૬ରʹͳͬͨ • εΫϥϜʹ͓͚ΔεϓϦϯτϓϥϯχϯάʢୈ1෦ʣ 0.5 IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM 1 2 3 5 8
ɹʲϚΠϧετʔϯʳ ݟੵΓ 㱻 ࣮ଶ • ϕʔεͷܭը͕ʹཱͨͳ͍ • ࡉ͔͘ϞχλϦϯάͨ͠ ʹ 1िؒͰѻ͑Δྔ͕ݟ͑ͨ
ɹɹʲ݁ՌʳҊ݅։ൃʹ͏࣌ؒ1ͷ2ׂʙ4ׂʹऩଋͨ͠ ɹɹʲ׆༻ʳݟཱ͕ͯ2࣌ؒ → ظ3ഒͷ6࣌ؒʢ㲈1ʣ • εΫϥϜʹ͓͚ΔϕϩγςΟ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
νʔϜͷશһͰ࠷ॳʹೝࣝΛἧ͑Δ ɹ“खΓ” 1 / 4 ઃܭ ࢼݧ
ϦϦʔε ཁ݅ఆٛ ཁ݅ఆٛ • Ϟϒ ϓϩάϥϛϯά ϗϫΠτϘʔυίʔσΟϯά - “ઃܭํ” “ॻ͖ํ” • Ϟϒ ϓϩάϥϛϯά TODOચ͍ग़͠ - 1ͭ20ఔͷ࡞ۀΛશͯՄࢹԽ
લఔΛॏࢹ͢Δ ɹ“खΓ” 2 / 4 ઃܭ ࢼݧ
ϦϦʔε ཁ݅ఆٛ • ޙ͔Βͷʮ͜ΕͳΜ͚ͩͬʁʯʮͲ͏͢ΔΜ͚ͩͬʁʯ → “Γ͠” ࠷ѱ • ࣗͰεέδϡʔϧΛίϯτϩʔϧ͍ͯ͠Δ҆৺ײ • εΫϥϜʹ͓͚ΔεϓϦϯτϓϥϯχϯάʢୈೋ෦ʣ
ʢࠩ͠ࠐΈґཔͱಉ͡Ͱʣఆ֎࡞ۀ = ܭը͕ཚΕΔ ɹ“खΓ” 3 / 4
ઃܭ ࢼݧ ϦϦʔε ཁ݅ఆٛ ϨϏϡʔ ʮͲΜͳҊ݅Ͱ͚ͨͬ͠ʁʯ ʮͬͱྑ͍ॻ͖ํ͕͋Γͦ͏ʯ ଞνʔϜͰγεςϜো ʮAPI༷Λڭ͍͑ͯͩ͘͞ʯ όά͕ݟ͔ͭΔ → ࡞Γ͠ ࢼݧ ϦϦʔε
ૣ͘͢ΔͨΊʹɿલఔʹ࣌ؒΛֻ͚࣭ͯ୲อ - Doneͷఆٛ ɹ“खΓ” 4 / 4
ઃܭ ࢼݧ ϦϦʔε ཁ݅ఆٛ ઃܭ ࢼݧ ίʔυΛॻ͘લʹଞνʔϜڞ༗ ো࣌ʮAPIͰͳ͍ʯΓ͚ ࢼݧϑΣʔζμϝԡ͠ 1݅Ͱόά͕ग़ͨΒ࠶ൃࢭ ίʔυΛॻ͖ͳ͕Β ͏ҟৗܥ·Ͱςετ
νʔϜͰʮޒ݄ӍߴΥʔλʔϑΥʔϧʯͱݺͿϓϩηε͕ࣗવͱߏங͞Εͨ ɹΰʔϧ ɹํ๏ ɹ։ൃϓϩηεߏங ҆ఆԽ ߴԽ ηϨϞχʔ يಓमਖ਼ ΞΠςϜ
ՄࢹԽ ߴԽ ηϨϞχʔ يಓमਖ਼
ɹ՝ϦετΛͱʹվળ • िʹ1ճ͚ͩվળͷ࣌ؒΛઃ͚ͨ • ͕ଟ͗͢Δ → 1͚ͭͩબͿ ɹɹʲ࣭ʳ࣌ؒΛֻ͚ͯ୲อࡁΈʢ୲ՕॴͷγεςϜো2݅ / 120Ҋ݅ʣ
ɹɹʲʳ - ϦʔυλΠϜΛ્͢ΔϜμΛऔΓআ͘ • εΫϥϜʹ͓͚ΔϨτϩεϖΫςΟϒ IUUQTXXXTDSVNBMMJBODFPSHDPNNVOJUZBSUJDMFTNBZTQSJOUJTNPSFUIBOKVTUBUJNFCPY
ɹվળΞΫγϣϯʢྫʣ ʲBeforeʳূॏࢹͷಡΈ߹Θͤ༻จॻ ʲAfterʳ ཁ݅ಛԽͷϖϥ1ϑΥʔϚοτ ɹɹձٞΛ 60min → 5min ʹॖ
• ଞνʔϜͷσΠϦʔϛʔςΟϯάʹࢀՃ • νʔϜؒͰޓ͍ͷίϯςΩετΛѲ ɹɹؾܰʹ૬ஊ → ϦʔυλΠϜॖ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM แׅతͳυΩϡϝϯτΑΓ ಈ͘ιϑτΣΞΛ ϓϩηεπʔϧΑΓ ݸਓͱରΛ
͜ΕΒͷΞΠςϜΠϕϯτ ↓ ͋ͬͯ “ͨΓલ” ʹࢥ͑Δʁ ↓ ࠷ॳ͔Β༻ҙ͢Δͷ͕ ”વ”ʁ
ɹʮͨΓલʯΛੵͨࣾ͠ඪ४ɾςϯϓϨ • େͳϧʔϧ܈ ʹ ͙͢ʹ͑ͳ͍ ɹɹɹɹɹɹɹɹɹʮ뱌ʯʹֻ͕͔࣌ؒΔ • ͦͷ࣌ʑͰඞཁͳͷ ʹ ϓϧϕʔεͰඋ
ɹɹɹɹɹɹɹɹɹʢͤ͟ΔΛಘͳ͔ͬͨʣ IUUQTQJYBCBZDPNFOMJCSBSZCPPLTNPOUFTTPSJTIFMG
ɹϓϧϕʔε ඞཁͳͷΛɺඞཁͳͱ͖ʹɺඞཁͳ͚ͩ ϘτϧωοΫͷಛఆͱղফΛ܁Γฦ͢ ՝ղܾ ՝ൃݟ ݁Ռతʹ Pull ݁Ռతʹ Pull
ɹޒ݄ӍΥʔλʔϑΥʔϧ ͱνʔϜͰݺͿͷʹͳͬͨ ։ൃͷʮྲྀΕʯʹͤΔ खΓτϥϒϧʹΑΔʮٯྲྀʯʢʹϜμɾϜϥɾϜϦʣΛ͙ 1ݸྲྀ͠ʹΑΔϑΥʔΧεɹɹόοναΠζΛখׂ͘͞ɹɹ࣭ΛલఔͰ୲อɹɹܧଓతͳʮྲྀΕʯͷվળ ޒ݄Ӎͷґཔ ґཔ ґཔ ґཔ
ઃܭ ࢼݧ ϦϦʔε ཁ݅ఆٛ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹ19νʔϜ͔ΒͷґཔʹରԠ͢Δ
WEBαΠτͷޭࢪࡦ ϞόΠϧΞϓϦͰΕ͍͍ͷʹ ىҊ → ࢪࡦͱͯ͠࠾༻ʂ ʲ+αʳྲྀΕ͕ՄࢹԽ → ਫݯʹϑΟʔυόοΫ
ɹຊ͢༰ʢ࠶ܝʣ ৽ถΤϯδχΞ ͍εΩϧϨϕϧ 19νʔϜ͔Βಉ࣌ґཔ ଟ༷ͳεςʔΫϗϧμʔ 10ɾେن ϨΨγʔγεςϜ 4ϲ݄Ͱ120Ҋ݅Λ͘͞ ϢʔβʔΞΫγϣϯ2.8ഒ
ࢼߦࡨޡ ϘτϧωοΫΛ1ͭ1۪ͭʹղফ x ݁ՌతʹΞδϟΠϧϓϥΫςΟε
੍͕ଟ͍ͱ͖ͦ͜ • ϘτϧωοΫͷಛఆͱղফ • ثʢΞδϟΠϧϓϥΫςΟεʣ → ظؒͰՌΛ্͛Δ͜ͱ͕Ͱ͖Δ ɹ͍͑ͨ͜ͱʢ࠶ܝʣ
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
ɹ৽ถΤϯδχΞ WebAPIͷϨεϙϯεʹ ύϥϝʔλΛ1ͭՃ͢Δ͚ͩͷҊ݅ ࠷ॳ1िؒඅ͍ͯͨ͠
ɹʮॆ࣮ͨ͠ʯֶशϝχϡʔ͋ͬͨ • 3ϲ݄ͰҰਓલʹͳΔڭࡐ ʹ ͙͢ʹ͑ͳ͍ ɹɹɹɹɹɹɹɹɹʢ3ϲ݄ޙ·Ͱઓྗ֎ʣ • ͦͷ࣌ʑͰඞཁͳࣝ ʹ ϓϧϕʔεͰशಘ
ɹɹɹɹɹɹɹɹɹʢͤ͟ΔΛಘͳ͔ͬͨʣ IUUQTQJYBCBZDPNFOMJCSBSZCPPLTNPOUFTTPSJTIFMG
ɹTDDͷΑ͏ʹֶͿ ΞʔΩςΫτ ٕज़ྗ ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ Ϧʔμʔ νʔϜঢ়گ ͱͯ͠ৼΔ͏ -
ςετίʔυ࣮ߦ ฉ͍ͨΓௐͨΓ Pullϕʔε ͬஏΛ͔͘ RED Θ͔ͬͨʂͰ͖ͨʂ GREEN
ɹTDDͷΑ͏ʹֶͿ ΞʔΩςΫτ ٕज़ྗ ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ Ϧʔμʔ νʔϜঢ়گ ͱͯ͠ৼΔ͏ -
ςετίʔυ࣮ߦ ฉ͍ͨΓௐͨΓ Pullϕʔε ͬஏΛ͔͘ RED Θ͔ͬͨʂͰ͖ͨʂ GREEN ΞʔΩςΫτ ٕज़ྗ
ɹγεςϜઃܭ ΞʔΩςΫτͱͯ͠ࣄલʹઃܭ͕ݟ௨͍ͤͯΔʁ ˠ Noʂ ˠ ॲཧػೳهड़γʔέϯεਤΛॻ͘ͱ͜Ζ͔Βʂ
ɹ༷Ѳ ΞʔΩςΫτͱͯ͠ઃܭલʹαΠτ༷ΛѲ͍ͯ͠Δʁ ˠ Noʂ ˠ ը໘ભҠਤΛ࡞ͬͯΈΔʂ
ɹؔ࿈γεςϜ Βͳ͍ٕज़ཁૉ → 30ͷษڧձΛ։͍ͯΒ͏ • SolrͱͳΜͧ • ϩʔΧϧڥͰApacheͷઃఆΛ͍͡Ζ͏ • ࣾͷϞόΠϧΞϓϦج൫ʹ͍ͭͯ
• γεςϜશମͷσʔλϑϩʔʢӦۀͷݪߘೖྗ͔Βʣ
ɹͱʹ͔͘ฉ͘ • ϗϫΠτϘʔυΛ1ͭڌ • ʢຊͷʣΞʔΩςΫτʹֆͰͷղઆΛґཔ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹલఏࣝͷඞཁੑΛ࣮ײ • ʮҰྲྀͷΞʔΩςΫτͳΒશਖ਼ղͰ͖ΔͣʯͰৼΔ͏ • ςετۦಈֶशɿΛղ͘ˠϛεˠ͑ΛݟΔˠͳΔ΄Ͳ
ɹͲΜͲΜಡΉ - ؾ͘……οʂ͜Ε༗ӹ……οʂ • ҰྲྀͷΞʔΩςΫτ͖ͪΜͱຊΛಡΉʢଟʣ • ඞཁʹۦΒΕͯಡΉ → ͍Ͱཧղ͢Δ
ࠨͭҰྲྀͷΞʔΩςΫτ͕ಡΉຊͬͯײ͡͠ͳ͍͚Ͳ IUUQCPPLJNQSFTTDPKQCPPLTɹɹIUUQCPPLJNQSFTTDPKQCPPLTɹɹIUUQTXXXPSFJMMZDPKQCPPLT
ɹTDDͷΑ͏ʹֶͿ ΞʔΩςΫτ ٕज़ྗ ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ Ϧʔμʔ νʔϜঢ়گ ͱͯ͠ৼΔ͏ -
ςετίʔυ࣮ߦ ฉ͍ͨΓௐͨΓ Pullϕʔε ͬஏΛ͔͘ RED Θ͔ͬͨʂͰ͖ͨʂ GREEN ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ
ɹࣄۀߏ ϓϩμΫτΦʔφʔͱͯ͠ϏδωεߏΛѲࡁΈʁ → Noʂ → ϐΫτਤΛॻ͘ʂ
ɹࣈɾنײ ϓϩμΫτΦʔφʔͱͯ͠ࣈΛѲࡁΈʁ → Noʂ → ΞΫηεղੳπʔϧΛͬͯΈΔʂ
ɹࣄۀߏ ϓϩμΫτΦʔφʔͱͯ͠ӦۀͷചΓํΛ͍ͬͯΔʁ → Noʂ → ӦۀࣾһͷݚमʹࠞͥͯΒ͏ʂ
ɹϓϥΠϕʔτ·Ͱ৵৯…… ϓϩμΫτΦʔφʔͱͯ͠ϓϩμΫτΛ͍࣋ͬͯΔʁ → Noʂ → ݸਓαʔϏεΛ࡞Δʂ
ɹશ෦1ਓͰΔ → શମ૾͕ݟ͑Δ • ϓϩηεɿاը͔Βอकӡ༻·Ͱ • ٕज़ཁૉɿϑϩϯτ͔ΒΠϯϑϥ·Ͱ
ɹશ෦1ਓͰΔ → ࡉ෦͕ݟ͑Δ • αʔόઃఆσϑΥϧτͰ͍͍ͷ͔ • ձࣾͩͱར༻نͲ͏ͳ͍ͬͯΔͷ͔ IUUQHJIZPKQCPPL
ɹϢʔβʔͷ → ඇػೳཁ͕݅ؾʹͳΓͩ͢ ʲύϑΥʔϚϯεʳ • ઌഐʹฉ͖ͳ͕ΒJMeterΛࢼͯ͠ΈΔʂ • ͜ͷΞΫηεྔͰ͜ͷॲཧͳͷ͔ʂ ʲηΩϡϦςΟʳ
• HTTPϔομʔͷઃఆɺେৎ͚ͩͬʂ • େৎͩͬͨʂ͜͜Ͱઃఆ͍ͯ͠Δͷ͔ʂ
ɹTDDͷΑ͏ʹֶͿ ΞʔΩςΫτ ٕज़ྗ ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ Ϧʔμʔ νʔϜঢ়گ ͱͯ͠ৼΔ͏ -
ςετίʔυ࣮ߦ ฉ͍ͨΓௐͨΓ Pullϕʔε ͬஏΛ͔͘ RED Θ͔ͬͨʂͰ͖ͨʂ GREEN Ϧʔμʔ νʔϜঢ়گ
ɹܗ͔ΒೖΔ • ʮ͑ʁݺΕ·͚ͨ͠ͲʁʯΈ͍ͨͳإͰձٞʹࢀՃ • νʔϜϦʔμʔͷΘΓʹνʔϜͷใࠂΛ͢Δ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹѹతϑΟʔυόοΫྔ • ࿅शɿϦʔμʔʹ͓ࢼ͠ใࠂ → ؒҧ͍Λࢦఠͯ͠Β͏ • ࣮ફɿଞνʔϜͷϦʔμʔʹ΅͜΅͜ʹ͞ΕΔ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹϝϯλʔͱͷ1on1 • ҰྲྀͷϦʔμʔʹϝϯλʔ͕͍ΔͷΒ͍͠ʢଟʣ • ผ෦ॺͷઌഐʹ͓ئ͍ͯ͠ɺຖ30ͷ1on1Λߦ͏ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
Ϧʔμʔʢࣗশʣͱͯ͠νʔϜͷݱঢ়Λઆ໌͢Δ → Θ͔Βͳ͚ΕௐΔɾฉ͘ ɹQ1. νʔϜ͍·ͲΜͳঢ়گ͔ʁ by ϝϯλʔ
ɹQ2. ࠷େ͖ͳԿ͔ʁ by ϝϯλʔ Ϧʔμʔʢࣗশʣͱͯ͠νʔϜ๊͕͑ΔΛઆ໌͢Δ → ຊʹͦΕ͕1൪ͷʁ by ϝϯλʔ →
σΟεΧογϣϯͰཧ
ɹQ3. ʹରͯ͠Ͳ͏ͨ͠Β͍͍͔ʁ by ϝϯλʔ Ϧʔμʔʢࣗশʣͱͯ͠ղܾΞϓϩʔνΛఏҊ͢Δ → ຊʹͦΕ͕ϕετͷํ๏ʁ by ϝϯλʔ →
աڈͷࢀߟࣄྫΛฉ͘ˍࠓճͷέʔεͲ͏͖͔ٞ͢
ɹTDDͷΑ͏ʹֶͿ ΞʔΩςΫτ ٕज़ྗ ϓϩμΫτΦʔφʔ ༷ɾࢪࡦ Ϧʔμʔ νʔϜঢ়گ ͱͯ͠ৼΔ͏ -
ςετίʔυ࣮ߦ ฉ͍ͨΓௐͨΓ Pullϕʔε ͬஏΛ͔͘ RED Θ͔ͬͨʂͰ͖ͨʂ GREEN
ɹʮॆ࣮ͨ͠ʯֶशܭը͚͕ͩਖ਼ղͰͳ͍ • 3ϲ݄ͰҰਓલʹͳΔڭࡐ ʹ ͙͢ʹ͑ͳ͍ ɹɹɹɹɹɹɹɹɹʢ3ϲ݄ޙ·Ͱઓྗ֎ʣ • ͦͷ࣌ʑͰඞཁͳࣝ ʹ ϓϧϕʔεͰशಘ
ɹɹɹɹɹɹɹɹɹʢͤ͟ΔΛಘͳ͔ͬͨʣ IUUQTQJYBCBZDPNFOMJCSBSZCPPLTNPOUFTTPSJTIFMG
ɹʮ࠷ڧͷҭϝχϡʔʯଘࡏ͠ͳ͍ʁ ৽ถΤϯδχΞ͕뱌͖͠Εͳ͍ࣝ ʹ ·ͩඞཁͳ͍ػೳΛ࡞Δͷͱಉ͔͡ IUUQXXXQSPKFDUDBSUPPODPN
ɹ“࣮ફ” Λ௨ͯ͠ “ࣗ” ͢Δ Ұྲྀͱͯ͠ৼΔ͏ ↓ વ͏·͍͔͘ͳ͍ ↓ ͕ࠩݟ͑Δ ↓
Ұྲྀͷઢʹۙ͘ IUUQTXXXQFYFMTDPNQIPUPDBSFGSFFDIJMEDIJMEIPPEDPVOUSZTJEF
ɹΠϯΫϦϝϯλϧͳֶश ʮ͔Δ͜ͱʯ͕૿͑Δʹ ʮ͔Βͳ͍͜ͱʯ͕͕͍ͬͯ͘ ͦΕΒΛશ෦ɺௐΔʂࢼ͢ʂฉ͘ʂֶͿʂ IUUQTXXXQFYFMTDPNQIPUPCBMMTIBQFECMVSDMPTFVQGPDVT
ɹຊ͢༰ʢ࠶ܝʣ ৽ถΤϯδχΞ ͍εΩϧϨϕϧ 19νʔϜ͔Βಉ࣌ґཔ ଟ༷ͳεςʔΫϗϧμʔ 10ɾେن ϨΨγʔγεςϜ 4ϲ݄Ͱ120Ҋ݅Λ͘͞ ϢʔβʔΞΫγϣϯ2.8ഒ
ࢼߦࡨޡ ϘτϧωοΫΛ1ͭ1۪ͭʹղফ x ݁ՌతʹΞδϟΠϧϓϥΫςΟε
੍͕ଟ͍ͱ͖ͦ͜ • ϘτϧωοΫͷಛఆͱղফ • ثʢΞδϟΠϧϓϥΫςΟεʣ → ظؒͰՌΛ্͛Δ͜ͱ͕Ͱ͖Δ ɹ͍͑ͨ͜ͱʢ࠶ܝʣ
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
ɹϨΨγʔγεςϜͱ͍͔ʹ͖߹͏͔ 50+ ͷαϒγε 3500+ tables 100,000+ columns ߴ։ൃʹ͑ΒΕΔ෦࣭Ͱͳ͍
“ΠςϨʔγϣϯ” ͱ “ਖ਼͍͠ϑΥʔΧε” ɹϨΨγʔγεςϜಉ͡ దԠ ݕࠪ
σϑΝΫτελϯμʔυͷ։ൃελΠϧʹ͚ۙͮΔ ɹΠςϨʔγϣϯ - ܧଓతσϦόϦʔΛࢧ͑Δٕज़ Git / Gitlabಋೖ ϚʔδϦΫΤετத৺ͷ։ൃ ϨϏϡʔมԽΛ͍͘͢
SonarQubeಋೖ Ξϯνύλʔϯͳॻ͖ํΛࢲత ιʔείʔυͷෳࡶΛԽ
ɹɹɹɹɹɹ υΩϡϝϯτʁ ɹɹɹɹɹɹ ػೳཁ݅ʁ ɹɹɹɹɹɹ ྑ͍ઃܭʁ ɹਖ਼͍͠ϑΥʔΧε
ɹ APIར༻ऀ͚ͷΤϥʔυΩϡϝϯτ • ίʔυΛࣗવݴޠʹ͚ͨͩ͠ • ࡞Δͷʹ͕͔͔࣌ؒΔ • ୭ಡΜͰ͍ͳ͔ͬͨ •
JSONΩϟϓνϟʢSwaggerతൃʣ • ϦʔυλΠϜͷେ෯ݮ • ར༻ݩʮಡΊΔΑ͏ʹͳͬͨʯ
ɹ ෦ઃܭυΩϡϝϯτ • Excelͷϑϩʔνϟʔτʹ߹Θͤͯ ɹifจͩΒ͚ͷਂ͍ωετʴreturnࢄࡏ • ͦͷׂʹίʔυͱExcelʹࠩ • ֓؍ʢϩθολετʔϯʣҎ֎ഇࢭ
• όϦσʔγϣϯϒϩοΫΛΓग़ͯ͠ ʮιϑτΣΞͷอकੑʯΛॏࢹ ɹif … ɹɹif … ɹɹɹif … ɹɹɹɹreturn; ɹɹelse if … ɹɹɹif … ɹɹɹɹreturn; ɹ# validation ɹif … ɹɹreturn; ɹ ɹ# main logic ɹ…… ɹ…… No Docs
ɹ υΩϡϝϯτ͋͘·Ͱิॿʂ ϑΥʔΧε͖͢ ʮ࣮ࡍʹಈ͘ιϑτΣΞʯ
ɹɹɹɹɹɹ υΩϡϝϯτʁ ɹɹɹɹɹɹ ػೳཁ݅ʁ ɹɹɹɹɹɹ ྑ͍ઃܭʁ ɹਖ਼͍͠ϑΥʔΧε
ɹ ػೳཁ݅ຬͨͤΔ͚Ͳ ࣅͨΑ͏ͳػೳ → ಉ͡APIʹڞ௨Խ͢ΕOKʁ WEBαΠτձһ͚ͷ৽ணϝʔϧ εϚϗΞϓϦͷ৽ணϓογϡ௨
ɹ NGʂҙຯ߹͍͕ҧͬͨʂ ΞϓϦͱWEBαΠτͰϢʔβʔ͕ҧ͏ ↓ ৽ண৴ͱͯ͠ར༻͢ΔϩδοΫҧͬͨ IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹ ΦʔέετϨʔγϣϯ·͕͍ͷͷ Λઃ͚ͨ ɹɹɹ• ݺͼग़͠ݩʹΑΔίϯςΩετͷΓ͚ ɹɹɹ• ࠜͬ͜ʹ͋ΔͷϚΠΫϩαʔϏεతͳൃ View View
View Controller Controller Controller Model
ɹ Ծઆݕূͱͯ͠ͷػೳՃ ʮޙ͔Βফ͍͢͠ʯ؍ͰίʔυΛΓग़͢ ֘ϒϩοΫ͚ͩফͤऴΘΓ ABςετ༻ϝιου ݺͼग़͠ॲཧ private xxx testAB(Hoge
hoge) { ɹɹ…… } public String mainController() { ɹɹ…… ɹɹtestAB(hoge); ɹɹ…… }
ɹ ઌͷػೳཁ͚݅ͩͰͳ͍ʂ ϑΥʔΧε͖͢ ʮϓϩμΫτʹ͓͚Δҙຯʯ ʢυϝΠϯࣝʹґଘ͢Δ͜ͱ͋Δʣ
ɹɹɹɹɹɹ υΩϡϝϯτʁ ɹɹɹɹɹɹ ػೳཁ݅ʁ ɹɹɹɹɹɹ ྑ͍ઃܭʁ ɹਖ਼͍͠ϑΥʔΧε
ɹ “ྑ͍” ͷڞ௨ೝࣝ ݩͷιʔείʔυ͕Ԛ͍ ↓ ʮԿ͕ Better ͳͷ͔ʯҙݟ͕όϥόϥ ↓ ϓϧϦΫͷϨϏϡʔͰᎍΊΔ
ɹ ੈؒͰ “ྑ͍” ͱݴΘΕ͍ͯΔͷ ಡΉ → νʔϜͰ͠߹͏ → શવΘ͔ΒΜʂ →
಄ͷย۱ʹΔ IUUQTXXXPSFJMMZDPKQCPPLTɹɹIUUQXXXTIPFJTIBDPKQCPPLEFUBJMɹɹIUUQXXXTCDSKQQSPEVDUTIUNM IUUQXXXTIPFJTIBDPKQCPPLEFUBJMɹɹIUUQTUIMJHIUDPNCMPHVODMFCPCUIFDMFBOBSDIJUFDUVSFIUNMɹɹIUUQTNBSUJOGPXMFSDPNBSUJDMFTNJDSPTFSWJDFTIUNM
ɹ গͣͭ͠ݟ͑ͯ͘Δ ʹͿ͔ͭΔ → ରԠ͢Δ → ޙ͚Ͱʮ͜Ε͕XXύλʔϯͩͬͨͷͰʁʯ → ঃʑʹʢࣗͨͪͳΓͷʣೝࣝΛἧ͍͑ͯͬͨ
IUUQTXXXQFYFMTDPNQIPUPCMBDLCPBSECVTJOFTTDIBMLCPBSEDPODFQU
ɹ ՄೳͳൣғͰগͣͭ͢͠ ྫʣશͯΛ୲͏CommonClass → ׂͰΓग़͢ ϘʔΠεΧτݪଇ ৮Δ͍ͭͰʹෳࡶΛԼ͛Δ IUUQTXXXQFYFMTDPNQIPUPBEVMUBEWFOUVSFCBDLQBDLEBZMJHIU
“ΠςϨʔγϣϯ” ͱ “ਖ਼͍͠ϑΥʔΧε” ɹϨΨγʔγεςϜಉ͡ దԠ ݕࠪ
ɹ“ιϑτΣΞ” ʹͯ͠ؾ͘ υΩϡϝϯτະөͷ༷ʢʹࠂͷදࣔॱϩδοΫʣ Λࣗओௐࠪ → վળࢪࡦΛఏҊ ఏҊ༰ͦͷ··Ͱͳ͔͕ͬͨ ࢪࡦʹͭͳ͕ͬͨ
IUUQXXXJSBTVUPZBDPNCMPHQPTU@IUNM
ɹຊ͢༰ʢ࠶ܝʣ ৽ถΤϯδχΞ ͍εΩϧϨϕϧ 19νʔϜ͔Βಉ࣌ґཔ ଟ༷ͳεςʔΫϗϧμʔ 10ɾେن ϨΨγʔγεςϜ 4ϲ݄Ͱ120Ҋ݅Λ͘͞ ϢʔβʔΞΫγϣϯ2.8ഒ
ࢼߦࡨޡ ϘτϧωοΫΛ1ͭ1۪ͭʹղফ x ݁ՌతʹΞδϟΠϧϓϥΫςΟε
੍͕ଟ͍ͱ͖ͦ͜ • ϘτϧωοΫͷಛఆͱղফ • ثʢΞδϟΠϧϓϥΫςΟεʣ → ظؒͰՌΛ্͛Δ͜ͱ͕Ͱ͖Δ ɹ͍͑ͨ͜ͱʢ࠶ܝʣ
1. ʲഎܠʳάϩʔεϋοΫͩʂ 2. ʲ՝ʳεςʔΫϗϧμʔ͕Ϡό͍ʂ 3. ʲ՝ʳ։ൃεΩϧ͕Ϡό͍ʂ 4. ʲ՝ʳγεςϜ͕Ϡό͍ʂ 5. ʲ·ͱΊʳΞδϦςΟͩʂ
ɹΞδΣϯμ
ɹॳ݄࣮ 6ରԠ / 27ґཔ
ɹͲͷνʔϜࢪࡦ͕ଧͯͳ͍ ࢪࡦ ࢪࡦ ࢪࡦ Blocker ❌
ɹ࠷ऴ݄࣮ 43ରԠ / 43ґཔ
ɹࢪࡦ͕ಈ͖࢝ΊΔ ࢪࡦ ࢪࡦ ࢪࡦ
ɹΞδϦςΟͷ্ ɹɹɹɹɹx 7.16 6 43
ɹ19νʔϜ͔Βͷ120ґཔ / 4ϲ݄ ґཔݩ Ҋ݅ શମࢪࡦ
ϞχλϦϯά 8&#ू٬ ηΩϡϦςΟ αΠτ#J[ αΠτ%FW αΠτ0QT ΞϓϦ#J[ ΞϓϦ%FT ΞϓϦ%FW ґཔݩ Ҋ݅ όον#J[ όον%FW σʔλαΠΤϯε Πϯϑϥ ج൫վળ αϒαΠτ"%FW αϒαΠτ##J[ αϒαΠτ#%FW αϒαΠτ$%FW ߹ܭ
ɹΞΫγϣϯ 2.8ഒ
ɹຊ͢༰ ৽ถΤϯδχΞ ͍εΩϧϨϕϧ 19νʔϜ͔Βಉ࣌ґཔ ଟ༷ͳεςʔΫϗϧμʔ 10ɾେن ϨΨγʔγεςϜ 4ϲ݄Ͱ120Ҋ݅Λ͘͞ ϢʔβʔΞΫγϣϯ2.8ഒ
ࢼߦࡨޡ ϘτϧωοΫΛ1ͭ1۪ͭʹղফ x ݁ՌతʹΞδϟΠϧϓϥΫςΟε
ɹϘτϧωοΫʹϑΥʔΧε͢Δ 1/ 2 ɹɹɹɹɹɹɹ1. ৫ɾϓϩηε ɹɹɹɹɹɹɹ2. ݸਓεΩϧ ɹɹɹɹɹɹɹ3. γεςϜɾٕज़ ɹɹɹɹɹɹ1ͭ1ͭղফ͍ͯͬͨ͠
ɹϘτϧωοΫʹϑΥʔΧε͢Δ 2 / 2 ࠷େ͖ͳͷಛఆ සൟʹΠςϨʔγϣϯΛճ͢ ↓ ޮՌతͳղফࡦ ݁ՌతʹΞδϟΠϧϓϥΫςΟεʹͳΓ͏Δ
੍͕ଟ͍ͱ͖ͦ͜ • ϘτϧωοΫͷಛఆͱղফ • ثʢΞδϟΠϧϓϥΫςΟεʣ → ظؒͰՌΛ্͛ΒΕΔ ɹ͍͑ͨ͜ͱ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ presented by @yuzutas0