chore: 문서를 작성할 때 한국어의 표현 작성 스킬 추가 및 1인칭 관점의 글 작성 검증 테스트 추가

This commit is contained in:
DongHyeonka
2026-07-29 16:48:03 +09:00
parent c39406bbdd
commit 41501b5d06
520 changed files with 95494 additions and 2231 deletions
+91 -134
View File
@@ -1,168 +1,125 @@
# Logic model for comprehensible technical documents
# Logic model
## 1. 문서는 질문 그래프다
## 1. 독자 질문의 순서
좋은 기술 문서를 “서론-본론-결론”이라는 형식만으로 설명하면 부족하다. 실제 독자는 순차적으로 다음 질문을 해결한다.
좋은 기술 글은 정보량보다 질문의 순서를 통제한다. 기술 블로그의 기본 질문은 다음과 같다.
```text
왜 읽어야 하는가?
정확히 무엇을 다루는가?
무엇을 이미 알아야 하는가?
핵심 답 또는 결과는 무엇인가?
그 답이 성립하는 이유와 메커니즘은 무엇인가?
구체적인 사례에서 어떻게 보이는가?
어떻게 확인하는가?
언제 실패하거나 선택하지 않아야 하는가?
그래서 무엇을 해야 하는가?
무슨 문제가 있었나?
왜 단순히 풀 수 없었나?
무엇을 검토했나?
왜 이 선택을 했나?
코드에서는 어떻게 동작하나?
무엇으로 확인했나?
어떤 비용과 한계가 남았나?
내 환경에서 무엇을 판단해야 하나?
```
모든 문서가 이 질문을 동일한 비중으로 다루지는 않는다. 문서 유형은 **독자의 현재 상태와 목적**에 따라 필요한 질문 부분을 선택하고 순서를 최적화한 것이다.
제목은 이 질문에 대한 표지판이어야 한다. `개요`, `상세`, `기타`처럼 정보 역할을 드러내지 않는 heading은 경고 대상이다.
## 2. 문서 유형을 섞을 때의 규칙
## 2. Decision unit
한 페이지에 여러 유형이 존재할 수 있지만 주된 목적은 하나여야 한다.
기술 선택은 다음 6요소를 하나의 논리 단위로 본다.
- Tutorial 안의 짧은 explanation은 현재 단계를 이해시키는 데 필요한 만큼만 둔다.
- How-to 안의 reference table은 절차 수행에 필요한 조회 표면으로 제한한다.
- Technical blog 안의 code example은 전체 API reference가 아니라 인과 관계를 보여준다.
- Reference 안의 장황한 배경 설명은 별도 explanation으로 분리한다.
- Troubleshooting 안의 fix는 확인된 cause branch에만 연결한다.
| 요소 | 질문 |
|---|---|
| context/constraint | 어떤 문제와 제약 아래에서 결정했는가 |
| choice | 무엇을 선택·허용·금지했는가 |
| why | 그 선택이 어떤 비용이나 위험을 줄였는가 |
| alternative | 현실적인 다른 선택은 무엇이었는가 |
| accepted cost | 선택 때문에 무엇을 감수했는가 |
| guardrail | 허용 범위가 넓어지지 않게 무엇이 실패하는가 |
판정 질문:
“X를 의도적으로 사용한다”는 choice 하나만 있다. 이유가 없으면 `RAT001`, 대안·비용·가드레일이 없으면 `RAT002` 후보가 된다.
> 이 부분이 독자의 현재 목표를 직접 전진시키는가, 아니면 다른 문서 유형의 목표를 새로 시작하는가?
## 3. Evidence semantics
후자라면 분리하거나 링크한다.
근거는 단어 일치가 아니라 claim role로 배치한다.
## 3. 논리 구조의 최소 단위
- **current state**: canonical project가 우선
- **decision history and rationale**: branch note가 유용
- **vendor/protocol behavior**: official docs
- **precedent**: company tech blog
- **general explanation**: canonical concept 또는 안정적인 background knowledge
### Section contract
공식 문서가 `@Service`의 동작을 설명해도 프로젝트가 왜 그것을 선택했는지는 증명하지 않는다. 반대로 branch note가 선택 이유를 설명해도 현재 구현 상태가 바뀌었다면 canonical source를 확인해야 한다.
각 section은 다음을 가진다.
## 4. Status boundary
1. **Reader question**: 독자가 이 시점에 묻는 질문
2. **Purpose**: 이 절이 수행할 정보 작업
3. **Claim/answer**: 질문에 대한 명시적 답
4. **Support**: 근거, 메커니즘, 예시 또는 절차
5. **Boundary**: 답이 유효한 범위와 예외
6. **Transition**: 다음 질문이 왜 생기는지 연결
### Paragraph contract
문단은 보통 다음 순서를 사용한다.
다음 status를 서로 바꾸어 쓰지 않는다.
```text
중심 문장 → 이유/근거 → 구체화/예시 → 다음 문장으로의 연결
actually implemented
locally verified
production verified
documented only
planned
needs confirmation
unsupported
```
문단이 두 개의 독립 결론을 갖거나, 첫 문장이 뒤의 내용을 예고하지 못하거나, 마지막 문장이 새 주제를 시작하면 분리 후보로 본다.
로컬 ArchUnit test 통과는 운영 효과의 증거가 아니다. 다른 회사의 사례는 이 프로젝트가 같은 결과를 얻었다는 증거가 아니다.
## 4. 이해를 돕는 인과 구조
## 5. Concrete example
기술 설명에서 목록만 나열하면 독자는 구성요소를 기억해도 시스템을 예측하지 못한다. 메커니즘 section은 다음 중 하나의 명시적 순서를 사용한다.
- 시간: 요청 전 → 요청 중 → 응답 후
- 데이터 흐름: 입력 → 변환 → 저장 → 출력
- 제어 흐름: 조건 → 분기 → 행동 → 상태 전이
- 장애 흐름: 트리거 → 증상 → 전파 → 완화 → 복구
- 결정 흐름: 제약 → 비교 기준 → 대안 평가 → 선택 → 수용 비용
각 화살표에는 “왜 다음 상태가 되는가”가 있어야 한다. 단순히 컴포넌트 이름을 이어 붙이지 않는다.
## 5. 점진 공개
독자가 세부사항을 이해하기 위한 구조를 먼저 제공한다.
1. 핵심 답/결과
2. 범위와 전제
3. 가장 단순한 모델
4. 정상 메커니즘
5. 완주하는 예시
6. 검증
7. 예외·실패·트레이드오프
8. 운영 세부사항
예외를 너무 일찍 넣으면 기본 모델을 형성하기 어렵고, 너무 늦게 숨기면 과도한 확신을 준다. 기본 모델을 제시한 직후 “어디까지 유효한가”를 명시하고, 상세 예외는 뒤에서 확장한다.
## 6. Worked example 계약
예시는 코드 조각의 존재가 아니라 **시작 상태부터 검증 결과까지의 연결**이다.
필수 요소:
- 초기 상태와 입력
- 각 단계의 행동 또는 상태 변화
- 단계의 이유
- 예상 관측
- 최종 결과
- 성공 기준
- 실패했을 때 되돌아갈 지점
초보 독자에게는 중간 추론을 더 많이 보이고, 숙련 독자용 문서에서는 자명한 단계를 줄인다. 브리프의 `prior_knowledge`가 이 깊이를 결정한다.
## 7. 근거와 주장 수준
문장은 다음 네 종류 중 하나로 분류할 수 있어야 한다.
| 종류 | 예 | 처리 |
|---|---|---|
| 관측 사실 | 특정 로그가 발생했다 | 출처·실험·측정 연결 |
| 일반 기술 사실 | 프로토콜 의미, API 계약 | 권위 있는 reference 연결 |
| 가정/가상 예시 | 설명을 위한 단순 모델 | 가정/예시임을 표시 |
| 권고/판단 | 이 조건에서는 A를 선택 | 기준·대안·비용을 공개 |
“관련된 출처”와 “그 주장을 지지하는 출처”는 다르다. Source pack의 `facts`는 허용된 주장 범위를 줄이는 역할을 한다.
## 8. 트레이드오프 구조
좋은 기술 글은 선택을 미화하지 않는다.
예시는 최종 코드 조각만 보여주지 않는다.
```text
선택한 접근
├── 얻는 것
├── 지불하는 비용
├── 대안
├── 선택 기준
├── 실패 조건
└── 선택하지 말아야 하는 상황
initial state
→ input
→ decision criterion
→ selected path
→ state/control-flow change
→ observable result
→ success or recovery criterion
```
대안을 비교할 때는 같은 기준을 사용한다. 한 대안은 성능으로, 다른 대안은 구현 편의성으로만 설명하면 비교가 성립하지 않는다.
독자는 예시에서 추상 모델의 각 요소를 대응시킬 수 있어야 한다.
## 9. 절차 안전성
## 6. Korean problem-solving blog profile
절차 문서의 단계는 다음 상태 머신으로 본다.
`woowahan_tech_blog_ko` profile은 다음을 권장한다.
```text
PRECONDITION_CHECKED
→ CHECKPOINT_CREATED
→ CHANGE_APPLIED
→ EXPECTED_RESULT_OBSERVED
→ VERIFIED
```
- 팀이나 시스템의 구체적 맥락에서 시작
- 기술 이름보다 문제와 비용을 먼저 설명
- 기존 방식, 실패한 시도, 대안을 숨기지 않음
- 선택 기준과 이유를 명시
- 구현 세부가 앞에서 세운 문제에 답하도록 구성
- 검증 결과를 원래 문제에 다시 연결
- project-local 결정을 보편 규칙으로 쓰지 않음
- 억지 접속어보다 문단 사이의 실제 논리 관계를 수정
- `문제 → 제약 → 대안 → 선택`을 의미 순서로 사용하되 문장 틀로 읽어 주지 않음
- 문단을 행위자, 상태, 변화, 결과, 판단에서 시작
- 질문형 heading은 바로 다음 문장에서 답하고, 접속어는 실제 인과·역접을 가리키게 함
- 순서어는 실제 단계·방법·레이어·도표에 사용하고, 추상 분류는 목록이나 의미 있는 소제목으로 표현
어느 단계에서든 불일치하면 다음으로 진행하지 않고 `STOPPED → ROLLED_BACK → RECOVERY_VERIFIED`로 이동해야 한다. 파괴적 명령은 경고 문구만으로 충분하지 않으며 백업/복구점, 영향 범위, 확인 명령이 함께 있어야 한다.
이는 샘플 글에서 관찰한 패턴을 하네스 규칙으로 번역한 것이며 공식 house style은 아니다.
## 10. 품질 평가 차원
특히 `첫 번째 제약은`, `두 번째 제약은`, `세 번째 제약은`처럼 outline의 분류명을 연속 문단 머리에 두는 방식은 정보 구조를 산문으로 노출한다. 한국어 기술 블로그에서 이런 형식이 가까운 문단에 세 번 이상 나타나면 `STYLE001` warning 대상이다. 실제 순서를 설명하는 번호 목록과 단계 문장은 대상이 아니다.
모델 reviewer는 다음 차원을 각각 검사한다.
## 7. Date and citation logic
- `reader_goal_alignment`: 약속한 결과를 실제로 제공하는가
- `information_architecture`: 문서 유형과 section 역할이 맞는가
- `logical_flow`: 전제·인과·결론·전환이 끊기지 않는가
- `cognitive_load`: 선행지식에 맞고 세부사항이 점진적으로 공개되는가
- `evidence_traceability`: 확인 가능한 주장이 근거와 연결되는가
- `example_verifiability`: 예시가 끝까지 실행·검증 가능한가
- `scannability`: heading과 첫 문장만 읽어도 구조가 보이는가
- `operational_safety`: 절차·변경·실패·복구가 안전한가
- `completeness_and_limits`: 범위, 비범위, 예외, 트레이드오프가 있는가
- access date는 provenance
- version/date가 behavior, compatibility, reproducibility를 바꿀 때만 본문에 사용
- hidden citation mode에서는 internal marker 금지
- public citation이 필요하면 footnote 또는 inline link 사용
한 차원의 평균이 전체 결함을 숨기지 않도록 blocker/error 개수를 점수와 별도로 게이트한다.
## 8. Lint와 model review의 역할 분리
Deterministic lint가 잘하는 것:
- heading 계약
- source marker/path/date/meta 문자열 누출
- 명시적 choice 뒤 rationale 어휘 부재
- 반복된 서수 문단처럼 형식적으로 식별 가능한 문장 scaffolding
- 절차 구조와 파괴적 command safety
Model review가 필요한 것:
- 이유가 실제로 선택을 정당화하는가
- 대안 비교가 공정한가
- source chunk가 claim을 충분히 지지하는가
- 문단 흐름과 독자 인지 부하
- 질문이 바로 답을 얻고 접속어가 실제 관계를 가리키는가
- 정보 구조가 기계적인 문장 틀로 노출됐는가
- project-local policy의 과장 여부