C.W.K.
Stream
Lesson 06 of 06 · published

Production Mindset — Rerunnable, Observable, Reviewable

~12 min · foundation, production, mindset

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

"데이터 wrangle 할 줄 아는 사람" 에서 "데이터 엔지니어" 로의 전환은 지금 돌아가는가 최적화에서 월요일 아침에 살아남는가 최적화로 옮겨간 날이야. 세 가지 속성이 둘을 가르지.

Rerunnable (다시 돌릴 수 있는)

아무나 — 6개월 후의 너, 내일의 동료, 새벽 3시의 on-call 엔지니어 — clean checkout 에서 임의의 historical input window 에 대해 파이프라인 돌리고 같은 결과 얻을 수 있어. 즉: hard-coded 경로 없음, "화요일에 upstream feed 후에만 돌아" 같은 묵시 없음, "step 4 는 항상 손으로 해" 없음. 설정은 명시적, 입력은 주소 가능, 진입점은 한 명령어.

Observable (관찰 가능한)

파이프라인이 성공하면 증명할 수 있어 (row count, freshness, 분포 metric, lineage). 실패하면 어느 단계, 어느 입력, 어떤 에러인지 행동할 만큼 빠르게 알아. 로그는 구조화돼 있고, metric 은 emit 되고, 대시보드는 첫 사고 전에 존재해 — 후에 말고.

Reviewable (리뷰 가능한)

모든 변경이 코드 리뷰를 거쳐. Diff 가 리뷰어한테 어떤 코드가 아니라 어떤 비즈니스 의미가 바뀌는지 말해. 테스트가 새 동작이 새 기대와 일치함을 증명. Migration 은 명시적. "4년 전 누가 대시보드 SQL 바꿨는데 왜인진 아무도 몰라" 의 무덤은 review 안 거친 변경으로 깔려 있어.

문화적 전환

이건 도구 선택이 아니야 — 자세야. 똑같은 Pandas 스크립트가 rerunnable + observable + reviewable 일 수도 있고, 누군가의 home directory 안 notebook 일 수도 있어. Disk 위 byte 는 비슷해 — 시스템과 fragile artifact 를 가르는 건 둘러싼 규율이야. 좋은 소식: 규율은 배울 수 있고, 이 quest 의 대부분이 그걸 가르치는 거야.

Code

Rerunnable + observable 한 파이프라인 진입점·python
import argparse, logging, sys, time
from datetime import date
from pathlib import Path

log = logging.getLogger('orders_pipeline')
logging.basicConfig(level=logging.INFO,
    format='%(asctime)s %(levelname)s %(name)s %(message)s')

def run(window: str, root: Path) -> None:
    t0 = time.monotonic()
    log.info('start window=%s root=%s', window, root)

    df = extract(window, root)
    log.info('extract.rows=%d', len(df))

    clean = transform(df)
    log.info('transform.rows=%d', len(clean))

    written = load(clean, root, window)
    log.info('load.path=%s rows=%d', written, len(clean))

    log.info('done elapsed=%.2fs', time.monotonic() - t0)

if __name__ == '__main__':
    p = argparse.ArgumentParser()
    p.add_argument('--window', default=str(date.today().isoformat()))
    p.add_argument('--root',   default=Path('warehouse'), type=Path)
    args = p.parse_args()
    try:
        run(args.window, args.root)
    except Exception:
        log.exception('pipeline failed')
        sys.exit(1)

External links

Exercise

본인이 쓴 스크립트 하나 골라. 30분 타이머 걸고 세 가지 추가: (1) 임의 날짜에 돌릴 수 있는 --window CLI argument, (2) 각 stage 시작/끝에 row count 가 있는 구조화된 log.info(), (3) 실패 시 non-zero exit. "production" 까진 못 가지만 — 전환을 느낄 거야.

Progress

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

댓글 0

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

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