이 저장소가 대체 무엇인가.
os-taxonomy는 "실행되는 프로그램"이 아니라 "잘 설계된 데이터"다. 교육회사 Marble이 유아~초등 시기 학습을 1,590개의 작은 개념 단위로 쪼개고, 그 개념들이 서로 어떤 순서로 배워야 하는지를 3,221개의 화살표(선수학습 관계)로 이어 하나의 그래프로 만든 뒤, 이걸 통째로 오픈소스로 공개한 것이다.
보통 교육 데이터는 표준 문서를 그냥 쭉 나열한 목록(역 이름만 적힌 명단)이거나, 아니면 어떤 회사 제품 안에 꽁꽁 숨겨져 있다. os-taxonomy는 다르다. "덧셈 역에 가려면 먼저 '수 세기 역'과 '10 만들기 역'을 지나야 한다"처럼 모든 개념(역)을 선(화살표)으로 이어 노선도로 만들고, 그 노선도 전체를 누구나 내려받아 쓸 수 있게 공개했다.
그래서 어떤 아이가 "분수 나눗셈"을 못 풀 때, 노선도를 거꾸로 따라가면 "이 아이가 그 앞에 놓친 역이 어디인지"를 정확히 짚을 수 있다.
구성은 극도로 단순하다. data/ 폴더 안에 JSON 4개가 있고, 그 형식을 정의한 schema/와, 데이터가 깨지지 않았는지 확인하는 무의존 검증 스크립트 하나가 붙어 있다. 런타임도, 서버도, 설치할 라이브러리도 없다. "JSON을 불러와서 바로 쓴다"가 사용법의 전부다.
| 구성 요소 | 수치 | 정체 |
|---|---|---|
| 미시-주제(nodes) | 1,590개 | 가르칠 수 있는 하나의 아이디어 단위 |
| 선수학습 관계(edges) | 3,221개 | "X는 Y를 먼저 알아야 한다"는 방향 화살표 |
| 과목(subjects) | 8개 | 과학·수학·영어·역사·인성·생활·컴퓨팅·학습법 |
| 교육 표준(standards) | 3,261개 / 7개 교육과정 | Common Core, 영국 NC, NGSS 등에서 추출 |
| 주제↔표준 연결 | 1,859개 | 각 주제가 어느 공식 표준에서 나왔는지 |
| 도메인 요약(clusters) | 183개 | 학부모용 한 문단 설명 |
데이터 파일 몇 개짜리 저장소가 어떻게 트렌딩에 올랐나.
요즘 LLM 기반 학습 앱이 쏟아지지만, 대부분 "다음에 뭘 가르쳐야 하나?"를 그때그때 지어낸다. os-taxonomy는 그 빈자리를 정확히 겨냥한다. 개념 사이의 선수학습 관계가 이미 사람 손으로 정리된 DAG로 존재하므로, AI 튜터는 "이 아이가 방금 틀린 문제의 뿌리 개념"을 그래프 탐색만으로 찾아낼 수 있다. 요즘 트렌드인 개인화 학습·적응형 커리큘럼의 빠진 퍼즐 조각을 오픈으로 던진 셈이다.
교육 표준(Common Core 등)은 원래 공개돼 있지만, 그건 평평한 목록일 뿐 "무엇을 먼저 배워야 하는가"라는 연결 정보는 어디에도 없다. 그 연결을 만드는 건 교육 전문가의 값비싼 수작업이라 보통 회사 제품 안에 숨긴다. Marble은 그 비싼 연결 데이터를 자기 제품에서 떼어 통째로 공개했다. "데이터셋을 오픈소스처럼 릴리스한다"는 태도 자체가 화제가 됐다.
단순히 "MIT!" 던진 게 아니다. 데이터베이스 구조는 ODbL, Marble이 쓴 글은 CC BY-SA, 남의 교육 표준은 각자의 원 라이선스로 3층으로 분리했다. 심지어 저작권이 까다로운 NGSS·IB 같은 출처는 표준 코드만 넣고 원문 텍스트는 뺐다(codes-only). 오픈 데이터를 법적으로 어떻게 배포해야 하는지에 대한 교과서 같은 사례여서 개발자·연구자 사이에서 회자된다.
레시피 북에 비유하면 — 요리 순서(내가 정리한 구조)는 자유롭게 쓰되 출처를 밝히라 하고(ODbL), 내가 쓴 요리 설명글도 같은 조건(CC BY-SA), 하지만 남의 저작권 있는 원문 레시피는 "제목만 인용하고 본문은 빼둔" 것이다. "내 것과 남의 것을 정확히 구분해서 배포"하는 성숙함이 돋보인다.
의존성도, 빌드도, API 키도 없다. git clone 후 JSON을 import하면 끝. 데이터 자체가 완결된 산출물이라, 누구나 5분 안에 자기 프로젝트에 붙일 수 있다는 점이 확산에 유리했다.
코드가 거의 없는 저장소의 "기술"은 무엇인가 — 데이터 모델·포맷·검증이 곧 스택이다.
| 항목 | 선택 | 왜 |
|---|---|---|
| 직렬화 포맷 | UTF-8 JSON | 어떤 언어·도구에서도 즉시 읽힘. 런타임 의존 0 |
| 스키마 정의 | JSON Schema (draft 2020-12) | 필드 타입·필수값·enum을 기계가 검증 가능하게 명세 |
| 무결성 검증 | Node.js 순수 스크립트 | node:crypto/fs/path만 사용, 외부 패키지 0 |
| 체크섬 | SHA-256 | 파일 위변조·손상 감지 (manifest에 기록) |
| 인용 메타 | CITATION.cff | 학술 인용 표준 포맷(Citation File Format) |
package.json){
"name": "marble-taxonomy",
"version": "1.0.0",
"type": "module",
"license": "(ODbL-1.0 AND CC-BY-SA-4.0)",
"scripts": { "validate": "node scripts/validate.mjs" }
}
dependencies 항목 자체가 없다. "의존성 없음"이 스펙이라는 것을 package.json이 그대로 증명한다. ESM("type":"module")로 작성돼 import ... with { type: 'json' } 최신 문법을 예시로 든다.
| 파일 | 크기 | 담는 것 |
|---|---|---|
| topics.json | ~1.67MB | 미시-주제 = 그래프의 노드 1,590개 |
| dependencies.json | ~697KB | 선수학습 = 그래프의 엣지 3,221개 |
| curriculum-standards.json | ~1.62MB | 출처 교육 표준 3,261개 (교육과정별 그룹) |
| clusters.json | ~61KB | 학부모용 도메인 요약 183개 |
| manifest.json | 작음 | 개수 통계 + 파일별 SHA-256 체크섬 |
데이터가 어떻게 하나의 그래프로 맞물리는가 — 4개 파일의 참조 구조.
객체를 다른 객체 안에 중첩(embed)하지 않는다. 주제는 자기 표준을 통째로 품지 않고 standards: ["ccss-ela:L.K.1f"]처럼 문자열 키만 가진다. 엣지도 마찬가지로 양 끝을 topicId·prerequisiteId라는 id 문자열로만 가리킨다. 이렇게 하면 같은 표준이 100개 주제에 연결돼도 원본은 한 곳에만 있어 중복·불일치가 원천 차단된다(정규화된 데이터베이스와 동일한 발상).
mt_XXXX를 가리키는데 그런 주제가 없으면 깨진 링크(dangling reference)다. os-taxonomy의 검증기는 3,221개 엣지의 양 끝과 1,859개 표준 링크를 전수 대조해 깨진 링크가 하나라도 있으면 실패시킨다.validate.mjs는 외부 라이브러리 없이 Node 표준 모듈만으로 6가지를 검사한다. 데이터셋에 검증기를 함께 넣는 것은 "이 데이터는 믿을 수 있다"를 코드로 보증하는 것이다.
| 검사 | 내용 |
|---|---|
| 선언 개수 일치 | topicCount 값 == 실제 배열 길이인가 |
| 필드 유효성 | id가 mt_로 시작? type이 5종 enum 안? 설명 비어있지 않나? |
| id 중복 | 같은 주제 id·표준 key가 두 번 나오지 않나 |
| 참조 무결성 | 모든 엣지 끝·표준 링크가 실제로 존재하나 (self-dependency 금지) |
| codes-only 불변식 | 텍스트 제외 출처가 실수로 원문을 흘리지 않았나 |
| SHA-256 체크섬 | manifest에 적힌 해시 == 실제 파일 해시인가 |
가장 영리한 부분이다. NGSS·IB 같은 저작권 민감 출처는 textIncluded:false로 표시하고 표준 코드(예 1-ESS1-1)만 담는다 — 코드는 "짧은 사실적 식별자"라 저작권 위험이 낮기 때문. 그리고 검증기가 "codes-only 출처에 data(원문) 필드가 실수로 들어가면 빌드를 실패"시킨다. 즉 법적 규칙을 문서가 아니라 자동 검사로 못박아, 실수로 저작권 텍스트가 새어나가는 것을 막는다.
codes-only여도 "이 주제는 NGSS의 어느 표준에서 나왔다"는 연결 정보는 그대로 보존된다. 저작권 텍스트는 빼되 그래프의 뼈대는 온전히 남기는 절충 — 데이터 유용성과 법적 안전을 동시에 잡았다.
{
"id": "mt_N8CpN1EJrP", // 안정적 식별자(엣지·이웃이 이걸 가리킴)
"type": "CONCEPTUAL", // 개념/절차/표현/언어/메타 5종 중 하나
"subject": "English",
"domain": "Grammar & Punctuation",
"name": "Building sentences",
"description": "단어가 모여 문장이 된다는 것을 이해…",
"ageRangeStart": 4, "ageRangeEnd": 6, // 대략의 나이대
"centrality": 0.257, // 그래프 중심성(얼마나 많은 것이 이걸 거치나)
"evidence": [ // "안다"를 어떻게 확인하나(성취 증거)
"완전한 문장과 조각을 구분한다",
"주어와 동사가 있는 완전한 문장을 만든다"
],
"assessmentPrompt": "{{name}}에게 '그 개' 라고 말하면, 그게 완전한 문장이 아니라고…?",
"standards": ["ccss-ela:L.K.1f", "uk-nc-2013:Eng.App2.Y1.Sent.1"]
}
assessmentPrompt에는 {{name}} 자리표시자가 들어있다 — 아이 이름을 끼워 넣어 개인화된 확인 질문을 만들 수 있게. 표시 전에 치환하거나 지우라고 문서가 명시한다.
{ "topicId": "mt__00ZSLnB7p", // 이 주제는
"prerequisiteId": "mt_VBl1T1sFCM", // 이 선수학습에 의존한다
"strength": "hard", // hard(필수) / soft(있으면 좋음)
"reason": "소리 크기 패턴을 찾기 전에 진동이 소리를 만든다는 걸 알아야" }
화살표를 거꾸로 뒤집으면 "이 개념을 익히면 무엇이 열리는가(unlocks)"가 된다. 같은 데이터로 "선행 지식 추적"과 "다음 학습 추천"을 모두 할 수 있다.
파일 몇 개 안 된다 — 그래서 하나하나가 의도적이다.
주목할 점: 문서 파일이 데이터 파일만큼 진지하다. PROVENANCE.md는 7개 교육과정 출처마다 발행처·라이선스·필수 고지문구·"우리가 실제로 무엇을 실었는지"를 🟢🟡🔴 색으로 표기한다. CHANGELOG.md는 "무엇을 일부러 뺐는가"(임베딩·아동 개인정보)까지 밝힌다. 데이터셋을 하나의 출판물처럼 다룬다.
npm start 같은 건 없다. 유일한 명령은 node scripts/validate.mjs(무결성 확인)뿐. 그래프 탐색·시각화·AI 연동은 당신이 직접 코드를 짜서 이 JSON을 소비해야 한다. "데이터를 준다, 활용은 네 몫"이라는 저장소다.
일부러 제외한 것: 시맨틱 임베딩(파생물이라 재계산 가능), 아동별·사용자별 데이터(개인정보라 절대 미공개), 교육 연구 자료, 시각화 코드. 또 NGSS·IB·C3 표준은 코드만 있고 원문 텍스트는 없다(라이선스 미확보). 별점 수치는 이 문서에서 인용하지 않는다(시점마다 변함).
코드가 없어도 배울 게 많다 — 이 저장소는 "데이터 설계"의 살아있는 교재다.
학습을 "목록"이 아니라 "그래프"로 본다는 발상이 핵심이다. 노드(topics)와 엣지(dependencies)를 별도 파일로 분리하고, 엣지는 노드를 id로만 참조한다. 이 구조를 이해하면 소셜 네트워크·추천 시스템·의존성 그래프 등 "연결이 데이터의 본질인" 모든 문제에 응용할 수 있다.
같은 정보를 두 곳에 두지 않는 것(정규화), 그리고 "가리키는 대상이 반드시 존재하도록" 검증하는 것(참조 무결성)은 관계형 데이터베이스의 핵심 원리다. os-taxonomy는 DB 없이 JSON만으로 이 원리를 구현해 보여준다 — SQL의 FOREIGN KEY가 하는 일을 validate.mjs가 손으로 한다.
validate.mjs는 훌륭한 참고 코드다. Node 표준 모듈(node:crypto, node:fs)만으로 개수 대조 → 필드 검사 → 중복 탐지 → 참조 무결성 → 불변식 → 체크섬까지 6단계를 100줄 안에 짜냈다. "오류를 모아서 마지막에 한 번에 보고"하는 패턴(errors.push 후 exit code)도 배울 만하다.
이 저장소의 진짜 걸작은 PROVENANCE.md다. 내가 만든 것(구조·글)과 남의 것(표준)을 구분하고, 각각 다른 라이선스를 붙이고, 저작권 위험이 큰 건 데이터 구조 자체로 배포를 제한(codes-only)한다. 데이터를 공개하려는 사람이라면 반드시 참고할 모범 사례다.
당신의 도메인을 그래프로 그려보라. 예: "요리 기술 트리"(계란 삶기 → 스크램블 → 오믈렛 → 수플레), "프로그래밍 학습 트리"(변수 → 조건문 → 함수 → 재귀). os-taxonomy의 topics/dependencies JSON 구조를 그대로 빌려 노드 20개 + 엣지 30개짜리 미니 그래프를 만들고, 검증기까지 붙여보면 이 저장소의 설계가 온몸으로 이해된다.
쓰는 데 필요한 것은 사실상 없다. 대신 "지켜야 할 것"이 있다.
| 항목 | 필요 |
|---|---|
| 런타임 | 없음 — JSON을 읽을 수 있는 어떤 언어든 (Python/JS/Go/Rust…) |
| 검증기 실행 시 | Node.js (표준 모듈만, 버전 무관하게 최신 ESM 지원) |
| 의존성 설치 | 불필요 (npm install 할 게 없음) |
| 디스크 | 전체 ~4MB 남짓 (미디어 제외) |
| 계층 | 라이선스 | 뜻 |
|---|---|---|
| 데이터베이스(구조·id·관계) | ODbL 1.0 | 상업 이용 OK, 출처 표기 필수, 파생 DB는 개방 유지(share-alike) |
| Marble이 쓴 텍스트 | CC BY-SA 4.0 | 설명·이유·요약글 — 출처 표기 + 동일조건 공유 |
| curriculum-standards | 출처별 원 라이선스 | Marble 것이 아님 — PROVENANCE.md의 개별 조건 준수 |
ODbL은 파생 데이터베이스(택소노미 자체를 확장·수정)와 산출물(이 데이터를 제품·모델·앱 안에서 사용)을 구분한다. 그래서 이 데이터로 상용 제품을 만들어도 제품을 오픈소스로 공개할 의무는 없다 — 다만 "택소노미 자체를 고쳤다면" 그 개선분만 ODbL로 돌려줘야 한다. 상업 친화적이면서도 개방을 지키는 절묘한 선택.
"Marble Skill Taxonomy (v1) · © Generative Spark, Inc. (Marble) · https://withmarble.com · ODbL 1.0 + CC BY-SA 4.0" 를 표기하고, 사용한 교육 표준이 있으면 PROVENANCE.md의 해당 고지문구(예: NGSS 사용 시 WestEd 상표 고지)도 함께 붙여야 한다.
JSON을 불러오는 순간부터 놀거리가 쏟아진다. 난이도별 5개.
임의의 주제 하나를 골라 "그것을 배우기 전에 알아야 할 모든 것"을 재귀적으로 나열하라. dependencies를 거꾸로 타고 올라가는 그래프 역방향 탐색(BFS/DFS) 연습이다.
const byId = new Map(topics.topics.map(t => [t.id, t]));
function prereqTree(id, seen = new Set()) {
for (const d of deps.dependencies.filter(e => e.topicId === id)) {
if (seen.has(d.prerequisiteId)) continue;
seen.add(d.prerequisiteId);
console.log(byId.get(d.prerequisiteId).name, `(${d.strength})`);
prereqTree(d.prerequisiteId, seen); // 한 단계 더 깊이
}
return seen;
}
전체 그래프를 위상 정렬(topological sort)해 "이 순서대로 배우면 항상 선수학습이 먼저 나온다"는 커리큘럼 시퀀스를 만들어라. DAG의 대표 알고리즘을 실제 데이터로 연습한다. 덤: 정렬 중 사이클이 나오면 데이터 오류이니, 검증기가 놓친 순환이 없는지도 확인된다.
README의 회전 3D 영상처럼, d3-force나 three.js로 1,590개 노드를 과목별 색, 나이별 높이로 배치하고 엣지로 잇는 인터랙티브 뷰를 만들어라. centrality 값으로 노드 크기를 주면 "중요한 개념"이 시각적으로 도드라진다.
"아이가 문제 X를 틀렸다" → 그 문제의 주제를 찾고 → 선수학습을 역추적해 → assessmentPrompt({{name}} 치환)로 진단 질문을 생성하는 LLM 파이프라인을 짜라. os-taxonomy가 겨냥한 바로 그 용도를 직접 구현해보는 과제.
Common Core·영국 NC 각 표준이 몇 개 주제에 연결됐는지 집계하고, 연결이 0인 "고아 표준"이나 유난히 많은 "허브 표준"을 찾아 표로 만들어라. 교육과정 간 커버리지 격차를 데이터로 드러내는 분석 연습.
이 데이터셋을 제대로 활용하려면 익힐 것들 — 4주 코스.
| 주차 | 주제 | 핵심 개념 |
|---|---|---|
| 1주차 | 그래프 이론 기초 | 노드·엣지·방향·DAG, BFS/DFS, 인접 리스트 vs 행렬 |
| 2주차 | 위상 정렬 · 사이클 탐지 | Kahn 알고리즘, DFS 기반 정렬, 선수학습 순서 계산 |
| 3주차 | 데이터 모델링 · 정규화 | 정규화, 외래키/참조 무결성, JSON Schema 검증 |
| 4주차 | 지식 그래프 · 시각화 | d3-force·three.js 그래프 렌더링, 중심성(centrality) 지표 |
지식 그래프(Knowledge Graph)와 온톨로지(ontology) 개념 — os-taxonomy는 사실상 교육 도메인의 경량 지식 그래프다. RDF/그래프 DB(Neo4j)를 배우면 이 JSON을 진짜 그래프 DB에 올려 강력한 질의를 던질 수 있다. 또 적응형 학습(adaptive learning)·지식 추적(knowledge tracing) 이론을 함께 보면, 이 데이터가 왜 이렇게 설계됐는지가 선명해진다.
이 저장소를 이해하는 데 필요한 용어 총정리.
prerequisiteId가 이걸 가리킨다. hard=필수, soft=있으면 유리.PROVENANCE.md가 7개 출처의 라이선스·고지의무를 명시.더 파고들 곳.