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
Ogata Katsuya
September 13, 2025
2
130
ソフトウェアアーキテクチャ入門 / 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
150
AIで加速する文化祭ソフトウェア開発 / Software Development for School Festivals Accelerated by AI
ogatakatsuya
0
31
Vibe-Coding で作ったアプリを 文化祭で運用した話 / The story of running an app I built with Vibe-Coding at a school festival
ogatakatsuya
1
150
ハッカソンの勘所とエンジニアリングへの活かし方 / What Hackathons Teach Us and How to Bring That into Engineering
ogatakatsuya
0
37
Kubernetesで分散処理をやってみる-Kafkaを添えて-
ogatakatsuya
0
220
大学のサークルプラットフォームを作った話
ogatakatsuya
0
110
Go College
ogatakatsuya
0
130
文化祭で使うアプリを1人で作った話
ogatakatsuya
0
110
twitter-cloneを作った話
ogatakatsuya
0
64
Featured
See All Featured
We Are The Robots
honzajavorek
0
170
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Crafting Experiences
bethany
1
50
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
The Curse of the Amulet
leimatthew05
1
8.7k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
260
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.1k
Producing Creativity
orderedlist
PRO
348
40k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
330
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