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
ku-mu
March 25, 2023
1
1.4k
学校で学んだことが ソフトウェアエンジニアという 仕事につながるまで
JOIの2023年3月 春季セミナー 全体講演会でお話した内容です。
ku-mu
March 25, 2023
Tweet
Share
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
75
5.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
21
2k
GraphQLの誤解/rethinking-graphql
sonatard
56
9.3k
Debugging Ruby Performance
tmm1
70
11k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
14
1.5k
Statistics for Hackers
jakevdp
790
220k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
The Language of Interfaces
destraynor
151
23k
Optimising Largest Contentful Paint
csswizardry
13
2.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
25
2k
Transcript
ֶߍͰֶΜͩ͜ͱ͕ ιϑτΣΞΤϯδχΞͱ͍͏ ࣄʹͭͳ͕Δ·Ͱ 1
2 • ιϑτΣΞΤϯδχΞ • ͓ͷਫঁࢠେֶ/େֶӃ ཧֶ෦ ใՊֶՊ • ڝٕϓϩάϥϛϯά •
TopCoder :੨ ※AtCoderͷલʹ༗໊ͩͬͨͭ • ISUCON4 ֶੜ ༏উ • ߴߍ࣌ͷಘҙՊ: ࠃޠɾࣾձ Chica Matsueda ͘ʔΉ @ cocodrips
3 • 2002 ~ FinalFantasy9ʹײಈ͗ͯ͢͠࡞ͬͯΔ ήʔϜձࣾʹब৬͢Δ͜ͱΛܾΊΔ • 2015 ~
SQUARE ENIX ήʔϜϓϩάϥϚ • 2017 ~ σʔλੳͷελʔτΞοϓ σʔλੳίϯαϧλϯτ • 2018 ~ ϝϧΧϦ ιϑτΣΞΤϯδχΞ (AI / Backend / iOS) Chica Matsueda ͘ʔΉ @ cocodrips
Q: ϓϩάϥϛϯάΛ ͡Ί͖͔͚ͨͬʁ 4
Q: কདྷͲΜͳ͓ࣄΛ ͯ͠Έ͍ͨͰ͔͢ʁ 5
ࠓͷ͓ • ϓϩάϥϛϯάΛ͏͓ࣄ • ֶߍͷษڧڝٕϓϩάϥϛϯά ͍ͭࣄʹཱͭͷ͔ • ਐ࿏ɾࣄΛબͼํͷώϯτ 6
• ֶɺڝٕϓϩάϥϛϯάΛֶΜͰ͍ΔதͰɺ ͦΕ͕ͲΜͳ෩ʹকདྷʹཱͭͷ͔ͷ ྫΛ͍͔͓ͭ͘ݟ͍ͤͨ͠ͱࢥ͍·͢ • ษڧΛؤுΔϞνϕʔγϣϯʹͳͬͯ͘ΕͨΒخ͍͠ • લதֶੜʹͰ͖Δ͚ͩΘ͔ΔΑ͏ʹઆ໌͠Α͏ͱ͠
͍ͯΔͷͰɺߴߍੜͷํʹୀ۶ͳ෦͋Δ͔ • ࠷ޙͷํͨ͘͞Μֶ͠·͢ • Θ͔Βͳ͍෦ͲΜͲΜ࣭͍ͯͩ͘͠͞ʂʂ 7
ϓϩάϥϛϯάΛ͏͓ࣄ 8
ϓϩάϥϛϯάΛ͏͓ࣄ 9 ήʔϜϓϩάϥϚ ήʔϜΛ࡞Δ͓ࣄɻ144XJUDI͔ΒεϚϗ·Ͱ 8FCΤϯδχΞ 8FCαΠτͷϑϩϯτΤϯυɾόοΫΤϯυ ΫϥΠΞϯτΤϯδχΞ J04"OESPJEɾ8FCͷ࣮Λ͢Δ όοΫΤϯυΤϯδχΞ αʔϏεͷޙΖͰΔγεςϜ
"1* Λ࡞Δ γεςϜΤϯδχΞ 8FCγεςϜͷઃܭΛߟ͑Δ ηΩϡϦςΟΤϯδχΞ γεςϜΛڴҖ͔ΒकΔ "*ΤϯδχΞ "*ͷϞσϧΛ࡞ͬͨΓɺ݁ՌΛݕূ͢Δ σʔλੳΤϯδχΞ σʔλΛੳͨ͠ΓɾࢪࡦͷޮՌݕূΛͨ͠Γ͢Δ .-0QTΤϯδχΞ "*ͷϞσϧΛαʔϏεԽͤ͞ΔͨΊʹ͢Δ ΠϯϑϥΤϯδχΞ αʔϏεΛ͓٬͞Μʹಧ͚Δج൫Λ࡞Δ
ϓϩάϥϛϯάΛ͏͓ࣄ • ͍·ͲΜͳ͓ࣄ͕͍͔ͨ͠૾͢Δͷ͍͠ • ͲͷࣄΛ͢Δ͔ܾΊΔඞཁͳ͍ 10
ֶͱཧՊͰ༡Ϳ
ΩϟϥΫλʔʹଉΛͤ͞Δ 12
ΩϟϥΫλʔʹଉΛͤ͞Δ 13 scale = 1 + 0.1 * Mathf.Sin(speed *
Time.time);
ΩϟϥΫλʔʹଉΛͤ͞Δ 14 1Λϕʔεͷେ͖͞ͱͨ͠ͱ͖ʹɺఆഒͷsinθΛ͢͜ͱͰ Ұఆ࣌ؒͰαΠζ͕େখ͢ΔΦϒδΣΫτ͕࡞ΕΔ scale = 1 + 0.1
* Mathf.Sin(speed * Time.time); θݱࡏͷ࣌ؒΛ͏͜ͱͰ࣌ؒܦաͰΛมԽͤ͞ΒΕΔ
ΩϟϥΫλʔΛམԼͤ͞Δ 15 ࣗ༝མԼͷެࣜ མԼ Y2 = Y1 + (1/2) *
Gt2 t: ࣌ؒ, G: ॏྗՃ(=-9.8) Y2 = Y1 + Ct t: ࣌ؒ, C: ఆ(<=0)
ΩϟϥΫλʔΛམԼͤ͞Δ 16 ࣗ༝མԼͷެࣜ →தֶ̏ੜͷཧՊͰश͏ࣗ༝མԼӡಈ ɹΛͬͯࣗવͳམԼΞχϝʔγϣϯΛ࡞ΕΔ མԼ Y2 = Y1 +
Ct t: ࣌ؒ, C: ఆ(<=0) Y2 = Y1 + (1/2) * Gt2 t: ࣌ؒ, G: ॏྗՃ(=-9.8)
ABςετ
ABςετͱʁ 2ͭͷҧ͏όʔδϣϯͷWebϖʔδɾΞϓϦɾࠂͳͲΛɺ ϥϯμϜʹϢʔβʹදࣔͯ͠ɺͲͪΒͷ΄͏͕ίϯόʔδϣ ϯ(ߪೖɾొɾΫϦοΫ)Λ͔ͨ͠Λൺֱ͢Δ࣮ݧ 18
ͲͬͪͷσβΠϯ͕ྑ͍? 19 AҊ BҊ ίϯόʔδϣϯ ߪೖͯ͘͠Εͨ 5% 6% ࠓͳΒ
0'' ຊ࣌·Ͱ 0'' ߪೖ͢Δ ߪೖ͢Δ 🐶ʻͬͪ͜ͷ΄͏͕Αͦ͞͏ →→→→ •1pt up! •120%
ͲͬͪͷσβΠϯ͕ྑ͍? 20 AҊ BҊ ίϯόʔδϣϯ ߪೖͯ͘͠Εͨ 5% 6% දࣔͨ͠Ϣʔβʔ
100 100 ࠓͳΒ 0'' ຊ࣌·Ͱ 0'' ߪೖ͢Δ ߪೖ͢Δ 🐶ʻͬͪ͜ͷ΄͏͕Αͦ͞͏ʁ
ͲͬͪͷσβΠϯ͕ྑ͍? 21 AҊ BҊ ίϯόʔδϣϯ ߪೖͯ͘͠Εͨ 5% 6% 100
100 ࠓͳΒ 0'' ຊ࣌·Ͱ 0'' ߪೖ͢Δ ߪೖ͢Δ දࣔͨ͠Ϣʔβʔ 🐶ʻͬͪ͜ͷ΄͏͕Αͦ͞͏ʁ
ҧ͍ۮવͰͳ͍ͷ͔ʁ AҊ: 100ਓͷ5% = 5ਓ BҊ: 100ਓͷ6% = 6ਓ
࣮ࡍʹ1ਓ͔͠ߪೖͯ͘͠ΕͨਓҧΘͳ͍ͷʹɺ ͜ΕۮવͰͳ͘BҊ͕ϕλʔͩͱݴ͑Δͷ͔ʁ 22
౷ܭతԾઆݕఆ ʮBҊͱAҊͷίϯόʔδϣϯ͕ҟͳΔʯͱ͍͏͜ͱ͕ ޡࠩͰੜͨ͡ͱߟ͑ʹ͍͘͜ͱͰ͋Δ͔Λ֬ೝ͢Δํ๏ ࣜෳࡶͳͷͰؾʹͳΔਓ ʮΧΠೋݕఆʯʮTݕఆʯͰௐͯΈΑ͏ ※େֶͷ౷ܭֶͷतۀͰৄ͘͠Δൣғͷ༰ ABςετͷ݁Ռʹ౷ܭతʹ༗ҙʹ͕ࠩ͋Δ͜ͱΛ
ࣔͨ͢ΊʹɺेͳαϯϓϧΛ४උ͢Δඞཁ͕͋Δ 23
ͲͬͪͷσβΠϯ͕ྑ͍? 24 AҊ BҊ ίϯόʔδϣϯ ߪೖͯ͘͠Εͨ 5% 6% 10,000
10,000 ࠓͳΒ 0'' ຊ࣌·Ͱ 0'' ߪೖ͢Δ ߪೖ͢Δ 🐶ʻ౷ܭతʹ༗ҙʂ ͬͪ͜Λ࠾༻͠Α͏ʂ දࣔͨ͠Ϣʔβʔ
AIΛͬͨγεςϜΛ࡞Ζ͏
ը૾ݕࡧγεςϜ • ͋ͳͨͱ͋ΔECαΠτΛӡӦ͍ͯ͠Δ • Ϣʔβ͕ΠϯελάϥϜͷը૾Λૹ৴͢Δͱɺ ࣅͨը૾ͷΛ100ݸฦ͢γεςϜΛ࡞Γ͍ͨ • ͳ͓ECαΠτʹ1ԯݸͷ͕͋Δ 26
ը૾ݕࡧγεςϜͷ࡞Γํ STEP1(ֶश): ը૾ಛྔσʔλϕʔεΛ४උ͢Δ ը૾ͯ͢ΛಛྔϕΫτϧʹมͯ͠σʔλϕʔεʹ͍ΕΔ ※ ը૾ใ Width *
Height * 3ͷྻใ ※ ͍ΘΏΔσΟʔϓϥʔχϯάͷٕज़Λ͍ ը૾Λࣈใ(floatͷଟ࣍ݩྻ)ʹม 27 200 x 200ͷը૾ͳΒ, ͞120,000ྻͰ͋Δը૾ใΛ ͞100ఔͷྻʹѹॖ͢ΔΠϝʔδ (R, G, B) → ઢܗֶ(େֶ)ඍੵͷ͕ࣝඞཁ
ը૾ݕࡧγεςϜͷ࡞Γํ STEP2 (ਪ): ը૾ಛྔͷ͍ۙΛฦ͢γεςϜΛ࡞Δ ೖྗը૾ΛಛྔϕΫτϧʹม͠ɺ ࠷ۙ୳ࡧʢNNʣΛͯ͠ɺ͍ۙϕΫτϧΛ୳͢ 28 →ΞϧΰϦζϜͷجૅ͕ࣝඞཁ
ڝٕϓϩάϥϛϯάͷ෩ʹͯ͠ΈΔ 29 • Nݸͷ͞Mͷྻ͕༩͑ΒΕΔ • ৽ͨʹ͞Mͷྻ͕ೖྗͱͯ͠͞Εͨͱ͖ɺ ϢʔΫϦουڑͷ࠷͍ۙྻΛ100ݸฦͤ • 100
< N < 108 , 0 < M < 102 ಛྔϕΫτϧ
ڝٕϓϩάϥϛϯάͷ෩ʹͯ͠ΈΔ 30 • Nݸͷ͞Mͷྻ͕༩͑ΒΕΔ • ৽ͨʹ͞Mͷྻ͕ೖྗͱͯ͠͞Εͨͱ͖ɺ ϢʔΫϦουڑͷ࠷͍ۙྻΛ100ݸฦͤ • 100
< N < 108 , 0 < M < 102 ※ ͓٬༷Λͨͤͯߦ͚ͳ͍ͷͰ1ඵҎʹܭࢉ͢Δඞཁ͕͋Δ͕ɺ αʔόʔͷεϖοΫࣗͰߟ͑Δ͜ͱ͕Ͱ͖Δ ʹ> AtCoderͷจʹ͋ΔʮϝϞϦ੍ݶ1024 MBʯ ఫഇͰ͖Δ ಛྔϕΫτϧ
୯७ʹܭࢉ͢Δͱ… 100 < N < 108 , 0 < M
< 102 • ϝϞϦ༻ྔ N * M * M * 4byte(float) = 108 * 102 * 102 * 4 ≒ 4TB • ܭࢉྔ O(N * M * M) => 1012 31
୯७ʹܭࢉ͢Δͱ… 32 ݱ࣮త͡Όͳ͍… 100 < N < 108 , 0
< M < 102 • ϝϞϦ༻ྔ N * M * M * 4byte(float) = 108 * 102 * 102 * 4 ≒ 4TB • ܭࢉྔ O(N * M * M) => 1012
Ͳ͏ͬͯղܾ͢Δ͔ʁ 33 ࣄͰɺཁ݅Λᘳʹຬͨ͢ඞཁͳ͍ తΛՌͨͨ͢Ίͷϕλʔͳղܾํ๏ΛఏҊ͠Α͏ • 99ݸʹ͍ۙͱ96ݸͷॱ൪͕ҧͬͯ ϏδωεతͳӨڹେ͖͘ͳ͍ •
ͦͦશΛσʔλϕʔε͍ೖΕΔඞཁ͋Δͷ͔ʁ
Ͳ͏ͬͯղܾ͢Δ͔ʁ 34 • ࠷ۙ୳ࡧΞϧΰϦζϜΛΊͯ ۙࣅ࠷ۙ୳ࡧΞϧΰϦζϜ (Faiss)Λར༻͢Δ • GPUΛͬͯܭࢉ͢Δ
→ ίετ͕ߴ͘ͳΔͷͰخ͘͠ͳ͍ • ಛఆͷ݅Λຬ͚ͨͩ͢ΛΠϯσοΫεʹ͍ΕΔ ※ ྫ: աڈ3ϲ݄Ҏʹߪೖ͞Εͨཤྺ͕͋Δ͚ͩ → ҰؾʹରσʔλΛݮΒͤΔՄೳੑ͕ߴ͍ ϏδωεతͳӨڹΛܭࢉܾͯ͠ΊΔ
ಛʹ͍ͬͯΔֶߍͰֶΜͩࣝ 35 • தֶ • ֶશ෦ • ӳޠ • ߴߍ
• ࡾ֯ؔ (2) • ࢦɾର • ඍɾੵ • ֬ɾظ • ӳޠ • େֶ (ཧֶ෦) • ౷ܭ • ઢܗֶ • ίϯϐϡʔλجૅ • (ඍɾੵ)
ಛʹ͍ͬͯΔֶߍͰֶΜͩࣝ 36 • ͜ΕΒͷษڧΛ͍ͯ͠Δ࣌Ͱ ҰମԿʹʹཱͭͷ͔Θ͔Βͳ͔ͬͨ •
ֶͷ͕ࣝಛʹඞཁͳ 37
ใܥͷֶՊͰֶͿίϯϐϡʔλͷ͕ࣝ ಛʹʹཱͭ (ࢲݟ) 38
ਐֶઌʹ͍ͭͯߟ͑Δ • ઐֶߍब৬: Γ͍ͨ͜ͱ͕໌֬ʹܾ·ͬͯΔਓ˕ • େֶબͼ: ཧֶ෦ֶ෦ͷใܥͷֶՊ͕͓͢͢Ί • େ͖ͳେֶ͍ΖΜͳ͜ͱΛֶͼ͍͢
খ͞ͳେֶઌੜಉڃੜͱ͍ۙڑͰͬ͘͡ΓֶΔ • େֶͷHPͰଔۀੜͷਐ࿏͕ݟΕΔͷͰ ͕ࣗ૾͍ͯ͠Δਐ࿏ʹਐΜͰΔਓ͕ଟ͍͕ݟΔͱ˕ • ໌֬ʹΓ͍ͨ͜ͱ͕ܾ·ͬͯͳ͍ͳΒ ֶΔબࢶͷଟ͍େֶ͕͍͍͔? () 39
ιϑτΣΞΤϯδχΞ(SWE)ͷࣄ • ʮৗʹษڧ͠ଓ͚ΔʯࣄͱݴΘΕ͍ͯΔ… • ࣌ͲΜͲΜมΘ͍ͬͯ͘ͷͰ͔ͨ͠ʹ ϓϩάϥϛϯάݴޠɾϥΠϒϥϦΛֶͿඞཁ͋Δ • ֶɾίϯϐϡʔλͷجૅࣝɾΊͪΌͪ͘Όಘҙͳ
ϓϩάϥϛϯάݴޠ1͕ͭ͋ΕΩϟονΞοϓ͘͠ͳ͍ • ίϯϐϡʔλαΠΤϯεܥͷֶՊͷେֶͷ͕ࣝͳͯ͘ SWEʹͳΕΔɻͨͩͦͷ͕ࣝ͋Δͱࣄͷ෯͕Δ 40
ࠓ·Ͱͷࢲͷ͓ࣄ 41
ࠓ·Ͱͷࢲͷ͓ࣄ 42
SWEͷࣄͱڝٕϓϩάϥϛϯά • ࣄڝٕϓϩάϥϛϯάͷΑ͏ʹ ՝͕໌֬ʹܾΊΒΕ͍ͯͳ͍ɻ ࣮͢ΔͷͪΖΜͷ͜ͱɺ Γ͍ͨ͜ͱΛจʹམͱ͠ࠐΉͱ͜ΖࣄʹͳΔ •
ڝٕϓϩάϥϛϯάҰ෦ͷ࣮ྗͷ܇࿅ʹͳΔ • ࢲͷਓੜͷʹཱͪଓ͚ͯΔ ҧ͏ձࣾɾֶߍͷ༑ୡͨ͘͞ΜͰ͖ͯ࠷ߴͩΑͶ 43
ΞϧΰϦζϜҎ֎ͷڝٕϓϩάϥϛϯά • Kaggle (ఆظ) AIͷਫ਼Λڝ͏ • ISUCON (1)
Πϯϑϥ(αʔόʔͷϨεϙϯεͷ͞ɾޮΛڝ͏) ίϯςετ • SECCON ηΩϡϦςΟʹؔ͢Δίϯςετ • Codingame (ఆظ) ήʔϜAIͷίϯςετɻଞͷϢʔβͱରઓͰָ͖͍ͯ͠ 44