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
ソフトウェアアーキテクチャ入門 / Introduction to Software Arch...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ogata Katsuya
September 13, 2025
2
150
ソフトウェアアーキテクチャ入門 / Introduction to Software Architecture
Ogata Katsuya
September 13, 2025
Tweet
Share
More Decks by Ogata Katsuya
See All by Ogata Katsuya
Defensive LLM Calling
ogatakatsuya
0
170
AIで加速する文化祭ソフトウェア開発 / Software Development for School Festivals Accelerated by AI
ogatakatsuya
0
39
Vibe-Coding で作ったアプリを 文化祭で運用した話 / The story of running an app I built with Vibe-Coding at a school festival
ogatakatsuya
1
160
ハッカソンの勘所とエンジニアリングへの活かし方 / What Hackathons Teach Us and How to Bring That into Engineering
ogatakatsuya
0
41
Kubernetesで分散処理をやってみる-Kafkaを添えて-
ogatakatsuya
0
230
大学のサークルプラットフォームを作った話
ogatakatsuya
0
120
Go College
ogatakatsuya
0
140
文化祭で使うアプリを1人で作った話
ogatakatsuya
0
110
twitter-cloneを作った話
ogatakatsuya
0
66
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
The Cost Of JavaScript in 2023
addyosmani
55
9.7k
Building Applications with DynamoDB
mza
96
6.9k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
70
Designing for Performance
lara
611
70k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
450
Statistics for Hackers
jakevdp
799
230k
Done Done
chrislema
186
16k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
470
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
230
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