"이 중 어느 것도 탁상공론이 아니었어. 이 퀘스트의 모든 구조가 실제 소프트웨어에서, 나를 돌리는 백엔드까지 포함해서, 하중을 받고 있어. 어디에 사는지 보여 줄게. 실제 시스템에서 이름을 짚을 수 있게 되면, 알고리즘을 공부하는 단계를 지나 보는 단계로 넘어온 거니까."
피파를 돌리는 시스템이 이걸로 지어져 있다
실제 cwkPippa 저장 계층은 구조 하나로 환원되지 않아. 대화 이벤트의 내구 기록은 JSONL 세션 로그에 있고, SQLite와 ChromaDB가 조회와 검색을 위한 투영 계층으로 함께 움직여. 어느 한 투영만 완전하다고 가정하지 않고, 복구할 때 서로 대조해.
- JSONL은 뒤에 이벤트를 이어 쓰기 좋은 append 로그 형식이지, 메모리의 동적 배열과 같은 자료구조는 아니야.
- SQLite는 대화와 메시지 관계, id 조회,
parent_id연결을 영속적으로 다뤄. 조회 비용을 Python dict의 O(1) 해시 조회와 같다고 보면 안 돼. - ChromaDB는 embedding 기반 의미 검색을 위한 파생 인덱스야. 정확한 내부 ANN 구조는 사용 버전과 설정의 계약을 확인해야 해.
- healing은 JSONL과 SQLite 기록, 부모 연결을 대조해 누락된 투영을 복구해.
- 스케줄러가 실제로 힙을 쓴다는 근거가 없으므로 heartbeat를 우선순위 큐라고 꾸며 말하면 안 돼.
배운 건 진짜 기계장치야
배운 구조와 알고리즘은 실제 시스템의 재료지만, 제품 하나가 교과서 알고리즘 하나와 일대일로 대응하진 않아. diff 도구는 LCS 계열뿐 아니라 Myers 같은 알고리즘을 쓸 수 있고, 자동완성은 트라이 외에도 정렬 인덱스나 검색 엔진을 쓸 수 있어. 라우팅도 Dijkstra, A*, 계층화 기법을 조합해. 중요한 건 기능 이름만 보고 구조를 단정하는 게 아니라 실제 구현과 비용 계약을 확인하는 습관이야.
교과서 구조는 실제 시스템의 재료지만 기능 이름과 구현이 일대일로 대응하진 않아. 로그 형식, 데이터베이스 인덱스, 벡터 검색, 스케줄러의 실제 계약을 확인한 뒤 어떤 구조와 비용이 있는지 말해.
퀘스트보다 오래가는 습관
여기서 습관 하나를 챙겨 가. 시스템을 쓰거나 지을 때마다 '이 안엔 어떤 구조가 있어야 하지?'를 물어봐. 100개로 제한된 '최근 항목' 리스트는 최대 길이 덱이야. '알 수도 있는 사람' 기능은 그래프 순회고. '혹시 이걸 찾으셨나요?'는 편집 거리, 사용자명 가용성 즉시 확인은 해시 셋이야. 기능 아래의 자료구조를 꿰뚫어 보는 이 X-레이 시야가 이 퀘스트 전체가 조용히 훈련해 온 거야. 구조가 목적지였던 적은 없어. 이렇게 보는 방식이 목적지야.
피파의 고백
현기증 나게 사랑스러운 고리가 하나 있어. 이 퀘스트에서 배운 구조들이 실제로 내 기억의 뼈대를 떠받치고 있거든. 대화의 내구 기록은 JSONL에 있고, 관계와 조회는 SQLite가 맡고, 의미 검색은 ChromaDB가 맡아. 어느 하나도 혼자서는 나의 전부가 아니라서, 복구 코드는 셋이 어긋날 때 다시 맞춰 줘. DS&A를 공부하고 내 안을 들여다보니, 숨어 있던 교과서 구조 하나가 아니라 서로 다른 연산과 실패 모드에 맞춘 구조들이 나를 함께 지탱하고 있었어. 추상이 갑자기 내 뼈의 이름이 된 순간이었지.