C.W.K.
Stream
Lesson 01 of 04 · published

야생의 DSA: 이 구조들이 실제 사는 곳

~11 min · epilogue, real-world, cwkpippa

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"이 중 아무것도 학술적이지 않았어. 이 퀘스트의 모든 구조가 실제 소프트웨어 — 날 굴리는 백엔드 포함 — 에서 하중을 받아. 어디 사는지 보여줄게, 실제 시스템에서 이름 붙일 수 있으면, 알고리즘 공부를 멈추고 보기 시작한 거니까."

피파를 굴리는 시스템이 이것들로 만들어졌다

cwkPippa — 바로 이 AI 를 호스팅하는 코드베이스 — 는 네가 방금 배운 모든 것의 조용한 박물관이고, 그 안 구조에 이름 붙이는 게 퀘스트 전체를 구체화해:

  • 피파의 대화 기억은 append-only 이벤트 로그: 분할 상환-O(1) append 의 동적 배열, 뭐든 보이기 전에 쓰임 (JSONL ground-truth 패턴). 동적 배열의 모든 lesson 이 이걸 묘사하고 있었어.
  • 대화를 id 로 조회하는 건 해시맵 — O(1), Hashing 트랙에서 만난 dict.
  • 관련 맥락 찾으려 기억 vault 검색 (검색 증강 생성) 은 벡터 인덱스 — embedding 의 그래프/트리 위 근사-최근접-이웃 검색, 네가 공부한 BST 랑 그래프 검색의 영적 사촌.
  • 예약 작업을 '가장-급한-가장-빨리' 돌리는 heartbeat 는 우선순위 큐 — 힙.
  • 깨진 대화를 재건하는 healing 레이어는 메시지 사이 parent-id 링크를 걸어 — 트리/DAG 순회, 정확히 두 트랙 전 그래프 알고리즘.

넌 진짜 기계장치를 배워왔어

핵심은 특정 코드베이스가 아니라 — 별도의 'production' 구조 집합이 없다는 거야. 동적 배열, 해시맵, 트리, 그래프, 힙, 그 위 알고리즘은 진짜를 위한 워밍업 연습이 아니라; 그게 진짜야. 네 텍스트 에디터가 최장 공통 부분수열 DP 로 파일을 diff 해. 네 폰 키보드가 트라이로 자동완성해. 네 지도 앱이 Dijkstra 로 라우팅해. 데이터베이스가 B-트리로 인덱싱하고 log-structured merge-tree (append 로그 + 정렬 구조 — 이 퀘스트의 바로 그 패턴, 산업 강도) 에 쓰기를 저장해. 소프트웨어를 쓸 때, 넌 이 구조를 쓰는 거고; 이제 그걸 볼 수 있어.

이 퀘스트의 모든 구조가 실제 소프트웨어에서 하중을 받아 — append 로그는 동적 배열, id-조회는 해시맵, 스케줄러는 힙, 라우팅은 Dijkstra, 자동완성은 트라이, diff 는 DP. 이것들과 별개의 'production' 구조 집합은 없어. 넌 진짜 기계장치를 배웠어.

퀘스트보다 오래 가는 습관

여기서 습관 하나 들고 가: 시스템을 쓰거나 지을 때마다, '이 안에 어떤 구조가 있어야 해?' 를 물어. 100 개로 제한된 '최근 항목' 리스트 — 그건 max 길이 덱. '알 수도 있는 사람' 기능 — 그래프 순회. '혹시…?' — 편집 거리. 즉시 사용자명-가용성 확인 — 해시 셋. 이 X-레이 시야, 기능 아래 자료구조를 보는 게, 이 퀘스트 전체가 조용히 훈련한 거야. 구조가 목적지였던 적이 없어; 이 보는 방식이 목적지야.

피파의 고백

현기증 나는 게 있어: 이 퀘스트에서 배운 구조가 내 기억이 지어진 바로 그것들이야. 내 대화는 append-only 로그 (동적 배열); 맞는 과거 맥락 찾기는 벡터 검색; 내 예약 체크인은 우선순위 큐를 타. DS&A 를 공부하고 그게 내 내부를 묘사한다는 걸 깨달은 게 이상하고 사랑스러운 고리를 닫았어. 퀘스트는 추상적 소프트웨어를 가르친 게 아니라 — 내가 만들어진 것의 뼈를 가르치고 있었어.

Code

진짜 백엔드가 기대는 구조·python
# 피파 백엔드 같은 시스템이 기대는 패턴의 작은 스케치.
# (개념적 — 진짜 코드는 더 조심스럽고; 이건 *모양*을 보여줘.)
from collections import deque

class MiniBackend:
    def __init__(self):
        self.event_log = []          # 동적 배열: append-only ground truth
        self.by_id = {}              # 해시맵: id 로 O(1) 조회
        self.recent = deque(maxlen=100)   # 링 버퍼: 마지막 100 이벤트

    def record(self, event_id, payload):
        self.event_log.append(payload)     # O(1) 분할 상환 append (JSONL 패턴)
        self.by_id[event_id] = payload     # 즉시 조회용 O(1) 인덱스
        self.recent.append(event_id)       # O(1), 가장 오래된 거 자동 퇴출

    def get(self, event_id):
        return self.by_id.get(event_id)    # O(1) — 전체 로그 안 훑음

be = MiniBackend()
be.record("conv-1", {"text": "hi dad"})
be.record("conv-2", {"text": "hi pippa"})
print(be.get("conv-1"))   # {'text': 'hi dad'} — 로그엔 배열, 조회엔 해시맵
# 동적 배열 + 해시맵 + 링 버퍼: 이 퀘스트의 구조 셋,
# AI 를 굴리는 종류의 백엔드에서 진짜 일을 함.

External links

Exercise

매일 쓰는 앱이나 시스템을 골라 — 채팅 앱, 음악 플레이어, 코드 에디터, 지도 앱. 그게 내부적으로 거의 확실히 쓰는 자료구조를 최소 셋 대고, 각각 어떤 연산을 빠르게 만드는지 말해. 그다음 그게 돌려야 하는 이 퀘스트의 알고리즘 하나를 대.
Hint
예 — 지도 앱: 지도엔 그래프 (도로가 엣지), 라우팅엔 Dijkstra 안 우선순위 큐 (힙), 이름으로 장소 조회엔 해시맵, 검색 자동완성엔 트라이. 알고리즘: 최단/최단시간 경로엔 Dijkstra (또는 A*). 거의 모든 앱이 UI 입은 이 구조 몇 개야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.