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
48
ソフトウェアアーキテクチャ入門
Ogata Katsuya
September 13, 2025
Tweet
Share
More Decks by Ogata Katsuya
See All by Ogata Katsuya
Kubernetesで分散処理をやってみる-Kafkaを添えて-
ogatakatsuya
0
44
大学のサークルプラットフォームを作った話
ogatakatsuya
0
70
Go College
ogatakatsuya
0
78
文化祭で使うアプリを1人で作った話
ogatakatsuya
0
63
twitter-cloneを作った話
ogatakatsuya
0
32
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
GitHub's CSS Performance
jonrohan
1032
460k
Side Projects
sachag
455
43k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
KATA
mclloyd
32
14k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Code Review Best Practice
trishagee
70
19k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
A designer walks into a library…
pauljervisheath
207
24k
Being A Developer After 40
akosma
90
590k
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