Learn
Get better at programming on purpose, even while AI writes more of the code.
Start here
Every craft is learned the same way: imitate first, then improvise, and only then innovate. Programming is no exception. AI can hand you finished code at any stage, but not the understanding that comes from making it. Start with the path, then read why speed and understanding are different outputs:
-
Imitate, improvise, innovate: the stages every craft is learned in.
-
Comparing Use of AI vs Learning to Code Has Nothing to Do With Knowledge
Generated code makes you faster, but finished work and understanding are different outputs.
Paths
Over a decade of notes on how programmers get better: deliberate practice, useful friction, and writing to find out what you don’t understand yet.
Practice
-
There is no finish line, and no substitute for going through the process
-
Why the hard parts are the parts that teach
-
Which friction is toil, and which friction is the workout
-
Retelling Stories with Commit Diffs in My Head
If you can't narrate the change, you don't own it yet
-
Always Pay Attention to Implications of Technical Advice
Every snippet sells a worldview. You are responsible for what you learn
-
New Era of Small Software Shops
Big Tech is here to stay, but if they go full-LLM, full factory production, you will find care and craft and innovation elsewhere.
Learning with a Zettelkasten
-
Getting Over Frustratingly New Topics (Swift Concurrency) with a Zettelkasten
Swift Concurrency as the worked example: vocabulary, confusion, hypotheses, corrections
-
Zettelkasten for Programmers: Documenting Confusing with Swift.SendableMetatype
Start a note with the sentence you cannot explain yet
-
What’s a Zettelkasten Good for in the Age of Affordable LLM’s?
The method underneath all of this, and why generation doesn't replace it
Swift and AppKit craft
-
Why the tested AppKit patterns still pay off
-
Composition Over Inheritance in NSViews
Wrap the framework view and expose as little as you can
-
Refactoring bends the code again and again before the real change
-
Counter Drift and Entropy with Kaizen
Code changes faster than your model of it. Small, regular repairs
Work with me
-
One-on-one: code reviews, pair programming, and mentoring on what you're building.
-
Swift app development apprenticeship
Learn app development on real work, paid, from the job you have to the one you want.
Latest
All 931 postsReaching mastery has no clearly defined finish line, and in software crafting in particular, it is a ‘wicked’ environment because the rules and tools change under you all the time while everyone disagrees about what the goal is.
CLI for Your Notes in The Archive – Automated Zettelkasten (Usage) for Programmers
Exposing your notes with a CLI can help LLM’s and you both to discover connections. The tool I wrote for The Archive essentially offers a YAML API for my Zettelkasten.
Counter Drift and Entropy with Kaizen
The answer to entropy in things we build, of getting worse over time and not better, always has been to stay vigilant and impose order, even as the order changes.
Use a computer to be fast, use a computer to exercise the mind.
Does Bad Code in Your Context Window Misalign LLM Recommendations?
Can you effectively poison the well from which you drink your agentic Kool-Aid with the legacy code of yesteryear?