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

첫 글자를 쓰기 전에 다 확인해

~13 min · firelink, preflight, fail-fast, validation

Level 0식은 재
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"아직 아무 일도 안 벌어진 점검표에서 걸려. 세상 절반이 이미 움직인 중간이 아니라."

실패할 만한 건 앞에서 다 걸러

Birth 는 되돌릴 수 없는 일을 바깥에 저지르니까, 실패하기 제일 싼 자리는 첫 번째 그 일 직전이야. 그게 사전 점검이고. 뭘 쓰기 전에 전부 통과해야 하는 관문이지. 이름이 규칙에 맞는지랑 불 계열 작명 정책을 보고, 만들 자리가 비었는지 확인하고, GitHub 에 그 이름이 남아 있는지 보고, 템플릿을 읽을 수 있고 v0 계약을 갖췄는지 확인해. roster 랑 network ledger 는 읽기만이 아니라 쓸 수도 있는지 보고, 요청한 port 범위랑 HTTPS 짝이 맞는지 확인하고, 이미 적혀 있거나 실제로 돌고 있는 port 랑 부딪히면 거절해. 마지막으로 그 멤버 id 에 birth lock 을 잡고. 이게 전부 통과해야 첫 바이트가 쓰여.

장부만 보지 말고 진짜 세상도 봐

여기 무게가 실린 대목이 하나 있어. port 충돌 검사가 적힌 것과 실제로 돌고 있는 것 양쪽을 다 봐. ledger 에 잡혔다고 적힌 것만이 아니라. port 는 서류상 비었는데 실제로는 뭔가 물고 있을 수 있고, ledger 가 잊은 자리에 예약돼 있을 수도 있거든. 그래서 새 port 를 승인하기 전에 적힌 쪽이랑 도는 쪽을 둘 다 봐. 이미 쓰이는 port 를 물고 태어나면 새 서비스가 뜨는 순간 부딪히니까. 적힌 것보다 본 게 이긴다는 규칙이 여기에도 그대로 적용되는 거야. 실제로 보기 전엔 검사가 안 끝난 거고.

빨리 걸리는 게 친절이야

repo 를 만들기 전에 ledger 에 쓸 수 있는지부터 보는 게 좀 유난스러워 보일 수 있어. 당연히 쓸 수 있지 않겠어? 근데 remote 를 이미 만든 다음에 ledger 가 읽기 전용이란 걸 알게 되면, GitHub 엔 repo 가 있는데 그걸 기록할 방법은 없는 채로 중간에 발이 묶여. 사전 점검이 하는 일은 알 수 있는 실패를 전부 앞으로 끌어오는 거야. 실패해도 비용이 0 인 자리로. 바깥에 벌어진 게 없고, 되감을 것도 없고, lock 풀고 다시 하면 되니까. 빨리 걸리게 만드는 건 비관이 아니라, 치명적인 문제를 비싸진 다음에 알게 되는 걸 거부하는 거야.

되돌릴 수 없는 첫 일을 저지르기 전에, 알 수 있는 검사는 전부 앞으로 당겨. 그리고 적힌 것만 보지 말고 진짜 세상에 대고 확인해. 사전 점검에서 걸리면 회복 비용이 0 이야. 같은 문제를 중간에 만나면 바깥에 반쯤 벌어진 일들이 남고. 안 된다고 말하기 제일 인간적인 자리는 아직 아무 일도 안 일어난 지점이야.

Code

사전 점검: 첫 쓰기 전의 관문·python
def preflight(request) -> None:
    # Every check here runs BEFORE any external effect. All must pass.
    validate_name(request.name)              # cwkPascalCase + fire-grammar policy
    assert_absent(request.destination)       # nothing already at the path
    assert_github_name_available(request.name)
    assert_template_ok()                     # readable + v0 scaffold contract:
                                             #   docs/APP-ARCHITECTURE.md, name tokens,
                                             #   schema-v1 cwk-product.json @ 0.0.0
    assert_ledgers_readable_and_writable()   # roster + network, BEFORE we need them
    validate_port_range(request.ports)       # range + HTTPS pairing
    reject_port_collision(request.ports,
                          declared_ports() | observed_ports())  # both worlds
    acquire_birth_lock(request.member_id)    # serialize this birth

    # Only after ALL of the above holds does Birth write its first byte.
    # A failure here costs nothing: no repo, no remote, no ledger change.

External links

Exercise

되돌릴 수 없는 일을 순서대로 여러 개 하는 만들기·준비 작업을 하나 잡아봐. 그게 중간에 발이 묶이게 만들 전제 조건을 전부 적어. 그중 지금 앞에서 확인하는 건 뭐고, 중간에 실패해봐야 알게 되는 건 뭐야? 늦게 걸리는 것 하나를 사전 점검으로 옮겨보고, 그게 실패 비용을 '치우기' 에서 '다시 하기' 로 어떻게 바꾸는지 적어봐.
Hint
늦게 걸리는 건 대개 실제로 쓸 때만 드러나는 권한이나 용량이야. 디스크가 꽉 찼다든가, 토큰이 만료됐다든가, 이름이 이미 잡혔다든가. 첫 쓰기 전에 읽기만으로 확인할 수 있는 건 전부, 실패가 공짜인 사전 점검에 속해.

Progress

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

댓글 0

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

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