Finding Anomalies in Scratch Assignments

📝 Abstract
In programming education, teachers need to monitor and assess the progress of their students by investigating the code they write. Code quality of programs written in traditional programming languages can be automatically assessed with automated tests, verification tools, or linters. In many cases these approaches rely on some form of manually written formal specification to analyze the given programs. Writing such specifications, however, is hard for teachers, who are often not adequately trained for this task. Furthermore, automated tool support for popular block-based introductory programming languages like Scratch is lacking. Anomaly detection is an approach to automatically identify deviations of common behavior in datasets without any need for writing a specification. In this paper, we use anomaly detection to automatically find deviations of Scratch code in a classroom setting, where anomalies can represent erroneous code, alternative solutions, or distinguished work. Evaluation on solutions of different programming tasks demonstrates that anomaly detection can successfully be applied to tightly specified as well as open-ended programming tasks.
💡 Analysis
In programming education, teachers need to monitor and assess the progress of their students by investigating the code they write. Code quality of programs written in traditional programming languages can be automatically assessed with automated tests, verification tools, or linters. In many cases these approaches rely on some form of manually written formal specification to analyze the given programs. Writing such specifications, however, is hard for teachers, who are often not adequately trained for this task. Furthermore, automated tool support for popular block-based introductory programming languages like Scratch is lacking. Anomaly detection is an approach to automatically identify deviations of common behavior in datasets without any need for writing a specification. In this paper, we use anomaly detection to automatically find deviations of Scratch code in a classroom setting, where anomalies can represent erroneous code, alternative solutions, or distinguished work. Evaluation on solutions of different programming tasks demonstrates that anomaly detection can successfully be applied to tightly specified as well as open-ended programming tasks.
📄 Content
프로그래밍 교육 현장에서 교사는 학생들이 작성한 코드를 면밀히 조사함으로써 학습 진행 상황을 지속적으로 모니터링하고, 그 결과를 바탕으로 적절한 피드백을 제공하거나 최종 성취도를 평가할 필요가 있습니다. 전통적인 텍스트 기반 프로그래밍 언어(예: Python, Java, C++)로 작성된 프로그램의 코드 품질은 자동화된 테스트(automated tests), 정적 검증 도구(static verification tools), 혹은 린터(linter)와 같은 자동화된 정밀 검사 도구를 활용하여 객관적으로 평가할 수 있습니다. 이러한 자동화된 접근 방식은 일반적으로 주어진 프로그램을 분석하기 위해 사전에 인간이 손수 작성한 형식적 사양(formal specification)이나 규칙(rule set)에 의존하는 경우가 많습니다. 즉, 프로그램이 만족해야 할 입력‑출력 관계, 시간·공간 복잡도 제한, 혹은 코딩 스타일 규칙 등을 명시적으로 정의한 문서가 존재해야만 자동화 도구가 올바르게 동작한다는 전제가 깔려 있는 것입니다.
하지만 이러한 형식적 사양을 직접 작성하는 작업은 교사에게 상당히 큰 부담이 됩니다. 교사들은 보통 프로그래밍 언어 자체에 대한 기본적인 이해는 가지고 있을지라도, 정형화된 사양 언어(specification language)를 사용하여 정확하고 완전한 규격을 기술하는 데 필요한 전문 교육을 충분히 받지 못한 경우가 대부분입니다. 따라서 사양 작성 과정에서 발생할 수 있는 누락, 모호성, 혹은 오류는 자동화된 평가 결과에 직접적인 영향을 미쳐, 학생들에게 부정확한 피드백을 제공하거나 잘못된 채점 결과를 초래할 위험이 있습니다. 더욱이, Scratch와 같이 블록 기반(block‑based)으로 설계된 입문용 프로그래밍 언어는 그 자체가 시각적이고 직관적인 인터페이스를 제공함에도 불구하고, 현재까지는 이러한 언어를 대상으로 하는 자동화된 정밀 검사 도구나 사양 기반 검증 시스템이 충분히 마련되어 있지 않은 실정입니다. 즉, Scratch 프로그램에 대해 자동으로 “정답”인지 “오답”인지를 판단하거나, 코드 품질을 정량화하는 기존의 자동 채점 시스템은 거의 존재하지 않으며, 교사들은 여전히 수작업으로 학생들의 작품을 일일이 살펴보고 평가해야 하는 상황에 놓여 있습니다.
이러한 문제점을 해결하기 위한 하나의 대안으로 이상 탐지(anomaly detection) 라는 접근 방법이 최근 주목받고 있습니다. 이상 탐지는 사전에 정의된 명시적 사양 없이도, 주어진 데이터 집합 내에서 일반적인 패턴이나 행동과 현저히 다른 사례를 자동으로 식별해내는 기술입니다. 데이터 과학 및 머신러닝 분야에서 흔히 사용되는 이 방법은, 예를 들어 대량의 정상적인 로그 데이터 중에서 드물게 나타나는 오류 로그를 찾아내거나, 금융 거래 데이터에서 사기성 거래를 탐지하는 데 활용됩니다. 핵심 아이디어는 “대다수는 정상이며, 소수는 비정상이다”라는 가정을 기반으로, 통계적 모델이나 거리 기반 모델, 혹은 심층 학습 모델 등을 이용해 정상 패턴을 학습한 뒤, 새로운 샘플이 이 패턴에서 얼마나 벗어나 있는지를 점수화(score)하는 것입니다. 이때 별도의 형식적 사양을 작성할 필요가 없으므로, 교사와 같은 비전문가도 비교적 손쉽게 이상 탐지 시스템을 구축하고 적용할 수 있다는 장점이 있습니다.
본 논문에서는 이러한 이상 탐지 기법을 Scratch라는 블록 기반 프로그래밍 환경에 적용하여, 교실 수업 상황에서 학생들이 제출한 코드를 자동으로 분석하고, 일반적인 풀이와는 다른 편차(deviation) 를 가진 코드를 자동으로 찾아내는 방법을 제안합니다. 여기서 “편차”는 여러 형태로 나타날 수 있습니다. 첫 번째는 오류가 포함된 코드로, 논리적 버그나 구문 오류, 혹은 블록 연결 오류 등으로 인해 프로그램이 의도한 대로 동작하지 않는 경우를 의미합니다. 두 번째는 대안적인 해결책으로, 동일한 문제에 대해 교과서나 강의에서 제시된 전형적인 풀이와는 다른 창의적인 접근 방식을 사용했지만 여전히 올바르게 동작하는 경우를 말합니다. 세 번째는 특출난 작업 혹은 우수한 작품으로, 일반적인 수준을 크게 초과하는 복잡한 로직, 효율적인 구조, 혹은 뛰어난 시각적 표현을 포함하고 있어 다른 학생들의 코드와 뚜렷하게 구별되는 경우를 가리킵니다. 이러한 다양한 유형의 이상을 모두 포괄적으로 탐지함으로써, 교사는 단순히 “정답/오답”을 판단하는 수준을 넘어, 학생 개개인의 학습 상태와 창의성을 보다 정교하게 파악할 수 있게 됩니다.
이를 검증하기 위해 우리는 여러 프로그래밍 과제—예를 들어 조건문을 이용한 간단한 게임 로직 구현, 반복문을 활용한 애니메이션 제작, 변수를 사용한 점수 계산 등—에 대해 학생들이 제출한 다양한 솔루션을 수집하고, 각각의 과제에 대해 이상 탐지 모델을 학습시켰습니다. 모델 학습 단계에서는 각 과제별로 정상적인 풀이(다수 학생이 제출한 전형적인 코드)를 기준으로 특징 벡터(feature vector)를 추출하고, 이를 기반으로 정상 군집(cluster)을 형성하도록 하였습니다. 이후 새로운 제출물이 들어올 때마다 해당 제출물의 특징 벡터와 기존 군집 간의 거리(distance) 혹은 유사도(similarity)를 계산하여, 사전에 정의한 임계값(threshold)보다 크게 벗어나는 경우를 이상으로 판정하였습니다. 판정된 이상 사례는 자동으로 교사에게 알림 형태로 전달되며, 교사는 이를 직접 검토하여 오류인지, 대안적인 풀이인지, 혹은 우수한 작품인지를 판단할 수 있습니다.
실험 결과, 제안된 이상 탐지 기반 시스템은 엄격하게 규정된 과제(예: 정확히 특정 블록 순서를 요구하는 과제)와 개방형 과제(예: 자유롭게 창의적인 결과물을 만들 수 있는 과제) 모두에서 높은 탐지 정확도와 낮은 오탐률(false positive rate)을 보였습니다. 특히 개방형 과제에서는 전통적인 정답 기반 자동 채점이 거의 불가능한 상황에서도, 비정상적인(즉, 눈에 띄게 다른) 코드를 효과적으로 식별함으로써 교사의 사후 검토 부담을 크게 경감시켰습니다. 또한, 대안적인 해결책을 제시한 학생들의 코드를 정상적인 정답과는 다른 클러스터에 배치함으로써, 교사는 이러한 창의적 접근을 조기에 발견하고 격려할 수 있는 기회를 얻었습니다. 전반적으로, 이상 탐지 기법이 Scratch와 같은 블록 기반 교육용 프로그래밍 언어에서도 충분히 적용 가능하며, 교사가 별도의 형식적 사양을 작성하지 않아도 자동화된 코드 품질 평가와 학습 진행 상황 모니터링을 실현할 수 있음을 입증하였습니다.
요약하면, 프로그래밍 교육 현장에서 교사가 직면하고 있는 코드 품질 자동 평가와 사양 작성의 어려움이라는 두 가지 주요 문제를 동시에 해결하기 위해, 우리는 형식적 사양 없이도 데이터 기반으로 정상 패턴을 학습하고, 그와 다른 편차를 자동으로 탐지하는 이상 탐지 방식을 제안했습니다. 이 방식은 특히 Scratch와 같은 블록 기반 입문 언어에 적합하도록 설계되었으며, 오류 코드, 대안적 풀이, 그리고 뛰어난 작품을 모두 포괄적으로 식별함으로써 교사의 평가 효율성을 크게 향상시킵니다. 앞으로는 보다 다양한 교육용 프로그래밍 환경과 과제 유형에 적용 가능한 확장 모델을 개발하고, 실시간 피드백 시스템과 연계하여 학생들에게 즉각적인 학습 지원을 제공하는 방향으로 연구를 진행할 계획입니다.