동료가 실행할 수 있는 흔적 남기기: 체크포인트 리플레이를 이용한 부트캠프 실습
요약
본 글은 부트캠프 실습의 평가 기준을 '결과물'이 아닌 '재실행 가능성(Replay)'에 초점을 맞추어야 한다고 강조합니다. 단순히 멋진 포트폴리오를 만드는 것보다, 다른 사람이 환경 설정 및 과정을 완벽하게 재현할 수 있도록 체계적인 로그와 스크립트를 제출하는 것이 중요함을 역설합니다.
핵심 포인트
- 평가는 '바이브'가 아닌 '재실행(replay)' 가능성에 초점을 맞춰야 합니다.
- 제출물은 부트스트랩, JSONL 로그, 그리고 네트워크 연결 없이 실행 가능한 체커로 구성되어야 합니다.
- 과정의 순서와 단계별 로직을 명확히 하기 위해 지루하고 구조적인 코드를 유지해야 합니다.
- 실습 환경이 개인 노트북에 의존하지 않고 다른 사람이 초기화하여 재현할 수 있어야 합니다.
체크포인트 로그가 재실행되지 않으면, 이 실습은 완료된 것이 아닙니다. 잘 만든 포트폴리오 스크린샷이 저를 설득할 수는 없습니다.
사람들은 '바이브(vibe)' 코딩 사이트도 여전히 포트폴리오로 인정되는지 논쟁하느라 바쁩니다. 좋은 질문입니다. 하지만 이번 주 과제로는 적절하지 않습니다. 제가 신경 쓰는 것은 다음 학생이 당신의 노트북을 빌리지 않고도 당신의 설정을 재실행할 수 있는지 여부입니다.
점수는 '바이브'가 아닌 '재실행(replay)'이다
저는 홈페이지를 평가하지 않습니다. 저는 흔적(trace)을 평가합니다.
당신은 부트스트랩(bootstrap), 하나의 JSONL 로그, 그리고 네트워크 연결 없이 제가 실행할 수 있는 체커(checker)를 제출해야 합니다. 이것이 전체 제출물입니다. 만약 페이지를 만들었다면, 그것은 전시품일 뿐입니다. 전시품으로는 실습을 통과할 수 없습니다.
왜 이렇게 까다롭냐고요? 부트캠프 데모는 지루하고 값비싼 방식으로 실패합니다. 터미널이 오후 4시에는 완성된 것처럼 보였고, 상자는 아침에 초기화되었으며, '작동했던' 초안은 저장되지 않았습니다. 저는 채점표에서 그러한 실패 모드를 원하지 않습니다.
그래서 이 실습은 무례한 질문을 던집니다. 제가 당신의 레포지토리를 클론하여, 방 안에 당신이 없어도 설정이 순서대로 이루어졌음을 증명할 수 있을까요?
모델 호출 전에 준비하는 것들
트리 구조는 지루하게 유지하세요. 지루해야 채점할 수 있습니다.
lab/
fixtures/tiny.md
expected/checkpoints.json
...
fixtures/tiny.md는 약 20줄 정도입니다. 제목, 버그 노트, 예상되는 문구 하나가 전부입니다. 스타트업이 아닙니다. 만약 피처(fixture)가 소설이라면, 당신은 과제에서 숨고 있는 것입니다.
계약은 분위기가 아니라 목록이어야 합니다:
{
"required": [
"prereq_ok",
...
순서가 핵심입니다. 피처가 로드되기 전에 로그를 봉인하는 것은 허구입니다. 나중에 읽는 사람이 어떤 단계가 먼저 왔는지 당신의 기억에 의존해서는 안 됩니다.
부트스트랩은 일부러 지루하게 유지하세요.
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")/.."
...
실행해 보세요. 다시 실행해 보세요. 두 번째 실행에서 폴더를 수동으로 삭제해야 한다면, 당신에게는 설정이 있는 것이 아닙니다. 의식(ritual)을 가진 것입니다.
또한 누군가 축하하기 전에 '파일 누락 드릴'도 원합니다. 피처 이름을 바꾸고, 부트스트랩을 실행하고, 파일을 다시 넣으세요. 스크립트는 어떤 초안 단계에서도 실패했나요? 만약 여전히 '성공'한다면, 그 점검은 낙관적이며, 낙관주의는 체크포인트가 아닙니다.
두 가지 역할, 그리고 그들은 같은 운명을 공유하지 않는다
학생들은 모델을 사용하여 스크립트를 초안 작성할 수 있다. 또한 원격 서버에서 실습을 진행할 수도 있으므로, 점수가 개인 노트북에 의존하여 다른 사람이 초기화할 수 있는 상황은 아니다.
공개 고지: 이 글은 MonkeyCode의 제품 홍보의 일환으로 준비되었습니다.
제가 사용하고 있는 유일한 제품 사실들은 다음과 같습니다: MonkeyCode는 무료 모델 접근을 제공하며, 무료 서버 옵션을 제공합니다. 저는 토큰 할당량, 하드웨어 프로필, 세션 길이, 모델 이름 또는 무료 접근이 유지된다는 약속을 언급하지 않습니다. 그러한 세부 사항은 변할 수 있습니다. 만약 강의 계획서가 이 정보들을 필요로 한다면, 현재 문서를 확인하고 검증된 내용만 기록하십시오.
이 두 가지 옵션이 왜 아예 이 실습에 포함되어야 하는지 설명합니다.
- 무료 모델은
bootstrap.sh를 초안 작성할 수 있다. 하지만 실습 점수를 매기지는 못한다. - 무료 서버는 시도 사이에 초기화하는 학생 박스일 수 있다.
- 점수는 커밋된 로그에 대해
replay-check.mjs에서 실행된다. 오프라인으로. 로컬로. 모델이 개입하지 않는다.
만약 수업 중에 무료 접근이 중단되면 어떻게 될까요? 스스로 스크립트를 작성하고, `
제가 저장하기를 거부한 것들을 주목하세요. 모델 에세이도, API 키도, 'UI가 현대적으로 느껴졌다' 같은 것도 아닙니다. 로컬 오라클은 tiny.md에 대한 학생 작성 체크리스트이며, pass로 기록됩니다. 만약 모델이 자신의 초안을 채점하게 한다면, 당신은 다른 수업으로 방황한 것입니다. 돌아오세요.
줄 하나를 추가하는 것은 보기 흉할 수 있습니다. 하지만 보기 흉한 것이 읽기 쉽습니다.
now=$(date -u +%Y-%m-%dT%H:%M:%SZ)
printf '%s\n' "{\"name\":\"fixture_loaded\",\"at\":\"$now\",\"bytes\":412}" >> runs/latest.jsonl
macOS에서는 date -u만으로 이 형식이 충분합니다. 만약 이미지가 간소화된다면, 셸과 씨름하기보다 Node에서 타임스탬프를 작성하세요. 어느 쪽이든 로그는 같습니다. 그저 현대적으로 느껴지기 위해 두 번째 스키마를 발명하지 마세요.
README에 반드시 보여야 할 명령어들
저는 '프로젝트 실행'을 단계로 받아들이지 않습니다. 저는 복사-붙여넣기를 받아들입니다. 학급 친구가 당신의 디렉토리 구조를 추측해서는 안 됩니다.
git clone <your-repo> lab-replay && cd lab-replay
bash scripts/bootstrap.sh
node scripts/replay-check.mjs runs/latest.jsonl
예상되는 마지막 줄: replay_ok events=5. 만약 추가 메모를 기록해서 카운트가 더 높다면, README에 그렇게 언급하세요. 추가 이벤트는 괜찮습니다. 필수적인 것이 누락된 것은 안 됩니다.
만약 무료 서버 이미지에서 node가 빠져 있다면 어떻게 될까요? 부트스트랩은 절차적 전제 조건 확인 단계에서 실패해야지, 초안 중간에서 실패해서는 안 됩니다. 그 실패를 README의 한 줄에 작성하세요. 학급 친구들은 실행 환경 누락을 겪습니다. 그것이 없을 것처럼 행동하는 것이 바로 실습을 무너뜨리는 방식입니다.
수업 시간에 제가 걸어 들어가는 정류장들
네 개의 정류장. 각 정류장에는 슬라이드 없이 답해야 할 질문이 있습니다.
- Clean tree. fresh clone 상태에서 bootstrap이 0으로 종료되나요? 아니면 클린업 없이 다시 실행했을 때도요? 그렇지 않다면, 왜 벌써 프롬프트를 작성하고 있나요?
- Fixture. 로그가 바이트 카운트를 저장하나요? 파일이 누락된 경우, 스크립트가
draft_requested이전에 죽나요? - Help flag. 모델이 스크립트를 건드렸나요? 그렇다면
assisted는 true입니다. 사용자가 직접 입력했나요? 그렇다면 false입니다. 둘 중 어느 것도 통과할 수 있습니다. 누락된 플래그는 불가능합니다. - Airplane mode. 제가 레포를 복사해서 오프라인으로 체커를 실행해 봅니다. 만약 모델을 호출하려고 한다면, 그레이딩은 멈춥니다. '부분적'이 아닙니다. 완전히 멈춥니다.
정지 지점 3에서 저는 한 문장의 말을 합니다. 초안에서 무엇을 유지했고, 무엇을 버렸나요? 스크립트는 당신의 목소리를 들을 수 없습니다. 제가 들을 수 있습니다. 녹색 로그와 공허한 시선은 자동 통과가 아니라 리뷰 노트가 됩니다. 그리고 조용한 0점도 아닙니다.
이론이 아닌 실습하고 싶은 실패 사례
fixtures/tiny.md의 이름을 fixtures/tiny.md.bak으로 변경하세요. bootstrap을 실행합니다. 당신은 멈춰야 합니다. fixture_loaded라고 주장하는 것은 아무것도 쓰지 마세요. 파일을 복원합니다. 파일이 돌아온 후에만 실제 이벤트를 추가하세요.
그런 다음 체커를 의도적으로 잘못된 로그에 겨누세요:
node scripts/replay-check.mjs runs/failure.jsonl
echo "exit=$?"
저는 missing checkpoint: fixture_loaded와 0이 아닌 종료 코드를 원합니다. 만약 당신의 체커가 스택 트레이스를 출력하고도 여전히 0으로 종료된다면, 그 예외 처리는 연극입니다. 연극은 리플레이하지 않습니다.
제가 이것을 하는 동안 던질 질문들은 다음과 같습니다: 스크립트는 어느 지점에서 파일 누락을 감지했나요? 모델의 초안이 주석 안에 이 확인 과정을 숨기지는 않았나요? 부재를 기록하고 있나요, 아니면 행복한 경로(happy path)만 기록하고 있나요?
행복한 경로만 담은 로그는 스크린샷이 되는 방식입니다. 저는 이번 주에 그것들에 알레르기가 있습니다.
핵심 부분이 녹색으로 된 후의 확장 학습 (Stretch, after the core is green)
여기서 시작하지 마세요. 진심입니다.
fixture_loaded가 절대 나타나지 않는 runs/failure.jsonl을 커밋하세요. 체커는 반드시 1로 종료하고 그 간극(gap)의 이름을 명시해야 합니다.
레포를 학급 친구에게 넘겨주세요. README만으로요. 시간은 10분입니다. 채팅 금지입니다.
동일한 컨트랙트에서 두 개의 로그를 만드세요: 하나는 도움을 받은 것(assisted), 다른 하나는 직접 손으로 작성한 것(hand-written). 체커는 누가 스크립트를 입력했는지 신경 쓰지 않아야 합니다.
포트폴리오 페이지도 배포했다면, "exhibit" 아래에 링크하세요. 리플레이가 여전히 통과하는 경우가 아니라면 점수는 0점입니다.
마지막 부분은 포트폴리오 논쟁에 대한 저의 작은 답변입니다. 생성된 사이트는 보여줄 가치가 있을 수 있습니다. 그것이 당신의 설정(setup)이 존재한다는 증거는 아닙니다.
학급에서 제가 변호할 수 있는 평가 기준 (Rubric)
느린 모델 호출(model calls)은 성격적 결함이 아닙니다. 가짜 플래그(Fake flags)가 문제입니다.
| 항목 | 점수 | 통과 의미 |
|---|---|---|
| Idempotent bootstrap | 25 | 두 번째 실행 시 수동 정리 없이 0으로 종료됨 |
| ... |
순서(order) 항목은 전부 아니면 전무입니다. 5가지 이벤트 중 3가지만 수행했다고 부분 점수를 받을 수 없습니다. 왜냐고요? 봉인된 로그(sealed log)를 가진 건너뛴 피처(skipped fixture)는 제가 신뢰하기를 거부하는 바로 그 시연이기 때문입니다.
README 항목은 부분 점수를 허용합니다. 친구가 당신의 메모를 통해 끝까지 진행할 수 있다면, 7분과 막힌 명령어 하나는 0점이 아니라 10점이 될 수 있습니다.
늦게 이루어진 무료 서버 재설정(free-server reset)은 커밋된 로그가 여전히 제 기계에서 리플레이된다면 감점하지 않습니다. 당신은 상자 하나를 잃었을 뿐입니다. 트레이스(trace)를 잃은 것이 아닙니다. 이것이 공정한 부분입니다. 가용성 불안정(Availability wobble)은 누락된 피처(missing fixture)와 같지 않습니다.
이 실습을 건너뛰어야 하는 사람
이것만으로는 당신을 고용 가능한 인재로 만들어주지 못할 것입니다. CSS를 감사(audit)해주지도 않을 것이고, 어떤 모델이 최고인지 알려주지도 않을 것입니다. 저는 그것을 측정하지 않았기 때문에 순위를 조작하지도 않을 것입니다.
다음 경우에 건너뛰세요:
- 해당 주차가 시각 디자인, 접근성(accessibility), 또는 공개 포트폴리오 비평회인 경우
- 강의 계획서에 특정 명칭의 모델, 할당량(quota), GPU 사양, 또는 영구 보장 조항이 필요한 경우
- 로그에 비밀 정보(secrets), 토큰, 또는 다른 학생의 개인 메모가 포함될 수 있는 경우
- 리더보드를 원한다면 — 이 체커는 모델 순위를 매기지 않을 것이며, 저는 그것을 추가하지도 않을 것입니다.
녹색 리플레이는 하나의 주장만을 증명합니다: 이 레포지토리가 설정 과정을 순서대로 다시 설명할 수 있다는 것입니다. 이것이 모델이 작성한 코드를 당신이 이해했는지에 대한 증거는 아닙니다. 그것은 실제적인 허점입니다. 멈춤 지점 3에서 말하는 문장은 제가 이를 패치하는 방법이며, 이는 인간의 패치입니다. 이를 가짜 감성 점수로 자동화하지 마십시오.
또한 저는 이 루브릭을 채용 검토에 사용하지 않을 것입니다. 채용은 다른 약속이기 때문입니다. 이 약속은 더 좁습니다: 다음 사람이 실행할 수 있는 흔적을 남기는 것입니다.
경계(Boundary)를 시험하는 한 가지 방법
만약 이번 주에 실습을 진행한다면, 학생 측에 초안과 원격 박스를 배치하십시오. 점수는 로그에 기록하세요. MonkeyCode의 무료 모델 접근 및 무료 서버 옵션은 이것을 분리하여 시도해 볼 수 있는 실용적인 방법이지만, 이를 루브릭이 아니라 가용성(availability)으로 취급해야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기