Forked from the MOOC Java Course by the University of Helsinki Java MOOC, The aim with this course is to provide the learner with:
- More practice exercises of varying difficulty
- A leaner, to the point, written content
Reason number one, I did not go to University, and I dropped out of school. I wanted to become a software engineer and what stood in my way for a long period of time was that, "I am too stupid" because of my clearly non-traditional background.
Today, I am a software engineer and I hold the same belief but that resilience and consistency matters much more.
My methodology of learning is simple. Practice, practice, practice. What worked for me to become a software engineer is 80% challenging yourself with practice, and 20% conceptual learning. My aim is to provide that access to practice, enough that your brain will go numb (I have completed all the exercises in this course).
Reason number two, I strongly dislike how wealth blocks people from STEM fields so here's a course for free built on top of the already great MOOC Java course by Uni of Helsinki.
If you have just cloned or forked this repository, follow these steps to get started immediately:
- JDK 17 or 21 (LTS): Verify your installed Java version:
java -version
- Git: For local version control and terminal practice.
Test that Gradle compiles and all existing tests pass:
./gradlew test(On Windows, use gradlew.bat test)
The repository separates conceptual guides, exercise starter code, and test suites:
src/
├── main/java/partXX/sYY<name>/
│ ├── <n>-<name>.md <-- Spoiler-free conceptual guide
│ └── exercises/ <-- Package: partXX.sYY<name>.exercises
│ ├── <ExerciseName>.md <-- Detailed specification & stdin/stdout table
│ └── <ExerciseName>.java <-- Clean starter template
└── test/java/partXX/sYY<name>/
└── exercises/
└── <ExerciseName>Test.java <-- Independent JUnit 5 test suite
- Read the Conceptual Guide: Open
src/main/java/partXX/sYY<name>/<n>-<name>.md. Guides are deliberately crafted with alternative examples so they never spoil the exercises. - Open the Exercise Spec: Read
exercises/<ExerciseName>.mdfor requirements and sample outputs. - Implement Solo: Write your solution in
exercises/<ExerciseName>.java. - Run Terminal Verification: Run the exercise's specific test suite:
./gradlew test --tests "partXX.sYY<name>.exercises.<ExerciseName>Test"
- Commit Your Work: Stage and commit your code via the terminal to build git fluency.
This repository is designed to be paired with an AI coding assistant (Antigravity, Claude Code, Cursor, Windsurf, Copilot, or local LLMs) acting as a Socratic Mentor.
All agent behaviors and core rules are specified in AGENTS.md (with synchronized shims in CLAUDE.md and GEMINI.md).
Specialized workflows live in .agents/skills/:
| Skill | Trigger / Command | Purpose |
|---|---|---|
mooc-create-md-and-exercises |
Scaffolding a new section | Scrapes Helsinki MOOC, modernizes Java advice (LTS standards), redacts spoilers from conceptual examples, generates exercise specs/starters, builds JUnit 5 tests, and calibrates 1–7 star difficulty ratings. |
mooc-verify-exercise |
"Look, I finished this" or /mooc-verify |
Audits test suites for cheat loopholes (hardcoded outputs, missing boundaries), hardens JUnit 5 tests, verifies execution with Gradle, and delivers Socratic code reviews. |
Tip
Progress Tracking: Tracking style is left entirely to the learner. You can use local notes (e.g. Obsidian, markdown logs, or the roadmap checklist below).
To ensure genuine mastery and eliminate copy-pasting:
- No Free Answers: The AI mentor provides mental models, invariant checks, and pseudocode flow—never raw Java implementation code.
- Standardized Star Calibration: Exercises follow a 1–7 difficulty scale. The standard MOOC curriculum is capped at 3–4 stars; custom progressive overload drills scale from 5 to 7 stars.
- Automated Verification: Rather than relying on broken or rigid remote runners, all logic is verified locally with custom JUnit 5 test suites.
- Terminal Autonomy: All git commands and test invocations are run by the learner.
- Part 1.1–1.6: Getting Started (Printing, Variables, Conditionals)
- Part 1.65: Applied Logic & Problem-Solving Drills (In Progress)
- Part 2: Repeating Functionality (Loops & Methods)
- Part 3: Lists and Arrays
- Part 4: Object-Oriented Programming (OOP)
- Part 5: Overloading and Objects in Lists
- Part 6: Objects within Objects (Testing)
- Part 7: Programming Paradigms & Algorithms
- Part 8: HashMaps and Data Organization
- Part 9: Inheritance and Interfaces
- Part 10: Useful Techniques (Streams & Regex)
- Part 11: Exceptions and File Processing
- Part 12: Type Parameters
- Part 13: Graphical User Interfaces (JavaFX)
- Part 14: Data Visualization
- Official Course: University of Helsinki Java Programming
- Agent Instructions: AGENTS.md | GEMINI.md | CLAUDE.md
Record notes here whenever you hit a major conceptual roadblock and break through:
- Part 1.1: Realized that
System.out.println()requires a semicolon at the end, and text must be wrapped in double-quotes to be treated as a String parameter. - Part 1.6: Discovered De Morgan's Laws: inverting
a && bbecomes!a || !b, which makes guard clauses and early rejection checks much cleaner.