| tags |
|
|---|
Goal: Work through the Clean Code video series and the Anthropic Claude Code in Action course at a steady, sustainable pace — and build a rich linked knowledge graph of notes along the way.
How notes work: After each video or lesson, create a new note using the [[_Templates/Video Note Template]] and save it inside
Notes/. Fill in the connections section — even one[[link]]makes a visible difference in the graph. See the [[_Graph/Graph Legend]] for how the tags and links work.
| Week | Theme | Clean Code Focus | Anthropic Course |
|---|---|---|---|
| 1 | Foundations | Intro & naming principles | Course Overview |
| 2 | Functions | What makes a good function | Getting hands on (pt. 1): setup & context |
| 3 | Structure & Form | How code should look and feel | Getting hands on (pt. 2): MCP & GitHub |
| 4 | TDD & Architecture | Testing and big-picture design | Hooks and the SDK |
Theme: What is clean code and why does naming matter?
- [[01 - Introduction]]
#week/1#topic/naming#source/clean-code - [[02 - Clean Code (Remake)]]
#week/1#topic/naming#source/clean-code - [[03 - Names++]]
#week/1#topic/naming#source/clean-code
- [[CC01 - Introduction]]
#week/1#topic/claude-code#source/anthropic - [[CC02 - What is a coding assistant?]]
#week/1#topic/claude-code#source/anthropic - [[CC03 - Claude Code in action]]
#week/1#topic/claude-code#source/anthropic
Codebase: lodash
Lodash is one of the most widely-used JavaScript utility libraries and has excellent naming conventions. It's small enough to navigate but rich enough to study.
Tasks:
- Clone the repo:
git clone https://github.com/lodash/lodash.git - Open
src/and pick 5 functions. For each one, answer: Does the name tell you exactly what it does without reading the body? - Find one function whose name you think could be better. Write a short note explaining why and what you'd rename it to.
- Try Claude Code: open the repo and ask
"Explain the naming conventions used in this codebase". Compare its analysis to your own. - Save your write-up as
Exercises/Exercise - Week 1 - [your name].md
Theme: Functions are the basic unit of clean code — learn to write them well.
- [[04 - Functions]]
#week/2#topic/functions#source/clean-code - [[05 - Functions Screencast — Testable HTML]]
#week/2#topic/functions#source/clean-code - [[06 - Functions Screencast — Prime Generator]]
#week/2#topic/functions#source/clean-code - [[07 - Functions Screencast — Video Store]]
#week/2#topic/functions#source/clean-code
- [[CC04 - Claude Code setup]]
#week/2#topic/claude-code#source/anthropic - [[CC05 - Project setup]]
#week/2#topic/claude-code#source/anthropic - [[CC06 - Adding context]]
#week/2#topic/claude-code#source/anthropic - [[CC07 - Making changes]]
#week/2#topic/claude-code#source/anthropic - [[CC08 - Course satisfaction survey]]
#week/2#topic/claude-code#source/anthropic - [[CC09 - Controlling context]]
#week/2#topic/claude-code#source/anthropic - [[CC10 - Custom commands]]
#week/2#topic/claude-code#source/anthropic
Codebase: axios
Axios is the most popular HTTP client for JavaScript. Its source code (~2,000 lines) is a masterclass in small, single-purpose functions.
Tasks:
- Clone the repo:
git clone https://github.com/axios/axios.git - Open
lib/core/Axios.js. Count the number of functions. How many do more than one thing? - Find a function longer than 20 lines. Use Claude Code to refactor it:
"Refactor this function to follow the single responsibility principle". Review and critique the output. - Write a note: What patterns from this week's videos did you actually see in the axios source?
- Bonus: Submit a real PR to axios if you find a genuine improvement (their CONTRIBUTING guide is beginner-friendly).
- Save your write-up as
Exercises/Exercise - Week 2 - [your name].md
Theme: Good code has a visual and structural rhythm.
- [[08 - Function Structure]]
#week/3#topic/structure#source/clean-code - [[09 - Function Structure Screencast — Stack]]
#week/3#topic/structure#source/clean-code - [[10 - Form]]
#week/3#topic/structure#source/clean-code - [[11 - Form Screencast — Lychrel]]
#week/3#topic/structure#source/clean-code
- [[CC11 - MCP servers with Claude Code]]
#week/3#topic/claude-code#source/anthropic - [[CC12 - Github integration]]
#week/3#topic/claude-code#source/anthropic
Codebase: express
Express.js is the gold standard of clean, readable Node.js code. The entire framework is under 5,000 lines — intentionally minimal and beautifully structured.
Tasks:
- Clone the repo:
git clone https://github.com/expressjs/express.git - Read
lib/application.jstop to bottom. Note: the file reads almost like a prose document. Why? - Pick any file in
lib/and draw (or describe) its vertical structure: how much is at the top level? How deeply nested does it go? - Use Claude Code with MCP integration (from this week's Anthropic module): connect Claude Code to GitHub and ask it to
"Review the structure of lib/router/index.js and suggest improvements based on clean code principles". - Save your write-up as
Exercises/Exercise - Week 3 - [your name].md
Theme: Tests drive better design; architecture shapes the whole system.
- [[12 - TDD — Part 1]]
#week/4#topic/tdd#source/clean-code - [[13 - TDD — Part 2]]
#week/4#topic/tdd#source/clean-code - [[14 - Architecture, Use Cases and High Level Design]]
#week/4#topic/architecture#source/clean-code
- [[CC13 - Introducing hooks]]
#week/4#topic/claude-code#source/anthropic - [[CC14 - Defining hooks]]
#week/4#topic/claude-code#source/anthropic - [[CC15 - Implementing a hook]]
#week/4#topic/claude-code#source/anthropic - [[CC16 - Gotchas around hooks]]
#week/4#topic/claude-code#source/anthropic - [[CC17 - Useful hooks!]]
#week/4#topic/claude-code#source/anthropic - [[CC18 - Another useful hook]]
#week/4#topic/claude-code#source/anthropic - [[CC19 - The Claude Code SDK]]
#week/4#topic/claude-code#source/anthropic
- [[CC20 - Quiz on Claude Code]]
#week/4#topic/claude-code#source/anthropic - [[CC21 - Summary and next steps]]
#week/4#topic/claude-code#source/anthropic
Codebase: jest
What better way to study TDD than to read the source of the testing framework itself? Jest's packages folder contains real TDD in action.
Tasks:
- Clone the repo:
git clone https://github.com/jestjs/jest.git - Open
packages/jest-each/src/— a self-contained package. Read the tests in__tests__/before reading the source. Try to guess the implementation from the tests alone. - Pick one package. Use Claude Code's SDK to write a small script that asks Claude Code to
"Identify the architectural boundaries in this package and explain which layer each file belongs to". - Reflect: Did the tests you read actually drive a better design? What evidence do you see in the code?
- Bonus: Write one new test for any jest package and submit it as a PR.
- Save your write-up as
Exercises/Exercise - Week 4 - [your name].md
These are alternative exercises for each week, covering Go, Java, Python, and Rust. Pick the language you know (or want to learn) — the clean code lessons apply identically across all of them. You can do one language or all of them. Contribute your write-up as
Exercises/Exercise - Week N - Lang - [your name].md.
Codebase: spf13/cobra
Cobra is the CLI framework behind Kubernetes, Hugo, and GitHub CLI. The Go standard library is famous for terse but precise naming — cobra exemplifies this at the library level.
Tasks:
- Clone:
git clone https://github.com/spf13/cobra.git - Open
command.go. Go naming avoids redundant context — e.g. a method onCommandis never namedCommandRun, justRun. Find 5 names that follow this rule and 1 that you think breaks it. - Compare Go's naming style (short, no underscores, context-from-type) to the JS style in lodash. Write a paragraph on the trade-offs.
- Ask Claude Code:
"What are the naming conventions in this Go codebase and how do they compare to Uncle Bob's rules?"— Go idioms sometimes conflict with Uncle Bob; document where and why.
Codebase: google/guava
Google Guava is the gold standard of Java library design. It's also a study in how verbose Java naming can become — and when that verbosity is actually helpful.
Tasks:
- Clone:
git clone https://github.com/google/guava.git - Open
guava/src/com/google/common/collect/and pick any 3 classes. Java names tend to be long and fully qualified — does the length add clarity or noise? - Find a method whose name you think is too long. Propose a shorter alternative and argue whether it would be better or worse in context.
- Ask Claude Code:
"Identify any naming inconsistencies across the classes in this package".
Codebase: gin-gonic/gin
Gin is the most popular Go web framework. Go encourages small functions and explicit error returns — gin shows what this looks like at scale.
Tasks:
- Clone:
git clone https://github.com/gin-gonic/gin.git - Open
context.go. This is gin's core file. How long are the functions? Go convention favours shorter functions than Uncle Bob even — does gin follow that? - Find a function that takes more than 3 parameters. In Go, this is often a sign something is wrong. Use Claude Code:
"Suggest how to reduce the parameter count of this function using idiomatic Go". - Compare gin's error-handling pattern (multiple return values) to JavaScript's try/catch. How does the language shape function design?
Codebase: psf/requests
Requests is the most downloaded Python package ever and is famous for being "HTTP for Humans." Its source is a case study in making complex behaviour feel simple through function design.
Tasks:
- Clone:
git clone https://github.com/psf/requests.git - Open
requests/api.py— the public-facing API. It's very short. Why? Where does the actual work happen? - Trace the call chain from
requests.get()all the way down to the socket. Count how many functions are involved. Does each one do exactly one thing? - Ask Claude Code:
"Draw the call chain from requests.get() to the underlying urllib3 connection and label each function's single responsibility".
Codebase: BurntSushi/ripgrep
Ripgrep is one of the most respected Rust codebases in existence. It's fast, correct, and beautifully structured. Rust's module system enforces clean boundaries in a way no other language does.
Tasks:
- Clone:
git clone https://github.com/BurntSushi/ripgrep.git - Open the
crates/directory. Each crate is a hard architectural boundary — map out what each one is responsible for. This is Uncle Bob's "use cases and layers" made concrete by the compiler. - Open
crates/core/src/search.rs. Read the file from top to bottom. Does it read like prose? Where does it break down? - Use Claude Code with MCP:
"Map the architectural layers in this Rust workspace and identify which crates correspond to Uncle Bob's entities, use cases, and interface adapters".
Codebase: spring-projects/spring-framework
Spring is one of the most architecturally deliberate Java projects ever built. It's also famously complex — which makes it a perfect case study in how structure can help or hurt readability.
Tasks:
- Clone:
git clone https://github.com/spring-projects/spring-framework.git - Pick one module (e.g.
spring-coreorspring-web). Open itssrc/main/java/tree. Notice how deeply packages are nested. Does the depth help or hurt navigation? - Find a class that has grown too large (over 500 lines). Use Claude Code:
"Identify the responsibilities of this class and suggest how to split it following the single responsibility principle". - Write a note: What does Java's verbosity do to form? Is it always noise, or sometimes signal?
Codebase: stretchr/testify
Testify is Go's most popular testing library — the direct equivalent of Jest. Reading its source while studying TDD gives you the same meta-insight as studying jest in JavaScript.
Tasks:
- Clone:
git clone https://github.com/stretchr/testify.git - Open
assert/assertions.go. Every assertion is a small, single-purpose function. Count how many there are. How is the file structured so it doesn't become unreadable at that length? - Open
assert/assertions_test.go. The tests test the testing library — read 10 of them before reading the corresponding implementation. Were you able to predict the code? - Ask Claude Code:
"Identify the architectural layers of the testify library and explain how the suite, assert, require, and mock packages relate to each other".
Codebase: junit-team/junit5
JUnit 5 is the ground-up rewrite of Java's oldest testing framework. The rewrite was explicitly guided by clean architecture principles — which makes reading it alongside Uncle Bob's architecture lecture particularly rewarding.
Tasks:
- Clone:
git clone https://github.com/junit-team/junit5.git - Open the
junit-platform-engine/module. This is the core abstraction layer. Notice it has no dependencies on any specific test runner — it's a pure use-case layer. How does this map to Uncle Bob's dependency rule? - Find a test inside
junit-jupiter-engine/src/test/and read it before reading the source it's testing. Could you have written the implementation from the test alone? - Ask Claude Code:
"Show how junit5's module structure maps to the Clean Architecture dependency rule — which modules are the core, which are the adapters?".
Codebase: pytest-dev/pytest
Pytest is Python's dominant test framework and has a beautifully plugin-based architecture. Its internals are a lesson in designing for extensibility without sacrificing clarity.
Tasks:
- Clone:
git clone https://github.com/pytest-dev/pytest.git - Open
src/_pytest/and readhookspec.py. Pytest's whole architecture is driven by a hook system — every extension point is declared here. How does this shape the rest of the codebase? - Pick any plugin in
src/_pytest/(e.g.capture.pyortmpdir.py). Read its tests intesting/first. - Ask Claude Code:
"Explain pytest's plugin architecture and identify which files represent the core domain vs. the plugin boundary vs. the built-in adapters".
- Clean Code videos:
/Users/admin/Study/ - Anthropic — Claude Code in Action: https://anthropic.skilljar.com/claude-code-in-action
- Note template: [[_Templates/Video Note Template]]
- Graph guide: [[_Graph/Graph Legend]]
Created: 2026-03-12 · See CONTRIBUTING.md on GitHub for how to add your notes