회사 프로젝트가 여러 개고 개인 프로젝트도 여러 개다.

어느 순간부터 문제가 생겼다.

어제 어디까지 했는지, 지금 뭘 해야 하는지가 전부 머릿속에만 있었다.

그리고 머릿속은 자주 비워진다.

프로젝트 A를 사흘 만에 다시 열면 처음 15분은 "내가 뭘 하고 있었더라"를 복원하는 데 쓴다.

더 나쁜 건 막혀 있던 것을 잊어버리는 것이었다. 누군가의 회신을 기다리는 중이었는데, 기다린다는 사실 자체를 까먹는다.

그래서 작업실 전광판을 만들었다.

핵심 원리 — 상태는 작업이, 시각화는 화면이

구조는 이렇다.

[각 프로젝트에서 진행되는 작업]
   └─ 작업 단위 끝날 때마다  ▼ 갱신
[workbench/projects/{id}.md]     ← 프로젝트별 상태 파일 (단일 진실원천)
   └─ 로컬 서버가 읽어  ▼ 집계
[board.html 전광판]              ← 폴링으로 자동 반영

여기서 두 가지 결정이 중요했다.

① 왜 프로젝트별 파일인가

처음엔 상태를 한 파일에 다 넣으려고 했다. 그게 보기 편하니까.

그런데 여러 프로젝트를 동시에 열어놓고 작업하면 동시 쓰기 충돌이 난다.

A 프로젝트 작업이 파일을 쓰는 도중에 B 프로젝트 작업도 쓰면 하나가 날아간다.

프로젝트마다 파일을 나누면 이 문제가 통째로 사라진다. 각자 자기 파일만 쓰니까.

동시성 문제를 락으로 푸는 대신 아예 겹치지 않게 나누는 쪽을 골랐다.

② 왜 기존 인수인계 문서와 따로 두는가

각 프로젝트에는 이미 상세 기록 문서가 있다. 무슨 결정을 왜 했고, 어떤 함정이 있는지가 다 적혀 있다.

그런데 그건 무겁다. 전광판에 띄우기엔 너무 길다.

역할을 나눴다.

  • 상세 기록 = 각 프로젝트의 인수인계 문서. 깊게, 길게.
  • 전광판 상태 = 가볍게 요약된 현재 상태만. 다음 액션 한 줄과 버킷 몇 개.

같은 정보를 두 곳에 적는 게 아니라, 해상도가 다른 두 문서를 두는 것이다.

데이터 모델

상태 파일은 프론트매터 + 섹션이다. 사람이 읽기도 좋고 기계가 파싱하기도 쉽다.

---
name: 공과장
category: work            # work | personal
hidden: false            # 개인·민감 프로젝트 숨김
path: ~/work/TF_GGJ
color: "#c75b2a"
order: 1
progress: 92             # 선택 — 수동 %
focus: "v1.6 배포 완료 — 잔여: 공지 게시·데모 리허설"
updated: 2026-07-30T11:35
---
## 진행중
- ...
## 할 일
- ...
## 막힘
- ...
## 완료
- ...
## 비고
- ...

여기서 제일 잘한 선택이 focus 한 줄이었다.

전광판에서 카드가 접혀 있어도 이 줄은 항상 보인다.

"이 프로젝트를 다시 열면 뭐부터 하면 되는지"가 딱 한 줄로 있는 것.

카드를 펴서 목록을 읽지 않아도 되니까, 전광판을 훑는 데 몇 초면 된다.

그리고 ## 막힘 버킷을 따로 뒀다.

남을 기다리는 일 — 회신 대기, 승인 대기, 외부 장비 복구 대기 — 은 전부 여기 들어간다.

전광판에서 이 항목들은 붉게 강조되고 상단에 올라온다.

내가 제일 자주 잊어버리던 게 이거였으니까, 시스템이 계속 눈에 띄게 만들었다.

서버는 의존성 0으로

전광판 서버는 파이썬 표준 라이브러리만으로 만들었다. 설치할 게 없다.

workbench/
├─ board.html          ← 전광판 (자체 완결 CSS/JS)
├─ server.py           ← 초경량 로컬 서버 (의존성 0)
├─ config.json         ← 포트·기본 모드·리마인더 on/off
├─ projects/           ← 프로젝트별 상태 파일
└─ CONVENTION.md       ← 갱신 규칙

요청이 올 때마다 projects/*.md를 다시 읽어서 JSON으로 집계한다. 캐시가 없다.

프로젝트 파일이 열몇 개뿐이라 매번 읽어도 순식간이고, 캐시가 없으니 무효화 버그도 없다.

개인 도구에서는 이렇게 단순한 게 거의 항상 맞았다.

npm 의존성을 하나도 안 쓴 이유도 같다. 이 도구는 1년 뒤에도 그냥 돌아야 한다.

의존성이 없으면 썩지 않는다.

제일 어려웠던 건 도구가 아니라 습관이었다

만들고 나서 알았는데, 전광판을 만드는 것보다 갱신하는 게 훨씬 어려웠다.

작업이 끝나면 다음 작업으로 넘어가고 싶지, 상태 파일을 열고 싶지 않다.

며칠 지나니 전광판이 전부 옛날 정보가 됐다. 옛날 정보를 보여주는 현황판은 없는 것보다 나쁘다. 믿을 수 없으니까.

그래서 갱신을 습관이 아니라 규칙으로 만들었다.

작업 규칙 문서에 이렇게 박아뒀다.

의미 있는 작업 단위가 끝날 때마다(인수인계 문서를 갱신하는 그 순간) 해당 프로젝트의 상태 파일도 갱신한다. 최소한 focusupdated는 항상 최신으로.

핵심은 **"인수인계 문서를 갱신하는 그 순간"**에 묶은 것이다.

새로운 습관을 하나 더 만들려고 하면 실패한다.

이미 하고 있는 행동에 끼워 넣으면 성공률이 훨씬 높다.

그리고 updated 시각을 저장해서 오래된 카드를 흐리게 표시하게 했다.

며칠 이상 갱신이 없으면 카드가 바래 보인다. "이건 지금 상태가 아닐 수 있다"는 신호다.

내 기록을 내가 못 믿을 때, 그 사실을 화면이 대신 말해주는 셈이다.

업무와 개인을 나눈 이유

카드마다 category가 있고 전광판은 업무 모드와 개인 모드를 오간다.

개인 프로젝트를 회사에서 화면에 띄워놓기는 좀 그러니까, 라는 현실적인 이유가 하나.

그리고 더 중요한 이유는 맥락 전환 때문이다.

업무 시간에 개인 프로젝트 카드가 눈에 들어오면 집중이 흐트러진다.

보고 싶지 않은 걸 안 보이게 하는 것도 도구의 역할이라고 생각했다.

민감한 프로젝트는 hidden: true로 아예 감출 수도 있다.

정리하면

  • 동시 쓰기 문제는 파일을 나눠서 없앴다. 락보다 분할이 쉬웠다
  • 상세 기록과 현재 상태를 분리했다. 같은 정보의 해상도를 두 개로
  • focus 한 줄이 전광판의 핵심이었다. 접혀 있어도 보이는 것
  • 막힘을 별도 버킷으로 빼서 가장 자주 잊는 걸 가장 눈에 띄게 만들었다
  • 의존성 0으로 만들어서 도구가 썩지 않게 했다
  • 갱신은 습관이 아니라 규칙으로, 그것도 이미 하는 행동에 끼워 넣어서

지금은 아침에 전광판을 한 번 훑고 그날 할 일을 정한다.

머릿속에 있던 걸 밖으로 꺼냈더니, 머릿속에 다른 걸 넣을 자리가 생겼다.

도구를 만들면서 제일 크게 배운 건, 좋은 도구는 기능이 많은 게 아니라 갱신을 안 잊게 만드는 도구라는 것이었다.