현장

기준은 여전히 당신 것이다 — 채점 도구가 하지 않는 일

작성: makemind · 2026년 7월 21일

먼저 밝혀 둔다. 2026년 3월에 이 매거진은 어느 교사가 채점 도구를 만든 이야기를 실었다. 이 현장은 특정 업체가 아니다. 실제로 그렇게 돌아가는 형태를 그대로 구성했고, 어느 곳인지는 밝히지 않는다. 아래는 그 형태대로 직접 만든 것이고, 답안과 루브릭은 전부 지어낸 것이다.

원 글의 문제는 다른 데 있었다. 도구가 점수를 줬다는 이야기는 있는데, 무엇을 근거로 줬는지가 없었다.

채점에서 그건 사소한 누락이 아니다. 점수는 학생이 이의를 제기할 수 있어야 하고, 교사는 그 이의에 답할 수 있어야 한다. 이유 없는 점수는 이의를 제기할 수도, 답할 수도 없다.

루브릭은 데이터다

먼저 이 도구가 갖지 않는 것부터. 무엇이 좋은 답인지 판단하는 코드가 없다. 그건 루브릭이고, 루브릭은 교사가 쓴 데이터다.

/// One rubric line, written by the teacher.
///
/// `accept` is the list of things that earn the mark. It is deliberately a list
/// of strings rather than a regular expression or a scoring function: the
/// teacher has to be able to read their own standard back, and change it
/// without asking anyone.

정규식이나 채점 함수로 두지 않은 이유가 저기 있다. 교사가 자기 기준을 되읽을 수 있어야 한다. 실행 로그에 그 되읽기가 있다.

rubric: Q1(10) accept=[24] | Q2(10) accept=[x=3, x = 3, 3]
      | Q3(20) accept=[-5, x=-5] | Q4(10) accept=[12cm, 12 cm]

2번의 accept 가 셋인 것을 봐 달라. x=3, x = 3, 3. 띄어쓰기와 표기를 어디까지 봐줄지가 채점 기준이고, 그건 교사의 판단이지 도구의 관용이 아니다.

부분점수는 이유를 달고 나온다

여기가 이 편의 중심이다. 채점표를 조회 테이블에서 판단으로 만드는 건 부분점수다.

/// Mark one answer against one rubric line, and say which branch was taken.
///
/// The reason for returning the branch and not just the number: a teacher
/// overriding a mark needs to see what the scheme decided, not guess at it.
(int, String) _mark(RubricItem r, String? given) {
  if (given == null || given.isEmpty) return (0, 'blank');
  if (r.accept.contains(given)) return (r.points, 'accepted');
  if (r.partial.containsKey(given)) {
    return (r.partial[given]!, 'partial (${r.trap})');
  }
  return (0, 'wrong');
}

점수만 돌려주지 않고 어느 갈래를 탔는지를 같이 돌려준다. 실제 답안 하나를 그대로 옮긴다.

paper 02: Q1 "24" -> 10/10 (accepted)
        | Q2 "x=3" -> 10/10 (accepted)
        | Q3 "5" -> 8/20 (partial (drops the minus sign on the root))
        | Q4 "12 cm" -> 10/10 (accepted)

3번이 20점 만점에 8점이고, 왜 8점인지가 붙어 있다. 근의 부호를 빠뜨렸다는 것. 학생이 물으면 교사는 저 줄을 보여 주면 된다.

검증도 그걸 본다.

# 부분점수는 루브릭의 어느 갈래가 줬는지 말해야 한다. 이유 없는 숫자는
# 반박할 수 없고, 교사는 반박할 수 있어야 한다.
grep -q 'partial (drops the minus sign on the root)' captures/run.log \
  || { echo "a partial mark arrived without the reason that produced it"; exit 1; }
Papers — 40.5 average, 8 papers marked against the rubric. 실제 렌더 캡처
Papers — 40.5 average, 8 papers marked against the rubric. 실제 렌더 캡처

이 콘텐츠는 개발자 이상이 필요합니다

로그인 후 플랜을 업그레이드하면 계속 읽을 수 있습니다.

플랜 보기
Twitter