
개발자라면 누구나 마음속에 품고 있는 '버킷리스트'가 하나쯤 있죠?
제 리스트 한구석에는 꽤 오랫동안 묵혀둔 아이템이 하나 있었습니다.
바로 "나를 이기는 체스 AI 만들기"입니다.
거창해 보이나요?
사실 여기에는 치명적인 비밀이 하나 있습니다.
제가 체스를 엄청나게 못 둔다는 겁니다.
그래서 목표 달성이 생각보다 쉬웠습니다.
딥블루(Deep Blue)나 알파고를 만들 필요가 없었거든요.
그저 '저보다만' 잘하면 됐으니까요.
오늘은 10년 차 개발자가 주말에 잉여로움을 쏟아부어 만든,
초경량 체스 엔진 개발기를 들려드릴게요.
커피 한 잔 준비하셨나요? 시작합니다.
1. 도파민 디톡스와 코지 코딩(Cozy Coding)
요즘 개발 환경, 솔직히 너무 시끄럽지 않나요?
슬랙 알림 울리죠, 메일 오죠, 툭하면 빌드 깨졌다고 알람 뜨죠.
그래서 이번 프로젝트는 작정하고 '과거로 회귀'하기로 했습니다.
창고에 박혀 있던 낡은 아수스(Asus) 넷북을 꺼냈습니다.
인터넷? 연결 안 했습니다.
오로지 저와 코드, 그리고 껌벅거리는 커서뿐이었죠.
Vim 에디터를 켜고 터미널 환경에서 코드를 짜기 시작했습니다.
마치 90년대 해커 영화의 주인공이 된 기분이랄까요.
이걸 요즘 말로 '코지 코딩(Cozy Coding)'이라고 부르고 싶네요.
방해 요소가 없으니 몰입감이 엄청났습니다.
2. 의존성 0%의 미학
이번 프로젝트의 핵심 원칙은 '단순함'이었습니다.
한 번이면 수천 개의 라이브러리가 깔리는 세상이잖아요?
그게 싫었습니다.
그래서 C언어를 선택했습니다.
외부 라이브러리? 하나도 안 썼습니다.
심지어 동적 메모리 할당()도 안 썼습니다.
오로지 고정된 메모리만 사용했죠.
결과가 어땠을까요?
체스 엔진 핵심 코드가 600줄도 안 됩니다.
AI 로직은 150줄 미만이고요.
나중에 웹어셈블리(WebAssembly)로 컴파일해보니 바이너리 크기가 6KB가 안 되더군요.
요즘 웹페이지에 들어가는 아이콘 이미지 하나보다 작은 용량입니다.

3. "테스트 코드는 나중에 짜야지"의 최후
하지만 10년 차 개발자라도 실수는 합니다.
아니, 오히려 "이 정도 사이즈면 머릿속으로 다 그려지지"라며 자만하다가 넘어지죠.
빨리 결과물을 보고 싶은 마음에 단위 테스트(Unit Test) 작성을 미뤘습니다.
"체스 룰 뻔하잖아? 나중에 짜지 뭐."
이게 화근이었습니다.
체스에는 '앙파상(En Passant)'이나 '캐슬링(Castling)' 같은 까다로운 규칙들이 있습니다.
여기서 버그가 터지기 시작하는데, 도저히 잡을 수가 없더군요.
결국 하던 일을 멈추고 처음부터 다시 테스트 프레임워크를 만들고 테스트 케이스를 짰습니다.
돌려보니 버그가 우수수 쏟아지더라고요.
여러분, 사이드 프로젝트라도 테스트는 꼭 작성하세요.
뼈저리게 느꼈습니다. 테스트는 선택이 아니라 생존 수단입니다.
4. 6KB짜리 AI를 웹에 올리는 법
터미널에서 텍스트로 체스를 두려니 눈이 너무 아팠습니다.
그래서 그래픽 인터페이스(GUI)를 붙이기로 했죠.
두 가지 방법을 썼습니다.
첫째, XBoard 프로토콜 연동.
리눅스 진영의 오래된 체스 GUI 표준입니다.
텍스트 입출력만 맞추면 되니 구현이 아주 쉬웠습니다. 100줄도 안 걸렸죠.
둘째, 웹 브라우저 연동.
여기서 C언어의 진가가 발휘됩니다.
C로 짠 코드를 웹어셈블리(WASM)로 컴파일했습니다.
복잡한 데이터 변환(Marshalling) 과정을 거치기 싫어서 꼼수를 좀 썼습니다.
체스 수(Move)를 단순한 정수형 숫자 하나로 비트 패킹해서 자바스크립트로 넘겼죠.
여기에 라는 가벼운 자바스크립트 라이브러리를 붙이니,
모바일에서도 돌아가는 그럴싸한 체스 게임이 완성되었습니다.
빌드 도구도, NPM도 필요 없었습니다.
그냥 HTML 파일 하나면 충분했죠.
5. 결론: 그래서 이겼나요?
가장 중요한 질문이 남았네요.
과연 제가 만든 AI를 제가 이겼을까요?
슬프게도, 제가 졌습니다.
매번 퀸이나 룩을 허무하게 잃고 게임을 던지게 되더군요.
제 AI가 훌륭해서가 아닙니다.
제가 초반에만 반짝 유리하다가, 중반 넘어가면 어이없는 실수를 연발하기 때문이죠.
아마 이 세상에서 체스를 제일 못 두는 사람만 이길 수 있는 AI일지도 모릅니다.
하지만 임무는 완료했습니다.
"나를 이기는 AI"를 만들었으니까요.
마치며
거창한 기술 스택이나 복잡한 아키텍처가 아니어도 좋습니다.
가끔은 이렇게 낡은 노트북 하나 펴놓고,
순수한 코드 덩어리를 만지는 재미를 느껴보시는 건 어떨까요?
비록 제가 만든 AI에게 처참하게 패배했지만,
코딩하는 과정만큼은 그 어떤 승리보다 짜릿했습니다.
이번 주말, 여러분도 묵혀둔 버킷리스트를 하나 꺼내보세요.
그게 아주 사소하고 쓸모없어 보이는 것일지라도 말이죠.


