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
ソフトウェアアーキテクチャ入門
Search
Ogata Katsuya
September 13, 2025
0
92
ソフトウェアアーキテクチャ入門
Ogata Katsuya
September 13, 2025
Tweet
Share
More Decks by Ogata Katsuya
See All by Ogata Katsuya
Kubernetesで分散処理をやってみる-Kafkaを添えて-
ogatakatsuya
0
200
大学のサークルプラットフォームを作った話
ogatakatsuya
0
88
Go College
ogatakatsuya
0
96
文化祭で使うアプリを1人で作った話
ogatakatsuya
0
77
twitter-cloneを作った話
ogatakatsuya
0
51
Featured
See All Featured
Fireside Chat
paigeccino
41
3.7k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
930
Practical Orchestrator
shlominoach
190
11k
Building Applications with DynamoDB
mza
96
6.7k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
The World Runs on Bad Software
bkeepers
PRO
72
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.7k
A designer walks into a library…
pauljervisheath
209
24k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Faster Mobile Websites
deanohume
310
31k
Transcript
2025-09-14 / ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4 ٕज़ෛ࠴Λ࡞Βͳ͍ͨΊͷ ιϑτΣΞΞʔΩςΫνϟೖ Katsuya Ogata
ࣗݾհ • ໊લ: ॹํ ࠀ࠸ (͓͕ͨ ͔ͭ) • ॴଐ: େࡕେֶใֶݚڀՊ
• झຯ: ొࢁ/ਭ/৯ࣄ • ࠷ۙϋϚͬͯΔ͜ͱ: ࣗαʔόʔ • X: @ogata_katsuya • ݸਓ: www.ogatakatsuya.com
ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4
ຊߨ࠲ͷత AI࣌ʹ௨༻͢ΔΤϯδχΞϦϯάྗཆߨ࠲ • AI͕ίʔυΛϞϦϞϦॻ͍ͯ͘ΕΔ͔Βͦ͜ɺઃܭྗνʔϜ։ൃͷεΩϧ ͕ɺΑΓڧ͘ٻΊΒΕ͍ͯΔ • όΠϒίʔσΟϯάΛߦ͏͜ͱʹΑΓɺجૅతͳٕࣝज़Λ࣋ͨͳ͍·· ϓϩμΫτ։ൃΛߦͳ͍ͬͯ͘ͷةݥʂ • ΑΓAIΛຯํʹ͚ͭͯɺΑΓྑ͍ΤϯδχΞϦϯάΛ͍ͯͨ͘͠Ίͷߨ࠲
ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4
ΞʔΩςΫνϟͱʁ ͳʹͦΕ͓͍͍͠ͷʁʁ🤤 • γεςϜશମͷࢥ • ॊೈʹมԽ͢ΔͷΛड͚ೖΕΔͨΊʹɺมԽͤ͞ͳ͍γεςϜͷࠎΈ • ཁ༷݅มΘ͍ͬͯ͘ͷͩͱఆ͢Δ • ͦͷ্ͰɺॊೈʹରԠͰ͖ΔΑ͏ͳΞʔΩςΫνϟΛબ͢Δ
• ϓϩδΣΫτͷ్தͰΞʔΩςΫνϟΛ৽͢Δ͜ͱඇৗʹίετͱϦεΫ ͕ߴ͘ͳͬͯ͠·͏ • ϓϩδΣΫτͷॳظʹ৻ॏ͔ͭ൵؍తʹઃܭΛ͢Δ͜ͱ͕؊ཁ
ιϑτΣΞΞʔΩςΫνϟ ͳͥιϑτΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • AIਖ਼͘͠ಈ͍ͯ͘ΕΔίʔυΛੜ͢Δ͜ͱʹ͚͍ͯΔ • ͔͠͠ɺظతͳઢͰݟͨͱ͖ʹɺ࠷ྑͱݴ͑ͳ͍ • ৽͍͠ϝϯόʔ͕ίʔυΛཧղ͢Δͷʹ͕͔͔࣌ؒΔ • ػೳՃΛ͠Α͏ͱࢥͬͨΒมߋՕॴ͕େʹͳΔ
• όά͕ൃੜ͍͢͠ίʔυʹͳͬͯ͠·͏ • ਓ͕ؒཧղͰ͖ͳ͍ίʔυʹͳͬͯ͠·͏
ιϑτΣΞΞʔΩςΫνϟ ͳͥιϑτΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • ΞʔΩςΫνϟɺAIʹʮͲΜͳܗͰίʔυΛॻ͔ͤΔ͔ʯͷʹͳͬͯ͘ ΕΔ • ςετΛॻ͖͘͢ͳΔ • Λదʹ͢Δ͜ͱͰۀ͕͘͢͠ͳΔ •
ΞʔΩςΫνϟΛઃఆ͓ͯ͘͜͠ͱͰɺͦΕҎ߱ͷAIͷग़ྗ҆ఆͯ͘͠Δ
ຊߨٛͷείʔϓ • Δ͜ͱ • ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ • อकੑɾ֦ுੑΛ࣋ͬͨιϑτΣΞΞʔΩςΫνϟ • Βͳ͍͜ͱ •
ϚΠΫϩαʔϏε or ϞϊγϦοΫ • ΠϯϑϥͷབྷΉγεςϜઃܭ
͓ॻ͖ 1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ 2. ϨΠϠʔυΞʔΩςΫνϟͷհ 3. ( ͕࣌ؒ͋Ε ) ࣮ફྫ
4. ίʔυ࣭ͱτϨʔυΦϑ 5. ·ͱΊ
1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़
Bad Code
Good Code
ωετΛਂ͘͠ͳ͍ Early returnͱcontinue/breakΛ׆༻͢Δ • ifจͷωετ͕ਂ͘ͳΔͷΛ͙ • 🙅 If A ->
if B -> ॲཧ • 🙆 If !A return -> if !B return -> ॲཧ • forจதͷifจcontinue/breakΛ༻͍͙ͯ͢ൈ͚Δ
Bad Code
Good Code
σʔλͱॲཧ͍ۙॴʹஔ͘ ϏδωεϩδοΫσʔλΫϥεʹدͤΔ • σʔλΫϥεʹؔ࿈͢ΔϩδοΫಉ͡ॴʹஔ͘ • σόοΫ༷࣌มߋ࣌ʹՄಡੑɾมߋ༰қੑ্͕͢Δ • σʔλΫϥεͷॳظԽ࣌ʹෆਖ਼͕ೖΒͳ͍Α͏ʹݕূ͢Δ • ϩʔΧϧมΛΠϛϡʔλϒϧʹ͢Δ͜ͱͰ༧ظͤ͵্ॻ͖Λ͙
• PythonͰͰ͖ͳ͍͕ɺϝιουͷҾΠϛϡʔλϒϧʹ͢Δͱྑ͍
Bad Code
Good Code
σʔλܕΛ׆༻͢Δ ؔͷΓʹܕΛར༻͢Δ • ؔͷΓʹϓϦϛςΟϒܕ(bool, int, fl oat, double, string)͔͠༻͍ͳ͍ •
ϓϦϛςΟϒܕࣥண • ΓͷΞϊςʔγϣϯʹσʔλܕΛ༻͍Δ͜ͱͰɺՄಡੑΛ্ͤ͞Δ • ΤϥʔͱҰॹʹ݁ՌΛฦ͢Resultܕͱ͍͏ͷଘࡏ͢Δ • TypeScript, Rust, Golang etc…
Bad Code
Good Code
Λదʹ͢Δ ୯Ұͷ๏ଇ / ؔ৺ͷ • ͳΜͰͰ͖ͪΌ͏Ϋϥε(ਆΫϥε)Λ࡞Βͳ͍ • ʹԠͯ͡దʹ͚ͯ͋͛Δ • ςετ͕Γ͘͢ͳΔ
• ϦϑΝΫλϦϯά͕͘͢͠ͳΔ • ֤ίϯϙʔωϯτΛૄ݁߹ʹอͭ͜ͱ͕ॏཁ • SOLIDݪଇΛࢀর͢Δͱྑ͍
ΠϯλʔϑΣʔεͱϩδοΫΛ͢Δ ϩδοΫΛӅṭͯ͠ΠϯλʔϑΣʔε͚ͩΛެ։͢Δ • ϩδοΫ͕ີ݁߹ʹͳΒͳ͍ͨΊʹɺΠϯλʔϑΣʔεʹґଘͯ͠Β͏ • มߋ༰қੑ / Մಡੑ্͕͕Δ • νʔϜ։ൃ͕Γ͘͢ͳΔ
• ܨ͗͜ΈͷࡍʹɺΠϯλʔϑΣʔε͚ͩΛҙࣝ͢Εྑ͍ • ࠓޙɺ͞ΒʹՃ͞ΕΔՄೳੑ͕͋Δͳͱ͍͏࣌ʹ͏ͱྑ͍ • ΠϯλʔϑΣʔεͷߟ͑ํΛ׆༻Ͱ͖ΔΑ͏ʹͳΔͱάοͱϨϕϧ্͕͕Δ
Bad Code
Good Code
Bad Code
Good Code
ͦͷଞͷٕज़ • Θ͔Γ໋໊͍͢Λ৺͕͚Δ • ϚδοΫφϯόʔΛආ͚Δ • దʹίϝϯτΛೖΕΔ • কདྷඞཁʹͳΔ͔ɻɻɻͱ͍͏ίʔυೖΕͳ͍ɺඞཁʹͳͬͨΒ࣮͢Δ •
YAGNIݪଇ • ඞཁແ͘ͳͬͨίʔυ͙͢ʹফ͢ • ίʔυ͕ॏෳ͍ͯ͠ͳ͍͔Λ֬ೝ͢Δ • DRYݪଇ
2. ϨΠϠʔυΞʔΩςΫνϟͷհ
ϨΠϠʔυΞʔΩςΫνϟͱ ֤ͰΛׂɾӅṭ͢Δ ϨΠϠʔ ׂ ۩ମྫ Presentation ϢʔβʔΠϯλʔϑΣʔε HTTP ϦΫΤετͷॲཧ REST/GraphQL
Webϖʔδ Application Ϣʔεέʔεͷ࣮ υϝΠϯɾΠϯϑϥΛར༻ͨ͠ॲཧϑϩʔ Usecase Domain ϏδωεϩδοΫ γεςϜͷ֩ͱͳΔ෦ UserΫϥε ProductΫϥε Infrustructure σʔλϕʔεΞΫηε ֎෦APIݺͼग़͠ Repository Infrustructure
දతͳϨΠϠʔυΞʔΩςΫνϟ • ΫϦʔϯΞʔΩςΫνϟ • ΦχΦϯΞʔΩςΫνϟ • ϔΩαΰφϧΞʔΩςΫνϟ • ໊લ͕ҧ͏͚ͩͰతಉ͡ •
ؔ৺ͷ • ςετ͘͢͠ • υϝΠϯΛத৺ʹ • MVC (Model - View - Controller)
ॲཧͷྲྀΕ 1. Controller͕HTTPϦΫΤετΛड͚औͬͯదʹॲཧ͢Δ 2. Usecaseʹड͚औͬͨσʔλΛҾ͖͢ 3. UsecaseͰॲཧͷྲྀΕΛهड़͢Δ 1. UsecaseͰDomainϞσϧʹม͢Δ 2.
ඞཁ͕͋ΕRepositoryΛར༻ͯ͠σʔλΛऔಘ͢Δ 4. ControllerͰHTTPϨεϙϯεܕʹมͯ͠ฦ͢
3. ࣮ફྫ
ϨΠϠʔυΞʔΩςΫνϟͷ࣮ફྫ ؆୯ͳUserͷCRUDૢ࡞Λ͢ΔAPI UserͷऔಘͱొͷΈΛѻ͏
DTOͷܕఆٛ
Controllerͷॲཧ
Usecaseͷॲཧ
Domainͷॲཧ
Repositoryͷॲཧ
(༨ஊ) ࣮ྫ https://clouddirect.jp.fujitsu.com/service/navi-words-osi_reference_model
(༨ஊ) ࣮ྫ • τϥϯεϙʔτ • TCP / UDPͱ͍ͬͨϓϩτίϧΛѻ͏ • ओʹɺ௨৴ͷ৴པੑΛ্ɾ୲อ͢ΔͨΊͷ
• ωοτϫʔΫٕज़ͷҧ͍Λٵऩͯ͠ΞϓϦέʔγϣϯʹωοτϫʔΫͷ ΓޱΛݟͤͯ͋͛Δ • جຊతͳελϯεͱͯ͠ωοτϫʔΫΛ৴པ͍ͯ͠ͳ͍ • ͦͷͨΊʹɺ࠶ૹॲཧΛߦ͏
4. ίʔυ࣭ͱτϨʔυΦϑ
Α͠ɺ৽͍͠ ϓϩδΣΫτΛ্ཱͪ͛Δͧ💨
ͱΓ͋͑ͣ ϨΠϠʔυΞʔΩςΫνϟͰ࣮͢Δͧ💪
ϞϊγϦοΫͳίʔυશͯѱͩ👿
🙅
ΞʔΩςΫνϟͷબఆ ΞʔΩςΫνϟ͞·͟·ͳཁૉΛؑΈͯҙࢥܾఆΛߦ͏ https://speakerdeck.com/snoozer05/software-architecture-and-decision-making?slide=45
ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • Ϗδωε • ͍ͭ·ͰʹϦϦʔε͍͔ͨ͠ • αʔϏεͷٻΊΔύϑΥʔϚϯεɾηΩϡϦςΟཁ݅ • ৫
• ͲΜͳεΩϧηοτͷਓ͕͍ͯɺͲΕ͘Β͍ͷਓͰ։ൃ͢Δ͔ • ٕज़ • ͲΜͳݴޠɾϑϨʔϜϫʔΫΛ༻͍ͯ։ൃΛߦ͏͔
ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • ΞʔΩςΫνϟ͋͘·Ͱखஈ • తʹ߹ΘͤͯదͳબఆΛߦ͏͜ͱ͕ॏཁ • ͦΕͧΕͷΞʔΩςΫνϟͷϝϦοτɾσϝϦοτΛదʹཧղͯ͠ɺҙࢥܾ ఆΛߦ͏͜ͱ͕େ •
͍͘Βίʔυ͕៉ྷͰɺςετͷΧόϨοδ͕ߴͯ͘ϢʔβʔʹՁఏڙͰ ͖ͳ͚Εҙຯ͕ͳ͍
ٕज़తෛ࠴ͱͷ͖߹͍ํ ٕज़తෛ࠴ʹѱͰͳ͍ • ϏδωεϓϩδΣΫτਪਐ͢ΔͨΊͷٕज़తෛ࠴ͳΒ🙆 • Ϗδωε͕ޭ͢Εͦ͜ͰಘͨࢿۚͰෛ࠴Λฦ͍͚ͯ͠ྑ͍ • ԾʹϨΨγʔͳίʔυɺՁ؍ͷ߹Θͳ͍ίʔυͱग़ձ࣮ͬͯͨ͠ਓ ͷϦεϖΫτΛΕͳ͍ •
Some Respect For Legacy Code
5. ·ͱΊ
·ͱΊ • AI࣌ͦ͜ɺιϑτΣΞΞʔΩςΫνϟͷઃܭྗ͕ॏཁ • ྑ͍ίʔυΛॻ͘͜ͱͰอकੑΛ্͛Δ͜ͱ͕Ͱ͖Δ • ྑ͍ίʔυΛॻٕ͘ज़Λదʹ͍ͬͯ͘͜ͱ͕ॏཁ • ༷ʑͳιϑτΣΞΞʔΩςΫνϟ͕ଘࡏ͢Δ •
ͦΕͧΕͷੑ࣭ʹ߹Θͤͯదʹબɾ׆༻͢Δ͜ͱ͕ॏཁ • ίʔυ࣭ͱͦͷτϨʔυΦϑ͕ଘࡏ͢Δ͜ͱΛཧղͯ͠ӡ༻͍ͯ͘͠ඞཁ͕ ͋Δ
ࢀߟจݙ • ॻ੶ • ྑ͍ίʔυ/ѱ͍ίʔυͰֶͿઃܭೖ • Good Code, Bad Code
• ʹऩ·Δίʔυͷॻ͖ํ • Σϒϖʔδ • ͜Ε͔ΒֶͿਓͷͨΊͷιϑτΣΞΞʔΩςΫνϟೖ • Software Architecture in an AI-Driven World • ιϑτΣΞΞʔΩςΫνϟݚमʲMIXI 25৽ଔٕज़ݚमʳ
Q&A