본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

칸 하나는 거짓말을 할 수밖에 없어

~11 min · two-truths, sentinel-dates, column-overloading, data-loss

Level 0식은 화로
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"crumb 을 언제 썼나, 그리고 어느 날에 속하나. 이건 서로 다른 두 진실이야."

두 질문, 한 칸으론 둘 다 못 답해

모든 crumb 은 시간에 대해 두 질문에 답해. 이거 실제로 언제 썼어? 네가 탭하는 순간 기기가 아는 객관적 사실이지. 그리고 이거 어느 날에 속해? 네가 내리는 판단이고, 오늘일 수도 지난 화요일일 수도 다음 달일 수도 있어. 진짜로 다른 질문이고, 날짜 칸 하나엔 답이 하나만 들어가. 뭘 저장하든 그 칸은 이제 나머지 하나에 대해 거짓말하는 거야.

쓴 순간을 저장하면 backdate 를 못 해. 지난주에 속하는 기억이 이번 주를 가리키는 데 갇혀. target 날을 저장하면 진짜 쓴 순간을 없앤 거야. 3월로 던진 crumb 이 이제 3월에 쓰였다고 우기고, 실제로 언제 그 생각을 했는지의 정직한 기록은 그냥 사라져. 이걸 피하는 영리한 단일 값은 없어. 두 진실이 서로 독립이라 칸이 두 개 필요해. Vesta 는 그걸 captured_at(안 바뀌고 기기가 매김)과 target_date(저자가 배정, 유일하게 바뀌는 날짜)로 불러.

한 칸에 두 뜻을 절대 얹지 마. 칸 하나가 서로 다른 두 사실을 표현하라고 조용히 떠맡으면, 둘이 처음 어긋나는 순간 하나를 망가뜨려. 해법은 더 영리한 인코딩이 아냐. 칸을 하나 더 두는 거지. 정직한 두 칸이, 충분한 척하는 과부하 걸린 한 칸을 항상 이겨.

자리채움 날짜 병

그래도 둘을 뭉치는 팀한테 뭐가 일어나는지 봐. 날짜 칸 하나는 '특정 target 날 없음' 을 표현 못 해. 그래서 누군가 자리채움 값(sentinel)을 발명해. '미정' 이나 '알 수 없음' 을 뜻하는 마법 값이지. 유닉스 epoch, 먼 미래 9999년, 쿼리 절반이 처리를 까먹는 NULL. 그러고 그 값이 새기 시작해. 모든 목록 맨 위나 아래로 정렬되고, 날짜 범위 필터를 슬쩍 빠져나가고, UI 에 '1970년 1월 1일' 로 뜨고, 하류 쿼리마다 그걸 피하려 특수 케이스를 키워. 자리채움 값은 뭉개진 모델의 흉터야. 칸 하나가 두 일을 지다 무너졌다는 증거지.

Vesta 는 자리채움 값이 절대 필요 없어. 그게 모델이 맞다는 신호야. 모든 crumb 은 진짜 captured_at 을 가져. 어떤 실제 순간에 쓰였으니까. 그리고 진짜 target_date 를 가져. 저자가 어떤 날에 놨으니까. 어느 쪽도 '알 수 없음' 이 아니라, 발명할 마법 값도 기억할 특수 케이스도 샐 것도 없어.

Code

과부하 걸린 한 칸 대 정직한 두 칸·python
# COLLAPSED — one field forced to serve two masters
crumb = {"date": "2026-03-14"}   # ...but which truth is this?
#   is it when I wrote it, or the day it's about?  You can't tell.
#   backdate a memory -> the real write-time is gone
#   and 'undated' needs a sentinel -> hello, 1970-01-01 in the UI

# TWO TRUTHS — each question keeps its own field
crumb = {
    "captured_at": "2026-07-24T09:15Z",  # immutable: when I wrote it
    "target_date": "2026-03-14",         # assigned: the day it's about
}
# both always real, never 'unknown' -> no sentinel, no special case

External links

Exercise

네가 아는 스키마에서 조용히 두 뜻을 지닌 칸을 찾아 봐. 어떨 땐 state 고 어떨 땐 이유인 'status', 어떨 땐 생성이고 어떨 땐 마감인 'date', NULL 이 세 가지를 뜻하는 nullable 컬럼. 그게 진짜로 답하는 두세 개의 독립 질문을 적고, 그만큼의 정직한 칸으로 쪼개 봐. 어떤 자리채움 값이 사라지는지 봐.
Hint
단서는 마법 값이나 과부하 걸린 NULL 이야. 칸이 '위 중 아무것도 아님' 을 뜻하려고 특수 자리채움이 필요하면, 아마 한 질문 이상에 답하는 거야. 진짜 질문 하나하나는 항상 정직하게 채워지는 자기 칸을 받을 값어치가 있어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.