다섯 개의 개인 프로젝트와, 만들면서 무엇이 어떻게 깨졌고 어떻게 알아냈는지의 기록.
이름을 누르면 그 프로젝트의 소개 페이지로 간다. 아래 주제 색인은 다섯을 가로질러 같은 모양으로 깨진 것을 묶은 것이다 — 장르도 언어도 다른데 겹쳤다.
실시간 영토 확장 전략 게임에 증강 드래프트를 얹는다. 일정 시간마다 판이 멈추고 카드 셋 중 하나를 고르면 그것이 빌드가 된다. openfront.io 에서 모티브를 얻어 제작했다.
한국 해군 이지스 기동전단의 다층 방어 시뮬레이터. 대공·대함·대잠 교전을 확률로 풀고 몬테카를로로 반복해 요구조건 충족 여부를 판정한다. 3D 전장 시각화까지.
Windows 상주형 PC 성능 이상 탐지. 리소스를 5초마다 모아 «평소와 다른» 상태를 감지하고 느려진 원인 프로세스를 지목한다. 절대 임계값 없이 이 PC 기준의 상대값으로.
넥슨 오픈API로 EA SPORTS FC 온라인 감독모드 전적을 조회·집계한다. 승률·선수 지표·전술 상성·슛 맵을 16종의 탭으로. 받은 경기는 로컬 DB 에 누적한다.
각 프로젝트 페이지에 무엇을 하는 앱인지 · 구조 · 주요 기능 · 개발 노트가 있다. 노트 본문은 저장소에 있고, 이 페이지들은 링크만 건다 — 복사하면 어느 쪽이 최신인지 알 수 없게 된다.
장르도 언어도 다른 다섯 프로젝트인데 — 실시간 전략 게임 · 방어 시뮬레이터 · 상주형 모니터링 · 전적 조회 앱 · 위성 추적 앱 — 깨진 모양이 겹쳤다. 사례가 하나였을 땐 그 프로젝트의 성질인 줄 알았다. 새 주제는 두 프로젝트 이상에서 나왔을 때만 만든다. 그래서 주제는 넷 → 여섯 → 일곱로 늘었다 — Argus(3번째)에서는 하나도 안 생겼고, 피파(4번째)에서 둘, RL3D(5번째)에서 하나. 세 번 다 「이미 한 프로젝트에서 두껍게 나왔던 것」이 두 번째 사례를 만나 조건을 채운 경우였고, 그 사이의 기다림이 이 규칙의 값이다.
아무것도 검사하지 않는 검사도 초록으로 뜬다. 그리고 그건 실패보다 알아채기 어렵다.
node로 문법을 검사하니 최신 문법을 전부 통과시켰다. 폰에 올린 뒤에야 안다every()가 참이었다(별도 vm realm 에서 instanceof Date가 false). 그리고 경계 테스트가 기대값을 상수로 계산해 그 상수를 0으로 바꿔도 통과했다“효과가 없다”는 결론을 내리기 전에, 그 결론을 만든 측정이 유효했는지를 먼저 묻는다. 측정 코드도 코드다.
돌지 않는 규칙은 아무것도 깨뜨리지 않아서, 깨뜨리는 것보다 훨씬 오래 방치된다.
isinstance(e, TimeoutError) 분기가 한 번도 실행되지 않는 죽은 코드였다(urlopen은 타임아웃을 URLError(reason=timeout)로 감싼다). 그동안 사용자는 서버가 느릴 뿐인데 “인터넷 연결을 확인하세요”를 봤다예외도 로그도 붉은 테스트도 없이 죽는다. 그리고 방어 코드가 실패의 증거를 지우기도 한다.
stderr가 None이 되고, (x or "")가 그걸 빈 문자열로 바꿔 실패 원인이 통째로 사라졌다pythonw라 stderr가 없어 아무 신호도 없었다계산은 맞는데 전달이 틀린다. 두 표현이 각자는 맞고 서로 어긋나면, 한쪽만 보는 테스트는 영원히 통과한다.
원인 후보였다 — 순위가 매겨진 표를 사람은 답으로 읽는다—로 숨기면서 막대는 실제 길이로 그렸다둘 다 회귀 테스트 픽스처였다. 실제 응답을 그대로 두는 것이 골든 테스트의 가치인데, 그 실제 응답에 제3자 정보가 섞여 있다.
ouid(영구 식별자) · matchId(하나만 있어도 참가자를 조회할 수 있다) · 상대 구단주명 4명이 공개돼 있었다. 파일명도 matchId 라 내용만 고쳐서는 소용이 없었다틀린 조언은 없는 조언보다 나쁘다. 그리고 낡은 줄은 대개 초록 옆에 붙어 있어서 더 안 읽힌다.
회귀 8×26에 멈춰 있었다 — 실제는 38×29. 매 커밋 출력되던 줄이다제목은 무엇이 틀렸는지로 시작한다. 기능 자랑이 아니라 실패와 그 발견 과정이 본문이다.
근거를 건다. 각 노트 끝에 커밋 해시와 문서 위치를 표로 둔다. 링크를 걸기 전에 해시가 실재하는지 확인한다.
수치는 실측과 인용을 가른다. 커밋 메시지에 적힌 값은 그때의 주장이지 지금 잰 값이 아니다. 해시는 “누가 그렇게 적었다”의 근거지 “그게 맞다”의 근거가 아니다.
못 잰 것은 못 쟀다고 적는다. 무엇을 왜 안 쟀는지까지.
끝에 그 건에서 남긴 규칙을 한 줄로 뽑는다. 그 프로젝트 밖에서도 통해야 좋은 노트다.
파일 위치는 프로젝트마다 docs/notes/NN-slug.md 로 같다.
규약을 맞춰 두면 이 페이지가 긁을 때 규칙이 하나로 끝난다 —
실제로 두 번째 프로젝트를 쓰고 나서야 무엇이 공통인지 관찰로 알 수 있었다.