Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions content/education/curriculum/design-principles.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@

<Placeholder>핵심 개념을 반복하며 심화하는 구조</Placeholder>

{/* PROMOTED FROM: react-payments-555prs-analysis (2026-05-26) */}
### 정량 증거: 페이먼츠 5년 누적

[React 페이먼츠 미션 5년치 PR 555개 분석](/education/logs/react-payments-555prs-analysis)에서 같은 미션 저장소가 5년 동안 form/state/component라는 영구 핵심을 유지한 채 매년 새 학습 목표(2025 testing/error-handling, 2026 async/MSW)를 한 층씩 누적한 패턴이 데이터로 확인됐다. 나선형 커리큘럼이 단순한 반복 강화가 아니라 **영구 골격 + 누적 추상화**의 이중 구조임을 시사한다.

→ 관련 패턴: [디자인 패턴 9 - 누적 학습 미션 설계](/education/design-patterns/catalog#패턴-9-누적-학습-미션-설계)
→ 관련 인사이트: [미션은 누적 학습 모델이다](/education/insights/mission-learning-accumulation)
{/* END PROMOTED */}

## 실전 중심 구성

<Placeholder>미션과 프로젝트 중심의 학습 경험</Placeholder>
29 changes: 29 additions & 0 deletions content/education/design-patterns/catalog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,32 @@
→ 근거 패턴: [인사이트 > 점진적 스캐폴딩](/education/insights/progressive-scaffolding)

</Toggle>

{/* PROMOTED FROM: react-payments-555prs-analysis (2026-05-26) */}
## 패턴 9. 누적 학습 미션 설계

> 한 미션 저장소를 매년 새로 만드는 게 아니라, 변하지 않는 골격 위에 매년 새 학습 목표를 한 층씩 누적해 5~6년 단위로 누적 학습 자산을 만든다.

**맥락** — 같은 이름의 미션을 매년 운영하면서 학습 목표를 진화시켜야 하는 상황. 매년 저장소를 새로 만들면 데이터가 단절되고, 그대로 두면 학습 깊이가 정체된다.

<Toggle title="해결책 · 사례 · 변형">

**해결책**

영구 골격(form/state/component처럼 모든 기수에서 다뤄지는 핵심)과 누적 층(매년 한 단계씩 추상화돼 추가되는 새 목표)을 분리해 설계한다. 미션 재설계 결정은 5년치 PR 데이터로 카테고리×연도 매트릭스를 만들어 데이터 기반으로 한다.

**사례**

- [React 페이먼츠 미션 5년치 PR 555개 데이터 분석](/education/logs/react-payments-555prs-analysis) — form/state/component 4개 영구 골격 위에 2025 testing/error-handling, 2026 async/MSW가 누적된 패턴
- [자바 @MVC 미션](/education-experiment/repositories/java-mvc) — Controller 일관성 → Handler 추상화 → JsonView로 단계 누적
- [자바 로또 미션](/education-experiment/repositories/java-lotto) — 구현 1단계 → 리팩토링 2단계 구조 자체가 누적 학습 설계

**변형**

매년 폐지된 단계가 영구 폐지인지 일시 보류인지를 데이터로 재평가한다. 페이먼츠 3단계는 2024–2025 폐지 후 2026 부활. 폐지된 단계의 학습 목표가 다른 미션으로 이전 가능한지를 본문 데이터에서 검증하면 폐지 결정의 정확도가 올라간다.

→ 근거 패턴: [인사이트 > 미션은 누적 학습 모델이다](/education/insights/mission-learning-accumulation)
→ 분석 도구: [도구 > 미션 저장소 PR 데이터 분석 워크플로우](/education/tools/mission-repo-analysis-workflow)

</Toggle>
{/* END PROMOTED */}
1 change: 1 addition & 0 deletions content/education/insights/_meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export default {
'self-diagnostic-framework': '자기 진단 프레임워크',
'progressive-scaffolding': '점진적 스캐폴딩',
'argumentation-based-learning': '논증 기반 학습 설계',
'mission-learning-accumulation': '미션은 누적 학습 모델이다',
'lecture-design': {
title: '강의 설계',
display: 'hidden'
Expand Down
13 changes: 13 additions & 0 deletions content/education/insights/argumentation-based-learning.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,16 @@

- [POE 발견 학습](/education/insights/poe-discovery-learning) — 예측→관찰→설명 구조는 이 패턴의 선행 형식
- [점진적 스캐폴딩](/education/insights/progressive-scaffolding) — 논증 수준을 회차별로 높여가는 설계와 결합 가능
- [미션은 누적 학습 모델이다](/education/insights/mission-learning-accumulation) — 같은 미션 저장소에서 매년 논증 깊이가 누적되는 구조

{/* PROMOTED FROM: react-payments-555prs-analysis (2026-05-26) — quantitative evidence marker */}
## 부록: 정량 증거 (페이먼츠 555 PR 분석)

[React 페이먼츠 미션 5년치 PR 555개 데이터 분석](/education/logs/react-payments-555prs-analysis)에서 이 패턴의 정량 증거가 확인됐다.

- **인간 리뷰 코멘트 2,178건**의 테마 분류 결과: **질문 형식 35.2% + "왜?" 형태 의도 묻기 16.0% = 51.2%가 답이 아닌 질문**.
- 같은 데이터에서 긍정 피드백 36.8%, 제안 형식 22.8%. 부정 지적이 아니라 **질문·발견·격려**가 리뷰의 주된 형태.
- 코치 사례: [PR #390 — 365kim](https://github.com/woowacourse/react-payments/pull/390)은 답 대신 공식 문서 한 줄("⭐️추천⭐️: https://react.dev/learn/you-might-not-need-an-effect")을 추천. [PR #213 — 포코](https://github.com/woowacourse/react-payments/pull/213)는 "왜 주소창에서 입력하면 진입이 안되고 화면단에서 클릭해서 넘어가면 이동이 될까? 요 포인트를 100% 이해하시고 넘어가시면 되는 부분입니다"라고 정답을 주지 않고 질문으로 마무리.

본 패턴이 한 사례·한 기수의 관찰이 아니라 **5년·2,178건의 코멘트로 정량 검증된 우테코 리뷰 문화의 핵심 특성**임을 보여준다.
{/* END PROMOTED */}
55 changes: 55 additions & 0 deletions content/education/insights/mission-learning-accumulation.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# 미션은 누적 학습 모델이다

<Callout>
**핵심 발견**: 우테코의 같은 미션 저장소는 매년 다른 사람이 같은 문제를 푸는 곳이 아니라, **영구 핵심 골격 위에 매년 새로운 학습 목표가 누적되는 구조물**이다. 같은 이름의 미션이라도 5년 전후로 학습 단위가 한 단계씩 추상화된다.
</Callout>

## 패턴 요약

우테코 미션 저장소는 단순 반복이 아니다. **변하지 않는 골격**(예: 페이먼츠 미션의 form/state/component)과 **매년 누적되는 새 학습 목표**(예: 2025 testing/error-handling, 2026 async/MSW)로 구성된 이중 층이다. 변하지 않는 층이 학습의 토대를 일정하게 유지하고, 누적되는 층이 학습의 깊이를 매년 한 단계씩 끌어올린다.

이는 미션 설계자가 "올해는 무엇을 새로 가르칠까"를 고민하기 전에, **"기존 골격 위에 무엇을 더 쌓을까"** 부터 고민해야 함을 시사한다.

## 근거 실험

<CardGrid columns={2}>
<Card title="React 페이먼츠 미션 5년치 분석" href="/education/logs/react-payments-555prs-analysis">
2021–2026 555개 PR. form/state/component 4개 카테고리가 5년 내내 60% 이상 유지(영구 골격). 2025 error-handling 11%→100%, 2026 async 1%→99%·msw 6%→99%·controlled-uncontrolled 14%→96%로 매년 새 학습 목표가 누적.
</Card>
<Card title="자바 @MVC 미션" href="/education-experiment/repositories/java-mvc">
스프링 @MVC 직접 구현 미션. 379회 포크·400+ PR. Controller 반환 타입 일관성·Handler 추상화가 같은 골격 위에서 매 기수 새 단계로 누적된 사례.
</Card>
<Card title="자바 HTTP 미션" href="/education-experiment/repositories/java-http">
톰캣 직접 구현 미션. 385회 포크·1,100+ PR. 세션 보안·쿠키 파싱·에러 핸들링 일관성이 단계별로 누적된 패턴.
</Card>
<Card title="자바 로또 미션" href="/education-experiment/repositories/java-lotto">
구현 1단계 → 리팩토링 2단계 구조 자체가 누적 학습 설계. 327회 포크·676 PR에서 단일 책임·일급 컬렉션이 2단계로 분리 학습됨.
</Card>
</CardGrid>

## 핵심 원칙

1. **영구 골격을 먼저 식별한다** — 어떤 주제가 모든 기수에서 60% 이상 다뤄지는지를 데이터로 확인하고, 그것이 미션의 진짜 학습 목적임을 명시한다. 페이먼츠에서는 form-handling, state-management, component-design, custom-hooks가 영구 층이었다.

2. **새 목표는 누적 형태로 추가한다** — 기존 골격을 흔들지 말고, 그 위에 한 층을 더 얹는다. 페이먼츠 2026 재설계는 form/state/component를 그대로 두고 그 위에 async/MSW/testing을 추가한 형태다.

3. **추상화 한 단계를 의식해 설계한다** — 2026 페이먼츠의 핵심 단어는 "MSW로 네트워크 경계를 모킹하고 프론트엔드가 보는 서버의 모습을 설계한다", "서버-클라이언트 계약을 경험". **"기능 동작" → "외부 시스템과의 계약 설계"** 로 학습 단위가 추상화됐다. 매번의 미션 재설계는 한 단계만 추상화한다.

4. **사라지는 주제도 의미가 있다** — 페이먼츠에서 styling 카테고리는 2021년 40% → 2026년 20%로 절반으로 줄었다. 사라진 것은 잊혀진 것이 아니라 **"미션의 본질이 아니라고 판단된 결과"** 다. 사라진 주제를 명시하면 미션 설계의 의도가 또렷해진다.

5. **재제출 비율이 누적의 신호다** — 페이먼츠에서 215명 중 97%가 2회 이상 PR을 보냈다. 한 번 통과로 끝나는 게 아니라 **여러 단계에 걸쳐 같은 저장소로 돌아오는 구조**가 누적 학습을 가능하게 한다.

## 적용 가이드

| 상황 | 적용 방법 | 주의점 |
| --- | --- | --- |
| 기존 미션 재설계 검토 | 5년치 PR 본문에서 카테고리×연도 매트릭스 작성 → 영구 골격과 사라진 층, 새로 추가된 층을 분리 | 키워드 사전을 정의하는 단계에서 미션의 본질이 무엇인지 토론이 필요 |
| 새 미션 신설 검토 | 기존 미션 중 영구 골격이 가장 안정된 저장소 위에 신설 목표를 한 층 얹는 형태로 설계 | 새 저장소를 만들지 말고 기존 저장소에 단계를 추가하는 것이 누적 효과를 살림 |
| 미션 단계 폐지 | 폐지 전 해당 단계 PR의 마지막 3년치 본문에서 학습 목표가 다른 미션으로 이전 가능한지 확인 | 페이먼츠 3단계는 2024–2025 폐지 후 2026 부활. 폐지가 영구적이지 않을 수 있음을 데이터가 보여줌 |
| 외부 라이브러리 도입 시점 | 영구 골격이 안정된 후에 도입. 페이먼츠 5년치에서 Redux/Zustand 합 9회 vs Context 306회 — 기본기 체화가 라이브러리 도입 시점을 미룬 사례 | 라이브러리는 학습이 아니라 추상화 도구. 도입 전 기본기로 풀어보는 단계가 누적의 토대 |

## 관련 인사이트 및 도구

- [점진적 스캐폴딩](/education/insights/progressive-scaffolding) — 한 미션 내 회차 단위 누적. 본 인사이트는 **여러 기수·여러 해에 걸친 누적**이라는 더 큰 시간 단위.
- [자기 진단 프레임워크](/education/insights/self-diagnostic-framework) — 누적된 미션의 상태를 매년 진단해 재설계 결정의 근거를 만든다.
- [미션 저장소 PR 데이터 분석 워크플로우](/education/tools/mission-repo-analysis-workflow) — 이 패턴을 다른 미션 저장소에서 검증할 때 사용하는 표준 절차.
3 changes: 2 additions & 1 deletion content/education/tools/_meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ export default {
},
'clean-language-mentoring': '클린 랭귀지 상호 멘토링',
'research-cycle-workflow': '연구 사이클 워크플로우',
'rendering-strategy-workshop': '렌더링 전략 결정 워크숍'
'rendering-strategy-workshop': '렌더링 전략 결정 워크숍',
'mission-repo-analysis-workflow': '미션 저장소 PR 데이터 분석'
}
123 changes: 123 additions & 0 deletions content/education/tools/mission-repo-analysis-workflow.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# 미션 저장소 PR 데이터 분석 워크플로우

> 우테코 단일 미션 저장소(예: `woowacourse/react-payments`)에 누적된 PR 본문·리뷰 코멘트를 정량 분석해 학습 주제 진화·리뷰 코칭 패턴·미션 재설계 흔적을 추적하는 절차.

<Callout>
**대상**: 미션 저장소 한 곳을 깊게 들여다보고 싶은 코치·교육 모델 설계자

**입력**: `woowacourse/{repo}` 형태의 GitHub 저장소 1곳, `gh` CLI 인증

**산출**: 연도×단계 매트릭스, 주제 카테고리 시계열, 리뷰 코멘트 테마 분포, 코치 인용구 사례, 시각화 가능한 JSON
</Callout>

이 워크플로우는 [React 페이먼츠 미션 5년치 PR 555개 데이터 분석](/education/logs/react-payments-555prs-analysis) 로그에서 실증되어 [`/research-cycle`](/education/tools/research-cycle-workflow)에서 도구로 승격되었다.

## 언제 쓰는가

- 한 미션 저장소가 5년 이상 살아남았고, 그 동안 학습 목표가 변했는지 의심될 때
- 코치 리뷰 문화를 정성적 인상이 아니라 정량 데이터로 확인하고 싶을 때
- 다른 미션과 비교 가능한 형식으로 한 미션을 요약하고 싶을 때
- 미션 재설계 결정에 5년치 데이터를 근거로 활용하고 싶을 때

## 4단계 절차

### 1단계. 메타데이터 전수 수집

```bash
# 총 PR 수 확인 (Link 헤더의 rel="last")
gh api 'repos/woowacourse/{repo}/pulls?state=all&per_page=1' -i | grep -i 'link:'

# 페이지네이션으로 전수 수집 (100개/페이지)
for page in $(seq 1 N); do
gh api "repos/woowacourse/{repo}/pulls?state=all&per_page=100&page=$page&sort=created&direction=desc" \
--jq '[.[] | {number, title, author: .user.login, body, state, created_at, comments: .review_comments, labels: [.labels[].name]}]' \
> "pulls_page_$page.json"
done
jq -s 'add' pulls_page_*.json > all_pulls.json
```

> 주의: `pulls` list endpoint는 `review_comments` 카운트를 반환하지 않는다. 코멘트 수가 필요하면 다음 단계의 search API로 별도 수집한다.

### 2단계. 상위 PR 코멘트 수집

```bash
# search/issues로 PR을 코멘트 수 내림차순 정렬 (issue 코멘트 기준)
gh api 'search/issues?q=repo:woowacourse/{repo}+type:pr&sort=comments&order=desc&per_page=100' \
--jq '[.items[] | {number, title, comments}]' > top_comments.json

# 상위 30개 PR의 코멘트 가져오기 (issue + review 모두)
jq -r '.[0:30] | .[].number' top_comments.json | while read pr; do
gh api "repos/woowacourse/{repo}/issues/${pr}/comments" \
--jq "[.[] | {pr: ${pr}, type: \"issue\", user: .user.login, body, created_at}]" \
>> review_comments.jsonl
gh api "repos/woowacourse/{repo}/pulls/${pr}/comments?per_page=100" \
--jq "[.[] | {pr: ${pr}, type: \"review\", user: .user.login, body, path, line, created_at}]" \
>> review_comments.jsonl
done
```

### 3단계. 주제·테마 분류 (Python)

본문과 코멘트에 키워드 사전을 정규식으로 매칭해 카테고리 출현 빈도를 시계열로 측정한다. 24개 본문 카테고리, 20개 리뷰 코멘트 테마가 페이먼츠 분석에서 검증된 사전이다.

```python
# 본문 카테고리 예시 (페이먼츠 검증판)
topics = {
'state-management': ['상태 관리', 'state', 'useState', 'useReducer', 'context'],
'controlled-uncontrolled': ['controlled', 'uncontrolled', '제어', '비제어'],
'msw': ['MSW', 'msw', 'mock service', '모킹', 'handler'],
'error-handling': ['에러 처리', '에러 핸들링', 'ErrorBoundary', 'try', 'catch'],
# ... 24개
}

# 리뷰 코멘트 테마 예시
review_themes = {
'positive-feedback': ['좋', '잘', '깔끔', '👍', '훌륭', 'LGTM'],
'question': ['궁금', '여쭤', '질문', '?'],
'why-question': ['왜', '이유', '의도', '어떻게'],
'suggestion': ['해보', '어떨까', '제안', 'suggest'],
# ... 20개
}
```

전체 사전과 매칭 스크립트는 [페이먼츠 로그의 원본 자료 섹션](/education/logs/react-payments-555prs-analysis#원본-자료)에 보존된 `.inbox/react-payments-analysis/` 디렉터리 구조를 그대로 복제해 사용한다.

### 4단계. 시각화 자산 산출

| 산출물 | 형식 | 용도 |
| --- | --- | --- |
| 연도별 PR 분포 막대 | ASCII bar 또는 표 | 미션의 활성도 추세 |
| 연도×단계 매트릭스 | 마크다운 표 | 단계 구성의 변화 추적 |
| 주제 카테고리 × 연도 매트릭스 | 마크다운 표 (% 표시) | 학습 주제 진화 |
| 리뷰 테마 분포 | Mermaid `pie` | 리뷰 코칭 문화 |
| 본문 평균 길이 시계열 | 표 | 학습 문화 변화 신호 |
| 코치 인용구 5선 | Markdown 인용 | 정성 사례 |

## 결과물 체크리스트

분석 로그 1편이 갖춰야 할 최소 산출:

- [ ] 저장소 메타 (총 PR, 작성자 수, fork 수, 별 수)
- [ ] 연도×단계 매트릭스 (단계 변화 패턴 시각화)
- [ ] 최소 10개 카테고리의 시계열 매트릭스 (% 표시)
- [ ] 본문 평균 길이 시계열
- [ ] 리뷰 테마 분포 (긍정/질문/제안/관심사 분리/네이밍 등)
- [ ] 코치 인용구 최소 3선 (PR 링크 포함)
- [ ] 자기 성찰 어휘 빈도 (고민/책임/관심사/추상화 등)
- [ ] 외부 라이브러리 의존성 통계 (Redux/Zustand 등 → React 기본기 대비)

## 검증된 사례

- [React 페이먼츠 미션 5년치 PR 555개 데이터 분석](/education/logs/react-payments-555prs-analysis) — 이 워크플로우의 원본 적용 사례

## 관련 도구·인사이트

- [연구 사이클 워크플로우](/education/tools/research-cycle-workflow) — 이 도구가 산출한 로그를 인사이트·교육 모델로 승격하는 다음 단계 파이프라인
- [미션은 누적 학습 모델이다](/education/insights/mission-learning-accumulation) — 이 도구로 발견된 핵심 패턴
- [논증 기반 학습 설계](/education/insights/argumentation-based-learning) — 리뷰 테마 분포 분석이 이 인사이트의 정량 증거를 제공한다

## 한계와 주의

- **표본 편향**: 상위 30 PR만 코멘트를 수집하면 코멘트가 적은 PR(자기 완결성이 높았거나, 빠른 통과)이 분석에서 빠진다. 가능하면 모든 PR의 코멘트 수만이라도 수집해 분포를 봐야 한다.
- **키워드 사전 의존**: 매칭 정확도가 사전 품질에 의존한다. 한 사전을 다른 미션 저장소에 적용할 때는 검증 샘플로 정밀도를 측정한다.
- **인용은 동의서가 아니다**: 코치·크루의 코멘트를 인용할 때는 원본 PR 링크를 함께 남겨 출처를 분명히 한다. 직접 인용은 짧게 하되 의미가 살아 있어야 한다.
7 changes: 7 additions & 0 deletions content/updates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ export interface Update {

// 최신 항목을 맨 위에 추가하세요.
const updates: Update[] = [
{
date: '2026년 연구',
title: '승격: 미션은 누적 학습 모델이다 (인사이트 + 도구 + 디자인 패턴)',
description: '페이먼츠 5년 분석 로그를 승격해 인사이트 1개·도구 1개를 신설하고, 디자인 패턴 카탈로그와 커리큘럼 설계 원칙에 정량 증거 마커 섹션을 추가.',
href: '/education/insights/mission-learning-accumulation',
status: 'active',
},
{
date: '2026년 연구',
title: 'React 페이먼츠 미션 5년치 PR 555개 데이터 분석',
Expand Down
1 change: 1 addition & 0 deletions research-cycle-log.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ date mode logs_measured logs_promoted insights_created model_files_changed notes
2026-04-07 auto 0 0 0 0 baseline-advance after folder consolidation (no substantive log changes)
2026-04-14 manual 6 2 1 3 targets: 6 logs (date:2026-04-07); tool: rendering-strategy-workshop (P2=5); insight: argumentation-based-learning (4-log cross-pattern); _meta.ts+index.mdx+updates.ts updated
2026-05-19 auto 4 2 0 3 auto-sync: 4 logs evaluated; promoted coaching-squad-training-loop (20/20) and crew-autonomy (17/20); 3 marker sections added to progressive-scaffolding, learning-analytics, clean-language-mentoring; skipped android-participatory (11), writing-sessions (14)
2026-05-26 manual 1 1 1 2 target: react-payments-555prs-analysis (quality 24/25 A; promo 20/20); tool: mission-repo-analysis-workflow (P2=5); insight: mission-learning-accumulation (P3=5) + marker on argumentation-based-learning; marker sections on design-patterns/catalog (pattern 9) and curriculum/design-principles