CS 면접 노트를 지식 그래프로 만들어 학습 순서 정하기
허브 개념과 커뮤니티, 원문에 없던 연결까지 드러내기
문서가 여덟 페이지로 늘자 어느 개념이 어디에 붙는지 안 보였다. 문서를 그래프로 바꿔 연결이 가장 많은 허브 개념과 함께 공부해야 할 묶음, 원문에 없던 연결까지 드러낸 기록.
CS 면접 준비 문서가 여덟 페이지까지 늘어나자, 정작 필요한 순간에 어느 개념이 어느 개념과 붙어 있는지를 못 찾겠다는 문제가 생겼다. 문서는 페이지 단위로 끊겨 있는데 면접 질문은 개념을 가로질러 들어오기 때문이다. 이 글에서는 그 문서들을 지식 그래프로 바꿔 연결 구조를 눈으로 본 과정을 이야기하려 한다 — 구축 파이프라인이 앞이고, 그래프가 실제로 드러낸 것(허브 개념, 학습 단위 커뮤니티, 원문에 없던 연결)이 뒤다.
왜 그래프인가 — 문제의식
기존에 CS 면접 준비를 Notion에 페이지별로 정리해 왔는데 다음 문제가 있었다.
- 교차 연결이 안 보임:
virtual 소멸자는 virtual destructor 페이지에도, new vs malloc에도, vtable에도 등장하는데 각자 섬처럼 존재 - 우선순위가 주관적: 어떤 개념이 실제로 “허브”인지는 체감으로만 추측
- 꼬리질문 대비 약함: 면접에서 “그럼 vtable은?” “그럼 RTTI는?”으로 이어질 때 경로가 머릿속에 없음
- 매번 전문을 다시 뒤져야 함: 참조할 때마다 원본 md 전체를 훑어야 해 비효율
→ 관계를 그래프로 바꾸면 이 문제들이 전부 해결된다.
graphify 파이프라인
설치 & 연동
1
2
py -m pip install graphifyy
py -m graphify install # 프로젝트 규칙 파일 + PreToolUse 훅 자동 세팅
스킬 정의를 배치하고, 프로젝트 설정(JSON)에 검색 훅을 등록.
Notion → 로컬 덤프
Notion 연동으로 CS 면접 준비 루트 + 7개 서브페이지를 한 번에 가져와 로컬 마크다운으로 저장.
1
2
3
4
5
6
7
8
9
cs-notion/
├── 00_index.md (루트 + 꼬리질문 Q&A)
├── 01_runtime.md (런타임/컴파일타임, RTTI, 힙/스택)
├── 02_class_vs_struct.md
├── 03_new_vs_malloc.md
├── 04_oop.md (OOP 4원칙 + SOLID)
├── 05_vtable.md (vtable/vptr 메모리 레이아웃)
├── 06_virtual_destructor.md
└── 07_pointer_reference.md (포인터 vs 레퍼런스 + UE5 TObjectPtr)
graphify 실행 — 7단계
| STEP | 단계 | 내용 |
|---|---|---|
| 1 | detect | 파일 스캔 (8 docs · 9,637 words · 이미지/코드 0) |
| 2 | AST 추출 | 코드 없음 → 스킵 |
| 3 | 시맨틱 추출 | 8개 md를 일괄 처리해 JSON 청크 생성 |
| 4 | 병합 | AST(빈 것) + 시맨틱 → .graphify_extract.json |
| 5 | 빌드 · 클러스터 · 분석 | networkx 그래프, Louvain 커뮤니티 탐지(연결이 촘촘한 노드끼리 자동으로 묶는 알고리즘), god 노드 계산 |
| 6 | 커뮤니티 라벨링 | 13개 커뮤니티에 직접 이름 부여 |
| 7 | HTML 시각화 | graph.html 생성 |
산출물
| 파일 | 용도 |
|---|---|
graphify-out/GRAPH_REPORT.md | 사람이 읽는 리포트 (god 노드, 서프라이즈, 커뮤니티) |
graphify-out/graph.json | GraphRAG 쿼리용 JSON (BFS/DFS 경로 탐색) |
graphify-out/graph.html | 브라우저로 여는 대화형 시각화 |
그래프가 밝혀낸 연결 구조
숫자
- 102 노드 · 126 엣지 · 3 하이퍼엣지
- 92% EXTRACTED (원문 명시) / 8% INFERRED (합리적 추론) / 0% AMBIGUOUS
- 13개 커뮤니티로 자동 분할
전체 그래프 시각화
13개 커뮤니티가 색상으로 구분되어 있고, 노드 크기는 연결도(엣지 수)에 비례. 중앙 빨간색 허브가 virtual 소멸자(god 노드 1위, 15개 엣지).
중심부 상세 — god 노드 클러스터
virtual 소멸자를 중심으로 vtable, RTTI (Runtime Type Information), dynamic_cast, typeid, 다형성 이 방사형으로 연결. Community 2 (Runtime Typing & Virtual Destructor) 와 Community 1 (Virtual Dispatch & vtable) 이 교차하는 핵심 지점.
god 노드 TOP 10
연결도 = 해당 노드에 연결된 엣지 수. 숫자가 클수록 그래프의 허브.
| 순위 | 개념 | 엣지 수 |
|---|---|---|
| 1 | virtual 소멸자 | 15 |
| 2 | vtable (가상 함수 테이블) | 12 |
| 3 | CS 면접준비 인덱스 | 7 |
| 4 | Unreal 가비지 컬렉터 (GC) | 7 |
| 5 | class vs struct 차이 | 6 |
| 6 | new vs malloc 차이 | 6 |
| 7 | 다형성 (Polymorphism) | 6 |
| 8 | RTTI | 5 |
| 9 | 동적 디스패치 | 5 |
| 10 | Undefined Behavior (UB) | 5 |
→ 면접 빈출 포인트가 그래프 구조로 증명됨. virtual 소멸자 하나가 전체의 허브.
13개 커뮤니티 — 학습 단위
응집도(cohesion) 점수로 각 묶음의 탄탄함을 정량화.
| # | 이름 | 노드 수 | 응집도 |
|---|---|---|---|
| 0 | OOP & Class Design | 19 | 0.12 |
| 1 | Virtual Dispatch & vtable | 14 | 0.18 |
| 2 | Runtime Typing & Virtual Destructor | 14 | 0.18 |
| 3 | Unreal GC & TObjectPtr | 11 | 0.22 |
| 4 | new Expression & Allocation | 10 | 0.22 |
| 5 | Smart Pointers & RAII | 9 | 0.31 (최고) |
| 6 | References & Runtime Errors | 7 | — |
| 7 | C-Style Allocation & POD | 6 | — |
| 8 | SOLID Principles | 6 | — |
| 9 | Empty Base Optimization | 2 | — |
| 10 | Class & Object Basics | 2 | — |
| 11 | Void Type | 1 | — |
| 12 | Pointer Size | 1 | — |
Smart Pointers & RAII 커뮤니티가 가장 탄탄, OOP는 넓지만 느슨 (개념이 방대해서 서로 약한 연결).
서프라이즈 엣지 — 원문에 명시 안 된 연결
graphify가 파일 경계를 넘어 발견한 관계. 면접 꼬리질문 경로와 겹침.
new 표현식→힙 vs 스택 메모리(03번 파일 → 01번 파일)UObject operator new 오버로딩→Unreal GC(03 → 01)override 키워드→virtual 소멸자(03 → 06)다형성→virtual 소멸자(04 → 06)캡슐화 (Encapsulation)↔캡슐화 원칙— 2개 파일에서 거의 같은 개념 사용 중
→ 복습 시 이 경로를 따라가면 자연스럽게 꼬리질문까지 커버 가능.
하이퍼엣지 — 3개 이상 집합 관계
일반 엣지로는 표현 못 하는 “같이 쓰이는 3~4개 개념 묶음”.
| 이름 | 구성 | 신뢰도 |
|---|---|---|
| 동적 디스패치 3요소 | virtual + vtable + vptr + dynamic_dispatch | 0.95 |
| OOP 4대 원칙 | encapsulation + inheritance + polymorphism + abstraction | 1.00 |
| 스마트 포인터 3종 + 순환참조 | unique_ptr + shared_ptr + weak_ptr + circular_ref | 0.95 |
검색 훅 연동 — 참조 접근을 빠르게
PreToolUse 훅
프로젝트 설정(JSON)에 추가된 훅.
1
2
3
4
5
6
7
8
9
10
11
{
"hooks": {
"PreToolUse": [{
"matcher": "Glob|Grep",
"hooks": [{
"type": "command",
"command": "[ -f graphify-out/graph.json ] && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"additionalContext\":\"graphify: Knowledge graph exists. Read graphify-out/GRAPH_REPORT.md for god nodes and community structure before searching raw files.\"}}' || true"
}]
}]
}
}
동작: Glob/Grep으로 파일 검색을 시도하면 훅이 자동으로 “먼저 GRAPH_REPORT.md 읽어라”는 힌트를 주입. 원본 md 전수조사 대신 그래프 구조로 네비게이션.
쿼리 명령 — 면접 연습용
1
2
3
4
5
6
7
8
# BFS로 관련 개념 모아 답변 초안 생성
py -m graphify query "virtual 소멸자가 왜 필요한가"
# 두 개념 사이 최단 경로 (답변 스크립트 골격)
py -m graphify path "virtual 소멸자" "vtable"
# 이웃 노드 포함 자연어 설명
py -m graphify explain "RTTI"
정리 — 그래프에서 얻은 것
그래프는 “검색”을 “탐색”으로 바꾼다 — 파일을 뒤지는 대신 god 노드에서 BFS(너비 우선 탐색)로 관련 개념 수집
community detection은 무료 TOC 생성기 — 13개 커뮤니티가 곧 13개 면접 챕터가 됨
92% EXTRACTED는 신뢰 지표 — 자동 추출이 지어낸 관계가 아니라 원문에 명시된 관계 비중이 높아야 실전 답변에 사용 가능
PreToolUse 훅은 “규칙을 시스템에 새긴다” — 내가 매번 “먼저 리포트 읽어”라고 지시할 필요 없이 자동 주입
서프라이즈 엣지 = 꼬리질문 사전 — 원문이 직접 링크하지 않은 연결은 면접관이 “그러면 X는?”으로 파고드는 지점과 일치
하이퍼엣지로 “세트 암기” — 동적 디스패치 3요소, OOP 4원칙처럼 묶음으로 기억해야 할 개념은 그룹으로 보존
Notion 마스터 + 로컬 그래프 분리 — 편집은 Notion, 분석/쿼리는 로컬 (서로 역할이 다르므로 git은 둘 다 추적 안 함)
응집도 점수로 학습 강도 조절 — 응집도 낮은 커뮤니티(OOP 0.12)는 개념이 넓으므로 시간을 더 투입, 높은 곳(Smart Pointers 0.31)은 짧게 훑어도 OK
핵심 요약 — 페이지 단위로 흩어져 있던 CS 면접 노트를 지식 그래프로 바꾸면, 어떤 개념이 실제 허브인지(virtual 소멸자, vtable)와 파일 경계를 넘는 숨은 연결(서프라이즈 엣지)이 수치로 드러난다. 학습 우선순위를 감이 아니라 연결도로 정할 수 있게 됐다.

