Momenti Seminar에서 진행했던 "하스스톤 시뮬레이터 RosettaStone 개발 5년 간의 기록"의 발표 자료를 공유드립니다. 5년 동안 오픈 소스 프로젝트를 진행하면서 경험했던 일들을 정리하며 어떤 교훈을 얻었는지 생각해보는 시간이었습니다. 많은 분들에게 도움이 되었으면 합니다.
GDG Campus Korea에서 개최한 'Daily 만년 Junior들의 이야기 : 델리만주' 밋업에서 발표했던 내용으로 대학원 석사 입학 후부터 오늘날까지 어떤 활동들을 했는지 정리했습니다. 대학원생 분들과 게임 프로그래머 취업을 준비하시는 분들께 많은 도움이 되었으면 합니다.
2020년 서울시에서 주최한 강소기업탐방 프로그램에서 발표한 자료 입니다.
학교를 졸업하고 software engineer로 취직을 하기까지의 여정을 다뤘습니다
1. 개발자가 나에게 맞을지 고민하기 위한 방법
2. 개발자로 취직하기 (이력서/면접 준비 팁)
3. 개발자로 취직한 후 우리가 하는 일
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Chris Ohk
RL 논문 리뷰 스터디에서 Evolving Reinforcement Learning Algorithms 논문 내용을 정리해 발표했습니다. 이 논문은 Value-based Model-free RL 에이전트의 손실 함수를 표현하는 언어를 설계하고 기존 DQN보다 최적화된 손실 함수를 제안합니다. 많은 분들에게 도움이 되었으면 합니다.
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Chris Ohk
RL 논문 리뷰 스터디에서 Adversarially Guided Actor-Critic 논문 내용을 정리해 발표했습니다. AGAC는 Actor-Critic에 GAN에서 영감을 받은 방법들을 결합해 리워드가 희소하고 탐험이 어려운 환경에서 뛰어난 성능을 보여줍니다. 많은 분들에게 도움이 되었으면 합니다.
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Chris Ohk
RL 논문 리뷰 스터디에서 Agent57 논문 내용을 정리해 발표했습니다. Agent57은 NGU(Never Give Up)를 기반으로 몇 가지 기능을 개선해 57개의 Atari 게임 모두 인간보다 뛰어난 점수를 기록한 최초의 RL 알고리즘입니다. 많은 분들에게 도움이 되었으면 합니다.
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Chris Ohk
The paper introduces Deep Deterministic Policy Gradient (DDPG), a model-free reinforcement learning algorithm for problems with continuous action spaces. DDPG combines actor-critic methods with experience replay and target networks similar to DQN. It uses a replay buffer to minimize correlations between samples and target networks to provide stable learning targets. The algorithm was able to solve challenging control problems with high-dimensional observation and action spaces, demonstrating the ability of deep reinforcement learning to handle complex, continuous control tasks.
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기Chris Ohk
강화학습에 관심을 갖게 되어 어떤 게임에 적용해볼까 고민하다가 평소 즐기던 '하스스톤'이라는 게임에 관심을 갖게 되어 2017년 말부터 하스스톤 강화 학습을 위한 API를 만들기 시작했습니다. 이 발표를 통해 평소 하스스톤과 같은 카드 게임 개발이나 게임에 강화학습을 적용하기 위한 환경을 구축하는데 관심을 갖고 있던 프로그래머들에게 조금이나마 도움이 되었으면 합니다.
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
오픈소스 개발을 시작하기로 결정했더라도, 처음 개발하는 경우에는 막상 무엇을 개발할지, 그리고 어떻게 개발해야 할 지 막막하기만 합니다. 이 때는 기존에 공개되어 있는 오픈소스 프로젝트를 활용해 개선해나가는 프로젝트부터 시작하면 많은 도움이 됩니다. 이번 강연에서는 기존 오픈소스 프로젝트를 처음부터 새로 만들어가면서 개선해나갔던 경험을 이야기하고 어떻게 하면 오픈소스 개발에 쉽게 접근할 수 있는지를 알려줍니다.
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
C++11을 시작으로 모던 C++이 도입된 지도 어느새 6년이라는 시간이 흘렀습니다. 올해는 C++17 표준이 도입될 예정입니다. 그만큼 많이 개선되고 새로운 기능들이 많이 도입되었기에 실무에서 사용해보고 싶은 경우도 많습니다. 하지만 이미 서비스 중이라 기존 프로젝트를 새 버전의 VS로 마이그레이션하기 어려운 프로젝트가 많습니다. 그렇다고 아예 불가능한 일도 아닙니다. 이번 세미나에서는 기존 프로젝트를 새 버전의 VS로 마이그레이션하면서 발생했던 문제와 마이그레이션 이후 모던 C++을 사용하면서 발생했던 문제, 그리고 해결법을 설명하고자 합니다. 또한 새 버전의 VS에 생긴 유용한 기능들도 함께 알려드립니다.
2. Momenti Seminar
5 Years of RosettaStone
Hearthstone
• 블리자드 엔터테인먼트가 개발한 디지털 카드 수집 게임
• 2013년 3월 페니 아케이드 엑스포에서 처음 발표
• 2014년 3월 13일 PC 버전부터 출시
• 현재까지 11개의 확장팩과 4개의 모험 모드가 추가됨
• 2018년 11월 발표 기준 전세계 이용자수 1억명 돌파
4. Momenti Seminar
5 Years of RosettaStone
RosettaStone
• Hearthstone simulator using C++ with some reinforcement learning
(https://github.com/utilForever/RosettaStone)
• 하스스톤 강화학습을 하기 위한 시뮬레이터 구현 프로젝트
(나아가서 실제로 강화학습을 적용해보기 위한 코드도 작성)
• 라이선스 : AGPLv3
• 작성 언어 : C++17, Python
8. Momenti Seminar
5 Years of RosettaStone
RosettaStone
• Architecture
Core Logic
(C++)
C++ API
pybind11
Python API
(Working...)
OpenAI Gym
(To-do)
TensorFlow
PyTorch
Rust API
(To-do)
MCTS
(Reworking...)
9. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 구조를 설계하면서 발생했던 갈등을 해결했던 일
• DMCA Takedown 문제를 경험하고 해결했던 일
• 블리자드에서 코드를 검수받았던 일
• 복잡한 시스템에서의 상호 작용으로 인해 발생했던 일
• 오픈소스 컨트리뷰톤에 참가했던 일
10. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 구조를 설계하면서 발생했던 갈등을 해결했던 일
• 처음 개발할 때 대학생 1명과 협업을 했었다.
카드 게임을 구현하기 위해 구조를 설계하는 작업을 나눠서 맡았다.
• 프로젝트를 더 좋게 만들고 싶은 마음은 팀원들 모두 똑같다.
문제는 ‘어떻게 좋게 만들 것인가’에 대해 갖고 있는 생각이 다르다는 거다.
11. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 구조를 설계하면서 발생했던 갈등을 해결했던 일
• 서로 생각하는게 다르다 보니 어떤 팀원이 다른 브랜치에서 작업하고 나서
main 브랜치에 머지하고 나면 코드 구조가 달라지는 경우가 잦았다.
• 이로 인해 충돌이 자주 발생했고 작업하던 코드를 전부 다시 작성해야 했다.
• 이런 일이 반복되자 팀원들이 서로 지치게 되고 급기야 오해가 생겨 프로젝트에 위기가 찾아왔다.
12. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 구조를 설계하면서 발생했던 갈등을 해결했던 일
• 그래서 위기를 헤쳐나가기 위해 오프라인으로 만났다.
6시간 동안 서로의 생각을 이야기하고 어떻게 설계할 지 논의했다.
• 합의에 도달한 후, 더이상 문제가 발생하지 않았고 작업 진행에도 속도가 붙었다.
• 팀원들과 자주 이야기해 생각을 공유하고 서로의 방향을 맞추기 위해 노력해야 된다는 걸 깨달았다.
14. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• DMCA Takedown 문제를 경험하고 해결했던 일
• 구조를 설계할 때 하스스톤 시뮬레이터 구현체가 여럿 있었는데,
그 중 C# 구현체인 SabberStone의 구조를 참고해서 설계했었다.
• SabberStone의 라이선스는 AGPL이었고, RosettaStone의 라이선스는 MIT였다.
• MIT 라이선스의 프로젝트에 AGPL 라이선스의 코드를 복사하고 수정한 걸로 저작권 침해 신고를 한 것.
• 지인들에게 저작권 침해 여부를 문의했는데, 의견이 서로 달랐었다.
15. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• DMCA Takedown 문제를 경험하고 해결했던 일
• Takedown을 당했을 때 고려했었던 대처 방안
• 법원에 정식으로 재판 절차를 밟는다. → 시간이 매우 오래 걸리고 비용이 많이 들며, 피곤해지는 방안
• 저장소를 이대로 포기한다. → 그동안 들였던 시간과 노력이 아까운 방안
• 상호 합의를 통해 저작권 침해 신고를 취하한다. → 가장 합리적인 방안
16. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• DMCA Takedown 문제를 경험하고 해결했던 일
• 연구를 위해 진행하고 있는 프로젝트였고, AGPL로 변경한다고 해서 작업에 문제가 생길 부분도 없었다.
• 따라서 다음 사항에 합의하게 되었고 저작권 침해 신고는 취하되었다.
• 라이선스를 MIT에서 AGPL로 변경
• SabberStone의 설계를 참고한 코드에 라이선스 추가
• 3RD-PARTY와 README 파일에 라이선스 전문 추가
17. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• DMCA Takedown 문제를 경험하고 해결했던 일
• 오픈 소스의 라이선스, 나아가서 회사의 라이선스에 대해 생각하게 된 좋은 경험이었다.
18. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 블리자드에서 코드를 검수받았던 일
• NDC 19에 “<하스스톤> 강화학습 환경 개발기”라는 주제로 발표를 신청했는데, 선정되었다.
• 얼마 뒤 운영사무국에서 블리자드 PR팀과 협의가 필요하다는 연락을 받았다.
이 이야기를 블리자드에 어떻게 말해야 될 지 고민하다가 본사에서 근무하시는 지인분께 연락을 드렸다.
• 다행이 지인분께서 담당자에게 잘 말씀드려서 발표와 관련된 이야기를 전달드릴 수 있었다.
19. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 블리자드에서 코드를 검수받았던 일
• 약 3주 간의 시간이 지난 뒤 최종 연락을 받을 수 있었다.
• 이전까지는 블리자드의 검토 없이 개인적으로 진행했던 프로젝트였다면,
이제는 블리자드의 검토를 받고 라이선스와 관련된 문제가 없는 프로젝트로 탈바꿈하는 순간이었다.
• 이 일을 계기로 오픈 소스 프로젝트를 할 때 게임 시뮬레이터를 만드는 경우, 라이선스 문의부터 하고 있다.
20. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 복잡한 시스템에서의 상호 작용으로 인해 발생했던 일
• 하스스톤에는 수많은 카드가 존재한다.
프로젝트에서는 카드를 구현할 때마다 동작에 이상이 없는지 테스트 코드를 같이 작업한다.
21. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 복잡한 시스템에서의 상호 작용으로 인해 발생했던 일
• 하지만 여러 장의 카드를 특정 순서대로 사용했을 때 생기는 문제들은 확인하지 못했다.
• 다음과 같은 카드 두 장이 있다고 하자. 어떤 일이 발생할까?
22. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 복잡한 시스템에서의 상호 작용으로 인해 발생했던 일
• 문제를 어떻게 해결할 수 있을까?
23. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 복잡한 시스템에서의 상호 작용으로 인해 발생했던 일
• 모든 카드들을 특정 순서로 사용했을 때 발생할 수 있는 모든 문제를 단번에 파악하긴 어렵다.
하지만 발견할 때마다 방어 코드를 추가하고 관련해서 테스트 케이스도 추가하고 있다.
• 단위 테스트, 모듈 테스트, 통합 테스트 등이 필요한 이유에 대해서도 알게 되었다.
24. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 오픈소스 컨트리뷰톤에 참가했던 일
• 멘토로 참가해달라는 권유가 있어서 신청하게 되었고 프로젝트에 선정되었다.
• 오픈 소스 프로젝트에 처음 기여하시는 분들이 많았기에 여러 준비를 했다.
• 빌드하기 위해 필요한 프로그램 안내
• 소스 코드를 다운로드 받고 빌드하는 방법을 문서로 정리
• 이슈를 작성하는 방법
• 프로젝트의 구조를 설명하는 문서 추가
• 프로젝트에 쉽게 기여할 수 있는 항목들을 정리해 이슈로 등록
• 카드의 동작을 구현하는 방법을 설명하는 문서 추가
25. Momenti Seminar
5 Years of RosettaStone
During 5 Years...
• 오픈소스 컨트리뷰톤에 참가했던 일
• 많은 분들이 멘티로 신청해주셨고, 나름대로 여러 기준을 두고 고민 끝에 16명을 선정하게 되었다.
• 컨트리뷰톤 기간 동안 멘티분들과 서로 대화를 나눌 디스코드 채널을 개설하고 개발과 관련된 질문/답변,
코드 리뷰 등 다양한 이야기를 주고 나눴다. 그리고 멘티분들의 컴퓨터에 개발 환경을 구축했다.
• 덕분에 빠르게 개발 작업에 착수할 수 있었고 컨트리뷰톤 기간 동안 14명의 멘티분들께서
72장의 카드를 구현해주셨고 여러 버그들을 해결해주셨다.
• 회사에서 새로운 팀원을 온보딩하기 위한 준비도 크게 다르지 않다고 생각한다.
빠르게 적응할 수 있도록 여러 정보들을 취합한 문서를 미리 준비하고, 자주 대화할 채널을 만들자.
26. Momenti Seminar
5 Years of RosettaStone
Next 5 Years...
• RosettaStone 2.0
• OOP 기반 코드를 ECS 기반 코드로 리팩토링
• GUI 프로그램 구현
• WebAssembly 지원
• 전장, 듀얼 등 다양한 게임 모드 지원
• Rust로 재구현
• …