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

혼자 발화하는 건 아무것도 없어

~12 min · scheduler, automation, agency, unattended-jobs

Level 0불 꺼진 작업장
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

진짜 일하는 거부 둘

앞 강의에서 거부 네 개를 셌지. 그중 둘, 서버 없음과 포트 없음은 평범한 공학적 절제야. 나머지 둘이 더 이상하고 더 재밌어. 스케줄러 없음이랑 두뇌 없음. 이 둘이 이 도구가 슬그머니 콘텐츠 공장이 되는 걸 막아. 그리고 제일 먼저 논리로 밀려날 후보이기도 하고.

대부분의 프로젝트에선 이 논리가 이겨. 도구가 식별자 하나 받아서 영상을 뽑는다. 영상은 꾸준히 올라가야 한다. 그러니 타이머에 걸고, 대기열에 있는 걸 먹이고, 밤새 돌리자. 논리 자체는 어디도 안 틀렸어. 그리고 이 설계는 그걸 통째로 거절해.

타이머가 왜 거절당했나

적혀 있는 이유는 '무인 작업이 못 미더워서'가 아냐. 이 도구가 뭔지에 대한 주장이야. 사람이 작업을 돌리고, 작업장은 도구다. 스케줄러는 그걸 뒤집어. 타이머가 파이프라인을 쏘는 순간 도구가 행위자가 되고, 사람은 이미 나와버린 결과물의 검토자로 밀려나. 이 레포의 품질 교리 전체가 사람이 제작의 상류에 있다는 데 걸려 있는데, 스케줄러는 사람을 하류로 옮겨버려.

두 번째 이유가 있고, 이건 이 프로젝트 밖으로도 넘어가. 일정은 재료가 감당 못 할 수요를 만들어내. 매주 뭔가 내놔야 하는 도구는, 할 말이 없는 주에도 뭔가를 내놔. 일정이 그걸 요구하니까. 그래서 설계는 대기열 자체를 주기로 삼았어. 한 주에 요청 세 개면 영상 세 개, 요청 0 이면 0 이고, 0 은 해명이 필요 없는 정상 결과야.

두뇌 없음 — 그럼 판단은 어디서 와

다른 거부는 좀 더 미묘해. Beacon 은 모형을 안 들고 있고 자율 판단 루프도 안 돌려. 안에 결정은 잔뜩 있어. 뭘 렌더할지, 문장을 어떻게 다듬을지, 생성된 이미지 넷 중 뭐가 쓸 만한지. 근데 그중 어느 것도 도구 안에 살지 않아. 실행할 때마다 밖에서, 그걸 모는 사람한테서 들어와. 도구가 내놓는 건 결정론이야. 같은 입력이면 같은 프레임, 같은 인코딩 프로필, 같은 측정 검사.

이 분리는 정확하게 이름 붙일 값어치가 있어. 도구랑 에이전트를 가르는 선이거든. 도구는 손잡이를 당길 때마다 같은 일을 일으켜. 에이전트는 언제 당길지를 정해. 손잡이랑 결정을 다른 자리에 두면 "이건 왜 존재하지?"라는 질문에 항상 사람 하나랑 시점 하나로 답할 수 있어. 아무도 쓴 기억이 없는 설정 파일 말고.

Code

같은 부품, 두 가지 배열·text
REJECTED — the tool is the actor

  timer ──▶ pick from queue ──▶ render ──▶ publish
                                             │
                                        human reviews
                                        (downstream, after the spend)


CHOSEN — the person is the actor

  human decides ──▶ request ──▶ human picks it up ──▶ render
                                       │
                                  human gates the script
                                  (upstream, before the spend)

# same boxes, opposite causality.
# the second one cannot produce a video nobody wanted.
판단을 안 들고 있는 도구의 형태·python
# Every stage is a pure-ish function of its inputs plus a cache.
# Nothing here decides WHETHER to run - only HOW, given that it was asked.

STAGES = {
    "check":     stage_check,      # hard rules: fail loudly, decide nothing
    "tts":       stage_tts,        # synthesize exactly the segments given
    "plates":    stage_plates,     # render exactly the scenes declared
    "clips":     stage_clips,
    "assemble":  stage_assemble,
    "validate":  stage_validate,   # measure; report; refuse to bless
}

def main(stage: str, force: bool = False) -> None:
    # No scheduler imports here. No 'if it's been a week' branch.
    # The only way this runs is that somebody typed it.
    STAGES[stage](episode_dir, force=force)

External links

Exercise

네 시스템에서 타이머로 돌면서 사람이 읽으라고 뭔가를 뱉는 자동 작업을 하나 찾아봐. 리포트든 다이제스트든 요약이든. 그리고 진짜로 할 말이 하나도 없는 주기에 무슨 일이 벌어지는지 물어봐. 빈 산출물을 내? 억지로 채운 걸 내? 아예 아무것도 안 내? 그다음 방아쇠를 다시 설계해봐. '아무 일 없었음'이라는 흥미로운 경우가 소음을 안 만들고도 표현되게.
Hint
형식적으론 맞는데 정보가 0 인 산출물을 노려봐. 모든 칸이 '변동 없음'인 주간 리포트 같은 거. 그건 일정이 존재한다는 이유만으로 나오는 출력이야. 고치는 법은 거의 항상 방아쇠를 시계에서 사건으로 바꾸는 거고.

Progress

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

댓글 0

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

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