그때 다른 선택을 했다면, 나는 지금 어떤 삶을 살고 있을까.
이 질문에서 GHOSTLIFE를 시작했다. 성격을 진단하는 테스트를 만들고 싶었던 건 아니다. 오히려 반대였다. 이미 살아온 나를 설명하는 대신, 선택이 조금 달랐다면 어디쯤에서 어떤 삶을 살고 있었을지 상상해보는 작은 인터랙티브 경험에 가까웠다.
8개의 장면, 16개의 ‘살지 않은 나’
사용자는 여덟 개의 장면에서 네 가지 선택지 중 하나를 고른다. 각 선택은 STAY ↔ LEAVE, ORDER ↔ IMPULSE, HIDDEN ↔ SEEN, BUILD ↔ EXPERIENCE라는 네 축에 쌓인다. 네 개의 이진 결과가 조합되어 최종적으로 16개의 다른 삶 중 하나가 나온다.
결과는 단순한 라벨로 끝내지 않았다. 도시, 직업, 욕망, 두려움, 상징물, 그리고 그 삶을 만든 선택의 문장을 함께 보여준다. 결과 포스터를 저장할 수 있고, 친구의 GHOST 코드와 비교하면 두 사람이 다른 삶에서 어디에서 만났을지 한 장면을 만들어준다.
직접 해보기: https://chirpyworks.github.io/ghostlife/
왜 오픈소스로 공개했나
이 프로젝트의 가치가 코드의 비밀에 있다고 생각하지 않았다. 특별한 알고리즘을 숨겨야 성립하는 서비스도 아니다. 콘셉트, 카피, 결과의 매력, 공유하고 싶은 비주얼, 그리고 얼마나 빨리 실험하고 고치는지가 더 중요했다.
그래서 코드를 닫아두는 것보다 열어두는 편을 택했다. 누군가 질문을 바꾸고, 아키타입을 다시 쓰고, 전혀 다른 비주얼 문법을 얹어 자기 버전을 만들 수 있다면 그 편이 이 프로젝트의 성격에도 더 잘 맞는다.
GitHub: https://github.com/chirpyworks/ghostlife
프레임워크 없이 유지한 이유
GHOSTLIFE는 Vanilla JavaScript, CSS, 정적 HTML로만 돌아간다. 로그인도 없고, 코어 경험에 백엔드도 필요 없다. GitHub Pages에서 그대로 배포된다.
처음에는 빠르게 만들기 위해 대부분의 코드가 한 파일에 모여 있었다. 공개하기 전에는 구조를 다시 정리했다. 지금은 질문·결과 데이터, 점수 로직, 분석, 앱 동작, 스타일을 각각 분리해 처음 보는 사람도 무엇을 어디서 바꾸면 되는지 알 수 있게 했다.
src/ ├─ data.js ├─ scoring.js ├─ analytics.js └─ app.js styles/ └─ main.css tests/ └─ project.test.js
65,536개의 선택 경로를 전부 검사했다
질문은 8개이고 각 질문에는 4개의 선택지가 있다. 가능한 선택 경로는 4⁸, 즉 65,536개다.
오픈소스로 풀기 전에 이 조합을 전부 돌리는 테스트를 저장소 안에 넣었다. 현재 16개의 결과는 각각 정확히 4,096개의 선택 경로로 도달한다. 질문이나 점수 구조를 고친 뒤 분포를 실수로 깨뜨리면 GitHub Actions가 바로 잡아낸다.
한국어와 영어를 따로 썼다
다국어에서 가장 피하고 싶었던 건 번역투였다. 그래서 한국어와 영어를 번역 관계로 두지 않았다. 같은 의미를 전달하더라도 각 언어에서 자연스럽게 읽히는 문장으로 따로 작성했다.
질문, 선택지, 결과 문장, 친구 비교, 공유 카피까지 모두 KR/EN이 분리되어 있다. 영어 버전을 고쳐야 한다면 한국어 문장을 직역하는 것이 아니라 영어 문장 자체를 다시 쓰는 방식이 이 프로젝트의 원칙이다.
포크해서 다른 것을 만들어도 된다
라이선스는 MIT다. 질문을 전부 갈아엎어도 되고, 16개의 결과를 다른 세계관으로 바꿔도 된다. 비주얼 시스템을 다시 만들거나 선택형 게임의 뼈대만 가져가도 된다.
완성된 화면을 공개하는 것보다, 다른 사람이 뜯어보고 자기 식으로 다시 만들 수 있는 상태까지 정리하는 편이 더 재미있는 결말이라고 생각했다.
GHOSTLIFE는 지금도 실험 중이다. 실제로 사람들이 결과를 공유하는지, 친구를 다시 불러오는지, 어떤 결과에서 더 오래 머무는지는 이제부터 숫자로 볼 예정이다.
Live: GHOSTLIFE
Source: chirpyworks/ghostlife