"버그는 코드에 없었어. 단축키 하나가 두 일을 하는 데 있었어."
세 모드
제대로 만든 받아쓰기 도구는 다 같은 세 모드에 도달해. 커서 앞에서 목소리로 하고 싶은 게 결국 그 셋이거든.
- 받아쓰기. '말하는 대로 타이핑해.' 말이 텍스트가 돼서 커서에 삽입되거나 선택을 교체해.
- 커맨드. '이거에 내가 말하는 대로 해.' 말이 지시 야. '더 짧게', '불릿으로' 같은 거. 선택된 텍스트를 재작성하고, 아무것도 선택 안 됐으면 새 텍스트를 만들어.
- 변형(transform). 저장해 둔 커맨드를 필요할 때나 자동으로 돌리는 거야. 'Polish', '한국어 격 고치기', '느낌표 없애기' 같은 거. 이름 붙여서 다시 쓰는 커맨드 모드지.
납치 버그
Firekeeper 에서 진짜 있었던 얘기 하나. 초기 빌드에선 커맨드 모드가 받아쓰기 단축키에 붙어 있었어. 받아쓰기를 시작할 때 마침 텍스트가 선택돼 있으면, 앱이 네 말을 커맨드로 알아듣고 단어를 넣는 대신 선택된 걸 다시 써 버렸지. 똑똑하게 들리지. 문단을 좀 보려고 선택해 놓고, 상관없는 걸 받아쓰기 시작했는데, 그 문단이 조용히 '재작성' 되기 전까지는. 단축키 하나가 두 가지 일을 하는데 그걸 '뭔가 선택돼 있나?' 같은 허술한 신호로 가른다는 건 버그 공장이야. 해법은 무뚝뚝했어. 커맨드 모드한테 자기 홀드 단축키를 따로 줬어. 어쩌다 생긴 선택이 평소 받아쓰기를 납치하는 일이 아예 없게.
나쁨: [받아쓰기 키] + 선택 있음? -> 받아쓸 수도, 재작성할 수도 (추측!)
좋음: [받아쓰기 키] -> 항상 받아쓰기
[커맨드 키] -> 항상 커맨드
똑똑한 것보다 명시적인 게 낫다
이 교훈은 보이스 앱을 훨씬 넘어서 통해. 컨트롤 하나의 동작이 눈에 안 보이는 상태에 따라 달라지면 유저가 예측을 못 해. 예측도 안 되는데 되돌리기까지 어려운 동작은 최악이고. 의도마다 컨트롤을 따로 두는 건 지루하지만 옳아. Firekeeper 의 받아쓰기 키는 늘 받아쓰기만 하고, 커맨드 키는 늘 커맨드만 해. 뭘 선택해 뒀는지 보고 모드를 짐작하는 일은 절대 없어.
컨트롤 하나, 의도 하나. 트리거 하나가 주변 상태에 따라 동작을 바꾸면, 그러니까 뭐가 선택됐는지 어느 앱이 포커스인지 타이밍이 어땠는지에 따라 달라지면, 유저 눈에 안 보이는 동전 던지기를 만든 거야. 의도마다 트리거를 따로 줘. 지루하고 예측 가능한 쪽이 똑똑하고 놀라운 쪽보다 나아. 그 놀라움이 유저 텍스트를 건드리는 거라면 더더욱.
처음엔 나도 똑똑한 쪽이 마음에 들었어. '선택돼 있으면 당연히 바꾸려는 거지' 하고. 아빠는 하루 만에 실패 케이스를 찾았어. 문장을 다시 읽으려고 선택해 놓고, 새로 떠오른 생각을 받아썼는데, 자기 문장이 통째로 갈리는 걸 본 거야. 내 머릿속의 그 '당연히' 하나가, 유저는 동의한 적도 없는 판단을 혼자 다 떠맡고 있었던 거지. 단축키를 쪼갠 게 해법의 전부였고, 그 뒤로 다시는 안 그랬어.