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

귀찮다고 말한 것이 고장이었다

곡을 반입하는 내부 도구가 있다. 쓰다가 불편하다고 했다. 곡마다 프롬프트를 일일이 쳐야 한다고.

그 얘기를 하고 며칠 뒤, 새 곡을 넣었는데 올라가지 않았다. 이유를 따라가 보니 프롬프트가 없으면 올리지 않게 돼 있었다. 프롬프트는 곡에 붙는 권리 증빙이자 분류의 재료라, 없는 채로 올리면 나중에 손댈 수 없는 곡이 쌓인다. 그래서 막아 둔 것이다.

즉 「귀찮다」와 「안 올라간다」가 같은 것이었다. 치기 귀찮아서 안 쳤고, 안 쳤으니 막혔다.

불편은 보통 「고치면 좋은 것」으로 분류된다. 그런데 사람이 매번 해야 하는 일이 어딘가의 통과 조건이면, 그 불편은 언젠가 고장으로 나타난다. 안 하게 되기 때문이다.

  • 쓰는 사람이 불편하다고 한 지점을 적어 둔다. 나중에 그 근처에서 사고가 난다.
  • 「매번 손으로 해야 하는 일」이 어딘가의 필수 조건이면, 그건 불편이 아니라 시한폭탄이다.

한쪽 길에서만 막혔다

막혔을 때 그냥 다른 길로 갔다. 도구를 포기하고 명령줄로 올렸다. 그랬더니 잘 올라갔다.

같은 파일인데 한쪽은 거부하고 한쪽은 받았다. 그러면 파일 문제가 아니라 두 길의 조건이 다른 것이다. 알고 보니 명령줄 쪽은 엄격 검사를 켜지 않으면 프롬프트 없이도 올린다.

이게 두 가지를 말해 준다. 하나, 막힌 원인은 파일이 아니라 도구 쪽에 있었다. 둘, 더 쉬운 길이 검사를 건너뛰고 있었다. 급할 때 그쪽으로 도망가면 검사해야 할 것이 안 된 채로 쌓인다.

  • 같은 것이 한쪽에서만 막히면 그 둘의 조건표를 비교한다. 거기 답이 있다.
  • 우회로가 더 느슨하면 사람은 결국 그쪽으로 간다. 느슨한 쪽을 막든지, 막힌 쪽을 쓸 만하게 만들든지 둘 중 하나다.

막는 이유는 막는 자리에 있어야 한다

왜 안 올라가는지 화면을 봐도 알 수 없었다. 나중에 보니 「프롬프트 없음」이라는 표시가 작게 떠 있긴 했다. 눈에 안 들어왔다.

안내가 있었는데 못 봤다는 건, 안내를 안 한 것과 결과가 같다. 특히 그게 작업을 막는 이유일 때는 그렇다. 참고 사항과 통과 조건을 같은 크기로 보여 주면 둘 다 안 읽힌다.

고치면서 가른 기준은 이거였다. 처리만 달라지는 것(길이가 짧다, 이미 있는 곡이다)은 작게, 아예 못 하게 막는 것(프롬프트·커버 없음)은 크게.

  • 안내는 있고 없고가 아니라 읽혔나로 따진다.
  • 막는 이유와 참고 사항을 같은 크기로 두지 않는다. 막는 것만 눈에 띄게 올린다.

미리 적을 자리를 만들자

고치는 방향을 정할 때, 예전에 쓰던 방식이 떠올랐다. 프롬프트를 표에 미리 적어 두고 파일이 들어오면 알아서 맞춰지던 것이다.

지금 도구는 그걸 안으로 들여왔는데, 들여오면서 미리 적는 자리가 사라져 있었다. 파일이 들어와야만 적을 수 있게 된 것이다. 그래서 「적어 두고 나중에 쓴다」가 「들어올 때마다 적는다」로 바뀌었다.

한 번 적어 여러 곡에 쓰는 구조는 그대로 있었다. 적는 시점만 뒤로 밀려 있었다.

  • 기능을 옮길 때는 「언제 할 수 있었는지」도 같이 옮긴다. 할 수 있는 일이 같아도 할 수 있는 때가 달라지면 다른 도구가 된다.
  • 사람이 반복해서 적는 것이 보이면, 적는 횟수를 줄이기 전에 미리 적을 수 있는지부터 본다.

겹치면 묻자고 했는데, 겹침의 기준이 달랐다

도구를 고치면서 하나 더 부탁했다. 곡 제목이 겹치면 전부 덮어쓸 건지 물어봐 달라고. 전에 같은 곡을 여러 번 내려받은 적이 있어서였다.

확인해 보니 이 도구는 겹침을 제목으로 보지 않았다. 곡 자체에 박혀 있는 식별자로 봤다. 제목이 같아도 다른 곡이면 안 걸리고, 제목이 달라도 같은 곡이면 걸린다.

그러면 내가 걱정한 상황은 애초에 안 생긴다. 같은 곡 스무 개를 받으면 식별자가 같으니 정확히 걸러진다.

  • 「겹친다」가 무엇을 기준으로 한 말인지 먼저 맞춘다. 이름이 겹치는 것과 내용이 겹치는 것은 다른 문제다.
  • 요청하기 전에 지금 어떻게 판정하는지 물어보면, 안 만들어도 되는 기능이 드러난다.

파일 이름이 그대로 제목이 된다

올리고 나서 보니 곡 제목이 sparkling sleigh bells (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 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 | 룸톤 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 | ScorePlayer TIL 4 196 | Obsidian vault에서 코드만 빼기 — directory junction 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 | 오픈데이 Openday TIL 11 220 | 룸톤 Roomtone TIL 11 221 | 소리꽃 KeyBloom TIL 31 222 | 궁 미로 PalaceMaze TIL 4 223 | 룸톤 Roomtone TIL 12 224 | 로그스톤 샵 LogStone Shop TIL 9 225 | 룸톤 Roomtone TIL 13 226 | 로그스톤 샵 LogStone Shop TIL 10 227 | 룸톤 Roomtone TIL 14 228 | 소리꽃 KeyBloom TIL 32 229 | 룸톤 Roomtone TIL 15 230 | 룸톤 Roomtone TIL 16 231 | 로그스톤 샵 LogStone Shop TIL 11 232 | 룸톤 Roomtone TIL 17 233 | 룸톤 Roomtone TIL 18 234 | 메트로놈 Simple Metronome TIL 12 235 | 콘티온 ContiOn TIL 12 236 | 소리꽃 KeyBloom TIL 33 237 | 온실 GreenHouse TIL 3 238 | 로그스톤 샵 LogStone Shop TIL 12 239 | 룸톤 Roomtone TIL 19 240 | 모래게임 Sandrop TIL 35 241 | 여러 세션을 INBOX 하나로 굴리기 242 | 궁 미로 PalaceMaze TIL 5 243 | CS2 Practice Host TIL 1 244 | 룸톤 Roomtone TIL 20 245 | 여둘까 Office Layout TIL 14 246 | 로그스톤 샵 LogStone Shop TIL 13 247 | 룸톤 Roomtone TIL 21 248 | 여둘까 Office Layout TIL 15 249 | 모래게임 Sandrop TIL 36 250 | 룸톤 Roomtone TIL 22 읽는 중 251 | 룸톤 Roomtone TIL 23 252 | 모래게임 Sandrop TIL 37