← Latest papers
💻 computer science

Accelerating Accurate Assignment Authoring Using Solution-Generated Autograders

This paper introduces "solution-generated autograding," a method that leverages provided solutions to automatically create accurate and scalable autograders without manual test case enumeration, demonstrated through the Questioner system which successfully supported a large CS1 course with nearly 800 programming questions over four years.

Original authors: Geoffrey Challen, Ben Nordick

Published 2026-08-10
📖 6 min read🧠 Deep dive

Original authors: Geoffrey Challen, Ben Nordick

Original paper licensed under CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). This is an AI-generated explanation of the paper below. It is not written or endorsed by the authors. For technical accuracy, refer to the original paper. Read full disclaimer

Imagine you are a teacher trying to teach a class of thousands how to bake the perfect chocolate cake. In the old days, to grade every single student's cake, you'd have to taste each one yourself. But with thousands of students, that's impossible. So, you build a robot chef to taste the cakes for you. This robot is an "autograder." Usually, to teach this robot what a "good" cake looks like, you have to write a massive, tedious list of rules: "If the cake is too dry, fail it. If it's too sweet, fail it. If the frosting is blue, fail it." You have to guess every possible mistake a student might make and write a rule for it. If you miss just one mistake, the robot might let a bad cake pass, or worse, reject a perfect cake because you forgot to tell it that blue frosting is actually okay for a "blueberry" cake. This process of writing the rules is slow, boring, and often leads to a robot that isn't very smart.

This paper is about a new way to build that robot chef. Instead of writing a long list of rules, the teacher simply shows the robot the perfect cake they baked themselves. The robot then uses that perfect cake to figure out what a "good" cake looks like on its own. It does this by trying to bake the cake in a million different slightly "wrong" ways to see if it can tell the difference between a real mistake and a perfect cake. This method is called "solution-generated autograding." It turns the boring job of writing rules into a fun game of "spot the difference," making it much faster to create huge libraries of practice problems for students learning to code.

The Problem: The "Rule-Writing" Trap

When students learn to program, they need to practice solving hundreds of different puzzles. To make this work, teachers need a way to check the students' code instantly. This is where autograders come in. Traditionally, creating an autograder is like building a security guard who only knows how to spot specific intruders. The teacher has to manually write a list of test cases: "If the code outputs 5 when the input is 2, that's good. If it outputs 6, that's bad."

This approach has three big problems. First, it's incredibly tedious. You have to guess every possible way a student might mess up, which is like trying to list every possible way someone could trip in a hallway. Second, it's hard to know if your list is good enough. Did you miss a tricky mistake? If you don't know, your autograder might be inaccurate, letting bad code pass or failing good code. Third, these test lists are often confusing for students. If a test fails, the student might not know if their code is wrong or if the teacher's test list was just poorly written.

The Solution: The "Perfect Cake" Strategy

The authors, Geoffrey Challen and Ben Nordick, propose a clever twist. Instead of writing a list of rules, the teacher just provides the solution—the perfect code that solves the problem. They call their tool Questioner.

Here is how Questioner works, using a playful analogy: Imagine the teacher hands the robot a perfect, golden-brown cake (the reference solution). The robot doesn't just look at it; it starts trying to break it. It uses a special "mutation" tool to make tiny, silly mistakes to the perfect cake. Maybe it swaps sugar for salt, or changes the oven temperature by one degree, or forgets to mix the eggs. These are the "mutants."

The robot then asks itself: "Can I tell the difference between my broken cake and the perfect one?" It generates thousands of random ingredients (inputs) to test the cakes. If the robot can spot the difference between the perfect cake and the broken one using these random ingredients, it knows it has a good test. If it can't spot the difference, it keeps generating more random ingredients until it can.

This is the magic: The robot uses the perfect solution to teach itself what not to accept. It doesn't need the teacher to write a list of "don'ts." It figures out the boundaries of correctness by trying to break the perfect solution and seeing what happens.

What They Found

The team built Questioner for Java and Kotlin and used it for four years in a massive introductory computer science course at the University of Illinois. They created nearly 800 programming questions that were used by thousands of students to evaluate millions of submissions.

Here are the key takeaways from their experience:

  • Speed and Fun: Writing questions with Questioner was much faster and more enjoyable than writing traditional test suites. One instructor was able to write roughly one new question per working day for three years straight, building a bank of 771 questions.
  • Accuracy: Because the robot tests against the actual perfect solution, it is very good at telling right from wrong. In their quizzes, they never had to drop a question because the autograder was inaccurate.
  • Rich Feedback: The system doesn't just say "Right" or "Wrong." It can also check code quality. For example, it can tell if a student's code is way too complicated (using too many steps) compared to the simple, elegant solution. It can even check if a student used a specific technique, like recursion, if that was the goal of the lesson.
  • Handling the Tricky Stuff: Sometimes, random ingredients aren't enough. For example, if a problem requires a specific number like "88" to work, the robot might never guess it by chance. In these cases, the teacher can give the robot a small list of "special ingredients" to try. But even then, the robot still uses the perfect solution to do the grading, so the teacher doesn't have to write a full test suite.

Why It Matters

This paper suggests that we don't need to be "test case enumerators" to build good autograders. By letting the solution itself generate the tests, we can build huge banks of practice problems much faster. This means more students can get immediate, accurate feedback on their coding, helping them learn without getting stuck on confusing errors.

The authors also note that this isn't just for Java; they are already building a version for Python called Snapact, and they are even exploring how to use AI to help write the initial perfect solutions. While they admit that no system is perfect (a student could still try to bypass the system with a "brute force" hack), their method makes it much harder to bypass and much easier for teachers to create high-quality learning materials.

In short, instead of writing a million rules to catch every mistake, the teacher just shows the robot the right answer, and lets the robot figure out the rest. It's a faster, smarter, and less frustrating way to teach the next generation of programmers.

Drowning in papers in your field?

Get daily digests of the most novel papers matching your research keywords — with technical summaries, in your language.

Try Digest →