Slide 1

Slide 1 text

2025-09-14 / ॳ৺ऀ޲͚νʔϜ։ൃϒʔτΩϟϯϓ #4 ٕज़ෛ࠴Λ࡞Βͳ͍ͨΊͷ ιϑτ΢ΣΞΞʔΩςΫνϟೖ໳ Katsuya Ogata

Slide 2

Slide 2 text

ࣗݾ঺հ • ໊લ: ॹํ ࠀ࠸ (͓͕ͨ ͔ͭ΍) • ॴଐ: େࡕେֶ৘ใֶݚڀՊ • झຯ: ొࢁ/ਭ຾/৯ࣄ • ࠷ۙϋϚͬͯΔ͜ͱ: ࣗ୐αʔόʔ • X: @ogata_katsuya • ݸਓ: www.ogatakatsuya.com

Slide 3

Slide 3 text

ॳ৺ऀ޲͚νʔϜ։ൃϒʔτΩϟϯϓ #4

Slide 4

Slide 4 text

ຊߨ࠲ͷ໨త AI࣌୅ʹ΋௨༻͢ΔΤϯδχΞϦϯάྗཆ੒ߨ࠲ • AI͕ίʔυΛϞϦϞϦॻ͍ͯ͘ΕΔ͔Βͦ͜ɺઃܭྗ΍νʔϜ։ൃͷεΩϧ ͕ɺΑΓڧ͘ٻΊΒΕ͍ͯΔ • όΠϒίʔσΟϯάΛߦ͏͜ͱʹΑΓɺجૅతͳ஌ࣝ΍ٕज़Λ࣋ͨͳ͍·· ϓϩμΫτ։ൃΛߦͳ͍ͬͯ͘ͷ͸ةݥʂ • ΑΓAIΛຯํʹ͚ͭͯɺΑΓྑ͍ΤϯδχΞϦϯάΛ͍ͯͨ͘͠Ίͷߨ࠲

Slide 5

Slide 5 text

ॳ৺ऀ޲͚νʔϜ։ൃϒʔτΩϟϯϓ #4

Slide 6

Slide 6 text

ΞʔΩςΫνϟͱ͸ʁ ͳʹͦΕ͓͍͍͠ͷʁʁ🤤 • γεςϜશମͷࢥ૝ • ॊೈʹมԽ͢Δ΋ͷΛड͚ೖΕΔͨΊʹɺมԽͤ͞ͳ͍γεςϜͷࠎ૊Έ • ཁ݅΍࢓༷͸มΘ͍ͬͯ͘΋ͷͩͱ૝ఆ͢Δ • ͦͷ্ͰɺॊೈʹରԠͰ͖ΔΑ͏ͳΞʔΩςΫνϟΛબ୒͢Δ • ϓϩδΣΫτͷ్தͰΞʔΩςΫνϟΛ࡮৽͢Δ͜ͱ͸ඇৗʹίετͱϦεΫ ͕ߴ͘ͳͬͯ͠·͏ • ϓϩδΣΫτͷॳظʹ৻ॏ͔ͭ൵؍తʹઃܭΛ͢Δ͜ͱ͕؊ཁ

Slide 7

Slide 7 text

ιϑτ΢ΣΞΞʔΩςΫνϟ ͳͥιϑτ΢ΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • AI͸ਖ਼͘͠ಈ͍ͯ͘ΕΔίʔυΛੜ੒͢Δ͜ͱʹ௕͚͍ͯΔ • ͔͠͠ɺ௕ظతͳ໨ઢͰݟͨͱ͖ʹɺ࠷ྑͱ͸ݴ͑ͳ͍ • ৽͍͠ϝϯόʔ͕ίʔυΛཧղ͢Δͷʹ͕͔͔࣌ؒΔ • ػೳ௥ՃΛ͠Α͏ͱࢥͬͨΒมߋՕॴ͕๲େʹͳΔ • όά͕ൃੜ͠΍͍͢ίʔυʹͳͬͯ͠·͏ • ਓ͕ؒཧղͰ͖ͳ͍ίʔυʹͳͬͯ͠·͏

Slide 8

Slide 8 text

ιϑτ΢ΣΞΞʔΩςΫνϟ ͳͥιϑτ΢ΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • ΞʔΩςΫνϟ͸ɺAIʹʮͲΜͳܗͰίʔυΛॻ͔ͤΔ͔ʯͷ౔୆ʹͳͬͯ͘ ΕΔ • ςετΛॻ͖΍͘͢ͳΔ • ੹຿Λద੾ʹ෼཭͢Δ͜ͱͰ෼ۀ͕͠΍͘͢ͳΔ • ΞʔΩςΫνϟΛઃఆ͓ͯ͘͜͠ͱͰɺͦΕҎ߱ͷAIͷग़ྗ΋҆ఆͯ͘͠Δ

Slide 9

Slide 9 text

ຊߨٛͷείʔϓ • ΍Δ͜ͱ • ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ • อकੑɾ֦ுੑΛ࣋ͬͨιϑτ΢ΣΞΞʔΩςΫνϟ • ΍Βͳ͍͜ͱ • ϚΠΫϩαʔϏε or ϞϊγϦοΫ • ΠϯϑϥͷབྷΉγεςϜઃܭ

Slide 10

Slide 10 text

͓඼ॻ͖ 1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ 2. ϨΠϠʔυΞʔΩςΫνϟͷ঺հ 3. ( ͕࣌ؒ͋Ε͹ ) ࣮ફྫ 4. ίʔυ඼࣭ͱτϨʔυΦϑ 5. ·ͱΊ

Slide 11

Slide 11 text

1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़

Slide 12

Slide 12 text

Bad Code

Slide 13

Slide 13 text

Good Code

Slide 14

Slide 14 text

ωετΛਂ͘͠ͳ͍ Early returnͱcontinue/breakΛ׆༻͢Δ • ifจͷωετ͕ਂ͘ͳΔͷΛ๷͙ • 🙅 If A -> if B -> ॲཧ • 🙆 If !A return -> if !B return -> ॲཧ • forจதͷifจ΋continue/breakΛ༻͍͙ͯ͢ൈ͚Δ

Slide 15

Slide 15 text

Bad Code

Slide 16

Slide 16 text

Good Code

Slide 17

Slide 17 text

σʔλͱॲཧ͸͍ۙ৔ॴʹஔ͘ ϏδωεϩδοΫ͸σʔλΫϥεʹدͤΔ • σʔλΫϥεʹؔ࿈͢ΔϩδοΫ͸ಉ͡৔ॴʹஔ͘ • σόοΫ࣌΍࢓༷มߋ࣌ʹՄಡੑɾมߋ༰қੑ͕޲্͢Δ • σʔλΫϥεͷॳظԽ࣌ʹෆਖ਼஋͕ೖΒͳ͍Α͏ʹݕূ͢Δ • ϩʔΧϧม਺ΛΠϛϡʔλϒϧʹ͢Δ͜ͱͰ༧ظͤ͵্ॻ͖Λ๷͙ • PythonͰ͸Ͱ͖ͳ͍͕ɺϝιουͷҾ਺΋Πϛϡʔλϒϧʹ͢Δͱྑ͍

Slide 18

Slide 18 text

Bad Code

Slide 19

Slide 19 text

Good Code

Slide 20

Slide 20 text

σʔλܕΛ׆༻͢Δ ؔ਺ͷ໭Γ஋ʹܕΛར༻͢Δ • ؔ਺ͷ໭Γ஋ʹϓϦϛςΟϒܕ(bool, int, fl oat, double, string)͔͠༻͍ͳ͍ • ϓϦϛςΟϒܕࣥண • ໭Γ஋ͷΞϊςʔγϣϯʹ΋σʔλܕΛ༻͍Δ͜ͱͰɺՄಡੑΛ޲্ͤ͞Δ • ΤϥʔͱҰॹʹ݁ՌΛฦ͢Resultܕͱ͍͏ͷ΋ଘࡏ͢Δ • TypeScript, Rust, Golang etc…

Slide 21

Slide 21 text

Bad Code

Slide 22

Slide 22 text

Good Code

Slide 23

Slide 23 text

੹຿Λద੾ʹ෼཭͢Δ ୯Ұ੹೚ͷ๏ଇ / ؔ৺ͷ෼཭ • ͳΜͰ΋Ͱ͖ͪΌ͏Ϋϥε(ਆΫϥε)Λ࡞Βͳ͍ • ੹຿ʹԠͯ͡ద੾ʹ෼͚ͯ͋͛Δ • ςετ͕΍Γ΍͘͢ͳΔ • ϦϑΝΫλϦϯά͕͠΍͘͢ͳΔ • ֤ίϯϙʔωϯτΛૄ݁߹ʹอͭ͜ͱ͕ॏཁ • SOLIDݪଇΛࢀর͢Δͱྑ͍

Slide 24

Slide 24 text

ΠϯλʔϑΣʔεͱϩδοΫΛ෼཭͢Δ ϩδοΫΛӅṭͯ͠ΠϯλʔϑΣʔε͚ͩΛެ։͢Δ • ϩδοΫ͕ີ݁߹ʹͳΒͳ͍ͨΊʹɺΠϯλʔϑΣʔεʹґଘͯ͠΋Β͏ • มߋ༰қੑ / Մಡੑ্͕͕Δ • νʔϜ։ൃ͕΍Γ΍͘͢ͳΔ • ܨ͗͜ΈͷࡍʹɺΠϯλʔϑΣʔε͚ͩΛҙࣝ͢Ε͹ྑ͍ • ࠓޙɺ͞Βʹ௥Ճ͞ΕΔՄೳੑ͕͋Δͳͱ͍͏࣌ʹ࢖͏ͱྑ͍ • ΠϯλʔϑΣʔεͷߟ͑ํΛ׆༻Ͱ͖ΔΑ͏ʹͳΔͱάοͱϨϕϧ্͕͕Δ

Slide 25

Slide 25 text

Bad Code

Slide 26

Slide 26 text

Good Code

Slide 27

Slide 27 text

Bad Code

Slide 28

Slide 28 text

Good Code

Slide 29

Slide 29 text

ͦͷଞͷٕज़ • Θ͔Γ΍໋໊͍͢Λ৺͕͚Δ • ϚδοΫφϯόʔΛආ͚Δ • ద੾ʹίϝϯτΛೖΕΔ • কདྷඞཁʹͳΔ͔΋ɻɻɻͱ͍͏ίʔυ͸ೖΕͳ͍ɺඞཁʹͳͬͨΒ࣮૷͢Δ • YAGNIݪଇ • ඞཁແ͘ͳͬͨίʔυ͸͙͢ʹফ͢ • ίʔυ͕ॏෳ͍ͯ͠ͳ͍͔Λ֬ೝ͢Δ • DRYݪଇ

Slide 30

Slide 30 text

2. ϨΠϠʔυΞʔΩςΫνϟͷ঺հ

Slide 31

Slide 31 text

ϨΠϠʔυΞʔΩςΫνϟͱ͸ ֤૚Ͱ੹຿Λ෼ׂɾӅṭ͢Δ ϨΠϠʔ ໾ׂ ۩ମྫ Presentation ϢʔβʔΠϯλʔϑΣʔε HTTP ϦΫΤετͷॲཧ REST/GraphQL Webϖʔδ Application Ϣʔεέʔεͷ࣮૷ υϝΠϯɾΠϯϑϥΛར༻ͨ͠ॲཧϑϩʔ Usecase૚ Domain ϏδωεϩδοΫ γεςϜͷ֩ͱͳΔ෦෼ UserΫϥε ProductΫϥε Infrustructure σʔλϕʔεΞΫηε ֎෦APIݺͼग़͠ Repository૚ Infrustructure૚

Slide 32

Slide 32 text

୅දతͳϨΠϠʔυΞʔΩςΫνϟ • ΫϦʔϯΞʔΩςΫνϟ • ΦχΦϯΞʔΩςΫνϟ • ϔΩαΰφϧΞʔΩςΫνϟ • ໊લ͕ҧ͏͚ͩͰ໨త͸ಉ͡ • ؔ৺ͷ෼཭ • ςετ͠΍͘͢ • υϝΠϯΛத৺ʹ • MVC (Model - View - Controller)

Slide 33

Slide 33 text

ॲཧͷྲྀΕ 1. Controller૚͕HTTPϦΫΤετΛड͚औͬͯద੾ʹॲཧ͢Δ 2. Usecase૚ʹड͚औͬͨσʔλΛҾ͖౉͢ 3. Usecase૚ͰॲཧͷྲྀΕΛهड़͢Δ 1. Usecase૚ͰDomainϞσϧʹม׵͢Δ 2. ඞཁ͕͋Ε͹Repository૚Λར༻ͯ͠σʔλΛऔಘ͢Δ 4. Controller૚ͰHTTPϨεϙϯεܕʹม׵ͯ͠ฦ͢

Slide 34

Slide 34 text

3. ࣮ફྫ

Slide 35

Slide 35 text

ϨΠϠʔυΞʔΩςΫνϟͷ࣮ફྫ ؆୯ͳUserͷCRUDૢ࡞Λ͢ΔAPI Userͷऔಘͱొ࿥ͷΈΛѻ͏

Slide 36

Slide 36 text

DTOͷܕఆٛ

Slide 37

Slide 37 text

Controller૚ͷॲཧ

Slide 38

Slide 38 text

Usecase૚ͷॲཧ

Slide 39

Slide 39 text

Domain૚ͷॲཧ

Slide 40

Slide 40 text

Repository૚ͷॲཧ

Slide 41

Slide 41 text

(༨ஊ) ࣮૷ྫ https://clouddirect.jp.fujitsu.com/service/navi-words-osi_reference_model

Slide 42

Slide 42 text

(༨ஊ) ࣮૷ྫ • τϥϯεϙʔτ૚ • TCP / UDPͱ͍ͬͨϓϩτίϧΛѻ͏૚ • ओʹɺ௨৴ͷ৴པੑΛ޲্ɾ୲อ͢ΔͨΊͷ૚ • ωοτϫʔΫٕज़ͷҧ͍Λٵऩͯ͠ΞϓϦέʔγϣϯ૚ʹωοτϫʔΫͷ ੾ΓޱΛݟͤͯ͋͛Δ • جຊతͳελϯεͱͯ͠͸ωοτϫʔΫΛ৴པ͍ͯ͠ͳ͍ • ͦͷͨΊʹɺ࠶ૹॲཧ౳Λߦ͏

Slide 43

Slide 43 text

4. ίʔυ඼࣭ͱτϨʔυΦϑ

Slide 44

Slide 44 text

Α͠ɺ৽͍͠ ϓϩδΣΫτΛ্ཱͪ͛Δͧ💨

Slide 45

Slide 45 text

ͱΓ͋͑ͣ ϨΠϠʔυΞʔΩςΫνϟͰ࣮૷͢Δͧ💪

Slide 46

Slide 46 text

ϞϊγϦοΫͳίʔυ͸શͯѱͩ👿

Slide 47

Slide 47 text

🙅

Slide 48

Slide 48 text

ΞʔΩςΫνϟͷબఆ ΞʔΩςΫνϟ͸͞·͟·ͳཁૉΛؑΈͯҙࢥܾఆΛߦ͏ https://speakerdeck.com/snoozer05/software-architecture-and-decision-making?slide=45

Slide 49

Slide 49 text

ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͸͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • Ϗδωε • ͍ͭ·ͰʹϦϦʔε͍͔ͨ͠ • αʔϏεͷٻΊΔύϑΥʔϚϯεɾηΩϡϦςΟཁ݅ • ૊৫ • ͲΜͳεΩϧηοτͷਓ͕͍ͯɺͲΕ͘Β͍ͷਓ਺Ͱ։ൃ͢Δ͔ • ٕज़ • ͲΜͳݴޠɾϑϨʔϜϫʔΫΛ༻͍ͯ։ൃΛߦ͏͔

Slide 50

Slide 50 text

ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͸͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • ΞʔΩςΫνϟ͸͋͘·Ͱखஈ • ໨తʹ߹Θͤͯద੾ͳબఆΛߦ͏͜ͱ͕ॏཁ • ͦΕͧΕͷΞʔΩςΫνϟͷϝϦοτɾσϝϦοτΛద੾ʹཧղͯ͠ɺҙࢥܾ ఆΛߦ͏͜ͱ͕େ੾ • ͍͘Βίʔυ͕៉ྷͰɺςετͷΧόϨοδ͕ߴͯ͘΋ϢʔβʔʹՁ஋ఏڙͰ ͖ͳ͚Ε͹ҙຯ͕ͳ͍

Slide 51

Slide 51 text

ٕज़తෛ࠴ͱͷ޲͖߹͍ํ ٕज़తෛ࠴ʹѱͰ͸ͳ͍ • Ϗδωε΍ϓϩδΣΫτਪਐ͢ΔͨΊͷٕज़తෛ࠴ͳΒ🙆 • Ϗδωε͕੒ޭ͢Ε͹ͦ͜ͰಘͨࢿۚͰෛ࠴Λฦ͍͚ͯ͠͹ྑ͍ • ԾʹϨΨγʔͳίʔυ΍ɺՁ஋؍ͷ߹Θͳ͍ίʔυͱग़ձͬͯ΋࣮૷ͨ͠ਓ ΁ͷϦεϖΫτΛ๨Εͳ͍ • Some Respect For Legacy Code

Slide 52

Slide 52 text

5. ·ͱΊ

Slide 53

Slide 53 text

·ͱΊ • AI࣌୅ͦ͜ɺιϑτ΢ΣΞΞʔΩςΫνϟͷઃܭྗ͕ॏཁ • ྑ͍ίʔυΛॻ͘͜ͱͰอकੑΛ্͛Δ͜ͱ͕Ͱ͖Δ • ྑ͍ίʔυΛॻٕ͘ज़Λద੾ʹ࢖͍ͬͯ͘͜ͱ͕ॏཁ • ༷ʑͳιϑτ΢ΣΞΞʔΩςΫνϟ͕ଘࡏ͢Δ • ͦΕͧΕͷੑ࣭ʹ߹Θͤͯద੾ʹબ୒ɾ׆༻͢Δ͜ͱ͕ॏཁ • ίʔυ඼࣭ͱͦͷτϨʔυΦϑ͕ଘࡏ͢Δ͜ͱΛཧղͯ͠ӡ༻͍ͯ͘͠ඞཁ͕ ͋Δ

Slide 54

Slide 54 text

ࢀߟจݙ • ॻ੶ • ྑ͍ίʔυ/ѱ͍ίʔυͰֶͿઃܭೖ໳ • Good Code, Bad Code • ೴ʹऩ·Δίʔυͷॻ͖ํ • ΢Σϒϖʔδ • ͜Ε͔ΒֶͿਓͷͨΊͷιϑτ΢ΣΞΞʔΩςΫνϟೖ໳ • Software Architecture in an AI-Driven World • ιϑτ΢ΣΞΞʔΩςΫνϟݚमʲMIXI 25৽ଔٕज़ݚमʳ

Slide 55

Slide 55 text

Q&A