Grade 10 ยท Christian ยท NGSS/CCSS-aligned
This is a full year of computer science that starts with no assumptions about coding and ends with your child writing real Python programs and arguing, with evidence, about how computing affects people. They'll learn to think through problems step by step before ever touching code, then use Python as the notation for that thinking. Along the way they'll handle real data, learn how the internet actually moves information around, see how systems get attacked and defended, and finish by using everything to investigate a real-world tech-and-society question โ like whether an algorithm's unequal outcomes are a bug or something worse. Every tool is free and runs in a browser, so there's no software to buy or install.
The whole year, in plain English. Tap any unit to see every skill inside, nothing is hidden.
Before any coding, your child learns the five ideas that the entire rest of the course keeps reusing: algorithm, sequence, selection, iteration, decomposition, and abstraction. They practice by hand-tracing simple step-by-step instructions (pseudocode and flowcharts), not by writing code.
Students correctly define, in their own words, the six core terms of this unit, algorithm, sequence, selection, iteration, decomposition, and abstraction, matching each term to a short example given during Day 1-8 instruction.
Given a short pseudocode algorithm using only sequence, students correctly complete a trace table showing the value of every variable after each line executes.
Given a pseudocode algorithm containing one selection (if/else) or one iteration (loop) structure, students correctly trace it through a trace table, correctly updating the counter or condition variable at each pass.
Students correctly identify and label instances of sequence, selection, and iteration within an unfamiliar pseudocode or flowchart algorithm they have not seen before.
Given a pseudocode algorithm with a deliberately inserted off-by-one loop-boundary error, students trace the algorithm to locate the exact line and value at which the actual output diverges from the intended output, and explain in one sentence why that line causes the divergence.
Students decompose a stated real-world problem into an ordered set of named sub-steps at a level of detail sufficient for another student to diagram, and justify in writing why each boundary between sub-steps was drawn where it was.
Students explain, using a specific abstraction they did not encounter in class (e.g., a rideshare app's 'request ride' button, a thermostat's set-temperature dial, or a vending machine's item button), what detail is hidden from the user, why hiding that detail benefits the user, and one situation in which that hiding could put the user at a disadvantage.
Given two different correct decompositions of the same original problem produced by classmates, students compare the two decompositions and identify which one would be more robust if the problem's constraints changed slightly (e.g., the input list could now be empty), stating the specific constraint change that breaks one decomposition and not the other.
Students translate a given flowchart into pseudocode (or a given pseudocode listing into a flowchart) such that every box/line in one notation corresponds to an identifiable line/box in the other, without changing the underlying logic.
Your child starts actually writing Python: variables, if/elif/else, for loops, while loops. The point this unit hammers home is that most beginner mistakes are notation mistakes, not thinking mistakes โ a correct flowchart can still produce a Python crash, and that's a spelling problem, not a logic problem.
Given a short Python snippet using = for assignment, students predict the value stored in a named variable after each line executes, distinguishing assignment from mathematical equality.
Students trace a Python program containing sequential variable reassignment (e.g. a running total updated across several lines) and correctly state the final printed value.
Given an unseen if/elif/else block and a specific input value, students trace execution to determine which single branch runs and justify why the earlier branches did not.
Students classify a Python runtime error message (IndentationError, NameError, or TypeError) by its type and identify the specific line and likely cause without being told which error category it is.
Students write a for loop that iterates a specified number of times to accumulate a running total, given a new but structurally similar word problem not seen in class.
Given a while loop that never terminates, students identify why the boolean condition never becomes False and rewrite the loop so it terminates correctly.
Given a word-problem specification never seen in class, students decide unassisted whether the solution requires a conditional, a loop, both, or neither, and justify that choice before writing code.
Students write and run an original Python program from a word-problem spec that combines at least one conditional and one loop, then compare their program's actual run output to their own hand-traced predicted output and explain any discrepancy.
Students explain, in their own words using a specific traced example, why a program with correct algorithmic logic can still crash, distinguishing a syntax error from a logic error.
Your child moves from one-variable-at-a-time to lists: storing many values together and writing one loop that processes all of them, using the index as the link between position and value. It closes with cleaning a genuinely messy dataset with no rulebook provided.
Given a list and a target position, retrieve the correct 0-based index needed to access the first, last, and nth element.
Execute a for-loop that iterates over every element of a list and prints each value, without using an explicit index variable.
Compare the for-item-in-list pattern and the for-i-in-range(len(list))-with-list[i] pattern for the same task, and explain in writing when the index-based form is necessary rather than optional.
Classify a given code snippet that indexes into a list as either producing a valid access or triggering an IndexError, by comparing the index used to the list's valid index range.
Given a Python traceback showing an IndexError, infer the specific line and index value responsible for the failure and state what value would have been valid instead.
Implement an accumulation pattern (running total, running count, or running maximum) using a for-loop over a list, given only a problem statement and no skeleton code.
Predict, then verify by running code, whether the original order and removed values of a list survive after a sort() or filter operation, and state the general rule for when data is recoverable.
Given a novel dataset structure never used in this course (e.g., a list of dictionaries representing sensor readings with timestamps), design and write a cleaning-and-summary program that removes invalid entries, preserves a record of what was removed, and reports at least three summary statistics.
Given a real-world scenario where a filtered dataset is later needed for a purpose the filtering did not anticipate (e.g., a school later wants to know how many students scored exactly 0, but 0 was treated as invalid and discarded), argue what information was permanently lost and what design change would have prevented the loss.
Exemplify the difference between a list and a string as sequence types by identifying two operations (e.g., indexing, iteration) that work identically on both and one operation that does not.
Summarize, in a written explanation accompanying the summative program, one specific bug encountered, quoting the exact error message and explaining how its wording pointed to the fix.
Your child learns to name a repeated block of code as a function โ the same 'hide the detail, expose the name' move as Unit 1's abstraction and Unit 2's print()/input(). It ends with taking a messy 40-line program someone else 'wrote' and reorganizing it into functions.
Given a 5-8 line function definition with a docstring-free header, students state in one sentence what the function does (its contract) without reading its body line by line.
Students trace a program by hand, recording the value of each parameter and each variable at each function call and return, for a program with at least two nested function calls.
Students explain why a function that modifies a global variable inside its body produces different output than a caller expects, using a specific mis-scoped code example.
Given a duplicated-logic program from Unit 3 (the same 4-line block appearing 3 times with different variables), students identify which lines are truly identical across all three copies versus which lines merely look similar but differ in a way that matters for correctness.
Students write a function with at least one parameter and a return statement that correctly replaces a specified block of duplicated code, verified by running it against the original program's output.
Given an unfamiliar 40-line program students have not seen before, students propose a decomposition into 3-5 functions, name each function, specify its parameters and return value, and justify why each boundary was drawn where it was rather than elsewhere.
Students compare two different valid decompositions of the same program (one function-per-loop vs. one function-per-task) and explain what each version makes easier and harder to change later.
Students diagnose the specific cause of a broken program from among four seeded bug categories (missing return, mismatched argument order, mismatched argument count, scope confusion) by running it and reading the error or wrong output, without being told which category applies.
Given a program from a domain never used in this course (e.g., a recipe-scaling calculator or a simple grading-curve tool), students design a function-based decomposition from scratch and defend it in writing against a specific alternative decomposition a partner proposes.
Students refactor a given unstructured 40-line program into at least three functions with parameters and return values, extend it with one new feature using their new function structure, and write a rationale explaining why each function boundary was chosen over at least one plausible alternative.
Your child stops thinking of a file as 'a picture' or 'a song' and starts thinking of it as bits whose meaning depends entirely on which encoding rule is being used to read them. This covers binary place value, bytes, lossy versus lossless compression, and bias in how data gets collected in the first place.
Convert a positive whole number up to 255 between binary and decimal representation using place value.
Decode a given sequence of 8-bit bytes into ASCII text using a provided ASCII lookup table.
Explain why the same 8-bit pattern can correctly represent a number, an ASCII character, or a component of a color, depending on which encoding the reading program assumes.
Compare a lossless and a lossy compression approach applied to the identical short artifact by identifying what information is discarded in the lossy version and what is preserved in the lossless version.
Given a small, unfamiliar real dataset (CSV), identify at least one specific choice made during data collection or encoding that constrains what conclusions can validly be drawn from it.
Design an original small-scale binary encoding scheme (fewer than 8 bits) for a novel, self-chosen symbol set, and justify whether the chosen bit length is sufficient.
Classify a given real-world data collection scenario as an example of sampling bias, encoding bias, both, or neither, distinguishing it from a simple data-entry error.
Summarize, in the student's own words, the sequence of decoding steps used to turn a raw byte sequence into readable ASCII text.
This builds the layer picture of the internet: client and server, packets, IP addresses, DNS, routing, TCP/IP, HTTP/HTTPS, and the tradeoffs between bandwidth, latency, and fault tolerance. It closes by using free browser developer tools to trace what actually happens when a real web page loads.
Given a diagram of a network request, students correctly label each layer (client, DNS, IP routing, packet, server) using the standard term for each.
Students explain why a protocol is a set of agreed-upon rules rather than a physical device, using the turn-taking/etiquette analogy taught in class.
Given a scrambled set of index-tagged packet fragments (some delayed, none lost), students reconstruct the original message and explain why packet order at arrival does not need to match send order.
Students compare a network scenario with TCP's reliability guarantees against an otherwise identical scenario without them, and identify which specific behavior (retransmission of lost packets) accounts for the difference in outcome.
Students classify a set of short network scenarios by whether the described problem is best explained by bandwidth, latency, or fault tolerance, distinguishing cases that superficially resemble each other.
Using only free browser developer tools, students trace and annotate the actual sequence of steps (DNS lookup, IP routing, packet exchange, server response) that occurs when a real, previously-unexamined URL is requested.
Given a novel scenario describing a network failure that does not match any case discussed in class (e.g., a submarine cable cut affecting one region's routing), students predict which named layers are affected and which continue functioning, and justify the prediction using the layer model.
Given a scenario about responsibility when something on the internet causes harm, students construct an argument identifying which specific actor(s) in the layer chain (ISP, DNS provider, server owner, platform, or none uniquely) bore responsibility in a real, previously undiscussed incident, and defend the argument against the objection that decentralization means no one is responsible.
Students recall the definition of DNS as the system that translates human-readable domain names into IP addresses.
Students summarize, in their own words, why breaking a message into packets sent independently is more fault-tolerant than sending the entire message as one continuous stream, integrating the routing, packet-reassembly, and fault-tolerance concepts taught across the unit.
This unit asks whether any system can be fully secure and argues no โ anything that stores or moves data creates something attackable. It covers encryption (explicitly reframed as encoding with a secret key), human-layer attacks like phishing and social engineering, network-layer attacks like packet sniffing and man-in-the-middle, and the tradeoffs behind personal data collection and targeted ads.
Given a stored piece of plaintext and a simple substitution/XOR-style key example, students execute the encoding and decoding steps by hand to produce ciphertext and recover the original plaintext.
Students correctly recall the definitions of phishing, malware, social engineering, packet sniffing, and man-in-the-middle attack, matching each term to its one-sentence mechanism.
Given a short, previously unseen incident description, students classify which single attack category (human/social-engineering, network-layer, or encryption/key-compromise) it represents, citing the specific textual evidence that rules out the other two.
Students compare a genuine and a fabricated (phishing) message side by side and explain which specific, checkable features (sender domain, link destination, urgency framing) distinguish them, rather than relying on surface polish.
Students explain why a fully encrypted communication channel can still be compromised, by identifying the specific point in the data pipeline (key storage, key transmission, or an unencrypted endpoint) where a described breach actually occurred.
Before receiving the formal usability-cost-risk framework, students examine two contrasting real-world data-collection scenarios and generate their own criterion for what makes one collection practice more or less concerning than the other.
Given a completely novel data-breach report not discussed in class, students argue in writing whether the affected organization's security tradeoff was reasonable, using specific evidence from the report about cost, usability, and risk rather than asserting a general judgment of competence.
Students infer which specific personal data an unfamiliar app or service is likely collecting and why, based only on the app's stated functionality and permission requests, without being told the answer.
Students differentiate between a mitigation that closes a specific named vulnerability and a generic security recommendation that does not name what it blocks, when evaluating sample mitigation proposals.
The last 16 days pull everything together into one Python program and one written argument about a real computing system's effect on people. The central skill is telling apart three things: a bug, an unequal outcome with no evidence of intent (disparate impact), and an unequal outcome with evidence of intent (disparate treatment) โ and separately, realizing that a system 'working as specified' doesn't settle whether it should exist that way.
Given a real-world computing system's design description and de-identified outcome data disaggregated by group, the student correctly labels each of five provided claims about the system as supported by outcome evidence, supported by intent evidence, or unsupported by the given evidence.
Given a new, previously undiscussed case of an algorithmic system with both design rationale and outcome data, the student determines whether the available evidence supports a claim of bug, disparate impact, or disparate treatment, and identifies what additional evidence (if any) would be needed to support a stronger claim.
The student writes a function that takes a list of records (dictionaries or tuples) loaded from a real dataset and a group-membership key, and returns a per-group summary statistic (e.g., selection rate, average value) using iteration and conditionals from Units 2-3.
Given a dataset with a different shape or grouping variable than the one used in the worked example (e.g., three groups instead of two, or a numeric threshold instead of a category), the student adapts their disaggregation function to compute the correct per-group statistic without re-deriving the loop structure from scratch.
The student explains, in a labeled two-column comparison, one specific way the digital divide (unequal access to devices, bandwidth, or skills) could bias which population is represented in a given real-world dataset, using vocabulary from Unit 5 (data representation) and Unit 6 (network access).
Given two real open-source license summaries (e.g., MIT and a copyleft license), the student identifies at least one obligation each license imposes on someone who reuses or redistributes the code, and states which license would apply if the student redistributed a modified version commercially.
The student writes a structured argumentative paragraph evaluating whether a named real-world computing system 'should' exist in its current form, distinguishing this claim explicitly from whether the system 'works as specified,' and supporting the should-exist claim with cited evidence rather than stated opinion.
The student correctly uses at least four distinct pieces of vocabulary from four different prior units (e.g., iteration from Unit 3, function/parameter from Unit 4, encoding from Unit 5, protocol/packet or attack surface from Unit 6-7) in context within the written report, applying each term to the specific case rather than defining it generically.
Given a description of a data-collection system from a domain never discussed in class or offered on the report's case list (e.g., a municipal smart-traffic sensor network or a university wearable-fitness research study), with NO causal-chain diagram, worksheet, or framing question supplied, the student identifies whether and how unequal access to devices, connectivity, or digital skill could bias which people or places are represented in the resulting dataset, and names the specific access factor responsible using Unit 5/6 vocabulary without being told which prior concept applies.
From the parent guide
This is a full year of computer science that starts with no assumptions about coding and ends with your child writing real Python programs and arguing, with evidence, about how computing affects people. They'll learn to think through problems step by step before ever touching code, then use Python as the notation for that thinking. Along the way they'll handle real data, learn how the internet actually moves information around, see how systems get attacked and defended, and finish by using everything to investigate a real-world tech-and-society question โ like whether an algorithm's unequal outcomes are a bug or something worse. Every tool is free and runs in a browser, so there's no software to buy or install.
Unit 1 ยท what to expect
Before any coding, your child learns the five ideas that the entire rest of the course keeps reusing: algorithm, sequence, selection, iteration, decomposition, and abstraction. They practice by hand-tracing simple step-by-step instructions (pseudocode and flowcharts), not by writing code.
The full guide covers all 8 units: where kids get stuck, what to say, and how to tell it's working. Included with the course.
Ready when you are
Free for 30 days ยท then $29/mo or $290/yr for the whole family ยท Cancel anytime, no questions asked.
Start your family's account