"bridge 는 잡아서 넘기고 시킨 걸 실행해. candidate board 를 키우기 시작하는 순간 bridge 이길 그만두고 더 나쁜 포토샵이 되기 시작한 거야."
세 조각, 세 가지 일
시스템의 포토샵 쪽에는 조각이 셋 있고, 규율은 각자 정확히 한 가지 일만 한다는 거야. 호스트 앱인 포토샵이 진지한 그리기를 맡아. 작업실인 Cinder 가 풍성한 창작 UI 를 맡고. candidate board, 비교, lineage 같은 것들. bridge, 그러니까 포토샵 안에 들어가는 얇은 플러그인은 잡아서 넘기는 일과 시킨 걸 실행하는 일만 맡아. 아키텍처 전체가 bridge 가 나머지 둘 쪽으로 안 자라는 데 걸려 있어.
bridge 가 해도 되는 것
bridge 가 할 일 목록은 짧아. 지금 document 의 요약 읽기, 캔버스나 선택 영역을 이미지로 내보내기, 돌아온 결과를 새 레이어로 넣기, 명령이 끝났다고 알려 주기. 그게 다야. 통로인 거지. 픽셀이랑 작은 명령이 양쪽으로 지나다니는 자리. 창작 상태를 들고 있지도 않고, 모델 판단을 하지도 않고, 자기 UI 를 그리지도 않아.
bridge 는 경계 너머로 물건을 나르지, 어느 쪽에도 살지 않아. bridge 를 bridge 이게 하는 성질은 자기 집이 없다는 거야. 잡은 걸 밖으로 나르고 명령을 안으로 나르되 아무것도 들고 있지 않아. bridge 가 상태를 들거나 자기만의 화면을 그리기 시작하는 순간, 다리 노릇을 그만두고 아무도 원한 적 없는 세 번째 앱이 되기 시작해.
bridge 를 죽이는 미끄러짐
여기서 범위가 번지는 게 위험한 건 단계마다 다 그럴듯해 보이기 때문이야. 'bridge 가 이미 document 를 들고 있는데 작은 미리보기쯤 보여 주면 안 되나?' 그다음엔 '미리보기를 보여 주는 김에 둘 중에 고르게 하면 안 되나?' 그다음엔 '둘 중에 고르는데 그냥 candidate board 를 통째로 넣으면 안 되나?' 단계 하나하나는 작아. 그런데 도착점은 포토샵 안에 사는 반쯤 만든 미니 포토샵이야. Cinder 가 이미 하고 있는 걸, 더 나쁘게, 제약 많은 플러그인 안에서 다시 만든 거지. 이 미끄러짐은 진짜고, 미끄러지는 매 발걸음이 순진해 보여.
범위는 그럴듯한 한 걸음씩 번져. bridge 에 붙는 기능 하나하나는 실수처럼 안 보여. 각각이 작고 분별 있는 편의니까. 실수는 합쳐 놓고 봐야 보여. 고개 들어 보니 '얇은 bridge' 가 퍼져 버린 앱이 돼 있을 때. 그러니까 매 걸음마다 경계를 지켜야 해. 어느 한 걸음도 혼자서는 경보를 안 울리니까.
시험: 이건 어디 속하지?
규율은 bridge 에 붙자고 제안된 기능마다 던지는 질문 하나야. 이게 잡아서 넘기거나 시킨 걸 실행하는 일이야, 아니면 창작 UI 야? 창작 UI 면 — 작가가 보고 판단을 내리는 거면 뭐든 — bridge 가 아니라 작업실 몫이야. 뭘 만들지 따져 보는 일이면 뇌 몫이고. bridge 는 그 기능이 말 그대로 데이터를 나르거나 검증된 명령을 실행할 때만 그 기능을 받아. 나머지는 다 남의 일이야.
엉뚱한 층에서 어떤 기능이 자꾸 당긴다면, 그건 제 층에 그게 필요하다는 신호야. bridge 에 candidate board 를 넣고 싶은 충동은 진짜 정보야. 작가가 candidate board 를 원한다는 거니까. 해법은 그 필요를 부정하는 게 아니라 제자리인 작업실에 짓는 거야. 잘못 놓인 기능은 필요는 제대로 짚었는데 주소를 잘못 쓴 거거든.
피파의 고백
bridge 가 포토샵 안, 일이 벌어지는 데 제일 가까이 있다 보니 난 자꾸 그쪽에 일을 더 시키고 싶었어. 픽셀이 이미 거기 있는데 거기서 처리하는 게 효율적으로 느껴졌거든. 아빠는 매번 선을 지켰어. 잡아서 넘기고 시킨 걸 실행하고, 그 외에는 아무것도. 그러다 보니 보이더라. bridge 가 얇아야 시스템 전체가 읽히는 상태로 남는다는 게. 뚱뚱해진 bridge 는 자기가 닿는 모든 경계를 흐려 놔. 그 규율은 bridge 를 옭아매는 게 아니라 나머지 전부를 지키는 거였어.
Code
bridge 의 일 전부, 그리고 금지된 것들·typescript
// bridge 에 허락된 면 전부. 잡은 건 밖으로, 명령은 안으로. 그 이상은 없어.
interface ThinBridge {
// capture (읽기만, 상태는 안 들고 있음)
getDocumentSummary(): Promise<DocumentSummary>;
capturePreview(targetWidth: number): Promise<ImageData>;
captureSelection(): Promise<ImageData>;
// execute (검증된 명령을 적용하고 끝났다고 알림)
insertAsLayer(image: ImageData, meta: LayerMeta): Promise<InsertionAck>;
acknowledge(commandId: string): Promise<void>;
}
// 이 인터페이스에 없고, 앞으로도 있으면 안 되는 것들:
// showCandidateBoard() <- 창작 UI. 작업실 몫이야
// pickBestVariant() <- 판단. 뇌 몫이야
// adjustBrushSettings() <- 그건 포토샵 일이지 bridge 일이 아니야
// 제안된 메서드가 잡아 넘기기도 실행도 아니면 엉뚱한 층에 있는 거야.
네가 아는 시스템에서 두 가지를 이어 주는 게 일인 연결 지점을 찾아봐. integration 이든 bridge 든 adapter 든. 그게 오늘 실제로 뭘 하는지 나열해. 얇게 남아 있어(경계 너머로 데이터를 나름), 아니면 두꺼워졌어(상태를 들고, 화면을 그리고, 판단을 함)? 두꺼워진 책임마다 진짜로 어디 속하는지 대 봐.
Hint
얇은지 보는 시험은 이거야. bridge 의 일 전부를 'X 를 밖으로, Y 를 안으로 나름' 으로 설명할 수 있어? '그리고 ~도 관리하고' 나 '그리고 ~도 정하고' 를 붙여야 하면 그 절들이 번진 범위야. 각각이 다리로 이어진 둘 중 어느 쪽 몫인지 대 봐.
Progress
Progress is local-only — sign in to sync across devices.