제품··5분 읽기

UI 문구는 명세다

화면이 한 약속을 코드가 지키지 않을 때, 문구를 낮추는 쪽이 늘 더 쌉니다. 두 제품에서 약속을 그대로 두고 동작을 고친 이유를 적었습니다.

#제품 원칙#UI 문구#DUGOUT 9#HappyBirthTown

화면에 적힌 문장과 코드가 하는 일이 어긋나 있는 것을 발견하면, 고칠 방법은 두 가지입니다. 문장을 동작에 맞춰 고치거나, 동작을 문장에 맞춰 고치거나. 앞쪽은 거의 언제나 더 쌉니다. 문구 한 줄을 바꾸면 끝나고, 테스트도 깨지지 않습니다.

최근 두 제품에서 이 갈림길을 연달아 만났습니다. 두 번 모두 싼 쪽이 먼저 보였고, 두 번 모두 그쪽으로 가지 않았습니다. 화면에 적힌 문장은 설명이 아니라 사용자와 맺은 계약이고, 그러니 어긋남은 문구의 문제가 아니라 결함이라고 보기로 했습니다.

스위치가 이미 약속이었다

DUGOUT 9는 KBO, 한국 프로야구 경기를 보면서 함께 여는 웹앱입니다. 공식 서비스가 아니라 독립 팬 프로젝트의 공개 데모입니다. 설정에는 공개 프로필 스위치가 있었고 기본값은 꺼짐이었습니다. 그런데 랭킹은 점수가 있는 모든 팬의 닉네임과 응원팀을 그대로 보여 주고 있었습니다. 스위치 값은 저장까지 되는데, 그 값을 읽는 곳이 없었습니다.

앞뒤를 맞추는 가장 쉬운 길은 두 가지였습니다. 스위치를 없애거나, 기본값을 켜짐으로 바꾸거나. 어느 쪽이든 코드는 그대로 두고 화면만 사실에 맞출 수 있었습니다. 반대로 갔습니다. 기본값 꺼짐을 지키고, 랭킹에서 비공개인 팬의 신원을 가렸습니다.

그 결과 팀별 랭킹은 눈에 띄게 비어 보입니다. 그래도 이미 화면으로 한 약속을 나중에 낮추는 것은, 사용자 입장에서는 자기가 고른 설정을 배신당하는 일입니다. 같은 이유로 기록 초기화가 서버에 쌓인 기록까지 지우도록 고쳤고, 개인정보 안내도 실제로 저장하는 항목에 맞춰 다시 썼습니다.

아무도 손대지 않았을 때의 기본값

해피버스타운은 친구들이 함께 꾸민 픽셀 마을을 생일 선물로 건네는 서비스입니다. 한때 그 안에 밤 10시에 찍히는 대표 사진이 있었습니다. 손님이 광장의 빈자리를 채우면 화면이 «밤 10시 사진에 남아요»라고 알려 주는 방식이었습니다. 셔터 시각은 주최자의 예약에 맡겼습니다.

기능은 다 됐고 검사도 통과했습니다. 다 만들고 나서 조항을 하나씩 되짚다가 구멍이 보였습니다. 예약의 기본값이 비어 있었습니다. 주최자가 아무것도 하지 않으면, 손님은 자리를 잡고 꾸미기까지 마쳤는데 셔터가 영영 내려가지 않습니다. 화면은 약속했고, 그 약속을 지키는 일은 다른 사람의 행동에 달려 있었습니다. 그것은 약속이 아니라 가정이었습니다.

그래서 첫 손님이 자리를 잡는 순간 셔터가 예약되도록 바꿨습니다. 파티의 주인은 여전히 주최자입니다. 주최자가 각본을 짜 두었으면 손대지 않고, 나중에 짜면 그쪽이 이깁니다. 다만 주인이 아무 말도 하지 않았을 때의 기본값은 약속을 지키는 쪽에 두었습니다. «주최자가 열면 된다»로 두는 편이 권한 구조로는 더 깔끔했지만, 그 깔끔함의 값은 손님이 치르게 되어 있었습니다. 이 사진은 그 뒤 모이는 시각이 없는 형태로 다시 바뀌었는데, 그 이야기는 고정된 시각 하나가 제품 전체를 동기로 만든다에 따로 적었습니다.

권한이 있는 사람에게 결정권을 주는 것과, 그 사람이 침묵했을 때 아무 일도 일어나지 않게 두는 것은 서로 다른 결정입니다. 뒤쪽은 대개 누가 정한 적 없이 그냥 그렇게 된 것입니다.

싼 쪽을 기본값으로 두지 않는다

두 사례에서 고친 것은 문구가 아니라 동작이었습니다. 그렇게 정한 기준이 같았습니다. 어느 쪽을 고칠지를 비용으로 정하지 않고, 사용자가 무엇을 믿고 행동했는지로 정했습니다. 스위치를 끈 사람은 자기 이름이 안 나오리라 믿었고, 자리를 잡은 손님은 사진에 남으리라 믿었습니다. 그 믿음을 근거로 이미 행동한 사람에게, 나중에 문구를 고쳐 «사실은 그렇지 않았다»고 말할 수는 없었습니다.

문구를 고쳐 맞추는 선택은 언제나 가능하고 언제나 더 쌉니다. 그래서 위험합니다. 그 선택을 기본값으로 삼으면 제품은 한 번에 한 줄씩, 아무도 결정한 적 없이 거짓말을 배웁니다. 화면에 문장을 하나 써 붙일 때마다 그 문장을 지킬 책임도 같이 생긴다는 것을, 문장을 쓰는 순간에 기억하려고 합니다.