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

곡이 넘어갈 때마다 소리가 튀었다

생성 도구로 뽑은 곡은 곡마다 음량이 제각각이다. 그대로 이어 틀면 한 곡이 끝나고 다음 곡에서 갑자기 커지거나 작아진다. 매장에서 이건 그냥 거슬리는 정도가 아니라, 직원이 하루에 몇 번씩 볼륨을 만지게 만든다.

올릴 때 파일 자체를 같은 음량으로 구워 두기로 한 건 앞선 TIL 1에서 정한 것이고, 이날 실제로 그렇게 굽기 시작했다. 곡을 올리면 형식을 맞추고 음량을 맞춘 파일이 만들어진다.

굽고 나서야 보인 대가가 있다. 값을 바꾸고 싶어지면 이미 올라간 곡을 전부 다시 구워야 한다. 그래서 원본은 손대지 않고 따로 보관하기로 했다. 실제로 한 달 뒤에 기준을 올릴 일이 생겼는데, 원본이 있어서 결정만 하면 되는 일이었다.

한 번 정해서 파일에 굳히는 선택은 「되돌릴 길을 같이 만들어 두느냐」로 안전해진다. 원본이 없으면 그 결정은 영구적인 게 되고, 있으면 그냥 다시 하면 되는 일이 된다.


피아노는 장르가 아니었다

태그를 달다 보니 장르 칸에 재즈·라운지와 나란히 피아노·기타·퍼커션이 들어가 있었다. 피아노는 장르가 아니라 무슨 악기를 썼느냐다. 그대로 두면 「피아노 재즈」를 찾을 때 두 값이 같은 칸에서 서로를 밀어낸다.

그래서 악기를 「편성」이라는 칸으로 따로 뺐다. 이미 수백 곡에 붙어 있는 태그를 옮기는 거라 연결이 다 끊어질까 걱정했는데, 그렇지 않았다. 곡과 태그는 이름이 아니라 안 보이는 번호로 묶여 있어서, 그 태그가 어느 칸 소속인지만 바꿔도 붙어 있던 곡은 그대로 따라온다.

분류 체계는 처음에 정확히 못 정한다. 곡이 쌓여야 무엇과 무엇이 다른 종류인지 보인다. 그러니 중요한 건 처음에 잘 정하는 게 아니라, 나중에 바꾸는 값이 싼 구조로 두는 것이다.


한 단어가 두 칸에 걸려 있었다

같은 자리에서 자동 태깅 사전도 손봤다. 프롬프트에 synth가 있으면 장르 「일렉트로닉」과 편성 「신스」 양쪽에 걸리게 돼 있었다. 어느 쪽이 붙을지는 그때그때 달라진다.

겹쳐 두면 결과를 예측할 수 없고, 잘못 붙었을 때 어디를 고쳐야 하는지도 알 수 없다. 그래서 한 단어는 한 칸에만 두기로 하고, 겹치던 것들을 한쪽으로 몰았다.

사전을 넓힐 때 새 단어를 넣는 것보다 먼저 볼 것은 이미 있는 단어와 겹치지 않는지다. 겹침은 늘어날수록 티가 안 나고, 티가 안 나는 채로 분류를 조금씩 흐린다.


나중에 바뀔 값을 통계에 그대로 쓰면 과거가 바뀐다

어떤 업종에서 어떤 곡이 잘 나가는지 보려고 재생 기록을 쌓기 시작했다. 여기서 정할 게 하나 있었다.

재생 기록에 업종을 적어 둘 것인가, 아니면 계정만 적어 두고 나중에 그 계정의 업종을 찾아볼 것인가. 뒤엣것이 간단해 보이지만, 그러면 매장이 업종을 바꾸는 순간 그 매장의 지난 재생 기록도 전부 새 업종으로 바뀐다. 「카페일 때 이 곡이 잘 나갔다」는 사실이 사라지는 것이다.

그래서 재생할 때의 업종을 그 자리에 박아 두기로 했다. 지금 값이 필요한 게 아니라 그때 값이 필요한 기록이기 때문이다.

기록을 설계할 때는 「그 값이 나중에 바뀔 수 있나」를 묻는다. 바뀔 수 있는 값을 가리키기만 해 두면, 그 기록은 과거가 아니라 현재의 그림자가 된다.


세는 기준 하나가 나중 일의 조건이 됐다

재생 기록을 쌓기 시작하면서, 앞선 TIL 1에서 정한 「곡 주소를 받아 가는 순간을 재생 한 번으로 센다」가 실제 숫자가 되어 쌓이기 시작했다.

이 정의가 나중에 두 번 발목을 잡는다. 검사 도구가 곡을 받아 갈 때도 재생으로 세어져 검사 전용 통로를 따로 두게 되고, 다음 곡을 미리 받아 두면 빨라지는데 그러면 안 튼 곡까지 세어져 미루게 된다. 둘 다 뒤에서 다시 나온다.

세는 기준을 정하는 일은 기능 하나가 아니라 앞으로 그 숫자를 건드리는 모든 일의 조건이 된다. 편한 자리에 두기 전에 「이 자리를 지나가는 게 사람의 행동뿐인가」를 묻는 게 낫다.


로그인이 없어도 운영자 화면은 먼저 만들 수 있었다

운영자용 계정 관리 화면을 만들려는데 걸리는 게 있었다. 매장이 자기 계정으로 로그인하는 구조가 아직 없다. 그러면 계정을 여러 개 관리해 봐야 매장 앱이 자기가 어느 계정인지 모른다.

「로그인부터 다 만들어야 계정 관리가 된다」로 보면 그날 할 수 있는 일이 없어진다. 그래서 둘을 나눴다. 운영자 화면은 계정 목록과 편집까지 먼저 만들고, 매장 앱은 당분간 계정이 하나뿐인 것으로 둔다. 매장과 계정을 로그인으로 잇는 일은 두 번째 고객을 받는 때로 미뤘다.

미루는 일에는 날짜가 아니라 조건을 붙이는 게 낫다. 「다음 달에」는 지나가면 그만이지만 「두 번째 고객이 오면」은 그 일이 실제로 필요해지는 순간에 알아서 걸린다.


요약

  • 만들 때 한 번 굳히는 선택은 원본을 남겨 두어야 되돌릴 수 있다.
  • 분류 체계는 처음에 정확히 못 정한다. 잘 정하는 것보다 나중에 바꾸는 값이 싼 구조가 낫다.
  • 한 단어가 두 칸에 걸리면 결과를 예측할 수 없다. 사전은 넓히기 전에 겹침부터 본다.
  • 기록에는 그때의 값을 박아 둔다. 바뀔 수 있는 값을 가리키기만 하면 과거가 현재를 따라 바뀐다.
  • 무엇을 한 번으로 셀지는 이후 그 숫자를 건드리는 모든 일의 조건이 된다.
  • 미루는 일에는 날짜가 아니라 조건을 붙인다.

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 11 79 습관만들기 Pawbit TIL 10 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 4 82 모래게임 Sandrop TIL 5 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 룸톤 Roomtone TIL 1 99 모래게임 Sandrop TIL 11 100 소리꽃 KeyBloom TIL 11 101 여둘까 Office Layout TIL 5 102 모래게임 Sandrop TIL 12 103 모래게임 Sandrop TIL 13 104 콘티온 ContiOn TIL 4 105 모래게임 Sandrop TIL 14 106 소리꽃 KeyBloom TIL 12 107 습관만들기 Pawbit TIL 14 108 모래게임 Sandrop TIL 15 109 모래게임 Sandrop TIL 16 110 소리꽃 KeyBloom TIL 13 111 온실 GreenHouse TIL 1 112 콘티온 ContiOn TIL 5 113 모래게임 Sandrop TIL 17 114 소리꽃 KeyBloom TIL 14 115 온실 GreenHouse TIL 2 116 콘티온 ContiOn TIL 6 117 모래게임 Sandrop TIL 18 118 콘티온 ContiOn TIL 7 119 모래게임 Sandrop TIL 19 120 소리꽃 KeyBloom TIL 15 121 룸톤 Roomtone TIL 2 읽는 중 122 모래게임 Sandrop TIL 20 123 모래게임 Sandrop TIL 21 124 소리꽃 KeyBloom TIL 16 125 소리꽃 KeyBloom TIL 17 126 소리꽃 KeyBloom TIL 18 127 여둘까 Office Layout TIL 6 128 소리꽃 KeyBloom TIL 19 129 소리꽃 KeyBloom TIL 20 130 콘티온 ContiOn TIL 8 131 콘티온 ContiOn TIL 9 132 로그스톤 상표 셀프 출원 TIL 1 133 소리꽃 KeyBloom TIL 21 134 로그스톤 샵 LogStone Shop TIL 1 135 소리꽃 KeyBloom TIL 22 136 로그스톤 샵 LogStone Shop TIL 2 137 룸톤 Roomtone TIL 3 138 소리꽃 KeyBloom TIL 23 139 모래게임 Sandrop TIL 22 140 모래게임 Sandrop TIL 23 141 소리꽃 KeyBloom TIL 24 142 로그스톤 샵 LogStone Shop TIL 3 143 모래게임 Sandrop TIL 24 144 소리꽃 KeyBloom TIL 25 145 모래게임 Sandrop TIL 25 146 MiniMacro TIL 1 147 룸톤 Roomtone TIL 4 148 모래게임 Sandrop TIL 26 149 콘티온 ContiOn TIL 10 150 Astro가 무엇인지, 왜 옮기는지 151 룸톤 Roomtone TIL 5 152 룸톤 Roomtone TIL 6 153 모래게임 Sandrop TIL 27 154 소리꽃 KeyBloom TIL 26 155 MiniMacro TIL 2 156 로그스톤 샵 LogStone Shop TIL 4 157 메트로놈 Simple Metronome TIL 8 158 모래게임 Sandrop TIL 28 159 여둘까 Office Layout TIL 7 160 룸톤 Roomtone TIL 7 161 메트로놈 Simple Metronome TIL 9 162 블로그 Astro 이관 TIL 163 여둘까 Office Layout TIL 8 164 로그스톤 샵 LogStone Shop TIL 5 165 모래게임 Sandrop TIL 29 166 오픈데이 Openday TIL 1 167 로그스톤 샵 LogStone Shop TIL 6 168 모래게임 Sandrop TIL 30 169 오픈데이 Openday TIL 2 170 모래게임 Sandrop TIL 31 171 Unreal Engine MCP TIL 1 172 모래게임 Sandrop TIL 32 173 소리꽃 KeyBloom TIL 27 174 콘티온 ContiOn TIL 11 175 오픈데이 Openday TIL 3 176 로그스톤 샵 LogStone Shop TIL 7 177 모래게임 Sandrop TIL 33 178 소리꽃 KeyBloom TIL 28 179 오픈데이 Openday TIL 4 180 여둘까 Office Layout TIL 9 181 오픈데이 Openday TIL 5 182 ScorePlayer TIL 1 183 모래게임 Sandrop TIL 34 184 BuildingHub TIL 1 185 ScorePlayer TIL 2 186 여둘까 Office Layout TIL 10 187 BuildingHub TIL 2 188 ScorePlayer TIL 3 189 Unreal Engine MCP TIL 2 190 궁 미로 PalaceMaze TIL 1 191 메트로놈 Simple Metronome TIL 10 192 메트로놈 Simple Metronome TIL 11 193 오픈데이 Openday TIL 6 194 BuildingHub TIL 3 195 Obsidian vault에서 코드만 빼기 — directory junction 196 ScorePlayer TIL 4 197 여둘까 Office Layout TIL 11 198 오픈데이 Openday TIL 7 199 URL은 바뀔 수 있는 것에 묶지 않는다 200 돌이키기 힘든 변경은 작게 먼저 확인한다 201 도구는 기능이 아니라 내 일에 맞는지로 고른다 202 궁 미로 PalaceMaze TIL 2 203 궁 미로 PalaceMaze TIL 3 204 소리꽃 KeyBloom TIL 29 205 오픈데이 Openday TIL 8 206 룸톤 Roomtone TIL 8 207 BuildingHub TIL 4 208 ScorePlayer TIL 5 209 로그스톤 샵 LogStone Shop TIL 8 210 여둘까 Office Layout TIL 12 211 오픈데이 Openday TIL 9 212 BuildingHub TIL 5 213 MiniMacro TIL 3 214 룸톤 Roomtone TIL 10 215 룸톤 Roomtone TIL 9 216 소리꽃 KeyBloom TIL 30 217 오픈데이 Openday TIL 10 218 여둘까 Office Layout TIL 13 219 룸톤 Roomtone TIL 11 220 소리꽃 KeyBloom TIL 31 221 궁 미로 PalaceMaze TIL 4 222 룸톤 Roomtone TIL 12 223 로그스톤 샵 LogStone Shop TIL 9 224 룸톤 Roomtone TIL 13 225 로그스톤 샵 LogStone Shop TIL 10 226 룸톤 Roomtone TIL 14 227 소리꽃 KeyBloom TIL 32 228 룸톤 Roomtone TIL 15 229 룸톤 Roomtone TIL 16 230 룸톤 Roomtone TIL 17