룸톤 Roomtone TIL 10
매장 배경음악의 재생 스케줄을 시간표처럼 다시 만들고, 쌓인 곡을 검수하는 도구를 손보며 정리한 것들이다.
시간과 화면이 어긋날 때
결과가 틀리면 계산식보다 두 값의 기준이 같은지 먼저 본다
시간대마다 재생목록이 바뀌는 기능에 「정시 컷」을 붙였다. 정해진 시각이 되면 4초 동안 소리를 줄이고 다음 목록으로 넘어가는 동작이다. 그런데 그 시각이 되어도 아무 일이 없었다. 곡이 끝날 때 확인하는 방식은 멀쩡히 도는데 정시에 터지는 쪽만 안 됐다.
원인은 기능이 아니라 시각을 담는 방식이었다. 우리 시간을 만들 때 「세계 표준시 + 9시간」으로 만들어 쓰고 있었다. 이러면 겉으로 읽히는 시계는 우리 시간인데, 값 자체에는 세계 표준시라는 꼬리표가 붙는다. 그런데 다음 전환 시각은 컴퓨터의 지역 시간 기준으로 만들고 있었다. 같은 「17시 18분」이라도 두 값의 속이 9시간 어긋나서, 비교와 뺄셈이 전부 틀어졌다.
2분 뒤에 올 전환 시각을 → 15시간 1분 뒤로 계산하고 있었다
시각은 「어느 지역의 시계로 몇 시인가」와 「값 자체는 무엇을 기준으로 하는가」가 따로 논다. 겉의 시계만 맞아도 다 맞은 것처럼 보이기 때문에, 눈으로는 절대 안 잡힌다.
다음에 계산 결과가 이상하면 식을 먼저 의심하지 않는다. 비교하는 두 값이 같은 기준 위에 있는지부터 본다.
화면의 눈금과 데이터의 정밀도가 다르면 화면이 거짓말을 한다
스케줄을 요일 × 30분 칸의 표로 만들었다. 그런데 시각은 1분 단위로 넣을 수 있었다. 표는 각 칸의 시작 시각만 검사해서 그 칸이 채워졌는지를 그렸다.
그래서 9시 5분부터 9시 20분까지 잡은 블록은 표에 아예 안 보였다. 어느 칸의 시작 시각도 그 안에 들어가지 않기 때문이다. 9시 15분에 시작하는 블록은 9시 30분 칸부터 칠해졌다. 재생은 1분 단위로 정확히 도는데 표만 어긋난 상태였다.
문제는 「안 보인다」가 아니라 「화면을 믿을 수 없게 된다」는 것이다. 표를 보고 판단하는 도구인데 표가 실제와 다르면 도구가 아니라 함정이 된다.
해결은 둘 중 하나다. 화면의 눈금을 데이터만큼 잘게 하거나, 데이터를 화면 눈금에 맞추거나. 30분 칸을 1분 칸으로 쪼개면 표가 서른 배로 길어져 한눈에 안 들어오니, 데이터를 30분에 맞췄다. 짧은 구간이 꼭 필요한 요구는 따로 다루기로 했다.
무언가를 표로 보여주기로 정할 때는, 그 표의 칸 크기가 곧 데이터의 정밀도 상한이 된다는 걸 같이 정하는 셈이다.
모델을 바꾸면 따라오는 것들
특수한 값을 없애면 그것을 처리하던 갈래가 통째로 사라진다
처음에는 블록 하나에 요일을 하나만 달 수 있었고, 「매일」은 요일을 비워 두는 것으로 표현했다. 그래서 코드 곳곳에 「매일이냐, 특정 요일이냐」를 가르는 갈래가 있었고, 매일 블록 위에 특정 요일 블록을 덮어쓰는 우선순위 규칙까지 딸려 있었다.
요일을 체크박스로 고르게 바꾸면서 한 블록이 여러 요일을 덮게 했다. 그러자 「매일」이 특수한 값이 아니라 그냥 일곱 개를 다 체크한 상태가 됐다. 그 순간 가르던 갈래가 전부 없어졌고, 덮어쓰기 우선순위도 필요 없어졌다.
특수값은 편해 보여서 초반에 자주 들어온다. 그런데 그것을 처리하는 갈래가 코드 여기저기에 번지고, 나중에는 그 갈래끼리 또 규칙을 만든다. 「이 특수값을 일반적인 값 하나로 표현할 수 있나」를 한 번 묻는 것만으로 규칙 두세 개가 사라질 때가 있다.
편의로 만든 것을 걷어내면 숨어 있던 가정이 드러난다
매장이 공유 비밀번호로 들어오는 역할이 하나 있었다. 계정 시스템이 생기기 전에 급하게 만든 것인데, 이제는 구독 회원이 곧 매장이라 역할이 겹쳤다. 없앴다.
그러자 예상 못 한 게 드러났다. 스케줄도 재생목록도 업종도, 매장이 하나뿐이던 시절의 가정 위에 놓여 있었다. 매장이 하나일 때는 아무 문제가 없어서 아무도 몰랐다. 역할을 걷어내고 「그럼 이 데이터는 누구 것이냐」를 물어야 하는 순간이 오니 비로소 보였다.
임시로 만든 것은 그 자체가 문제가 아니라, 그것이 다른 임시 가정들을 가려 준다는 게 문제다. 하나를 걷어내면 그 밑에 뭐가 있는지 보게 되니, 걷어내는 김에 밑을 확인하는 게 이득이다. 매장별로 데이터를 나누는 일이 이때 출시 전 필수로 올라갔고, 출시 전에 막았다.
무엇을 기준으로 만드는가
내가 시켰다가 내가 물렀다
시간표에서 마우스로 끌어 구간을 칠하게 해 달라고 했다. 블록 가장자리를 잡아 늘리는 것도, 커서가 가장자리에 닿으면 모양이 바뀌는 것도 같이 말했다. 데스크톱에서 만져 보며 떠올린 그림이었다.
만들어 놓고 보다가 아니라고 했다. 이 제품이 실제로 놓이는 자리는 매장의 안드로이드 태블릿이라 마우스가 없다. 데스크톱은 만들면서 확인하는 용도일 뿐이다. 되돌리고 터치 기준만 남겼다.
내가 지금 만지고 있는 화면이 곧 기준이 된 셈인데, 정작 그 화면은 제품이 놓일 자리가 아니었다. 무언가를 시키기 전에 「이게 실제로 놓일 자리는 어디인가」를 한 번 소리 내어 확인하는 편이 낫다. 시킨 사람이 나라도 그렇다.
되돌린 이유를 남겨야 같은 것을 두 번 만들지 않는다
되돌리면서 코드만 지우면 기록에는 「만들었다가 없앴다」만 남는다. 몇 주 뒤에 같은 필요가 느껴지면 왜 없앴는지 모른 채 다시 만들게 된다.
그래서 코드를 지우면서 문서에 이유를 적었다. 매장 기기가 태블릿이라 마우스 상호작용은 제품에서 쓰이지 않는다는 것, 데스크톱은 개발용이라 앞으로도 터치 기준으로 만든다는 것.
이건 다른 프로젝트에서도 하고 있는 방식인데, 이번처럼 「좋아 보였는데 안 쓰는 것」을 걷어낼 때 특히 값이 크다. 남기는 건 결정 자체가 아니라 그 결정을 낳은 조건이다. 조건이 바뀌면 다시 만들면 되고, 안 바뀌었으면 다시 만들 이유가 없다는 게 바로 보인다.
자동 판정을 믿는 법
판정 결과만 남기고 점수를 버리면 다시 판단할 수 없다
곡에 목소리가 섞였는지를 자동으로 검사한다. 음원 분리 도구(Demucs — 반주와 목소리를 갈라 주는 프로그램)로 목소리 부분만 뽑아내, 그 크기가 전체 대비 얼마나 되는지를 재서 기준값을 넘으면 「보컬 의심」으로 표시한다.
그런데 표시가 없는 곡에서 허밍이 들리는 일이 있었다. 기준값을 조금 낮추면 잡힐 것 같아서 다시 판정하려 했는데, 데이터베이스에는 「보컬이다 / 아니다」 두 값만 저장돼 있었다. 점수는 판정하고 버려졌다.
그래서 기준을 바꾸는 게 공짜가 아니게 됐다. 곡 하나마다 무거운 분리 작업을 처음부터 다시 돌려야 하고, 700곡이면 열몇 시간이다. 점수를 같이 저장해 뒀다면 숫자 비교만 다시 하면 되는 일이었다.
자동 판정을 붙일 때는 결과와 함께 그 결과가 나온 근거 수치를 남긴다. 기준값은 처음에 정확히 맞히기 어렵고, 쓰다 보면 반드시 조정하고 싶어진다. 그때 근거가 남아 있으면 조정이 몇 초고, 없으면 다시 재는 일이 된다.
덧붙여 이 검사는 곡의 30초부터 70초까지 40초만 떼어 판정하고 있었다. 허밍이 다른 자리에 있으면 놓치고, 그 구간의 색소폰이 목소리로 새면 오탐이 난다. 앞선 TIL 4에서 허밍을 허용할지는 도구가 아니라 방침이 정한다고 적었고, TIL 8에서는 오탐이 잦으니 격리하지 말고 표시만 하기로 했다. 여기서는 그 표시가 무엇을 보고 나온 것인지가 문제였다. 자동 판정이 대상의 일부만 보고 전체를 결론 낼 때는, 놓침과 오탐이 동시에 생긴다는 것도 같이 알아 두면 좋다.
도구와 습관
절차는 그 절차를 쓰는 도구 안에 적어 둔다
새 곡을 받아 올리는 절차가 여러 단계다. 폴더에 넣고, 표에 제목과 설명을 적고, 실행 파일을 누르고, 검수 도구를 연다. 커버 이미지나 설명이 빠지면 조용히 건너뛰고 폴더에 남는다는 함정도 있다.
프로젝트를 여러 개 굴리다 보면 한 달 만에 돌아왔을 때 순서가 기억나지 않는다. 그래서 그 절차를 검수 도구 화면 안에 접이식으로 적어 두었다.
문서에 적어도 되지만, 문서는 「찾아가야」 보인다. 도구 안에 있으면 그 일을 하러 온 자리에서 바로 보인다. 어디에 적느냐가 적었느냐보다 중요할 때가 있다.
요약
- 시각은 「보이는 시계」와 「값의 기준」이 따로 논다. 결과가 틀리면 식보다 두 값의 기준이 같은지를 먼저 본다.
- 표의 칸 크기를 정하는 것은 곧 데이터 정밀도의 상한을 정하는 것이다. 둘이 다르면 화면이 거짓말을 한다.
- 특수값을 일반적인 값 하나로 표현할 수 있는지 물으면 규칙 두세 개가 사라지기도 한다.
- 임시로 만든 것은 다른 임시 가정을 가려 준다. 걷어내는 김에 그 밑을 확인한다.
- 시키기 전에 「이게 놓일 자리는 어디인가」를 묻는다. 지금 만지고 있는 화면이 그 자리가 아닐 수 있다.
- 되돌릴 때는 결정이 아니라 그 결정을 낳은 조건을 남긴다.
- 자동 판정은 결과와 함께 근거 수치를 남긴다. 기준값은 반드시 나중에 조정하고 싶어진다.
- 절차는 그 절차를 쓰는 도구 안에 적는다. 문서는 찾아가야 보인다.