전체 99편
-
이 프로젝트에는 기능별 정책 문서가 있다. 구인, 경매, 배팅, 상점, 멘토링 같은 것들을 기능마다 한 편씩, "이 기능은 이런 규칙으로 돈다"를 시나리오와 상수표까지 포함해 적어 둔 것이다. 테스트 스펙 역할도 겸한다. 9월 20일에 그 문서들을 열어봤더니 대부분 5월 27일 기준 이었다. 넉 달 전이다. 그 사이 커밋이 수백 개 쌓였다. 문서를 코드 기준으로 다시 쓰기로 하고 하루를 잡았는데, 결과적으로 그날 나온 건 문서 커밋 네 개와 버그 수정 커밋 세 개 였다. 문서와 코드를 한 줄씩 대조하는 작업이 그 자체로 꽤 좋은 버그 탐지기였다. TL;DR - 문서가…
-
9월 중순, Supabase 프로젝트가 정지됐다. 이번 청구 기간 egress가 20.82GB 였다. 무료 한도는 5GB다. 접속자는 하루 40~50명인 모임 서비스다. 이미지를 잔뜩 서빙하는 것도 아니다 — Storage는 34MB밖에 안 쓴다. 20GB는 전부 DB를 읽어서 나간 바이트 였다. 원인을 세 번 틀리게 짚고 나서야 제대로 잡았다. 이번 편은 그 세 번의 기록이다. 결론부터 말하면 첫 번째 조치는 요청 횟수를 95% 줄였는데 egress는 1바이트도 안 줄었다. TL;DR - 1차 진단: 인증 미들웨어가 요청마다 던지는 쿼리가 하루 43만 건. 접속자…
-
9월 4일 오후 5시 17분에 경매 꿀팁 패널을 배포했다. 매물이 올라올 때마다 티모 말투로 한 줄씩 조언을 띄워주는 기능이다. 다음 날까지 신고가 두 건 들어왔다. "경매 만들면 이런 창이 뜬다" 첨부된 스크린샷의 그 창은 에러 바운더리였다. 실시간 경매 화면이 통째로 죽어 있었다. 원인은 코드 한 줄의 위치 였다. 그런데 이 편의 본론은 버그 자체가 아니다. 이 버그를 막았어야 할 안전장치가 세 겹 있었는데, 세 겹이 전부 구멍이었다는 쪽이다. TL;DR - 꿀팁 패널을 붙이면서 useMemo 를 "불러오는 중" early return 아래 에 두었다. sessi…
-
10편에서 크로스테넌트 누출을 다뤘다. 다른 모임 데이터가 새어 들어온 사고였고, 멀티테넌시를 하면 가장 먼저 걱정하는 종류의 문제다. 9월 1일과 2일에 고친 건 그 정확한 반대편이다. 데이터가 새는 게 아니라, 있어야 할 사람이 조용히 사라지는 쪽. 이쪽이 더 오래 안 잡힌다. 누출은 보이면 바로 사고지만, 누락은 아무도 신고하지 않으면 그냥 "원래 그런 화면"이 되기 때문이다. 이틀 동안 제보 두 건을 쫓다가 서로 다른 원인 두 개를 찾았고, 같은 원인을 네 번 고친 뒤에야 전수 조사를 했다. TL;DR - 제보 1: "가입 승인 상태인데 유저 목록·평가·유저페…
-
04편에서 "동시접속 100명도 안 되는 서비스에서 렉이 걸린 이유"를 썼다. 그때 범인은 서버였다 — 요청 하나가 쿼리 130개로 불어나는 N+1이었고, 쿼리를 고치니 해결됐다. 8월 31일에 들어온 신고는 문장이 비슷한데 내용이 달랐다. "카톡 링크로 사이트를 켜는 순간 마우스가 겁나 느려진다" 마우스가 느려진다는 건 네트워크 이야기가 아니다. API가 늦으면 화면이 늦게 뜨지, 커서가 끊기지는 않는다. 커서가 끊긴다는 건 브라우저의 메인 스레드나 합성(compositing) 단계가 막혔다는 뜻이다. 이번 편은 서버를 한 줄도 건드리지 않고 끝난 성능 사건의 기록…
-
7월 29일 오후, 서비스에 만두봇을 출시했다. 모든 페이지에 플로팅 버튼으로 떠 있는 AI 어시스턴트인데, "이번 주 경매 언제야?", "내 전적 어때?" 같은 질문에 모임 데이터를 직접 찾아 답하고, 구인 참가 신청 같은 몇 가지 일은 대신 눌러주기도 한다(모델은 gpt-4o를 쓴다). "유저 대신 행동하는 AI"를 프로덕션에 넣는 건, 채팅창 하나 붙이는 것과는 다른 문제였다. 이번 편은 그걸 넣으면서 정한 규칙들과, 출시 다음날 바로 터진 문제의 기록이다. 1. 권한 검증을 한 벌도 새로 만들지 않았다 가장 중요한 설계 결정부터. 만두봇의 툴 실행은 유저의 B…
-
시리즈 아홉 번째 편이자 "정렬/안전성" 트랙의 마지막 편. 지난 InstructGPT가 세운 RLHF 레시피는 강력했지만, 무해성을 학습시키려면 사람이 유해한 출력을 잔뜩 읽고 라벨을 달아야 한다는 부담이 그대로 남아 있었다. 이번에 다룰 Constitutional AI: Harmlessness from AI Feedback (Bai et al., 2022)은 그 라벨링을 원칙 목록 한 장 으로 대체하려는 시도다. 1. 기본적인 이해부터 쉽게 말하면, Constitutional AI(CAI)는 "사람이 유해한 답변에 일일이 빨간펜을 긋는 대신, 모델에게 원칙 목록(…
-
지난 편까지 Pod를 어디에 어떻게 배치하는지를 봤다. 1강부터 8강까지 오면서 손에 남은 건 결국 YAML 파일 뭉치다. 이번 편은 그 뭉치를 어떻게 하나의 패키지로 묶어 재사용하고 되돌리는가 — Helm 이야기. TL;DR - Helm은 쿠버네티스용 패키지 매니저 다. Chart(패키지 = 템플릿 묶음) / Values(주입할 설정값) / Release(설치된 결과물) 세 단어면 개념의 8할은 끝난다 - 매니페스트에서 환경마다 달라지는 값을 {{ .Values.x }} 자리로 파내고, 그 값을 values 파일로 분리한다 → 환경이 몇 개든 차트는 한 벌 - 렌더…
-
시리즈 여덟 번째 편이자 "정렬(Alignment)/안전성" 트랙의 첫 편. 지난 Toolformer까지가 "모델을 어떻게 더 똑똑하게 쓸 것인가"였다면, 이번에 다룰 Training language models to follow instructions with human feedback (Ouyang et al., 2022, NeurIPS)은 질문 자체가 다르다 — "똑똑한 것과 사용자가 원하는 대로 하는 것은 별개" 라는 이야기다. 흔히 InstructGPT라 불리고, 이후 ChatGPT로 이어지는 RLHF의 원형이 된 논문이다. 1. 기본적인 이해부터 쉽게 말하…
-
이 블로그는 2024년 2월부터 Jekyll(jekyll-theme-yat)로 굴러왔다. 오늘 Astro 5로 옮겼다. 시작은 거창한 기술 부채 청산이 아니라 이거였다 — "Jekyll 이름을 떼고 싶다." 푸터에 박힌 "Powered by Jekyll"과, 테마가 정해준 모양대로만 살아야 하는 상태가 슬슬 답답했다. 옮기면서 가장 신경 쓴 건 하나였다. 글 89편의 URL을 단 하나도 깨뜨리지 않는 것. 2년 반 동안 공유된 링크들이 있고, 검색엔진에 색인된 주소가 있다. 디자인이야 마음에 안 들면 다시 고치면 되지만, 깨진 링크는 조용히 죽는다. 결과부터 쓰면 성…
마지막 글까지 다 봤어요.