For instructors and homeschool parents running FND-102. The course is self-runnable from the student-facing materials; this guide adds pacing context, common stumbling blocks, and grading guidance.
Course shape at a glance
| Item | Value |
|---|---|
| Total time | ~125 hours over 14 weeks plus a presentation block |
| Weekly time | ~9 hours student time (most weeks) |
| Lecture per week | 2 sessions ≤50 min |
| Lab per week | 1 session ~90 min |
| Independent practice | ~4 hr/week |
| Reading + reflection | ~1.5 hr/week |
| Audience | Foundation-stream students after FND-101; career changers; homeschool yr 10-12 |
| Prerequisites | FND-101 (Digital Foundations) |
| Hardware | None required |
| Cost | $0 |
| Capstone | Student-chosen automation tool with full deliverable bundle |
Cohort pacing recommendations
- Self-paced (one student): 14 calendar weeks is comfortable. Students with prior Python may move through weeks 1-3 faster; do not let them skip the lab artifacts.
- Homeschool (1-3 students, parent-led): 14 weeks at 1 module per week works well. Lectures run as discussions over the code; labs work side-by-side at the same computer.
- Classroom (10+ students): 14-16 weeks. Add a weekly lab session where students debug each other's code; peer help is especially valuable in weeks 3-4 (functions, mutability) and week 9 (debugging).
- Bootcamp (full-time, ~4 weeks): 125 hours fits in 20 working days at 6-7 hours/day. Aggressive but achievable. Use Saturday review sessions for the midterm-prep block.
- Night class (working-adult cadence): 2 evenings per week + Saturday morning lab. Over 14 weeks the per-week shape stays close to the standard but Saturday catches whatever the weekday evenings left unfinished.
Per-week pacing notes and common stumbling blocks
Week 1: Python syntax (variables, types, strings)
Pacing: the first lecture is heavier than later weeks because students are also adjusting to running Python from the terminal. Expect ~60 min for the install verification + first python3 REPL session before any lecture material lands.
Common blocks:
- Students who type
pythoninstead ofpython3on macOS get the system Python 2 (which is gone in macOS 13+ but persists in students' muscle memory from tutorials). Always:python3. - "Why are there single AND double quotes?" Both work; pick one and be consistent in a file. The PEP 8 style guide does not mandate one over the other (
https://peps.python.org/pep-0008/#string-quotes); the practical answer for the course is "use whichever is convenient and avoid mixing within one line." input()returns a string. Students who writeif input() == 5are confused when it never matches. Always convert:if int(input()) == 5.
What to watch: students who finish Lab 1 (temperature converter) without converting input() to a number got lucky with the test cases. Have them run python lab-1-temp.py and type not-a-number; the crash is the teachable moment.
Week 2: Control flow
Pacing: if / else are quick (most students have intuition from other contexts). while and for need the full lecture time. The distinction between for i in range(10) and for item in list is non-obvious; both lectures should reinforce that for walks any iterable.
Common blocks:
- Infinite loops in Lab 2 (guess-the-number) when students forget to decrement a counter inside a
whileloop. Teach Ctrl-C as a survival skill on day one. - Off-by-one in
range:range(10)is 0-9, not 1-10. Have students printlist(range(10))to internalize. - Loop control (
break,continue) is intuitive in lecture but rarely needed in Lab 2. Most students do not use it; that is fine.
Week 3: Functions, scope, docstrings
Pacing: function definition is fast; scope is slow. Students struggle with "the variable inside the function is not the variable outside the function." Use the id() function and the globals() / locals() dictionaries to make scope concrete.
Common blocks:
- Returning vs printing: students write
print(result)inside the function and then callresult = my_func(x)expectingresultto hold the printed value. It holdsNone. Distinguish:printdisplays;returnhands a value back to the caller. - Default mutable arguments (
def f(x=[])) are a famous Python gotcha; introduce in lecture as a warning, not a deep dive. - Docstrings vs comments: docstrings are part of the function (accessible via
help(my_func)andmy_func.__doc__); comments are not. Teach this with thehelp()REPL session.
What to watch: Lab 3 asks students to refactor Lab 2 into named functions. Students who refactored without changing the program's behavior (no new bugs introduced) understand functions; students whose refactored Lab 2 behaves differently from the original need pair-debugging.
Week 4: Lists and dictionaries
Pacing: lists are quick (students have list-like intuition from other contexts). Dictionaries take longer because the key / value distinction is genuinely new. Add tuples and sets as a single lecture appendix.
Common blocks:
- Mutability surprises:
a = [1, 2]; b = a; b.append(3); print(a)prints[1, 2, 3]. Students expectato be unchanged. Useid(a)andid(b)to show they are the same list. dict.get(key)vsdict[key]: the bracket form raisesKeyErrorif the key is missing;.getreturnsNone. Both are correct in different contexts; teach when to use which.- List comprehensions are introduced as syntactic sugar for a
forloop that builds a list. Do NOT introduce nested comprehensions in week 4; they are week 6 material at the earliest.
Week 5: File I/O
Pacing: straightforward. The with open(...) as f: idiom is the only non-obvious syntax. CSV and JSON are stdlib one-liners and take 15 minutes each in lecture.
Common blocks:
- Text-mode vs binary-mode reads. Students who open a binary file in text mode get a
UnicodeDecodeErrorand panic. Demonstrate the error in lecture so they recognize it later. - Newline handling:
\non Unix,\r\non Windows. Thecsvmodule handles this if you open withnewline=''. Teach the empty-newline argument explicitly. - "Where is my file?"; students who run
open('data.txt')and get aFileNotFoundErrorbecause they were in a different directory. Teachpathlib.Path.cwd()andos.path.abspath('data.txt')as the diagnostic.
Week 6: Modules and standard library
Pacing: this is the first week where the lab (Lab 6) is a refactor, not a build. Some students find the refactor harder than a build because they have to read their own week-5 code and understand it. Budget extra office hours.
Common blocks:
argparseis the biggest single chunk of new syntax in the course. Walk through one full example end-to-end (parser = argparse.ArgumentParser(),add_argument,args = parser.parse_args(),args.foo) before the lab.logginglevels: students set everything to DEBUG and drown in output. Teach the level hierarchy (DEBUG < INFO < WARNING < ERROR < CRITICAL) and the convention "INFO is the default for production; DEBUG is for the developer."- Module imports vs from-imports:
import osthenos.path.join(...)vsfrom os.path import jointhenjoin(...). Both work; the first is preferred for stdlib modules.
What to watch: Lab 6's --help output is the first place students experience CLI tool UX. A --help that reads like a sentence ("Scan a log file for ERROR lines and report counts.") is correct; a --help that reads like field names ("input output verbose") needs revision.
Week 7: Regular expressions
Pacing: regex teaching is high-variance. Some students get it in 20 minutes; others struggle the whole week. The course's discipline is "when to use regex, when NOT to"; push students toward str.split() and in for simple cases, and reserve regex for genuine pattern-matching.
Common blocks:
- Greedy vs non-greedy quantifiers (
.*vs.*?). Students rarely encounter this in week 7's IP-extraction lab; mention as a forward-pointer for week-9 log analysis. - Raw strings:
r'\d+'not'\d+'. The escape rules in regular strings cause bugs that look like correct regex but match nothing. Always user'...'for regex patterns. - "Why didn't my regex match?" The single most useful debugger is
re.findall(pattern, text)printed out. Teach it as the first move when a regex is wrong.
Week 8: Midterm
Pacing: the midterm is a 2-hour proctored practical. Students get a spec for a small argparse CLI tool (one they have not seen before) and must build it from scratch using only the Python standard library and their notes. No internet for the exam itself; the spec is precise enough that they should not need to look anything up.
Sample midterm specs (rotate):
- Build a CLI tool
wordcount.py FILEthat prints the word count, line count, and most-common-word for a passed file. Argparse must support--top N(default 1) to print the top-N most common words. - Build a CLI tool
csv-summary.py FILE COLUMNthat reads a CSV and prints the count, min, max, and mean of the numeric values in the named column. Errors if the column is non-numeric. - Build a CLI tool
dedupe.py FILEthat reads a text file and prints unique lines in order of first appearance. Support--ignore-case.
Grading: correctness 60%, argparse hygiene 20%, error handling 20%. A student who passes the exam can ship Lab 6 unaided.
Week 9: Subprocess and pdb
Pacing: subprocess is conceptually simple but full of subtle traps (quoting, shell injection, exit codes). Spend lecture time on subprocess.run with capture_output=True and text=True as the safe default.
Common blocks:
shell=Trueis convenient and dangerous. Demonstrate a shell-injection vulnerability in lecture; students who understand WHYshell=Trueis bad will avoid it.- Exit codes:
result.returncode == 0means success; nonzero means failure. Students who only checkresult.stdoutmiss failures. pdb: the four commands students need aren(next),s(step),c(continue),p variable(print). Anything else is forward-stretch.
What to watch: Lab 9's debugging exercise is the first time some students use pdb. Pair-debug in the lab session; the muscle-memory for "set a breakpoint, run, inspect, step" takes a few rounds.
Week 10: Git intermediate
Pacing: the workflow (branch, commit, push, pull-request, merge) is more important than any specific command. Students who completed FND-101's week 10 already have git init, git add, git commit, git push; FND-102 adds branches and the PR concept.
Common blocks:
- Branch naming: students create branches named
temp,test,try. Teach the conventionstudent-name/lab-N-featureearly; PR-style review depends on readable branch names. - "Where is my work?"; students who commit on
main, then check out a feature branch, do not see their commit. Teachgit log --all --oneline --graphas the diagnostic. - Merge conflicts terrify students; resolve one together in lecture so the first one they hit in Lab 10 is familiar.
Week 11: Hashing and integrity
Pacing: SHA-256 as a black box is fine for FND-102. The CSA-101 + SEC-101 progression deepens the cryptographic theory; here, the practitioner discipline ("hash the file before and after, compare digests") is the lesson.
Common blocks:
- "Should I read the whole file into memory?"; for SHA-256, yes for files under ~100 MB, no for larger. Teach the chunked-read pattern (
while chunk := f.read(65536): hasher.update(chunk)). - Hex digest vs byte digest:
hasher.hexdigest()returns a string;hasher.digest()returns bytes. Use the hex form for human display.
Week 12: HTTP and requests
Pacing: requests is the friendliest API in the standard ecosystem; students pick it up quickly. The harder lesson is API discipline: rate limits, error handling, JSON parsing.
Common blocks:
- API keys leaked into Git: a real risk. Lab 12 uses a no-key free weather API for that reason. Teach
.envfiles +.gitignoreas the discipline even when the lab does not require it. response.json()raises if the body is not JSON. Teachtry/exceptaround it.- Rate-limiting (429 responses): mention in lecture, not in lab. Students who care will look it up.
Week 13: Testing and READMEs
Pacing: pytest's "name a function test_* and assert" model is beginner-friendly. The conceptual leap is "what is worth testing?"; the answer for FND-102 is "the happy path + the most obvious edge case + one regression test for a bug you found."
Common blocks:
- Students write tests AFTER the code is "done" and discover that the code is hard to test. Teach the test-first pattern in lecture; do not require it in lab.
pytestdiscovery: tests must be in files namedtest_*.pyor*_test.py, and functions must betest_*. The discovery rules are pickier than students expect; showpytest --collect-onlyas the diagnostic.- READMEs: students conflate a README with a tutorial. The README answers three questions: what does this do, how do I install it, how do I run it. Three sections, ~150 words total, is the right length for an FND-102 tool.
Week 14: Capstone workshop
Pacing: mostly 1-on-1 scope-check meetings. Each student presents their proposed capstone in a 10-minute conversation: what is the real task, what would the tool do, what does "done" look like. The instructor's job is to push back on scope: most first-draft capstones are too ambitious. "Trim it" is the most common feedback.
Common blocks:
- "I don't have a real task to automate." Push: laundry chore rotation, sports stats scraping, weekly grocery-list generator from your meal plan, photo renaming, RSS feed digest. There is no shortage of real tasks; the student just has not noticed which ones repeat.
- "I want to use machine learning." Out of scope for FND-102. Redirect to AI-101.
- "I want to scrape this commercial website." Check the site's terms of service first; some forbid scraping. Redirect to a free API (weather, GitHub, public data) if needed.
Grading framework
The course uses three rubrics, weighted differently across labs and capstone:
Lab grading (1-7 + 9-13):
- Correctness (60%): the tool does what the spec says
- Argparse / CLI hygiene (20%):
--helpreads like documentation; error messages are user-friendly - Git history (20%): more than one commit; commit messages are sentences not "fix"
Midterm (week 8):
- Correctness (60%)
- Argparse hygiene (20%)
- Error handling (20%)
Capstone:
- Code quality + craft (40%): well-named functions with docstrings; the code reads like prose; no dead code
- Tests + docs (30%):
pytesttests cover the tool's behavior; README answers what / install / run - Reflective depth (30%): the demo includes one paragraph on the bug the student found and fixed, and one paragraph on what they would do differently next time
The capstone rubric weights reflective depth heavily because the academy is teaching practitioners, not coders. A capstone that ships clean code but cannot describe its own failure modes is incomplete.
Forward-pointer cross-references
When teaching, note these connections to downstream academy courses:
- Week 3 functions -> CSA-101 Ch 6 assembler is one big Python module; the function-decomposition discipline shows up there
- Week 5 file I/O -> SEC-101 forensic analysis assumes you can read CSV / JSON dumps from log aggregators
- Week 6 argparse -> PEN-101's offensive scripts are all argparse-based; the convention transfers exactly
- Week 7 regex -> NET-101 log analysis returns to regex for IP / URL extraction
- Week 9 subprocess -> HW-101 MCU-flashing wraps
avrdude/esptoolvia subprocess; same pattern - Week 9 pdb -> CSA-101 Ch 9 (compiler frontend) promotes pdb to mandatory because parser recursion makes print-debugging untenable
- Week 11 hashlib -> SEC-101's integrity-monitoring labs use this; ADV-101's malware-analysis labs use it for sample identification
- Week 12 requests -> NET-101's API-scraping labs use it; AI-101's LLM-API work uses it
- Week 13 pytest -> Every academy toolchain ships with
pytesttests; the discipline is universal
What to do if a student is stuck
The course's hardest weeks for non-prior-coders are 3 (functions), 4 (dict mutability), and 9 (debugging). Three rescue tactics:
- Pair-debug. Sit next to the student and narrate what you would type next. Resist the urge to type yourself; the student's hands stay on the keyboard.
- REPL it. Open
python3and have the student paste in just the failing line. The interactive shell collapses the feedback loop to seconds; whatever was broken in the script is usually obvious in the REPL. - Print everything. Before reaching for
pdb, addprintstatements above and below the failing line:print('about to call func', args)andprint('result was', result). The print-debugging discipline is correct most of the time; teachpdbfor the cases where it is not.
A student who reaches week 6 cannot articulate the function / scope / mutability model needs week-3 review, not week-6 catch-up. Send them back to Lab 3, not forward.
Pilot-cohort notes (to be appended after first run)
Empty in v0.1; populate after the first cohort completes the course.
Instructor guide v0.1.