준비물은 페칫이 현실을 만지는 손 — 준비 섹션을 정리한 하루
할 일 앱은 화면 안에 삽니다. 그런데 일은 현실에서 일어납니다. 재료·도구·장소·인력·증명, 이 다섯 가지 준비물이 페칫이 현실을 가리키는 자리라서, 오늘은 그 축만 붙들고 정리했습니다. 보관함과 할 일의 관계, 삭제가 아닌 해제, 사진이 따라오는 일, 그리고 연타에도 어긋나지 않는 체크.
준비물은 페칫이 현실을 만지는 손 — 준비 섹션을 정리한 하루
할 일 앱은 화면 안에 삽니다. 제목, 날짜, 메모, 체크. 전부 글자입니다. 그런데 일은 현실에서 일어납니다. 촬영에는 배터리가 있어야 하고, 수업에는 유인물이 있어야 하고, 시험장에는 신분증이 있어야 합니다.
페칫에서 현실의 물건과 장소와 사람을 가리키는 자리는 하나입니다. 준비 섹션의 다섯 가지 준비물, 재료·도구·장소·인력·증명입니다. 다른 필드가 “무엇을 왜 할 것인가”를 적는 곳이라면, 준비물은 “그날 손에 무엇이 들려 있어야 하는가”를 적는 곳입니다. 저는 이 축으로 현실 세계와 페칫을 이으려고 합니다. 그래서 오늘은 준비물만 붙들고 하루를 썼습니다.
1. 보관함은 내가 가진 것, 할 일은 그날 챙길 것
페칫에는 준비물이 두 곳에 있습니다. 보관함과 할 일입니다. 보관함은 내가 가진 재료·도구·장소를 등록해 두는 개인 저장소이고, 할 일의 준비 목록은 그날 챙겨야 할 것들입니다. 보관함에서 골라 할 일에 붙이는 구조라, 같은 카메라를 열 번의 촬영에 붙일 수 있습니다.
그런데 이 둘을 오가는 화면이 서로 너무 닮아 있었습니다. 할 일의 재료 화면에서 +를 누르면 보관함 피커가 열리는데, 헤더가 똑같이 “재료”라서 같은 화면이 한 장 더 열린 것처럼 보였습니다. 오늘 이렇게 갈랐습니다.
- 할 일에서 연 피커는 헤더에 소속을 답니다.
보관함 › 재료. 보관함에서 직접 들어간 화면은 이미 보관함 안이니 접두를 달지 않습니다. - 피커의 행 문법을 다른 선택 화면과 맞췄습니다. 행을 누르면 상세, 오른쪽 + 를 누르면 붙이고 바로 닫힙니다. 체크 배지로 붙었다 떼었다 하는 방식은 쓰지 않았습니다. 같은 재료를 한 할 일에 두 번 넣을 수도 있어서, “붙어 있음”이라는 상태 자체가 없기 때문입니다.
- 검색어를 치다가 없으면 그 자리에서 만듭니다. 검색창 아래 첫 줄에 “새 재료 만들기” 행이 항상 있고, 치던 이름이 그대로 넘어갑니다.
2. 삭제가 아니라 해제
할 일의 재료 상세에서 그 재료를 빼는 버튼이 있습니다. 어제까지 그 버튼의 확인 창은 “삭제하면 되돌릴 수 없습니다”였습니다. 문구를 다시 읽어 보니 무서웠습니다. 진짜 물건을 버리는 것처럼 읽혔거든요.
실제로 일어나는 일은 이 할 일의 준비 목록에서 빠지는 것뿐입니다. 보관함의 재료는 그대로 있고, 다음 할 일에 다시 붙일 수 있습니다. 그래서 문구를 “해제”로 바꿨고, 확인 창에는 보관함이 그대로 남는다는 한 줄을 넣었습니다. 보관함 항목을 지우는 쪽은 진짜 삭제라서 종전 문구를 그대로 두었습니다.
현실의 물건을 가리키는 자리는 어휘가 정확해야 합니다. 화면 안의 글자를 지우는 것과 물건을 잃는 것이 같은 단어로 불리면, 사용자는 버튼 앞에서 멈추게 됩니다.
3. 사진은 물건의 얼굴
준비물에는 사진을 붙일 수 있습니다. 재료·도구·장소 세 종류에, 항목당 한 장입니다. 그런데 오늘까지 사진은 할 일 쪽에만 있었습니다. 보관함의 재료에는 사진을 붙일 수 없었고, 그래서 보관함에서 할 일로 붙일 때마다 사진 없는 재료가 들어왔습니다. 열 번 촬영을 하면 열 번 사진을 다시 붙여야 했던 셈입니다.
오늘 보관함에도 같은 사진 입력을 넣었고, 보관함에서 붙일 때 사진이 따라오게 했습니다. 구현은 링크 복사입니다. 사진 파일은 같은 사용자의 것이니 파일을 복제하지 않고 참조만 복사합니다. 할 일 쪽에서 사진을 지우는 건 참조를 지우는 것이라 보관함 사진은 남습니다. 앞 절의 “해제” 와 같은 원리입니다. 할 일은 현실을 참조하고, 현실은 보관함에 있습니다.
4. 연타에도 어긋나지 않게
현장에서 준비물은 빠르게 체크됩니다. 가방을 싸면서 딸깍, 딸깍, 딸깍. 그런데 오늘 발견한 버그는 이 딸깍을 배신하고 있었습니다. 다섯 개를 연속으로 켜면 첫 번째와 다섯 번째만 남는 식이었습니다.
원인은 저장 방식이었습니다. 토글 하나를 저장할 때 화면의 모델을 통째로 조립해 덮어썼는데, 그 조립의 바탕이 렌더에 한 박자 뒤처진 값이면 그 사이에 켠 다른 토글이 사라졌습니다. 서버 응답 순서가 뒤섞여도 같은 일이 났습니다.
고친 방식은 단순합니다. 모델을 조립하지 않습니다. 저장소에 그 키 하나만 바꿔 쓰고, 서버 응답에서는 버전만 받습니다. 키가 다르면 어떤 순서로 도착해도 서로를 건드릴 수 없습니다. 이 원칙을 준비물 체크뿐 아니라 섹션 펼침, 첨부 표시, 설정 화면의 토글과 피커까지 전부에 적용했습니다. 체크리스트가 손보다 느리거나 손을 되돌리면, 현실을 믿고 맡길 수 없으니까요.
아직 못 한 것
- 새로 만드는 화면에서는 사진을 바로 붙일 수 없습니다. 만든 뒤 상세에서 붙입니다.
- 인력과 증명에는 사진이 없습니다. 이건 의도한 범위입니다.
- 오늘 바꾼 것들은 실기기에서 아직 다 확인하지 못했습니다.
교훈
현실을 가리키는 축은 화면 안의 축보다 더 정확해야 합니다. 글자는 되돌릴 수 있지만 물건은 되돌릴 수 없습니다. 그래서 어휘는 “삭제”와 “해제”를 가르고, 사진은 원본이 한 곳에 있게 하고, 체크는 손가락 속도를 따라잡아야 합니다.
두 곳에 같은 것이 있으면 어느 쪽인지 화면이 말해 줘야 합니다. 보관함의 재료와 할 일의 재료는 같은 이름을 쓰되, 헤더 한 줄로 소속을 밝힙니다.
준비물은 페칫에서 가장 얇았던 축 중 하나였습니다. 오늘로 조금 두꺼워졌습니다.