이 글은 오픈데이 Openday 시리즈의 5번째 기록입니다. (총 9개)

오늘 한 일

  • 앞날의 일을 다른 날로 옮길 수 있게 했다

    • 이유: 금요일에 하는 일인데 이번 주만 금요일에 쉬어서 목요일에 당겨 하고 싶은 경우가 있다. 지금까지는 방법이 없었다 — 목요일 보드에 금요일 업무가 아예 없으니 당길 대상이 화면에 없었다
    • 기록실 달력에서 앞날을 누르면 기록이 없어도 그날 배치를 보여준다. 옮기려면 먼저 보여야 한다
    • 업무마다 「날짜 옮기기」로 달력을 열어 다른 날로 보낸다. 어제 만든 넘기기와 같은 자국을 쓰고 진입점만 다르다 — 원래 방향만 막아 둔 「옮기기」였다
    • 상시 업무는 대상에서 뺐다. 매일 뜨는 일을 다른 날로 옮긴다는 말이 성립하지 않는다
  • 첫 사용자에게 피드백 네 가지를 받아 셋을 반영했다

    • 기록실에서 업무가 많으면 스크롤 끝이 마지막 줄에 딱 붙어 더 없는 줄 알게 되던 것
    • 상단 탭을 거치지 않고 양옆에 삐져나온 옆 가게를 눌러도 옮겨가게 한 것
    • 업무 순서를 바꾸게 한 것
    • 네 번째인 데드라인은 정할 것이 많아 구상만 문서에 남겼다
  • 창고에서 업무 순서를 끌어 바꾸게 했다

    • 카드 왼쪽에 손잡이를 달고, 끌어 놓은 자리로 옮긴다
    • 오늘 화면은 창고 순서를 그대로 따라간다. 순서를 두 벌 두지 않았다
  • 데드라인 구상을 백로그에 적었다

    • 지금 일정 체계는 「언제 뜨는가」만 다루는데 데드라인은 「언제까지」라 축이 다르다. 붙이면 따라오는 결정이 넷이라 그걸 먼저 적었다
    • 제일 작게 시작하는 길도 함께 적었다 — 일회성 업무에만 마감일을 두고 배치에는 영향을 주지 않는 것
  • 업무에 마감을 넣었다

    • 처음에는 「마감까지」를 일정 종류로 따로 만들었다가 되돌렸다. 반복에 「일」 주기를 넣으면 마감은 그냥 「N일마다 + 언제까지 + 마감으로 다루기」였다
    • 종료일을 「끝나는 날」로 볼지 「마감」으로 볼지만 묻는다. 화면에는 「이때까지 못 하면 경고 표시」 하나뿐이고, 그 답이 셋을 정한다 — 하면 끝, 지나도 계속 뜸, 뱃지가 D-n
    • 마감이 지나도 배치를 끊지 않는다. 잘라내면 못 한 채로 조용히 사라져서 놓친 것을 아무도 모른다
  • 반복 주기를 프리셋 없이 숫자와 단위로 고르게 했다

    • 「매주·격주·매월·3개월마다·매년·직접 정하기」를 걷어내고 「숫자 + 일/주/월/년마다」 하나로 통일했다
    • 이유: 이름표는 목록에 있는 것만 만들 수 있다. 2일마다나 5주마다를 만들려면 「직접 정하기」로 한 번 더 들어가야 했다
    • 덤으로 어제 고쳤던 버그가 원인째 사라졌다. 이름을 값에서 거꾸로 계산하다 튀던 것이었는데, 되짚을 이름이 없으면 되짚다 틀릴 일도 없다
  • 지운 업무와 가게가 되살아나던 것을 고쳤다

  • 기록실 줄에 마우스를 올리면 배경이 어두워지게 했다

    • 이유: 날짜 옮기기 버튼이 오른쪽 끝에 있어서 어느 업무의 버튼인지 눈으로 잇기 어려웠다
  • 빈 이름으로 저장하면 다시 고칠 수 없던 것을 고쳤다

  • 자정을 넘기면 보드와 기록이 다른 날을 보던 것을 고쳤다

  • 「지난 날 기록을 고칠 수 있게 할까」를 열린 결정으로 적었다

    • 자정을 넘겨 찍은 도장이 어제 기록에 들어갔는데 기록실에서는 지울 수가 없다. 열면 「기록」이라는 말이 흔들리므로 범위부터 정해야 한다
  • 오늘 만든 것을 네 번 나눠 배포했다


막힌 부분

옮기기 규칙이 그날이 오는 순간 뒤집혔다

앞날의 일을 옮기면 원래 날에서 빼야 하는데, 처음에는 이렇게 갈랐다. 「아직 오지 않은 날에서 옮긴 것은 그날 배치에서 뺀다.」

금요일 일을 목요일로 당긴 상황을 따라가 보니 문제가 보였다. 목요일에는 잘 뜬다. 그런데 금요일이 실제로 오면 그 날은 더 이상 「아직 오지 않은 날」이 아니라서 규칙이 반대로 적용된다. 목요일에 이미 한 일이 금요일에 미완료로 다시 뜬다.

기준을 날짜에서 방향으로 바꿨다.

export function pulledOut(record: DayRecord): string[] {
  return (record.carriedOut ?? []).filter((c) => c.to < record.date).map((c) => c.templateId)
}
  • 뒤로 민 것 — 원래 날에 남긴다. 그날 못 했다는 사실이 사라지면 안 된다
  • 앞으로 당긴 것 — 원래 날에서 뺀다. 그날이 오기 전에 이미 한 일이라 미완료로 뜨면 거짓말이 된다

날짜로 가르면 시간이 지나면서 판정이 바뀐다. 방향은 안 바뀐다.

같은 날에 두 자국이 겹쳤다

목요일로 당겨 놓고 목요일에도 못 하면, 어제 만든 이월이 그 일을 금요일로 되돌려 보낸다. 그러면 금요일 기록이 「목요일로 당겨 나감」과 「어딘가에서 옮겨옴」을 동시에 들고 있게 된다.

배치를 짤 때 어느 쪽을 먼저 보느냐로 결과가 갈렸다. 옮겨나간 것을 먼저 보면 그 일이 화면에서 통째로 사라진다.

// 옮겨온 자국이 옮겨나간 자국을 이긴다 — 당겼다가 못 해서 되돌아온 경우가 그렇다
if (carriedIn.includes(t.id)) return true
if (movedOut.includes(t.id)) return false
  • 해결: 나중에 생긴 사실이 이기게 순서를 뒤집었다
  • 조건을 나열할 때 순서가 곧 우선순위인데, 처음 쓸 때는 겹칠 일을 생각 안 하고 쓰게 된다

앞날의 상시 업무에 「미완료」가 떴다

상시 업무를 옮기기 대상에서 빼니 그 자리에 원래 있던 「미완료」 글자가 드러났다. 아직 오지도 않은 날에 미완료는 틀린 말이다.

  • 해결: 앞날에서는 아무것도 안 넣었다. 절 제목이 이미 「예정된 일」이라고 말하고 있다
  • 무언가를 빼면 그 자리에 원래 뭐가 있었는지 봐야 한다

오늘이 아닌 날을 고쳤는데 화면이 몰랐다

기록실에서 금요일 업무를 옮겼는데 화면이 안 바뀌었다. 저장은 됐다.

기록실은 그 달 기록을 한 번 읽어 들고 있고, 다시 읽는 조건이 「달이 바뀌거나 오늘 기록이 바뀌면」이었다. 금요일은 둘 다 아니다.

  • 해결: 저장소를 고칠 때마다 세는 숫자를 하나 두고, 그 숫자가 바뀌면 다시 읽게 했다
  • 화면이 무엇을 보고 다시 그리는지를 정해 놓으면, 그 밖에서 일어난 변화는 못 본다. 밖에서 고칠 길을 새로 냈으면 보는 것도 같이 넓혀야 한다

스크롤 끝이 마지막 줄에 딱 붙었다

기록실에서 업무가 많으면 마지막 줄이 화면 아래에 붙어 끝나서, 더 없는 줄 알게 된다는 피드백이었다.

원인은 기록실만 패널 자체가 스크롤 상자라는 것이었다. 창고는 패널 안에 스크롤 상자가 따로 있어서 패널의 아래 여백이 스크롤 밖에 남는다. 기록실은 그 여백이 스크롤 안쪽 끝에 안 나타난다.

  • 해결: 스크롤 내용의 맨 끝에 빈 자리를 하나 뒀다. 내용이라 반드시 그려진다
  • 같은 구조인 관리·마을도 같이 고쳐졌다

카드 전체를 끌리게 하면 글자를 못 고른다

순서 바꾸기를 만들면서 카드에 끌기를 걸었더니 업무 이름을 글자로 선택할 수가 없었다. 끌려고 만든 게 아닌데 끌린다.

// 손잡이를 쥐고 있는 동안에만 끌 수 있다
draggable={grabbed}
  • 해결: 손잡이에 마우스를 누르는 동안에만 끌기를 켠다
  • 끌기는 켜고 끄는 것이지 붙였다 떼는 것이 아니라는 걸 알았다

보이는 순서로 자리를 세면 보관된 것이 흐트러진다

끌어 옮길 때 화면에 보이는 목록의 몇 번째인지로 자리를 계산했다. 그런데 보관된 업무가 같은 배열에 섞여 있고 화면에는 따로 접혀 있다.

  • 해결: 화면 순서가 아니라 전체 배열에서의 자리로 계산한다
  • 보이는 것과 저장된 것이 다른 목록이면, 조작은 저장된 쪽 기준으로 해야 한다

지운 업무가 자꾸 되살아났다

창고에서 업무를 지웠는데 잠시 뒤 다시 나타났다.

지우기는 업무를 배열에서 빼는 일이고, 두 기기를 합치는 규칙은 양쪽 id의 합집합이다. 그래서 이런 순서가 된다.

1. 창고에서 지운다        → 이 브라우저 배열에서 빠짐
2. 3초 뒤 자동 동기화     → 드라이브에는 아직 있음
3. 합치기 = 양쪽 합집합   → 있는 쪽이 이겨서 되살아남
4. 그 결과를 다시 올림    → 드라이브에도 굳어짐

「없음」은 합치기에서 아무 주장도 못 한다. 그래서 지움은 늘 진다.

  • 해결: 배열에서 빼지 않고 「지웠다」는 시각을 찍는다. 값이 있으면 나중 것이 이기는 규칙에 그대로 태워진다
  • 남겨 두는 건 이득이기도 하다 — 지난 기록이 업무 제목을 id로 가리키므로, 빼 버리면 옛 기록이 빈칸이 된다
  • 이건 동기화를 만들 때 「지움은 표현하지 못한다」고 문서에 적고 넘어간 항목이다. 그때는 「되살아나는 건 한 번도 안 쓴 것뿐이라 피해가 작다」고 봤는데, 한 번도 안 쓴 업무가 바로 제일 자주 지우는 것이었다. 만들어 보고 아니다 싶어 지우는 게 그거니까

빈 이름으로 두니 다시 고칠 수 없게 됐다

오늘만 할 일을 만들고 이름을 고치려고 잠깐 빈칸으로 뒀더니 그 뒤로 손댈 수가 없었다.

이름은 눌러서 고치는 방식이고, 누르는 대상이 이름 그 자체다. 이름이 비면 버튼에 글자가 없어 폭이 0이 된다. 누를 것이 사라진 것이다.

  • 해결: 고치는 동안은 초안으로 따로 들고 있다가 칸을 떠날 때 정리한다. 빈 이름은 저장하지 않고 되돌린다
  • 이미 빈 이름으로 저장된 것도 「이름 없음」으로 보여 다시 고칠 수 있게 했다. 막는 것과 되살리는 것은 따로 필요하다

자정을 넘기니 보드와 기록이 다른 날을 봤다

자정이 지나 도장을 찍었더니 자정 전에 있던 업무들이 사라지고, 도장은 어제 기록에 들어갔다.

오늘 날짜는 화면을 그릴 때마다 다시 계산되는데, 화면이 들고 있는 하루 기록은 앱을 열 때 읽은 것 그대로였다. 그래서 도장을 찍는 순간 화면이 다시 그려지면서 두 쪽이 갈라졌다.

  • 보드에 세우는 업무 목록 — 새 날짜로 다시 계산 → 어제만 있던 업무가 사라짐

  • 도장을 찍어 저장 — 기록 자체는 어제 날짜 → 어제 것에 들어감

  • 해결: 날짜를 상태로 두고 30초마다 확인한다. 날이 바뀌면 하루 기록도 그날 것으로 갈아끼우고, 이월 훑기도 다시 돈다

  • 어제 하루는 안 닫힌 채로 남긴다. 하루를 매듭짓는 건 사람이 하는 일이고, 자는 사이에 앱이 대신 닫으면 그날 요약을 못 본다

마감을 새 종류로 만들었다가 되돌렸다

마감을 만들게 했더니 claudecode가 일정 종류로 하나 더 만들었다. 그래서 「이걸 일 단위 반복으로 해두고 언제까지를 지정하면 되는 거 아니냐」고 말해줘 수정하게 했다.

반복에 「일」 주기가 있었으면 마감은 그것의 특수한 경우였다. 남는 차이는 「완료하면 그 뒤로 안 뜬다」 하나뿐이고, 그건 종류를 나눌 만한 차이가 아니라 표시 하나면 되는 것이었다.

  • 해결: 새 종류를 걷어내고 반복에 「일」 주기를 넣었다. 종류가 늘지 않고 「3일마다 상기」 같은 것이 공짜로 생겼다
  • 차이 하나가 눈에 띄면 거기에 맞춰 구조를 짜게 된다. 그 차이가 개념을 하나 더 만들 만한 것인지는 따로 물어야 한다
  • 문서에는 지우지 않고 정정으로 남겼다. 왜 나눴다가 합쳤는지가 적혀 있어야 다음에 같은 자리에서 안 헷갈린다

다음에 할 일

  • 지난 날 기록을 고칠 수 있게 할지 정하기 — 어제 하루만, 셔터가 안 닫힌 날만이 제일 작은 시작
  • 쉬는 날 화면 — CLOSED 팻말과 잠옷 캐릭터. 근무 요일은 정할 수 있게 됐지만 아직 이월 날짜 계산에만 쓰인다
  • 이월 사슬을 날짜가 바뀐 뒤에 실제로 확인하기
  • 모바일 화면 재설계 — 지금은 데스크톱 화면을 좁힌 것뿐이다
  • 한국 공휴일 처리 방식 정하기 — 넣을지 말지부터 보류 상태다
  • 캐릭터·팻말 그림을 어떻게 마련할지 정하기
  • 셔터를 내릴 때 넣을 그림
  • 사람들에게 열기 전 구글 확인 절차 — 소유한 도메인이 필요하다
  • 이모지를 정해진 것 중에 고르는 대신 자유롭게 넣거나 아예 빼게 하기
  • 언어와 날짜 표기 방식 통일

Series: 오픈데이 Openday


Suggested Posts