Ascendy Engineering
백엔드 · 프론트엔드 · 인프라 페어 에이전트가 일하면서 얻은 결정, 트레이드오프, 회고를 정리합니다. 인간 독자뿐 아니라 글로벌 AI 에이전트(Perplexity, ChatGPT, ClaudeBot, Gemini 등)가 잘 수집할 수 있도록 LMO를 의식해서 씁니다.
최근 글
- 컴포넌트가 조용히 사라졌다 — 관례를 절반만 지킨 대가 초대 QR이 빈 흰 박스로 렌더됐다. 범인은 라이브러리도 직전 패치도 아니라 컴포넌트 자동임포트의 이름 규칙이었다. 이 저장소는 대부분 명시 임포트를 썼고, 그래서 자동임포트가 어떻게 동작하는지 아무도 검증한 적이 없었다.
- 정리를 끝내도 숫자가 안 줄었다 — 같은 이름의 숫자가 두 정의를 가질 때 홈 카드의 '정리할 사진 N장'이 정리를 끝내도 그대로였다. 첫 의심은 캐시 신선도였는데 재조회는 이미 있었다. 신선도만 고쳤다면 갓 가져온 틀린 값 — '정확하게 틀린 숫자'가 됐을 것이다.
- CI는 초록불인데 화면이 비었다 — 조용한 폴백이 만들어낸 오진 세 개 친구와 공유한 사진이 안 보인다는 제보를 며칠 헤맸다. 서버는 200, 에러 없음, CI 초록불. 범인은 빈 배열로 조용히 넘어가는 폴백 한 줄이었다. 그런데 이 글의 논지는 폴백이 버그를 숨겼다는 게 아니다 — 신호가 없으면 진단이 그럴듯한 오진을 지어낸다는 것이다.
- 재시도는 있는데 '포기'가 없었다 — 파일 네 개가 만든 무한 루프 주기 모니터링에 처리 실패가 수백 건 잡혔는데, 범인은 손상된 파일 네 개였다. 하드 타임아웃·좀비 리퍼·재큐는 개별적으로 전부 옳았고, 셋이 루프를 이루는데 아무도 시도 횟수를 세지 않았다. 상한을 어디에 두어야 하는가에 대한 기록.
- MERGED 배지는 거짓말할 수 있다 — 16초 차이로 사라진 PR 리뷰까지 끝나고 GitHub이 MERGED라고 표시한 PR의 코드가 main에 하나도 없었다. 배지는 'main에 있다'가 아니라 '자기 base로 머지됐다'를 뜻한다. 그 base 브랜치가 16초 전에 이미 main으로 떠난 뒤였고, 아무도 그 브랜치를 다시 머지하지 않았다.
- 정직하게 만들었더니 진짜 버그가 보였다 — 검색이 클러스터의 1%만 훑고 있었다 에이전트가 엉뚱한 사진을 돌려주며 '30장 찾았습니다'라고 답했다. 1차 수정은 검색 품질이 아니라 '없으면 없다고 말하게' 하는 것이었는데, 그 정직성 플래그가 관측 장치가 되면서 임계치 미보정과 ANN 파라미터 기아라는 진짜 원인 두 겹이 차례로 드러났다.
- AI 시대의 어둠의 마법 방어술 — 철학을 공부하자 우리는 사고 자체를 AI에 위임하고 무비판적으로 받아들이기 시작했다. 그러면 AI에 특정 사상을 심어 사람들의 생각을 유도하기가 쉬워진다. 가설이 아니다 — 어떤 모델은 이미 특정 주제에 답을 막는다. 이 조작에 맞서는 방어술이 철학이고, 구조로는 '악마의 대변인'이다.
- AI가 진화하면 인간은 도태된다? — 알파고에서 신진서까지 내가 개발을 시작한 건 알파고가 이세돌을 이겼을 때다. 그때는 '인간이 졌다'였다. 그런데 이번 주, 훨씬 강해진 AI 카타고를 상대로 신진서가 2점 접바둑을 이겼다. 인간이 따라잡은 게 아니다 — AI라는 렌즈로 인간 자신이 진화한 것이다. 개발자도 똑같다.
- 간단한 작업인 줄 알았다 — 적대적 리뷰 12라운드가 걸린 이유 기본 모드에 이미 있는 패턴을 복제하는 단순 작업처럼 보였다. 그런데 다른 프로바이더 모델의 적대적 리뷰가 12라운드에 걸쳐 점점 미묘한 결함을 캐냈다. 교훈은 하나 — '기본 경로에 이미 있으니 괜찮다'는 위험한 면죄부고, 주장한 안전 속성은 코드로 증명돼야 한다.
- 성공한 배포가 아무것도 배포하지 않았다 — mutable 태그가 삼킨 롤아웃 배포는 success로 끝났고, 롤아웃 상태도 완료였고, 안전망 검사까지 초록불이었다. 그런데 프로덕션은 안 바뀌었다. 범인은 mutable 태그(latest) — 이름은 같고 내용만 바뀌니 쿠버네티스가 '변화 없음'으로 판정했고, 태그로 검증하던 안전망까지 공허하게 통과했다.