Mental models first
Explain, trace, and name purpose. Writing from a blank file is not the default move.
Dissertation prototype
CodeSense supports the development of foundational programming skills. CodeSense provides small, focused challenges that help you understand code, spot mistakes, evaluate solutions, and develop confidence with fundamental programming concepts.
Choose a topic 0 of 48 activities attempted in this browser.Explain, trace, and name purpose. Writing from a blank file is not the default move.
Accept or reject a suggestion. Find the bug. The tutor never finishes the item for you.
Rewrite weak generated code, and practise saying what a solution must do — including edge cases.
Each type is short, single-concept, and mapped to a Bloom-inspired outcome.
Pick the correct technical term for a piece of code.
Shared vocabulary is the foundation for everything else: students cannot explain, debug, or critique generated code (or specify what they want) without words such as parameter, index, key and iteration. Distractors are near-miss terms that novices genuinely confuse, such as parameter versus argument.
State what a core programming idea is, in your own words.
Putting a definition into one's own words shows whether a term is understood or merely recognised. Short, low-pressure definitions give an early, honest baseline before students read or evaluate code that depends on the idea.
Pair each technical term with the definition that fits it.
Recall of vocabulary is the base of the taxonomy, and matching tests several related terms at once, including the pairs novices mix up. The terms are anchored to a short code fragment so each definition can be checked against something concrete, and one extra definition fits no term so the last pair cannot be answered by elimination.
Say in plain English what a short fragment does.
Before students generate or accept code, they need a verbal model of behaviour. Explanation items make reading a first-class activity rather than a prelude to writing.
Predict output by simulating execution.
Tracing builds an operational mental model: what is true after each statement. Distractors are drawn from documented novice misconceptions rather than random wrong answers.
Name the problem the fragment is solving.
Students often describe syntax ('it uses a for loop') instead of purpose ('it finds the largest value'). Purpose items separate mechanism from intention — a distinction needed when judging AI-generated code that may be locally plausible but globally wrong.
State requirements clearly enough to specify a solution.
The learning goal is precise communication of behaviour — inputs, outputs, and edge cases — not prompt-engineering tricks. If a requirement is underspecified, generated code will guess.
Choose the fragment that completes a partly written program.
Application without a blank page: students apply a concept by deciding what the missing piece must be, which requires reading the surrounding code and the stated requirement. Distractors encode off-by-one, quoting and operator errors that generated code often contains.
Change existing code to meet a new requirement.
Most real programming, and most work with AI output, is changing code that already exists. Students must find the part of the code a new requirement touches and change only that, which is a different skill from writing a solution from scratch.
Find the fault and say why it matters.
Debugging is analysis: locating the mismatch between intended and actual behaviour. In an AI-rich setting this is the same skill used to inspect generated code.
Decide how two solutions to the same problem differ.
Generated code often arrives as alternatives. Comparing them means tracing both and finding the exact point where they diverge: analysis rather than recall.
Diagnose why a student's prediction is wrong.
Diagnosing why an answer is wrong needs a model of how a novice reasons. The same analytic skill is used to review explanations written by AI tools, which can be fluent and still wrong.
Improve a working but weak generated solution.
Synthesis here means revising an existing artefact: names, structure, edge cases. Students start from AI-like output so the task is judgement plus rewriting, not blank-page authorship.
Add functionality to working code, combining ideas.
Synthesis: combining concepts already met (variables, loops, conditions, lists, functions) to build something new on a working base, and reasoning about where the new code belongs.
Accept or reject a generated line, with a reason.
The pedagogically interesting moment is not generating code but deciding whether to trust it. Students practise evaluation: correctness, fit to the requirement, and a stated justification.
Judge working code and pick the most justified review comment.
Evaluating quality is different from checking correctness. Learners practise separating 'wrong' from 'could be better', and rejecting confident but unjustified criticism or praise, which is a core skill when reviewing generated code.