이 글은 Today I Learn 시리즈의 165번째 기록입니다. (총 213개)

게임은 어디서 멈추는지가 품질이다

메트로놈 때는 이런 질문이 없었다

지금까지 낸 앱은 메트로놈이었다. 켜서 쓰고 끄는 도구라 “유저가 어디까지 갔나”라는 질문 자체가 없었고, 잘 도는지만 보면 됐다.

게임은 500개의 판을 순서대로 지나가는 구조다. 어디서 멈추는지가 곧 품질이고, 그걸 알아야 다음에 무엇을 고칠지 정해진다. 그런데 그 질문은 남의 폰에 들어가고 나서야 생긴다. 내 폰에서는 내가 다 깨니까 막히는 자리가 안 보인다.

분석 도구(Firebase Analytics — 앱이 보낸 이벤트를 모아 콘솔에서 보여 주는 구글 서비스)는 붙여 두고도 몇 달을 안 열어 봤다. 무엇을 봐야 하는지 몰랐기 때문이다.

  • 제품의 형태가 봐야 할 것을 정한다. 단계를 지나가는 제품은 어디서 멈추는지를, 켜서 쓰는 도구는 잘 도는지를 본다
  • 무엇을 봐야 하는지 모르면 도구가 있어도 안 연다

열어 보니 비어 있었다

레벨 번호 자리가 전부 비어 있었다

출시 사흘 뒤, 유저가 몇 탄에서 그만두는지 보려고 콘솔을 열었다. 이벤트 수는 쌓여 있는데 레벨 번호가 들어갈 자리가 전부 비어 있었다.

앱은 레벨 번호를 제대로 실어 보내고 있었다. 문제는 받는 쪽이었다. 보낸 값 중 무엇을 쪼개 볼지 콘솔에 미리 등록해야 하는데(맞춤 측정기준 — 이벤트에 딸린 값을 콘솔에서 나눠 보려면 따로 등록하는 항목), 그게 빠져 있었다. 등록 안 된 값은 집계에서 버려진다.

  • 보내는 것과 볼 수 있는 것은 다른 단계다. 계측을 넣었으면 콘솔 화면에서 실제로 보이는지까지 봐야 끝난 것이다
  • 데이터가 비면 보내는 쪽부터 의심하기 쉽지만 받는 쪽 설정일 수 있다

등록했는데 지난 사흘은 안 채워졌다

등록하면 지난 데이터도 채워질 줄 알았다. 아니었다. 등록한 뒤에 들어온 것만 쪼개지고 그 전 것은 계속 빈 채로 남는다. 출시 첫 사흘은 “몇 탄”으로 영영 나눌 수 없게 됐다.

출시 직후라 표본이 애초에 적어서 실제 손해는 작았다. 유저가 많았으면 초반 데이터를 통째로 못 쓰게 됐을 것이다. 이벤트를 코드에 넣은 날 같이 등록했어야 했고, 출시 전 체크리스트에 있었어야 하는 항목이다.

  • 설정을 켜기 전에 소급이 되는지부터 확인한다. 안 되는 설정은 켜기 전 시간이 영영 비고, 늦을수록 잃는 양이 커진다
  • 그런 설정은 “지금 필요한가”가 아니라 “나중에 필요해질 수 있는가”로 판단한다

그래서 원시 데이터를 쌓기로 했다

앞으로도 “이것도 볼 걸” 하는 게 계속 나올 것이다. 그때마다 등록하고 그때부터 쌓으면, 궁금해진 시점에는 늘 데이터가 없다.

그래서 집계된 결과 말고 원시 기록을 한 줄씩 그대로 쌓아 두기로 했다. BigQuery(구글의 대용량 데이터 창고 — 쌓인 기록을 SQL로 꺼내 본다)로 내보내는 연결을 켰다. 그러면 나중에 어떤 질문이 생겨도 그때 꺼내 볼 수 있다. 다만 이것도 소급이 안 돼서 켠 날부터만 쌓인다. 당장 볼 일이 없어도 오늘 켠 이유다.

처음엔 Claude가 이건 유료 요금제에서만 된다고 해서 건너뛰었다. 그런데 내가 콘솔을 직접 들여다보니 무료 요금제에서도 켜졌다. 유료가 아니라고 알려 주고 그때 켰다.

  • 집계는 미리 정한 질문에만 답한다. 원시 기록은 질문을 나중에 정해도 되는 대신 꺼내 보려면 손이 더 간다
  • 미뤄 둔 일은 미룬 이유가 아직 맞는지 다시 본다. “돈이 든다”는 말은 직접 확인해 볼 만하다. 무료 범위는 그사이 넓어져 있기도 하다

저장 위치는 나중에 못 바꾼다

연결할 때 데이터를 어느 지역에 둘지 고르는 항목이 있다. 고를 수 있는 지역이 많아서 Claude에게 어디로 해야 하는지 물었다. 멀리 있는 지역을 고르면 데이터가 오가는 게 느려질 수 있다는 건 알고 있었다. 나중에 바꾸려면 연결을 끊고 다시 만들어야 하고 그동안 쌓인 것은 날아간다고 해서, 유저가 있는 한국에 맞춰 서울로 잡았다.

  • 되돌릴 수 있는 설정과 없는 설정을 가르면 어디에 시간을 쓸지 정해진다. 되돌릴 수 있는 건 빨리 정해 보고, 못 되돌리는 것만 붙잡고 생각한다

Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 습관만들기 Pawbit TIL 1 27 insertOnConflictUpdate vs DoUpdate(target) 28 세션 필터 29 아코디언(Accordiaon) UI를 펼친상태로 만들기 30 input의 step 31 습관만들기 Pawbit TIL 2 32 습관만들기 Pawbit TIL 3 33 Word Cloud 34 Google Sheets를 데이터 버스로(with AppSheet) 35 Django 모델 텍스트 필드 자동 수집 패턴 36 localStorage로 섹션 토글 상태 유지 37 순차 ID 생성(`select_for_update()` + `max()` 조합) 38 역참조 검색과 distinct() 39 xlsx 다운로드와 로딩 오버레이 충돌 40 Android 파일 공유 MIME 타입 41 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 42 크레센도 Phaser + TypeScript TIL 1 43 크레센도 Phaser + TypeScript TIL 2 44 크레센도 Phaser + TypeScript TIL 3 45 크레센도 Phaser + TypeScript TIL 4 46 크레센도 Phaser + TypeScript TIL 5 47 여둘까 Office Layout TIL 1 48 습관만들기 Pawbit TIL 4 49 여둘까 Office Layout TIL 2 50 여둘까 Office Layout TIL 3 51 크레센도 Phaser + TypeScript TIL 6 52 UTF-8 BOM과 PowerShell 파일 쓰기 53 소리꽃 KeyBloom TIL 1 54 습관만들기 Pawbit TIL 5 55 여둘까 Office Layout TIL 4 56 소리꽃 KeyBloom TIL 2 57 소리꽃 KeyBloom TIL 3 58 메트로놈 Simple Metronome TIL 1 59 소리꽃 KeyBloom TIL 4 60 메트로놈 Simple Metronome TIL 2 61 소리꽃 KeyBloom TIL 5 62 습관만들기 Pawbit TIL 6 63 크레센도 Phaser + TypeScript TIL 7 64 메트로놈 Simple Metronome TIL 3 65 소설 타임라인 관리 도구 Lumior TIL 1 66 습관만들기 Pawbit TIL 7 67 정적 블로그 SEO 정비와 Pagefind 검색 도입 68 크레센도 Phaser + TypeScript TIL 8 69 메트로놈 Simple Metronome TIL 4 70 습관만들기 Pawbit TIL 8 71 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 72 메트로놈 Simple Metronome TIL 5 73 모래게임 Sandrop TIL 1 74 습관만들기 Pawbit TIL 9 75 메트로놈 Simple Metronome TIL 6 76 모래게임 Sandrop TIL 2 77 모래게임 Sandrop TIL 3 78 습관만들기 Pawbit TIL 10 79 습관만들기 Pawbit TIL 11 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 5 82 모래게임 Sandrop TIL 4 83 습관만들기 Pawbit TIL 12 84 모래게임 Sandrop TIL 6 85 소리꽃 KeyBloom TIL 6 86 모래게임 Sandrop TIL 7 87 모래게임 Sandrop TIL 8 88 소리꽃 KeyBloom TIL 7 89 모래게임 Sandrop TIL 9 90 소리꽃 KeyBloom TIL 8 91 모래게임 Sandrop TIL 10 92 소리꽃 KeyBloom TIL 9 93 콘티온 ContiOn TIL 1 94 소리꽃 KeyBloom TIL 10 95 콘티온 ContiOn TIL 2 96 습관만들기 Pawbit TIL 13 97 콘티온 ContiOn TIL 3 98 모래게임 Sandrop TIL 11 99 소리꽃 KeyBloom TIL 11 100 여둘까 Office Layout TIL 5 101 모래게임 Sandrop TIL 12 102 모래게임 Sandrop TIL 13 103 콘티온 ContiOn TIL 4 104 모래게임 Sandrop TIL 14 105 소리꽃 KeyBloom TIL 12 106 습관만들기 Pawbit TIL 14 107 모래게임 Sandrop TIL 15 108 모래게임 Sandrop TIL 16 109 소리꽃 KeyBloom TIL 13 110 온실 GreenHouse TIL 1 111 콘티온 ContiOn TIL 5 112 모래게임 Sandrop TIL 17 113 소리꽃 KeyBloom TIL 14 114 온실 GreenHouse TIL 2 115 콘티온 ContiOn TIL 6 116 모래게임 Sandrop TIL 18 117 콘티온 ContiOn TIL 7 118 모래게임 Sandrop TIL 19 119 소리꽃 KeyBloom TIL 15 120 모래게임 Sandrop TIL 20 121 모래게임 Sandrop TIL 21 122 소리꽃 KeyBloom TIL 16 123 소리꽃 KeyBloom TIL 17 124 소리꽃 KeyBloom TIL 18 125 여둘까 Office Layout TIL 6 126 소리꽃 KeyBloom TIL 19 127 소리꽃 KeyBloom TIL 20 128 콘티온 ContiOn TIL 8 129 콘티온 ContiOn TIL 9 130 로그스톤 상표 셀프 출원 TIL 1 131 소리꽃 KeyBloom TIL 21 132 로그스톤 샵 LogStone Shop TIL 1 133 소리꽃 KeyBloom TIL 22 134 로그스톤 샵 LogStone Shop TIL 2 135 소리꽃 KeyBloom TIL 23 136 모래게임 Sandrop TIL 22 137 모래게임 Sandrop TIL 23 138 소리꽃 KeyBloom TIL 24 139 로그스톤 샵 LogStone Shop TIL 3 140 모래게임 Sandrop TIL 24 141 소리꽃 KeyBloom TIL 25 142 모래게임 Sandrop TIL 25 143 MiniMacro TIL 1 144 모래게임 Sandrop TIL 26 145 콘티온 ContiOn TIL 10 146 Astro가 무엇인지, 왜 옮기는지 147 모래게임 Sandrop TIL 27 148 소리꽃 KeyBloom TIL 26 149 MiniMacro TIL 2 150 로그스톤 샵 LogStone Shop TIL 4 151 메트로놈 Simple Metronome TIL 8 152 모래게임 Sandrop TIL 28 153 여둘까 Office Layout TIL 7 154 메트로놈 Simple Metronome TIL 9 155 블로그 Astro 이관 TIL 156 여둘까 Office Layout TIL 8 157 로그스톤 샵 LogStone Shop TIL 5 158 모래게임 Sandrop TIL 29 159 오픈데이 Openday TIL 1 160 로그스톤 샵 LogStone Shop TIL 6 161 모래게임 Sandrop TIL 30 162 오픈데이 Openday TIL 2 163 모래게임 Sandrop TIL 31 164 Unreal Engine MCP TIL 1 165 모래게임 Sandrop TIL 32 읽는 중 166 소리꽃 KeyBloom TIL 27 167 콘티온 ContiOn TIL 11 168 오픈데이 Openday TIL 3 169 로그스톤 샵 LogStone Shop TIL 7 170 모래게임 Sandrop TIL 33 171 소리꽃 KeyBloom TIL 28 172 오픈데이 Openday TIL 4 173 여둘까 Office Layout TIL 9 174 오픈데이 Openday TIL 5 175 ScorePlayer TIL 1 176 모래게임 Sandrop TIL 34 177 BuildingHub TIL 1 178 ScorePlayer TIL 2 179 여둘까 Office Layout TIL 10 180 BuildingHub TIL 2 181 ScorePlayer TIL 3 182 Unreal Engine MCP TIL 2 183 궁 미로 PalaceMaze TIL 1 184 메트로놈 Simple Metronome TIL 10 185 메트로놈 Simple Metronome TIL 11 186 오픈데이 Openday TIL 6 187 BuildingHub TIL 3 188 Obsidian vault에서 코드만 빼기 — directory junction 189 ScorePlayer TIL 4 190 여둘까 Office Layout TIL 11 191 오픈데이 Openday TIL 7 192 URL은 바뀔 수 있는 것에 묶지 않는다 193 도구는 기능이 아니라 내 일에 맞는지로 고른다 194 돌이키기 힘든 변경은 작게 먼저 확인한다 195 궁 미로 PalaceMaze TIL 2 196 궁 미로 PalaceMaze TIL 3 197 소리꽃 KeyBloom TIL 29 198 오픈데이 Openday TIL 8 199 BuildingHub TIL 4 200 ScorePlayer TIL 5 201 로그스톤 샵 LogStone Shop TIL 8 202 여둘까 Office Layout TIL 12 203 오픈데이 Openday TIL 9 204 BuildingHub TIL 5 205 MiniMacro TIL 3 206 소리꽃 KeyBloom TIL 30 207 오픈데이 Openday TIL 10 208 여둘까 Office Layout TIL 13 209 소리꽃 KeyBloom TIL 31 210 궁 미로 PalaceMaze TIL 4 211 로그스톤 샵 LogStone Shop TIL 9 212 로그스톤 샵 LogStone Shop TIL 10 213 소리꽃 KeyBloom TIL 32