맨해튼 보드게임대회 우승기
저는 최근 코엑스에서 만두게임즈가 주최한 맨해튼 보드게임대회에서 우승했습니다. 게임대회야 늘 열리는 것이고, 대회야 늘 우승자를 낳기 때문에 특별한 소식은 아닐 겁니다. 하지만 우승의 배경에 단순히 게임에 대한 감각이나 재능이 아니라 프로그래밍과 데이터가 있다면 어떨까요?
저는 직업 개발자는 아니고, 개발 역량이 조금 있는 기획자입니다. 프로그래밍 기술 자체보다는 기술과 인문학적 상상력을 결합해 세상을 풍요롭게 가꾸는 것에 관심이 많고, 비개발자들이 프로그래밍을 만났을 때 벌어지는 일련의 일들을 사랑합니다. 최근의 연구주제는 보드게임이었고, 보다시피 우승해버렸습니다. 프로그래밍이 없었다면 쉽지 않았을 겁니다. (물론 기본적인 실력이 뒷받침되기는 했...)
그래서 이 비하인드 스토리를 쓰게 되었습니다. 프로그래밍과 보드게임이 만났을 때 벌어지는 일들이 너무나 놀라웠고, 많은 의미있는 것들을 배울 수 있었으며, 꽤 흥미로운 아이디어들을 상상할 수 있었기 때문입니다. 그 이야기를 들려드리고자 합니다.
제가 대회를 준비하며 처음 한 일은 보드카페에 가서 맨해튼이라는 게임의 룰을 이해하고, 코드로 게임을 프로그래밍하는 것이었습니다. 일반적인 게임 프로그래밍과 다른 점은 플레이어들이 게임을 즐길 수 있도록 프로그래밍하는 것이 아니라, 난수 값에 의해 자동으로 게임이 시뮬레이션 진행되도록 짰다는 것입니다. 이 과정에서 가장 큰 수확은 저희 개발 능력이 향상된 것이 아니라, 게임에 대한 저의 이해가 향상된 점입니다.
먼저 게임의 준비, 진행, 마무리로 절차를 나누고 진행은 다시 라운드의 진행과 정리로, 라운드의 진행은 턴들의 연속으로, 하나의 턴은 경우의 수에 대한 상상과 선택으로, 하나의 큰 존재를 더 작은 존재들의 관계로 쪼개어가는 작업의 연속이었습니다. 수많은 오류들이 생겼고, 우여곡절 끝에 해결해나갔습니다. 그리고 그 과정에서 저는 이 게임을 속속들이 이해하게 되었습니다.
무엇인가 실제와 다르다면 코드는 동작하지 않거나, 오류를 일으킵니다. 이것은 프로그래밍이 가진 놀라운 가능성 중의 하나입니다. 현실 세계로 존재하는 무엇이든 코드를 통해 가상의 세계로 옮겨오는 과정에서 우리는 그것에 대해 배울 수 있습니다. 오류를 수정해나가는 과정에서 우리의 이해는 더 깊어집니다. 어쩌면 중요한 것은 프로그래밍 능력을 배우는 것이 아니라, 우리를 둘러싼 세계를 프로그래밍함으로써 그것에 대해 배워가는 것일지도 모릅니다.
저는 배움의 도구로 프로그래밍이 가진 가능성을 깨달으면서 게임만이 아니라 제 스스로를 코딩해보는 것, 저의 조직을 코딩해보는 것, 즐겨 읽는 소설 속 이야기를 코딩해보는 것에 대해 상상해보게 되었습니다. 뿐만 아니라 제가 평소에 궁금하고 더 알고 싶었던 모든 것을 코딩해보는 것에 대해 고민해보게 되었죠.
맨해튼이라는 보드게임은 건물을 세우는 턴 게임이고, 자기 차례 때에는 수많은 행동 중 단 하나만을 할 수 있습니다. 저는 이 게임에서 선택의 형식, 결과, 의미에 따라 가능한 거의 모든 행동을 검토하고 크게 47가지의 행동 패턴으로 압축했습니다.
47개의 행동 선택 중 2개 이상의 행동 선택이 충돌했을 때 어떤 행동을 우선할 것인지에 대해 가중치를 설정할 수 있도록 설계했습니다. 다음으로는 가중치를 바꿔가며 어떤 선택들을 우선하거나 지양했을 때 승률이 올라가는지에 대한 테스트의 연속이었죠. 막힐 때면 함께 우승한 팀원이자 현직 빅데이터 직무 강사인 친구의 도움을 받으면서, 준비기간 내내 밤을 새며 연구를 거듭했습니다.
선호 선택, 일반 선택, 기피 선택으로 47개의 행동 패턴을 그룹핑하고 각 그룹 안에서도 선택들 사이의 우선순위를 실험했습니다. 신뢰도 확보를 위해 충분한 시뮬레이션을 진행하고자, 하나의 전략 가중치 셋으로 10만 건 이상의 시뮬레이션을 진행했습니다. 예상과 다르게 결과가 좋은 선택들도 있었고, 좋지 않은 선택들도 있었습니다. 평균값의 함정에 속지 않기 위해 유의미한 선택들을 쪼개어 추가 실험을 진행하기도 하면서, 좋은 선택이란 무엇인가에 대해 많이 배웠던 것 같습니다.
저에게 기술적 역량이 없었을 때에는 보드게임 대회를 준비할 때 직접 한 판 한 판을 플레이하며 실험했습니다. 짧게는 30분, 길게는 3시간이 걸렸죠. 실험할 수 있는 가설의 수도 적었고, 그 결과값을 신뢰할 수 있는 표본의 양도 적었습니다. 하지만 제가 짠 맨해튼 프로그램은 1초에 1000회의 게임을 진행합니다. 승패만이 아니라 모든 경기의 최종 점수, 주요 선택, 라운드 별 점수 변화와 내역까지 기록으로 남죠. 컴퓨터는 데이터를 보여줄 뿐 그 의미까지 해석해주지는 않기 때문에, 단순히 승률만이 아니라 이런 데이터들 속에서 숨겨진 패턴들을 찾아내야 했습니다.
시뮬레이션 툴로써 프로그래밍이 가진 가능성은 우리가 단순히 게임에서 더 좋은 전략을 찾아낼 수 있게 되었음을 의미하지 않습니다. 알파고가 이세돌을 이긴 것은 컴퓨터가 인간보다 더 바둑을 잘 둘 수 있게 되었음을 의미하는 것이 아니라, 바둑 수준의 복잡성을 가진 세계에서 컴퓨터가 인간보다 더 나은 선택을 할 수 있게 되었음을 의미합니다.
물론 현실에는 변수가 많기 때문에 인간이 할 일은 여전히 남아있겠지만, 프로그래밍을 통한 시뮬레이션적 접근을 통해 우리는 선택이 필요한 모든 상황에서 가치있는 기본 선택을 가질 수는 있습니다. 테니스를 더 잘 칠 수 있고, 비지니스를 더 잘 할 수 있고, 더 매력적인 글을 쓸 수도 있을 겁니다. 영화 <어바웃 타임>의 주인공은 하루를 몇 번 살아보는 것만으로 많은 후회를 줄였습니다. 프로그래밍이 가진 시뮬레이션 툴로서의 가능성을 잘 활용하면 우리가 잘하고 싶어하는 모든 경험을 1초에 1000회 이상 진행해 볼 수 있습니다. 미래를 미리 살아보는 것이죠.
누군가는 이렇게 말할 겁니다. 영화에서도 주인공은 시간을 되돌리는 것을 그만두고 오늘에 최선을 다하지 않느냐고. 저는 시간을 과거로 되돌리는 것이 아니라, 미래를 미리 살아보는 것은 다르다고 생각합니다. 오히려 이것은 최선을 다해 한 번 뿐인 오늘을 살아가려는 노력일 수 있습니다. 현실에는 변수가 많기 때문에 결과는 우리가 예측한 것과 똑같이 흘러가지 않을 테고, 그러한 결과를 성실하게 받아들이는 것이 우리가 해야 할 일일지도 모릅니다.
현실을 가상으로 옮겨오는 과정에서 우리는 세계와 인간에 대해 면밀하게 배울 수 있고, 그렇게 옮겨온 객체들의 상호작용을 시뮬레이션해가는 과정에서 더 나은 경험을 만드는 방법을 발견할 수 있습니다. 저는 이것이 우리가 나아가야 할 코딩 교육의 방향 중 하나라고 생각합니다.
보드게임은 인간, 세계, 상호작용이 명확한 규칙에 의해 단순화되어 있기 때문에 인문학을 배우기에 가장 적절한 도구 중 하나입니다. 다른 매체들과 달리 능동적으로 선택할 수 있고, 자신의 선택에 따라 매번 다른 결과를 맞이하기 때문이지요.
저는 그동안 보드게임을 통한 인문학 교육 콘텐츠를 만들고 진행해왔는데요. 해당 콘텐츠에 이번 대회를 계기로 개발한 기술의 가능성을 더하는 것은 물론, 프로그래밍을 통한 인문학 교육까지 영역을 확장하기로 결심했습니다. 게임 뿐만이 아니라 우리를 둘러싼 현실의 다양한 것들을 코딩해보고, 그것들의 상호작용을 시뮬레이션해봄으로써 더 나은 존재와 관계의 방식을 찾는 프로그램이지요.
프로그래밍과 프로그래밍의 가능성에 대한 이해를 확장하는 데 조금이라도 흥미로운 자극이 되었기를 바라며, 곧 다른 소식들로 찾아뵙겠습니다.
좋은 게임에는 필승법이 없고, 맨해튼은 권위있는 상인 '2016년 긱 선정 올해의 보드게임상'을 수상한 좋은 게임입니다. 저는 100퍼센트 이길 수 있는 필승법을 발견한 것이 아니라 다른 전략에 비해 상대적으로 유효한 전략 중 하나를 발견했고, 실제로 시뮬레이션 과정에서 패배하는 경우가 적지 않았습니다. 현실에서 직접 시뮬레이션할 수 있는 작업에 기술적 역량을 더해 시간을 극단적으로 단축시칸 것에 불과하므로, 혹시라도 불필요한 오해가 없기를 바랍니다. 더불어 협업 및 콘텐츠에 대한 다양한 제안은 환영입니다:)