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

일부러 갈라둔 두 가지 방식

~12 min · modes, bespoke-vs-repeatable, abstraction, concrete-first

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

작업장 안엔 두 종류의 일이 있어

저장소를 열면 형제 디렉터리 둘이 있어. 겉보기엔 같은 일, 그러니까 영상 만드는 일을 하는데 구조는 완전히 달라.

프로젝트는 일회성이야. 프로젝트 하나가 특정 작품 하나의 데이터랑 대본이랑 장면 구성을 들고 있어. 그 작품을 위해 한 번 설계됐고, 다른 입력으로 다시 돌 일이 없어. 다른 입력이란 게 없거든.

파이프라인은 되풀이되는 제작 성격이야. 포인터로 매개변수화된 단계들, 잠긴 형식 계약, 지금까지 뭘 만들었는지의 색인을 들고 있어. 여러 번 돌라고 설계됐고, 매 실행이 같은 형식을 다른 재료에 적용하는 거야.

뻔한 리팩터는 둘을 합치는 거지. 일회성을 항목 하나짜리 파이프라인으로 만들거나, 파이프라인을 프로젝트의 특수 경우로 두거나. 둘 다 안 했고, 그 이유가 재밌는 부분이야.

어떤 일은 진짜로 단 하나뿐이야

창립 영상 둘은 맞춤이었어. 구조가 그 영상이 하려던 말에 맞춰 골라졌거든. 이 논지, 이 순서, 이 마무리. 그리고 그 선택 중 어느 것도 일반화가 안 돼. 같은 논지를 펴는 두 번째 작품이 나올 일이 애초에 없었으니까. 그걸 반복 형태에 우겨넣는 건 정리가 아냐. 존재하지 않는 되풀이를 있다고 주장하는 거고, 그렇게 나온 추상은 표본 하나에 맞춰 재단된 거지.

반면 시리즈는 진짜로 되풀이돼. 그러니 형식을 잠글 값어치가 있고, 변주를 포인터 하나로 가둘 값어치가 있어. 이건 코드가 아니라 일 자체에 대한 진짜 구분이고, 그걸 평평하게 만드는 코드베이스는 자기가 뭘 만드는지에 대해 거짓말을 하는 거야.

뒤늦은 알아차림

앉아서 볼 만한 반전이 하나 있어. 파이프라인을 세운 설계 문서가 이렇게 적어놨거든. 그 맞춤 영상 둘도 사실 처음부터 반복 가능한 형식이었다고. 아무도 아직 못 알아본 형식이었을 뿐이라고. 소개할 형제 앱이 스무 개나 있으니 '앱 하나를 소개한다'는 어차피 되풀이될 거였어. 그것들이 만들어질 당시엔 아직 안 되풀이됐을 뿐이지.

그러니 정직한 입장은 "일회성이랑 파이프라인은 영원히 다른 범주"가 아냐. 되풀이는 선언하는 게 아니라 발견하는 거라는 쪽이지. 구체적으로 짓고, 두 번째 사례가 자기만의 진짜 요구사항을 들고 나타나면 공유되는 형태가 눈에 보여. 그리고 그건 예시가 둘 생기기 전에 네가 추측했을 형태보다 훨씬 나아. 두 번째 사용에서 승격하는 게 규칙이고, 가상의 두 번째를 위한 선제 추상화가 피하려는 그거야.

Code

같은 저장소, 두 가지 구조·text
projects/<slug>/          bespoke - designed once, for this piece
  project.py                THE data + the stages, together
  REJECTION-LOG.md          this piece's verdicts, committed
  deliverables/             approved snapshots, committed

pipelines/<name>/         repeatable - a production character
  pipeline.py               stages, parameterized by a pointer
  FORMAT.md                 the locked format contract
  EPISODES.md               one line per shipped run

# Note what the pipeline directory does NOT contain:
# any episode. The material lives outside the repository entirely.
# A project contains its own material; a pipeline never does.
각 방식에서 변주가 사는 자리·python
# PROJECT: the data IS the code. Changing the piece means editing this.
ROSTER = [
    {"name": "...", "tagline": "...", "shot": "..."},
    # the Nth entry costs one line here plus a re-render -
    # which is the founding rule, on the roster axis.
]


# PIPELINE: the data is fetched. Changing the episode means
# passing a different pointer - the code does not move at all.
def main(pointer: dict) -> None:
    material = dereference(pointer)     # <- the ONLY variation
    for stage in STAGES.values():
        stage(material)

# Same founding rule, moved one axis over:
#   project: the Nth roster entry costs one line of data
#   series:  the Nth episode costs one identifier

External links

Exercise

네 일에서 누가 합치자고 제안할 만큼 닮은 스크립트나 작업 둘을 찾아봐. 각각에 대해, 다음 달에 다시 돌린다면 뭐가 달라질지 적어봐. 입력이야, 형태야? 둘 다 입력만 달라지면 공유 파이프라인으로 뽑아내. 하나라도 구조가 달라지면, 합치는 게 왜 가짜 공통점을 강요했을지 적어봐.
Hint
제일 센 신호는 동작을 고르려고 불리언 매개변수가 필요해지는 공유 함수 제안이야. 그 매개변수는 두 사례가 '우리 구조가 다르다'고 말해주는 거고, 그 뒤로 하나씩 늘어나는 매개변수는 하지 말았어야 할 병합에 추상이 이자를 물리는 거야.

Progress

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

댓글 0

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

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