2019년 회고 / 2020년 계획
28 Dec 20192019년도 몇 일 남지 않았다. 그 말은 올해를 마무리하기 위한 회고글을 쓸 때가 되었다는 뜻이다.
올해도 작년처럼 여러 활동을 했는데 하나씩 정리해 보도록 하자.
C++ Korea
C++ Korea는 2013년 11월에 개설해 현재 약 5,000명의 회원과 함께 세미나, 스터디 등 다양한 활동을 하고 있다. 올해 C++ Korea에서는 일정 상의 이유로 스터디는 잠시 쉬어가기로 하고 상반기와 하반기에 세미나를 개최했다. 작년에 제4회 세미나 때 아쉬웠던 부분들을 보완하기 위해 여러 의견을 나눴고 결과적으로 큰 문제 없이 진행할 수 있었다. 하나씩 살펴보며 좀 더 자세한 이야기를 해보자.
제5회 세미나
4월 6일, 한국마이크로소프트에서 C++ Korea 제5회 세미나 - “종합 선물 세트”를 개최했다.
이번 세미나에서는 ‘종합 선물 세트’라는 제목에 맞춰 다양한 주제를 준비하려고 했다. C++ Korea 운영진은 연사자를 섭외하기 전에 제4회 세미나에서 아쉬웠던 부분들을 점검하고 어떻게 개선하면 좋을지 논의했다.
제4회 세미나에서 아쉬웠던 부분은 다음과 같다.
- 생각보다 많은 참석자를 받아 공간이 많이 혼잡했다는 점
- 세미나 진행 순서를 확인할 시간표가 없었다는 점
- 세미나 준비를 미흡하게 한 점 (마이크 및 발표 자료 등)
생각보다 많은 참석자를 받아 공간이 많이 혼잡했던 점은 세미나 참석자 수를 180명에서 160명으로 줄이기로 했다. 그리고 세미나 진행 순서를 확인할 시간표가 없었다는 점은 시간표를 확인할 수 있는 안내 종이를 만들어 출석 확인을 할 때 배부하기로 했다. 마지막으로 세미나 준비를 미흡하게 한 점은 연사자를 직접 섭외하고 마이크 및 프로젝터 상태를 미리 확인하기로 했다. 또한 제4회 세미나에서 발표하기로 했으나 취소했던 문제를 해결하기 위해 발표 자료를 미리 준비했다.
2트랙으로 진행했던 제4회 세미나와 달리 다시 1트랙으로 줄이고 연사자는 이미 발표한 경험이 있는 분들 위주로 부탁드렸다. 위험 부담을 줄이고 세미나를 원활하게 진행하기 위한 선택이었다.
세미나 당일 전까지는 큰 문제없이 진행되었다. 문제는 세미나 당일이었다. 세미나 장소에 도착했는데 공간이 분리되어 있어 하나로 합치려고 하니 기계를 작동하는 데 필요한 열쇠가 없었던 것이다. 열쇠가 있을 만한 곳은 전부 뒤져봤지만 찾을 수 없었다. 그래서 담당자에게 전화를 했는데 자신도 왜 열쇠가 없는지 잘 모르겠다고 하시더라. 세미나 시간은 다가오고 사람들은 오는데 계속 안절부절했다. 그러던 도중 전날 행사를 진행하셨던 분이 열쇠를 자신의 집으로 들고 가셨고 지금 부랴부랴 달려오고 계시다는 소식을 듣게 되었다. 그 분이 도착하기에는 시간이 부족해 참석하신 분들께 양해를 구하고 약 20분 늦게 세미나를 시작할 수 있었다.
이를 통해 당연하다고 생각했던 부분에 문제가 생길 수 있으니 다음 세미나 때에는 모든 사항을 한 번 더 확인하자는 교훈을 얻었다.
세미나 발표 자료는 여기에서 확인할 수 있다.
제6회 세미나
9월 29일, 한국마이크로소프트에서 C++ Korea 제6회 세미나 - “종합 선물 세트 제2호”를 개최했다.
제5회 세미나 때 아쉬웠던 부분들을 많이 보완했기에 제6회 세미나에서는 또 다시 도전을 해보기로 했다.
- 발표자 공개 모집 및 블라인드 투표
- 트랙 수를 1개가 아닌 2개로 진행
- 케이터링이 아닌 도시락 제공
- 강연 영상 녹화 및 편집
우선 발표자 공개 모집에 대한 이야기를 해보자. 제4회 세미나에서도 발표자를 공개 모집했었다. 하지만 모든 발표자를 모셨던 제4회 세미나와는 달리 이번 세미나에서는 블라인드 투표를 진행해 기준선을 두고자 했다. 블라인드 투표란 발표자 정보는 공개하지 않고 발표 주제와 내용, 발표 시간과 난이도만 보고 투표하는 방식을 말한다.
Meeting C++에서 쓰는 방식을 차용했으며 점수에 따른 가중치도 동일하게 적용했다. 투표 결과를 토대로 난이도에 따라 2개의 트랙을 설정하고 각 트랙마다 5개의 세션을 배치해 총 10개의 발표 주제를 선정했다.
이번 세미나는 각 트랙의 세션 개수가 5개였기 때문에 오전부터 세션을 시작해야 했다. 이로 인해 그동안 제공했던 케이터링 대신 참석자 수 만큼 도시락을 주문했다. 세미나 비용을 30,000원 받았는데 도시락 비용으로 22,000원이 들어갔다.
케이터링에서 도시락으로 바꾼 결과는 아쉬웠다. 크게 두 가지가 문제였다. 첫번째는 남는 도시락을 처리하는 문제다. 그동안은 항상 토요일에 세미나를 진행했었는데 이번 세미나는 장소 대관 문제로 일요일에 진행해야 했다. 유료로 진행하는 세미나였지만 토요일에 비해 노쇼 비율이 높아지면서 남는 도시락이 생겼다. 두번쨰는 케이터링은 뒷처리하기가 편한 반면 도시락은 음식물을 따로 버려야 하다 보니 주변이 지저분해지는 문제다. 세미나를 하는 도중에도 음식물 쓰레기와 분리수거로 인해 운영진들이 고생이 많았다. 이러한 이유로 다음 세미나부터는 도시락보다는 케이터링을 요청하는 게 낫다고 판단했다.
또한 제4회 세미나 때 제대로 하지 못했던 영상 녹화도 다시 진행했다. 녹화 및 편집에 유능한 지인을 섭외해 진행했으며 녹화를 허용한 세션은 모두 유튜브에 영상이 올라간 상태다. 다음에도 기회가 된다면 영상 녹화 및 편집을 부탁할 생각이다.
세미나 발표 자료는 여기, 발표 영상은 여기에서 확인할 수 있다.
Optimized C++ (C++ 최적화) 번역서 출간
작년부터 작업했던 “Optimized C++”의 번역서 “C++ 최적화”가 7월 5일, 한빛미디어를 통해 출간되었다.
이리저리 바쁜 일정으로 인해 생각보다 번역하는 데 많은 시간이 걸렸다. 번역 검수 및 편집 과정에서 여러모로 애써주신 한빛미디어 관계자분들께 감사의 말씀을 전하고 싶다. 번역서 출간 이후 여러 리뷰를 살펴봤는데 검수도 여러 번 진행하고 감수도 거쳐서 그런지 평가가 좋다.
다음에 또 좋은 책을 번역할 기회가 있다면 도전해보고 싶다. 현재는 휴식을 위해 잠시 쉬고 있다.
Microsoft MVP
2015년 7월, C++ Korea 활동을 계기로 처음 Microsoft MVP에 선정되었다.
MVP 덕분에 알게 된 사람도 많고, 나의 시야도 정말로 넓어지게 되었다. 나에게 많은 변화를 준 계기이기도 하다. 올해도 무사히 Microsoft MVP로 선정되어 MVP 5년차가 되었다. 5년차가 되면 특별한 링을 주는데 받고 나니 감회가 새롭다. 다음 링은 10년차가 되어야 받을 수 있는데 그 때까지 열심히 달려볼 생각이다.
국민대 2019년 OSS 개발자 포럼 SW 여름 캠프
3월에 OSS 개발자 포럼 관계자 분께서 만나자고 연락을 해오셨다. 그래서 흔쾌히 만났는데 여름에 국민대에서 개최하는 캠프에서 강의를 할 수 있겠냐고 부탁하셨다. 작년인가 재작년에 부탁을 받아 캠프에서 1시간 가량 특강을 진행한 적은 있었지만 3일 과정으로 진행하는 강의는 처음이었다. 일단 해보고 싶은 마음에 수락은 했지만 무엇을 주제로 할까 고민이 많아졌다. 지인 몇 분과 의견을 주고 받은 끝에 강화학습으로 결정하게 되었다.
하지만 결정과 동시에 ‘2일 동안 10시간에 고등학생들이 잘 따라올 수 있을까…?’라는 걱정이 들기 시작했다. 주변 분들도 걱정을 많이 해주셨다. 그래서 강의를 시작하기 전 발표 자료를 만들면서 이 점을 계속 생각하며 더 쉽게 설명할 수 있게 바꾸고 비유나 예시를 많이 들어야겠다고 다짐했다.
그렇다고 목표를 크게 바꾸진 않았다. 적어도 DQN이 무엇인지는 알게 해주고 싶었고 CartPole이나 LunarLander 예제는 실행할 수 있게 만들어 주고 싶었다. 그래서 꼭 필요한 내용은 포기하지 않고 모두 넣었다. 분량이 많았지만 조교들과 함께 새벽까지 할 일을 나눠서 자료를 하나씩 만들어나갔다.
막상 2일 동안 진행하고 나니 괜한 걱정을 한 거 같았다. 학생들이 열정적으로 수업을 들어줬기에 나와 조교들도 열심히 보답해주기 위해 노력했다. 학생들이 이해가 안되는 부분이 있을 때는 다시 설명해주고, 질문이 있으면 답변을 해주고 필요하다면 저녁에 실습 시간에 별도의 보충 수업까지 했다.
둘째날 수업 시간에 CartPole-v1 예제로 DQN을 설명한 뒤 저녁에 LunarLander-v2 예제를 풀어보는 시간을 가졌는데 목표를 달성하기 위해 필요한 에피소드 수를 줄이려고 서로 정보를 공유하고 질문을 하는 모습을 보며 나는 열심히 해주는 학생들이 너무 고마웠다. 오히려 미안하기까지 했다.
나의 목표는 학생들에게 강화학습이 무엇이고 이런 것들을 배운다 정도를 알려주면 좋겠다고 생각했는데 생각 이상으로 훌륭하게 해줬다. 어려운 주제더라도 학생들에게 눈높이를 맞추고 목소리에 귀를 기울여주면 같이 헤쳐나갈 수 있다는 점을 배웠다. 덕분에 모두 결과물을 만들어낼 수 있었다.
다음에는 좀 더 잘하겠다는 마음을 가지며 일정을 끝냈다. 배우느라 고생한 학생들, 같이 자료 만들고 질문 받느라 수고해준 조교들, 행사 전반을 기획하고 운영하느라 고생한 운영진 분들께 모두 감사드린다는 말씀을 드리고 싶다.
강의가 끝나고 몇 일 뒤, OSS 캠프에 참가했던 고등학생이 메일을 보내왔다.
이 메일 한 통으로 강의했던 보람을 느낄 수 있었다. 덕분에 겨울 캠프도 강의를 맡게 되었다. 겨울 캠프는 내년 1월 초에 열릴 예정이므로 자세한 이야기는 내년 회고 때 하려고 한다.
캠프에서 사용했던 강의 자료는 여기에서 확인할 수 있다.
NDC 2019 : 하스스톤 강화학습 환경 개발기
NDC는 Nexon Developer Conference의 약자로 국내에 개최되는 게임 컨퍼런스 중 가장 큰 규모로 개최된다. 3일 간의 공개 세션을 통해 다양한 직군의 개발자들이 개발 경험, 지식 등을 아낌없이 나누는 행사라고 할 수 있다.
작년 NDC에서 “유체역학 엔진 개발기 - 게임에서 물리 기반의 유체를 구현하기 위한 고군분투”라는 주제로 발표를 했었기에 올해는 다른 주제로 발표하고 싶었다. 고민하다가 2017년 말부터 열심히 구현하고 있던 하스스톤 RL 환경을 만드는 프로젝트에 관한 이야기를 하면 좋겠다 싶어 마감 10분을 남기고 신청했다.
발표자 선정 결과를 기다리던 도중 NDC 운영 사무국에서 연락이 왔다. 아무래도 “하스스톤”과 관련된 발표이다 보니 블리자드에 발표를 해도 되는지 문의를 해보라는 것이었다. 이런 문의를 어디에 해야 할 지 막막해 하던 도중 작년 NDC를 통해 알게된 전이삭 님이 생각났다. 전이삭 님께 사정을 말씀드렸고 다행히 블리자드 코리아 내 담당자에게 바로 메일을 보낼 수 있었다. 이자리를 빌어 전이삭 님께 감사하다는 말씀을 드리고 싶다. 3주 간의 검토 이후 몇 가지 수정을 조건으로 허락을 받을 수 있었고 덕분에 발표자로 선정되었다.
왜 하스스톤 강화학습에 관심을 가지게 되었는지부터 시작해 하스스톤이 어떤 구조로 이뤄져 있고 각 기능을 어떻게 구현했는지, 그리고 앞으로의 계획은 어떻게 되는지를 정리해서 발표했다. “하스스톤”이라는 게임 덕분인지 작년에 비해 엄청나게 많은 분들이 참석해주셨다. 게임 웹진 기자분들이 참석하셔서 발표 내용을 잘 정리해주셨다. 발표 내용이 궁금하다면 다음 링크를 참고하길 바란다.
- [NDC2019] 하스스톤을 위한 ‘알파고’를 만들 수는 없을까? - 인벤
- [NDC 19] ‘알파고’ 같은 하스스톤 인공지능을 만들기 위한 험난한 여정 - 디스이즈게임
- [NDC2019 #11] 넥슨 프로그래머의 ‘하스스톤’ A·I 제작기 - 경향게임스
- [NDC 2019] 넥슨 프로그래머의 ‘하스스톤’ AI 도전기 - OSEN
아직 개발 중인 프로젝트라 강화학습과 관련된 내용을 많이 설명드리지 못했지만 지금도 꾸준히 작업하고 있고 결과물이 조금씩 나오고 있는 상태다. 기회가 된다면 내년에 Part 2로 시연하는 모습을 보여드리면 좋겠다. 그리고 이 발표 덕분에 하스스톤 프로게이머 몇 분과 연락을 하게 되었다. 현재보다 미래가 더욱 기대된다.
NDC 발표 자료는 여기, 녹화 영상은 여기에서 확인할 수 있다.
사이드 프로젝트 - RosettaStone
RosettaStone은 2017년 말에 시작한 프로젝트로 C++로 하스스톤 게임을 구현하고 강화 학습을 통해 여러 가지 의미있는 연구를 하기 위한 프로젝트다. 이 프로젝트를 시작하게 된 계기는 아주 단순하다. 하루는 하스스톤을 하고 있는데 여관 주인의 플레이가 너무 답답했다. 플레이어라면 하지 않은 플레이를 하길래 ‘아, 여관 주인의 뇌를 바꿔야겠다.’라고 느껴 시작하게 되었다. 올해도 많은 팀원들이 새로 들어왔고 함께 여러 작업을 했다. 오리지널 카드를 전부 구현했으며 RL 환경을 위해 MCTS를 구현하고 PyTorch C++ API와 연결해 강화 학습을 하기 위한 준비를 마쳤다. 올해에도 나와 같이 구현 작업하느라 고생한 팀원들에게 고맙다는 말을 전하고 싶다. 내년에는 같이 논문도 쓰고 프로게이머와의 대전도 진행하려고 한다.
최근에 2020년 로드맵을 작성했는데 다음과 같다.
- Implement all standard cards
- Rise of Shadows
- Saviors of Uldum
- Descent of Dragons
- Implement programs for playing game
- Console-based
- GUI-based
- Web-based
- Prepare “Hearthstone pro gamer” vs AI match-up
- Implement “Hearthstone Battlegrounds”
- Support various deep-learning framework for RL environment
- Tensorflow
- PyTorch
- Fully support Python API
- Write a paper on Hearthstone’s RL environment
- Make architecture documents for contributors
- Make tutorials for programs
저장소는 여기에서 확인할 수 있다.
개인 이야기
- 가끔 식도염이 재발해 고생할 떄가 있지만 작년에 비해 건강은 많이 회복했다.
- 식사량을 조금 줄였는데 효과가 있는 거 같다. 또한 주말에는 1~2끼만 먹고 있다.
- 돈을 너무 아끼지 않고 써서 감당이 안될 때가 있다. 돈을 아끼는 생활을 해야겠다.
- 한꺼번에 너무 많은 일을 하다 보니 일정에 치여서 포기해야 되는 경우가 많았다. 고쳐야 한다.
2020년 계획
2020년에 계획하고 있는 일들은 다음과 같다.
- C++20 책 집필하기 (박동하 님과 함께 작업)
- RL 환경 구축 관련 책 집필하기
- RL 환경 구축 관련 논문 쓰기
- RosettaStone 외 여러 RL 환경을 구축하기 위한 프로젝트 작업 진행
- 국민대 2020년 OSS 개발자 포럼 SW 겨울 캠프 - 알파제로를 이용한 오목 AI 만들기
- 모두의연구소 LAB 개설
- C++ Korea 스터디, 세미나 및 밋업 진행
- MVP Summit 2020 참석
- TEDxUNIST 강연
정리
올해도 참 많은 일들을 하며 보냈다. 특히 7월은 여러 일들이 겹쳐서 정신없이 보냈다. 여전히 나는 게으르다고 생각한다. 늘 의욕만 앞서고 실천으로 옮기지 못하는 나 자신이 미더울 때가 많다. ‘작년보다 올해는 좀 더 나았을까’라고 스스로에게 물어보자면 100점 만점에 70점 정도는 줄 수 있을 것 같다. 내년에는 내가 갖고 있는 능력을 좀 더 효율적으로 사용해 적어도 80점은 줄 수 있는 사람이 되었으면 좋겠다.