FOLIO ͷϚΠΫϩαʔϏε in Action2019/10/26 ΉΒΈΜ (ଜ্)Scalaؔαϛοτ2019Copyright © 2019 FOLIO, Ltd. All Rights Reserved.1
View Slide
ଜ্ (@Mura-Mi or @mura_mi)ΞϓϦέʔγϣϯΤϯδχΞ in FOLIO͜Ε·ͰͷΩϟϦΞ:* Simplex, Inc. (2012~2016)* CyberAgent AdTech Studio (2016~2018)* FOLIO (2018~ )$ whoami2
ࠓ͢͜ͱ3 '0-*0ͷ͔ΜͨΜͳհ ϛΫϩ ୯ମαʔϏεͷ ٕज़ελοΫ ϨΠϠΞʔΩςΫνϟ 'JOBHMF6TBHF ϚΫϩ αʔϏεશମͷ Ͳ͏αʔϏεΛ͚Δ͔ ҆ఆӡ༻ͷίπ ࠓޙͷ՝
FOLIO ͱʁ4
ScalaؔSummit 2018 ʮScalaͰͭ͘Δূ݊ձࣾͱελʔτΞοϓʯΑΓhttps://speakerdeck.com/mura_mi/securities-and-startup-with-scala?slide=198ڈͷ ScalaؔSummit Ͱ…
։ൃ։࢝FOLIO ͷ͔ΜͨΜͳྺ࢙9 ۀςʔϚࢿЌαʔϏε։࢝ςʔϚࢿ-*/&ͱ࿈ܞ։͓࢝·͔ͤࢿαʔϏε։࢝ϫϯίΠϯࢿαʔϏε։࢝"84Ҡߦ։࢝ਖ਼ࣜαʔϏε։࢝
ϛΫϩͳ10Photo by Darius Cotoi on Unsplash
Scala11 ۀ͔࣌Β4DBMBϚΠΫϩαʔϏεͰ։ൃΛελʔτ υϝΠϯࣝͷදݱྗ +7.֎෦ػؔγεςϜͱͷۚ༥ಛ༗ͷϓϩτίϧ4%,ʹରԠ͍͢͠
Finagle, Finatra, TwitterServer12 'JOBHMF5XJUUFSࣾͷ31$ϑϨʔϜϫʔΫ 5XJUUFS4FSWFS5XJUUFSͰͷ'JOBHMFαʔόʔΛηοτΞοϓ͢Δͱ͖ͷςϯϓϨʔτΛ044Խͨ͠ͷ 'JOBUSB'JOBHMFͱ5XJUUFS4FSWFSΛར༻ͨ͠ΞϓϦέʔγϣϯϑϨʔϜϫʔΫɽϧʔςΟϯά%4-%*Λఏڙ ຖ݄ϦϦʔε͕͋Δ WFS͕ZZZZNNܗࣜ$BM7FSͱ͍͏
Thrift13 'BDFCPPL͕։ൃͨ͠31$ϑϨʔϜϫʔΫΠϯλʔϑΣΠεఆٛݴޠ͓ΑͼόΠφϦ௨৴ϓϩτίϧ 'JOBUSB͕ओʹαϙʔτ͍ͯ͠Δͷ͕)551 3&45"1*͓Αͼ5ISJGU *%-ͷ͋Δ31$ϓϩτίϧͷඞཁੑܕ҆શɼ໌֬ͳ"1*ͷεΩʔϚཧ '0-*0্ཱͪ͛ظʹH31$͕·ͩਖ਼ࣜϦϦʔεͷஈ֊Ͱͳ͔ͬͨ
ϨΠϠυΞʔΩςΫνϟ14Photo by Burhan Rexhepi on Unsplash
* ؔ৺ͷΛ࣮ݱ͢Δ্ͰɼϏδωεϧʔϧͷ࣮ΛΠϯϑϥ (ϑϨʔϜϫʔΫϛυϧΣΞ) ʹґଘͤ͞ͳ͍ɽ* ϑϨʔϜϫʔΫϛυϧΣΞͷબࢶ͕࣮࣭1͔ͭ͠ແ͍৫ͰɼυϝΠϯͷ࣮ΛϐϡΞʹอͭ͜ͱͰϏδωεϧʔϧͷมߋͳͲʹॊೈʹରԠͰ͖ΔΑ͏ʹͳΔɽ15ΫϦʔϯΞʔΩςΫνϟ
FOLIO ͰͷయܕతͳϨΠϠΞʔΩςΫνϟ16EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEM '0-*0ͷϚΠΫϩαʔϏεʹ͓͚ΔϨΠϠ͚Λنఆ͢ΔࣾϑϨʔϜϫʔΫಛʹଘࡏ͠ͳ͍ ֤αʔϏεͷ։ൃ։࢝࣌ظʹΑͬͯΒ͖ͭ͋Δ͕ɼ࠷ۙͷαʔϏεͷߏ͓͓Αͦ͜ͷ༷ʹͳ͍ͬͯΔ ͜ͷίϯϙʔωϯτͦΕͧΕΛTCUͷαϒϓϩδΣΫτͱͯ͠ఆٛ͠ɼґଘͷҧίϯύΠϧ͕௨Βͳ͍Α͏ʹ͍ͯ͠Δ
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMdomain ϨΠϠ17 ͍ΘΏΔʮϏδωεͷؔ৺ࣄʯ ΤϯςΟςΟɺΦϒδΣΫτ ϦϙδτϦఆٛ USBJU ࣮͕Ͳͷ༷ʹͳ͍ͬͯΔ͔ͳΔ͘Ӆ͢ 3%# 3FEJT ώʔϓΩϟογϡ ଞϚΠΫϩαʔϏε EPNBJO
PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ) = גՁ / BPS18value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉ
PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ) = גՁ / BPS18value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉϓϦϛςΟϒϥοϓ͢Δ
PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ) = גՁ / BPS18value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉࣜΛϝιουͱͯ͠ද͢
ఆ͚ٛͩॻ͘19֎෦αʔϏεݺͼग़͠ͷఆٛ
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMdomain: Ͳ͜·Ͱִ͢Δʁ20 Ӆ͍ͯ͠Δٕज़ৄࡉ 31$ΞϓϦέʔγϣϯ'8 'JOBHMF'JOBUSB 4DBMB%#Ϛοϐϯά 2VJMM ϓϨθϯςʔγϣϯ 5ISJGU Ӆ͍ͯ͠ͳ͍ٕज़ৄࡉ ඇಉظॲཧΛද͢ܕΫϥε 5XJUUFS'VUVSF δΣωϦοΫϓϩάϥϛϯά TIBQFMFTT ϚΠΫϩαʔϏεͷϝϦοτͱͯ͠ʮٕज़ҟ࣭ੑʯͱ͋Δ͕ɼ࣮ࡍʜ EPNBJO
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMapplication ϨΠϠ21 ʮϢʔεέʔεʯͱݺΕΔ෦ EPNBJOϨΠϠͷࣝΛΈ߹Θͤͯ"1*όον࣮ߦ࣌ͷॲཧ༰Λهड़͢ΔBQQMJDBUJPO
Ϣʔεέʔε Request ͔Β Response ͷؔͰ͋Δ22use case trait
Just pure Scala case class23DTO implementation
۩ମతͳܕύϥϝʔλʔΛͯΊΔͱʁ24use case implementation
࣮ࡍʹ͍ͬͯΔॲཧʁ25use case implementation
࣮ࡍʹ͍ͬͯΔॲཧʁ25use case implementationEPNBJOϨΠϠͷૢ࡞
࣮ࡍʹ͍ͬͯΔॲཧʁ25use case implementationϢʔεέʔεݻ༗ͷॲཧϢʔεέʔεݻ༗ͷॲཧ
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMapplication: සग़ॲཧͱυϝΠϯͷৠཹ26 BQQMJDBUJPOϨΠϠͰසग़͢Δॲཧ"QQMJDBUJPO4FSWJDFͱݺΜͰڞ௨Խͨ͠Γ "QQMJDBUJPOϨΠϠͱ%PNBJOϨΠϠͷڥᐆດ͕ͩɼBQQΛॻ͖ͳ͕ΒEPNBJOʹ͍࣋ͬͯ͘ &WBOTຊʹग़ͯ͘Δʮৠཹʯॏཁͳ࡞ۀBQQMJDBUJPO
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMpresentation ϨΠϠ27 "1*Λ࣮͢Δٕज़ৄࡉ '0-*0ͩͱຆͲ͕5ISJGUͳͷͰɺϢʔεέʔε%UPͱ5ISJGUͷڮ͠ͳͲ͕ओͳׂQSFTFOUBUJPO
ࣾͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator Converter ͷ΄͏͕͍ۙ(ൺֱత৽͍͠αʔϏεʹͦͷΑ͏ͳωʔϛϯά͋Δ)28RequestAdapter
ࣾͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator Converter ͷ΄͏͕͍ۙ(ൺֱత৽͍͠αʔϏεʹͦͷΑ͏ͳωʔϛϯά͋Δ)28RequestAdapter5ISJGUͷϦΫΤετҾ
ࣾͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator Converter ͷ΄͏͕͍ۙ(ൺֱత৽͍͠αʔϏεʹͦͷΑ͏ͳωʔϛϯά͋Δ)28RequestAdapterϢʔεέʔεͷϦΫΤετ%50
ͻͨ͢Β Thrift ͷੜͷΛ VO ܕʹΊ͜ΜͰ͍͘ 29RequestAdapter implementation
RequestThrift → RequestDto → UseCase → ResponseDto → ResponseThrift30Gateway
RequestThrift → RequestDto → UseCase → ResponseDto → ResponseThrift31Gateway
Gateway ʹ·ͱΊΔͷ DI ʹ͓·͔ͤͯ͠… 32components
Finatra ͷ controller ʹ৯ΘͤΔ33controller
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMpresentation ϨΠϠ34QSFTFOUBUJPO
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMidl35 JEM΄ͱΜͲ5ISJGU*%-ͷΈͰߏ͞ΕͨαϒϓϩδΣΫτ 5ISJGUͷ*%-ͷΈΛೖΕͨKBSϑΝΠϧΛެ։ *%-ͷίϯύΠϧެ։ଆͰͳ͘ར༻͢Δଆͷࣄ ࣗαʔϏεͷ5ISJGU*%-ΛίϯύΠϧJEMJEMJOUFSOBM
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMidl-external36 ґଘ͢ΔϚΠΫϩαʔϏεͷίϯύΠϧΛߦ͏JEMFYUFSOBM
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMinfrastructure37 EPNBJOϨΠϠͰఆ͚ٛͩॻ͍ͨϨϙδτϦFUDΛ%#ΫΤϦɺ3FEJTίʔϧɺଞϚΠΫϩαʔϏείʔϧͰ࣮͢ΔJOGSBTUSVDUVSF
Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί͢38external service invocation implementation
Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί͢38external service invocation implementation5ISJGU*%-͔Βੜ͞Εͨ'JOBHMF$MJFOU
Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί͢38external service invocation implementationଞαʔϏεͷฦΓΛυϝΠϯʹॻ͖ى͜͢
EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFCBUDIPSTFSWFSFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEMentrypoint39 ࠷ऴతͳ࣮ߦΫϥεDPOpHVSBUJPOΛஔ͘CBUDIPSTFSWFSFOUSZQPJOU
ੲ: ࠷ॳ͔Β͜ͷߏͰͳ͔ͬͨ40TFSWFS CBUDIQSFTFOUBUJPODPNNPO%#QFSTJTUFODFJEMEPNBJOBQQMJDBUJPOCBUDITQFDJpDBQQMJDBUJPOҙਤ͍ͯ͠Δ͍ͳ͍ʹؔΘΒͣɼυϝΠϯϩδοΫهड़ͱJEM͕ີʹͭͳ͕͍ͬͯͨɽ 3FQPTJUPSZ͕5ISJGUߏମΛฦ͢ ଞαʔϏεͷ5ISJGUߏମΛͦͷ··͏TFSWFSTQFDJpDBQQMJDBUJPOTFSWFSTQFDJpDJOGSBCBUDITQFDJpDJOGSB
Thrift ͷੜΛϏδωεϧʔϧهड़ʹ༻͍ͳ͍41υϝΠϯϨΠϠΛ*%-͔Βੜͨ͠ఆٛʹґଘͤ͞ͳ͍ͷ͕ԿΑΓେࣄ ϝϯςφϯε࣌ͷϥΠϑαΠΫϧ͕ҧ͏ "1*֎෦αʔϏεͱͷܖɽޙํޓੑΛۃྗอͭΑ͏ʹӡ༻͢Δ ࣗαʔϏεͷσʔλϞσϧαʔϏεͷਐḿʹैͬͯॊೈʹݟͨ͠ΓɼϦϑΝΫλϦϯά͍ͨ͠ σʔλߏΛυϥεςΟοΫʹมߋ͢Δ͜ͱଟ͘ͳ͍͕ɼ໊લͷݟ͔͠ͳΓଟ͍ҹ ͜Ε·Ͱݟ͑ͳ͔ͬͨڥքΛݟग़ͨ͠Γ͢Δ ΦϒδΣΫτΛ͑ͳ͍ɻৼΔ͍ΛΦϒδΣΫτͷυϝΠϯΦϒδΣΫτʹدͤΒΕͳ͍
Finagle ΛͲ͏͏͔42
Finatra Λར༻ͨ͠αʔϏεͷςϯϓϨʔτΛࣾϥΠϒϥϦͱ͢Δ43ࣾϥΠϒϥϦ util-finagle-all
ఆظతʹΞοϓσʔτ͢Δ (ຌͦʹҰʁ) 44util/util-finagle-all
TwitterServer admin ʹϖʔδΛՃ͢Δ45'JOBHMF4FSWJDFΛ5XJUUFS4FSWFSΛఴ͑ͯىಈ͢Δͱɺ)551BENJO6*͕ىಈͯ͠ɺ֤छϝτϦΫεUPHHMF ޙड़ͷঢ়ଶ͕֬ೝͰ͖Δɻ͜ͷ5XJUUFS4FSWFSͷBENJOϖʔδʹಠࣗͷϖʔδΛՃ͢Δ͜ͱ͕ग़དྷΔɻ SFBEܥͷ"1*ͷதͷ֬ೝɺରސ٬ϝοηʔδૹ৴ͷϦτϥΠ࣮ࢪ༻ͷӡ༻ϢʔςΟϦςΟΛઃ͚Δͷʹ͍ͬͯΔ ຊ൪ڥ4".-͔ΒϦμΠϨΫτ͢ΔΑ͏ʹͯ͠ɺಛఆͷϩʔϧ͕Ξλον͞Ε͍ͯͳ͍ͱ৮Εͳ͍Α͏ʹͳ͍ͬͯΔ
TwitterServer HTTP Admin46
ಠࣗʹՃͨ͠ϖʔδ͔Β API ฦΓΛݟΔ47
ಠࣗʹՃͨ͠ϖʔδ͔Β API ฦΓΛݟΔ47Ճͨ͠ϝχϡʔ
ಠࣗʹՃͨ͠ϖʔδ͔Β API ฦΓΛݟΔ47"1*ͷதΛ֬ೝͰ͖ΔΑ͏ʹ
ϚΫϩͳ48Photo by timJ on Unsplash
ϚΠΫϩαʔϏεͷڥքΛݟग़͢ࢹ49Photo by Adli Wahid on Unsplash
ϚΠΫϩαʔϏεΛͲ͏Δ͔50 ʮϚΠΫϩαʔϏεͷڥքυϝΠϯڥքͰ͋Δʯͱ͋Δ υϝΠϯڥքΛݟۃΊΔͷγεςϜΛ࡞ΔਓͷࣄͳͷͰɼࣄۀαʔϏεͷ͚ͩ͋Δ '0-*0ͰͲ͏ଊ͍͑ͯΔ͔Λ͓͑͢Δ͜ͱͰࢀߟʹͳΕ
৫ͱͷҰக:ʮϓϩμΫτʯͱʮۀج൫ʯ51 '0-*0Ͱɼ ਓͷސ٬͕ෳͷۚ༥Λӡ༻͢Δ ͦΕͧΕͷۚ༥ಠࣗͷӡ༻ϩδοΫΛ࣋ͭ ਓͷސ٬ͷޱ࠲։ઃ৹͚ࠪͩߦ͏ɽͭ·Γۚ༥Λ·͍ͨͯސ٬JEͭ ސ٬ͷอ༗͢Δۚ༥͝ͱʹޱ࠲͕ଘࡏ͢Δ͖͕ͩɼ࠷ऴతͳצఆॲཧू͢Δ͖ ͜ΕΛҙࣝͯ͠ɼۚ༥Ͱग़དྷ্͕ΔͭͷίϯςΩετΛʮϓϩμΫτʯͱݺͼɼϓϩμΫτΛ·͍ͨͰσʔλΛѻ͏ྖҬΛʮۀج൫ʯͱݺͿΑ͏ʹ͍ͯ͠Δ
ʮϓϩμΫτʯͱʮۀج൫ʯ52ςʔϚࢿ ϫϯίΠϯࢿސ٬ج൫ ސ٬ใཧɼޱ࠲։ઃɼ$4ରԠূ݊ج൫ צఆཧɼೖग़ۚɼจཧFUD͓·͔ͤࢿۀج൫ϓϩμΫτ
ࣗࣾͱଞࣾ: ϑΝαʔυͰ͋Γഊࢭ53ۚ༥αʔϏεΛࢧ͑ΔγεςϜɼࣗࣾҎ֎ͷఏڙ͢ΔγεςϜʹґΔϘϦϡʔϜ͕େ͖͍ औҾॴϒϩʔΧʔͱͷจୡ גՁ৴ɼίϯηϯαε༧σʔλ৴ σʔλϕϯμʔ צఆܥγεςϜ ֎෦"41Λར༻ ۜߦৼࠐडγεςϜ ఏܞઌαʔϏεͱͷ࿈ܞ FUDʜ σʔλΛड͚͢ϓϩτίϧ͕ҧͬͨΓɼϕϯμʔಠࣗͷޠኮ֓೦Λϥοϓ͢ΔͨΊʹϚΠΫϩαʔϏεΛݐͯΔɽ'0-*0෦͔Β͢Δͱഊࢭɼ֎෦͔ΒݟΔͱϑΝαʔυͱͯ͠ػೳ͢Δɽ
ྫ: ֎෦γεςϜͱϚΠΫϩαʔϏε54σʔλϕϯμʔ40"1 9.- $47WJB4'51 ϕϯμʔಠࣗͷσʔϞϯόΠφϦͷαϒεΫϥΠϒ3&45"1*$BMM'0-*0ϑϩϯτސ٬ࢿ࢈ࢀরܥཧ-*/&͚'BDBEFσʔλ৴ϕϯμʔσʔλऔΓࠐΈ
୭͕͏ʁσʔλͷྲྀΕʁ55 ʮϢʔβʔʯจ຺ʹґͬͯͭͷҙຯΛ࣋ͪ͑Δ ސ٬ ࣾΦϖϨʔλʔίϯςϯπνʔϜ ϑϩϯτΞϓϦέʔγϣϯ͕ҧ͏ 4DBMBαʔϏεಉҰϨϙδτϦ͔ΒෳαʔόʔΛݐͯͨΓ͢Δ BENJOͱUP$αʔϏεͰεέʔϧΛม͑ͨΓ͢ΔBENJOࣾΞϓϦ͚"1*TFSWJDFUP$αΠτ͚"1*
αʔϏεΛࢭΊͣʹӡ༻͠ଓ͚ΔͨΊͷʁ56Photo by Eric Bruton on Unsplash
ࢄτϨʔγϯάͱ Datadog57 ϑϩϯτΤϯυ͔ΒͷϦΫΤετෳͷϚΠΫϩαʔϏεͰॲཧ͞ΕΔ ֤αʔϏεෳΠϯελϯεͰ࣮ߦ͞ΕΔ ֤αʔϏεΠϯελϯεͷు͖ग़͢ϩάʹJE USBDF*EΛ͠ɼϦΫΤετશମͷॲཧͷྲྀΕΛͰ͖ΔΑ͏ʹ͢Δ ͯ͢ͷϩά%BUBEPHʹू͠ɼ&3303ϩάݕग़࣌4MBDLʹ USBDF*E͖ͷ63-Λྲྀ͢Α͏ʹ͍ͯ͠Δ
traceId ͱ datadog58
traceId ͱ datadog59
ػೳτάϧ (Feature Toggle)60 ػೳ͕༗ޮͰ͋Δ͔Ͳ͏͔Λࣔ͢ਅِΛαʔόʔͷঢ়ଶͱͯ͠อ࣋͢Δɽ ৽ػೳطଘػೳͷվળ͞ΕͨίʔυΛಈ࡞ڥʹσϓϩΠͭͭ͠ɼͦͷίʔυΛಈ࡞ͤ͞Δ͔Ͳ͏͔ΛUPHHMF͢Δɽ࣮ߦ͞Ε͍ͯΔϓϩηεͷUPHHMFΛΓସ͑ΒΕΔɽ දࣔσʔλͷσʔλιʔεΓସ͑ύϑΥʔϚϯεվળͳͲɼUPHHMFແͩ͠ͱσϓϩΠΛΘͳ͍ͱલޙൺֱΛߦ͑ͳ͍มߋͷಋೖɼݕূͳͲʹར༻͢Δɽ 'JOBHMF͕GFBUVSFUPHHMFػೳΛ༗͍ͯ͠ΔͷͰͦΕΛ׆༻͍ͯ͠Δɽ
ػೳτάϧ (Feature Toggle)61Toggle ͷฦΓʹΑͬͯڍಈ͢Δ࣮Λ͑Δ
ػೳτάϧ (Feature Toggle)61Toggle ͷฦΓʹΑͬͯڍಈ͢Δ࣮Λ͑Δಉ͡USBJUΛ࣮ͨ͠ෳͷ࣮
ػೳτάϧ (Feature Toggle)61Toggle ͷฦΓʹΑͬͯڍಈ͢Δ࣮Λ͑Δ5PHHMFJTA*OU#PPMFBOA
ػೳτάϧ (Feature Toggle)61Toggle ͷฦΓʹΑͬͯڍಈ͢Δ࣮Λ͑Δ࣮ࡍͷUPHHMFͷฦΓʹґͬͯ
ػೳτάϧ (Feature Toggle)61Toggle ͷฦΓʹΑͬͯڍಈ͢Δ࣮Λ͑ΔͲͪΒͷ࣮Λಈ͔͔ܾ͢ΊΔ
ػೳτάϧ (Feature Toggle)62ઃఆϑΝΠϧ: Γସׂ͑߹ΛࢦఆͰ͖Δ
݁߹ϦεΫ ΛݮΒ͢63 "1*ͷޓੑطଘͷ"1*ͷޙํޓੑͳΔ่͘͞ͳ͍ઃܭͷ#SFBLJOH$IBOHFΑΓ৽"1* Ϗοάόϯ݁߹ϦϦʔεΛ͠ͳ͍େ͖ͳ৽ػೳ৽ϓϩμΫτϦϦʔεͷࡍɼΘΕͳ͍"1*͔ΒૣΊʹϦϦʔεΛ͠ɼຊ൪ͱ։ൃڥͰͷϞδϡʔϧͷࠩҟΛখ͘͞อͭΑ͏ʹ͢Δ ЋϦϦʔεϑϩϯτΤϯυڥΛ௨ৗͷͷʹՃ͑ͯࣾݶఆͰΞΫηεڥΛߏங͠ɼ৽ػೳΛࣾϝϯόʔ͕ઌߦͯ͠ӡ༻ͯ͠Λݟ͚ͭग़͢
ࠓޙͷ՝64Photo by Hans-Peter Gauster on Unsplash
େҬత CQRS తͳϦΞʔΩςΫνϟϦϯά65 τϥσΟγϣφϧͳূ݊ձࣾʹʮϑϩϯτϛυϧόοΫΦϑΟεʯͱ͍͏৬ػೳͷྨ͕͋Δɽ ϑϩϯτऩӹΛ্͛Δ෦ɽ ωοτূ݊ͩͱސ٬͕จΛग़͠ɼऔҾΛߦ͏෦ ϛυϧϑϩϯτͷ׆ಈͷ݁ՌͷϞχλϦϯά όοΫϑϩϯτͷ׆ಈͷ݁Ռͷࣄޙॲཧ ࣄɼצఆFUDʜ ϑϩϯτϛυϧόοΫ͝ͱʹγεςϜʹٻΊΒΕΔੑ֨ҟͳΔ ϑϩϯτऔҾओମͷίϚϯυΛड͚͚ͯॲཧΛ͢Δݎ࿚͔ͭߴεϧʔϓοτͰ͋Δ͜ͱɽऩӹྗɽ ϛυϧ෯͍σʔλͷҰ؏ੑͷ͋Δࢀর όοΫεέʔϥϏϦςΟ
େҬత CQRS తͳϦΞʔΩςΫνϟϦϯά66 '0-*0ͷαʔόʔαΠυγεςϜʮϑϩϯτϛυϧόοΫΦϑΟεʯͷ͚Λҙࣝ͠ͳ͍··։ൃͨ݁͠Ռɼͯ͢ͷϨΠϠʹ؏௨ͨ͠ϚΠΫϩαʔϏε͕ଘࡏ͍ͯ͠Δ ϑϩϯτγεςϜ$PNNBOE ϛυϧγεςϜ2VFSZɼόοΫγεςϜଞͱҟͳΔ࣍όονॲཧɼͱ͍͏͝ͱͷੑ֨ʹԠͨ͡Γͷ࠷దԽͱϦΞʔΩςΫνϟϦϯάΛਐΊ͍ͨ
Ұ෦ॖୀӡ༻67 ϑϩϯτΤϯυͰଟͷϚΠΫϩαʔϏεͷޭϨεϙϯεΛͯ͢ूͰ͖ͳ͍ͱϫʔΫ͠ͳ͍έʔε͕͋Δɽ Ұ෦ͷαʔϏε͕μϯ͍ͯ͠Δͱ͖ɼͦͷαʔϏεʹ֘͢ΔػೳͷΈϑϩϯτͰEJTBCMFʹͯ͠ଞͷػೳͳ͘ճΔΈ͕΄͍͠ɽ͜Ε͕Ͱ͖ΔͱαʔΩοτɾϒϨΠΫࣗ৴Λ࣋ͬͯऔΓΊΔɽ લड़ͨ͠ϦΞʔΩςΫνϟϦϯάؚΊͨαʔϏεؒґଘͷཧɼϑϩϯτΤϯυͷΈվमؚΊͯऔΓΉඞཁ͕͋Δɽ
ϨΠϠΞʔΩςΫνϟͷະདྷ…??68 αʔϏε୯ମͷ࣮ΛݟΔͱͲ͏ͯ͠ϘΠϥʔϓϨʔτ͕ଟ͍ ੜ࢈ੑΛ্͛ΔͨΊʹͲ͏͠Α͏ʜ ͯ͢ͷαʔϏε͕͜ͷߏΛ౿ऻ͢Δ͖͔ݕ౼ͷ༨͋Γʜ͕ͩɼࢦະͩແ͍EPNBJOBQQMJDBUJPOQSFTFOUBUJPO*OGSBTUSVDUVSFFOUSZQPJOUJEMJOUFSOBMJEMFYUFSOBMJEM
·ͱΊ69Photo by Kelly Sikkema on Unsplash
·ͱΊ: ͨΓલͷ͜ͱͰ͕͢70 దͳϨΠϠʔυΞʔΩςΫνϟΛ༻͍ͯϏδωεͷมԽʹڧ͍γεςϜΛ࡞Δ ϚΠΫϩαʔϏεͷڥքΛਖ਼͘͠ݟग़ͨ͢Ίʹɼ͕࣮ࣗͨͪ͢ΔϏδωεྖҬͱ͔ͬ͠Γ͖߹͏ ϚΠΫϩαʔϏεͷ҆ఆӡ༻ͱܧଓతͳਐԽͷͨΊͷٕज़அΛ͢Δ
THANK YOU