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.5k
学校で学んだことが ソフトウェアエンジニアという 仕事につながるまで
JOIの2023年3月 春季セミナー 全体講演会でお話した内容です。
ku-mu
March 25, 2023
Tweet
Share
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Designing for humans not robots
tammielis
253
25k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
Thoughts on Productivity
jonyablonski
70
4.8k
Navigating Team Friction
lara
189
15k
Balancing Empowerment & Direction
lara
3
620
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
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