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

내가 써 보고 괜찮았는데 남들은 낯설어했다

둘러보기의 계절·분위기·장르를 고르는 휠을 만들 때, 폰에서는 가로로 돌리고 태블릿에서는 세로로 돌리게 하자고 내가 정했다. 폰은 세로가 좁으니 가로가 맞을 것 같았다. 폰에 깔아 한 손으로도 돌려 봤고 쓸 만했다.

그런데 테스트해 준 사람들이 세로로 돌리는 쪽이 익숙하다고 했다. 폰에서 목록을 넘길 때 위아래로 미는 게 손에 익어 있으니, 가로로 도는 칸은 되는데도 낯설다는 것이다.

폰도 태블릿과 같은 모습으로 되돌렸다. 여기서 남는 건 「세로가 낫다」가 아니다. 내가 직접 써 보고 괜찮은 것과 처음 보는 사람에게 익숙한 것은 다르다는 것이다. 되는지 안 되는지는 내가 확인할 수 있지만, 익숙한지는 확인할 수 없다. 익숙함은 기능이 아니라 그 사람이 다른 앱에서 쌓아 온 습관이라서다.

앞선 TIL 10에서 「제품이 놓일 자리를 먼저 묻는다」를 적었다. 그때는 기기가 달라서(마우스 없는 태블릿) 생긴 문제였고, 이번엔 기기도 맞고 동작도 되는데 습관이 달랐다. 자리를 맞춘 다음에도 남는 축이 하나 더 있는 셈이다.


되돌릴 때는 길을 지워 둔다

되돌리면서 가로로 눕히던 코드를 지웠다. 앞선 TIL 10에서 「되돌린 이유를 남긴다」고 정했는데, 이번엔 한 걸음 더 갔다. 이유만 적어 두면 몇 달 뒤에 「폰은 가로가 낫지 않나」가 또 떠오르고, 코드가 남아 있으면 되살리기 쉽다.

그래서 코드를 지우고 문서에 「되살리지 말 것」을 이유와 함께 적었다. 남겨 두는 것과 지우는 것의 차이는 다음 사람이 얼마나 쉽게 같은 길로 돌아가느냐다.


같은 편집을 두 곳에 둘 뻔했다

앱에서 결제 없이 넘어가는 웹 화면을 만들었다. 거기서 매장 이름·업종·비밀번호를 고칠 수 있게 하고 나니, 이상한 게 눈에 띄었다. 업종은 앱에서도 고칠 수 있는데 매장 이름은 웹에서만 된다. 같은 일을 하러 두 군데를 가야 한다.

그래서 물었다. 나중에 웹에서도 재생하게 만들 거라면 둘 다 필요한 건가.

답은 아니었다. 웹에서 듣는 판을 만들면 지금 앱 화면을 그대로 웹으로 빌드하는 거라, 앱 설정 화면이 웹에서도 그대로 뜬다. 즉 편집을 앱에 두면 웹 플레이어가 생기는 날 웹에서도 저절로 된다. 웹 페이지에 같은 편집을 또 두면 그날부터 같은 일을 두 벌 관리하게 된다.

그래서 편집은 앱을 주 화면으로 하고, 웹 페이지는 기능을 더 늘리지 않기로 했다. 앱을 아직 안 깐 사람, 비밀번호를 잊어 앱에 못 들어가는 사람, 스토어 심사에 보여 줄 자리로만 남긴다.

무언가를 두 곳에 두려 할 때 물을 것은 「둘 다 필요한가」가 아니다. 「나중에 하나가 다른 하나를 덮게 되나」다. 덮게 된다면 지금 늘리는 건 그때 지울 일을 미리 만드는 셈이다.


결제 버튼을 둘 수 없는 자리가 있다

그 웹 화면에는 결제로 가는 링크를 하나도 두지 않았다. 앱에서 여는 화면에 결제를 안내하면 스토어 정책에 걸리기 때문이다. 앞선 TIL 6에서 결제는 앱 안이 아니라 기기 브라우저에서 하기로 정했는데, 이번엔 그 브라우저로 나가는 길 자체에 제약이 붙었다.

정리하면 이렇다. 스토어에 올린 앱은 「밖으로 나가는 문」을 만들 수는 있지만, 그 문 너머에 결제가 보이면 안 된다. 그래서 웹에 두 장이 필요해졌다. 요금과 구독 버튼이 있는 판매 페이지, 그리고 그것들이 하나도 없는 계정 관리 페이지다.

플랫폼 규칙은 기능을 막는 게 아니라 화면을 쪼개게 만든다. 규칙을 읽을 때 「무엇을 못 하나」만 보면, 그 때문에 화면이 몇 장으로 갈리는지는 안 보인다.


미루는 일에 날짜 대신 조건을 묶었다

웹 결제(Creem) 확인이 남은 일 목록에 계속 있었다. 이게 지금 급한지 물었더니 아니었다. 앱 안 결제는 이미 확인했고, 판매 페이지는 아직 검색에 안 잡히게 막아 둬서 그 버튼으로 들어올 사람이 없다.

다만 그냥 미루면 위험한 자리였다. 출시하면서 그 페이지를 검색에 열어 주는 순간, 한 번도 돌려 본 적 없는 결제 버튼이 아무나 누를 수 있게 된다.

그래서 「판매 페이지를 공개하기 직전에」로 묶었다. 앞선 TIL 2에서 「미루는 일에는 날짜가 아니라 조건을 붙인다」고 적었는데, 그때는 미룬 일이 필요해지는 순간에 알아서 걸리게 하려는 것이었다. 이번엔 이유가 하나 더 있다. 미루는 게 위험해지는 순간이 언제인지를 같이 적어 두는 것이다.

조건을 붙일 때 두 가지를 본다. 이 일이 필요해지는 때가 언제인가, 그리고 미룬 채로 두면 위험해지는 때가 언제인가. 둘이 다르면 뒤엣것을 적어야 한다.


화면이 옛 이름을 계속 보여 줬다

설정에서 매장 이름을 바꿨는데 홈에 옛 이름이 그대로 있었다. 저장이 안 된 줄 알았는데, 서버에는 새 이름이 들어가 있었다.

원인은 홈이 이름을 한 번 읽고 들고 있었던 것이다. 매번 물으면 요청이 느니까 아껴 둔 것인데, 그 아낌에는 「이 값은 안 바뀐다」는 가정이 숨어 있었다. 이름은 바뀐다.

값을 들고 있기로 할 때는 「이게 언제 바뀌나, 바뀌면 누가 알려 주나」를 같이 정해야 한다. 앞선 TIL 2에서 통계에 그때의 값을 박아 둔 것과는 반대 방향이다. 그때는 바뀌면 안 되는 값이라 박아 뒀고, 이번엔 바뀌는 값이라 들고 있으면 안 됐다. 같은 「값을 어디에 둘까」인데 결론이 갈린다.


작은 화면에서 내린 세 가지 판단

폰에 깔아 보고 짚은 것들인데, 셋 다 「글자를 어디에 둘까」였다.

첫째, 휠 타일의 이름이 「그루비」가 아니라 「그…」로 보였다. 칸이 좁으니 줄여 쓰는 게 기본 동작인데, 분위기 이름은 줄이면 뜻이 사라진다. 말줄임표 대신 두 줄로 줄바꿈하고, 타일 구석의 자켓 그림 위로 글자가 넘어가도 괜찮다고 정했다. 그림은 장식이고 이름은 정보라서다.

둘째, 「정시 컷」이라는 설정의 설명이 말하다 만 것처럼 읽혔다. 설정 이름 밑에 까는 한 줄짜리 자리에 켰을 때와 껐을 때를 다 적으려니 잘린 것이다. 이름 옆에 ?를 두고 눌렀을 때 문단으로 보여 주게 바꿨다. 설명이 자리에 안 맞으면 설명을 줄일 게 아니라 설명의 자리를 옮긴다.

셋째, 시간대 목록에서 30분 단위 항목에 도시 이름이 비어 있었다. 빠뜨린 줄 알았는데, 30분·45분 단위를 실제로 쓰는 지역이 몇 곳뿐이라 대부분 비는 게 맞았다. 빠진 여섯 곳만 채웠다. 비어 있는 게 전부 버그는 아니고, 채워야 할 자리인지 원래 비는 자리인지를 먼저 봐야 한다.


이미 끝난 일을 다시 돌릴 뻔했다

남은 일 목록에 「끝잘림 검사 한 바퀴」가 있어서 돌렸다. 724곡 중 21곡만 검사됐다. 나머지는 어제 음량을 다시 구운 뒤에 이미 검사해 둔 것이었다.

목록은 어제 로그를 쓰던 시점의 상태다. 그 뒤에 한 일은 목록에 반영되지 않는다. 도구가 「이 곡은 검사했다」를 기록해 두고 있었으니, 그걸 먼저 봤으면 돌릴 이유가 없다는 게 바로 보였다.

할 일 목록은 무엇을 할지 고르는 데 쓰고, 그게 아직 남았는지는 실제 상태에서 확인한다. 목록만 믿으면 끝난 일을 다시 하고, 실제 상태만 보면 해야 할 일을 잊는다. 둘 다 있어야 한다.


정리할 게 하나뿐이었다

출시 전에 코드에 지저분한 게 없는지 보자고 했다. 나온 것은 경고 0개, 안 쓰는 파일 없음, 임시로 적어 둔 메모 없음이었다. 정리할 것은 딱 하나, 내가 그날 만든 중복이었다. 이름을 묻는 입력 창이 이미 공용으로 있었는데 설정에 같은 창을 또 만들었던 것이다.

나머지 후보(긴 화면 쪼개기 같은 것)는 지금 고장 난 것도 아니고 자주 고치는 자리도 아니라 출시 뒤로 미뤘다.

여기서 가져갈 건 두 가지다. 하나는 정리할 것을 찾을 때 오래된 코드보다 오늘 만든 코드를 먼저 본다는 것이다. 어제까지 멀쩡하던 곳에 중복이 생기는 건 대개 오늘 손댄 자리다. 다른 하나는 정리의 범위를 미리 자르는 것이다. 「목록을 보고 하나만」이라고 정하지 않으면, 고칠 것이 없는데도 고칠 거리를 만들어 낸다.


요약

  • 내가 써 보고 되는 것과 처음 보는 사람에게 익숙한 것은 다르다. 익숙함은 기능이 아니라 습관이라 내가 검증할 수 없다.
  • 되돌릴 때는 이유를 적는 데서 그치지 말고 되돌아갈 길을 지워 둔다.
  • 같은 것을 두 곳에 두려 할 때 물을 것은 「둘 다 필요한가」가 아니라 「나중에 하나가 다른 하나를 덮나」다.
  • 플랫폼 규칙은 기능을 막는 게 아니라 화면을 쪼개게 만든다.
  • 미루는 일에는 필요해지는 때와 미룬 채로 두면 위험해지는 때를 같이 본다. 다르면 뒤엣것을 조건으로 적는다.
  • 값을 들고 있기로 할 때는 그 값이 언제 바뀌고 바뀌면 누가 알려 주는지를 같이 정한다.
  • 설명이 자리에 안 맞으면 설명을 줄이지 말고 자리를 옮긴다. 이름은 줄이면 뜻이 사라지니 줄바꿈한다.
  • 비어 있는 게 전부 빠뜨린 건 아니다. 채울 자리인지 원래 비는 자리인지 먼저 본다.
  • 할 일 목록은 무엇을 할지 고르는 데 쓰고, 남았는지는 실제 상태로 확인한다.
  • 정리할 것은 오래된 코드보다 오늘 만든 코드에서 먼저 나온다. 범위를 미리 자르지 않으면 고칠 거리를 만들어 낸다.

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 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 231 룸톤 Roomtone TIL 18 읽는 중 232 메트로놈 Simple Metronome TIL 12