Hacking with AI - December 2025
General
-
Keep It Simple
- There are lots of “fancy” ways to use ai; some of them are neat, but none or very few are essential. Most will be useless in a few months. Everyone is either playing around, trying to “make their mark”, or make money off ai; very few actually know what they’re doing (me included) and it’s easier than ever to spin up some code just to try out an idea so there’s a lot of slop.
- Start with the core tools and only add things that fill in important gaps; everything else is probably gravy.
- Over-engineering is still the primary bane of software engineering.
- Use a CLAUDE.md / AGENTS.md / copilot-instructions.md
- For a project; it acts as a static memory of your mental direction that is sticky between sessions.
- Globally (~/.claude/CLAUDE.md); it acts similarly but in terms of your general opinions on how you want to work with the agent and how you want it to act.
- slash commands are basically function encapsulation
- Claude Skills are neat, but don’t worry about them much at first
- subagents feel overcomplicated; add too much complexity IMHO; and will likely morph into something automatic in the future.
- There are lots of “fancy” ways to use ai; some of them are neat, but none or very few are essential. Most will be useless in a few months. Everyone is either playing around, trying to “make their mark”, or make money off ai; very few actually know what they’re doing (me included) and it’s easier than ever to spin up some code just to try out an idea so there’s a lot of slop.
-
Plan, plan, plan
- The effectiveness of LLMs is directly correlated with the amount of context and direction you provide them.
- Better specs (e.g. well written Tickets) = better results (“spec driven development”)
-
Context is still king
- Starting a new session or eventual compaction destroys a model’s “memory”; i.e. everything the model “learned” during the session is lost and one has to start all over to an extent.
- Steve Yeggae’s Beads tools is a solution for this (after getting comfortable with the core tools).
-
Limit MCP Usage
- MCP tools tend to use way too many tokens/context, not to mention security concerns.
- Almost all MCP tools can be replaced with cli tools
- CLI tools give llms super powers
- i.e. The only MCP tools I currently use are brave_search (due to bot blocking of claude web searches), and playwright (same reason pretty much). And I’ll likely replace playwright with the cli version.
-
Use Plan Mode
- With claude code specifically; Codex seems to do this fairly well without explicit direction from early feels.
- i.e. If not in plan mode, claude has a tendency to just go-for-it, possibly before you’re ready.
-
YOLO mode within Docker containers
- I’m still learning how these tools work so mostly don’t mind lots of manual approvals, but this is likely the way to not have to worry much about it destroying your system, and avoiding approval-fatigue (beware network requests though).
-
We’re all leads/managers now:
- i.e. we all now have a small team of tireless junior devs, and research assistants.
-
Using AI for coding is a different muscle
- AI assisted software engineering requires a shift in thinking, in many ways it’s a new muscle that will require time and practice to build; and requires a perhaps somewhat painful change in thinking and workflow.
General Usage / tools
Command Consoles
- Claude Code / Codex (they’re reasonably interchangeable)
- or Crush / OpenCode / etc for the adventurous (local models work too!)
- claude-code-router is neat for trying other models and still use CC.
- I use a “scratchpad” terminal window that I can summon and hide with a single keypress; this is my “conversational claude code instance”
- use multiple instances via tmux
One off queries
- Simon Willison’s
llmfor quick one-offs - Chatgpt/Claude web ui for conversation history
Management/Organization
- Tmux
- It just makes it so much easier to manage a bunch of multiple instances / terminal windows.
- git (of course)
- Steve Yeggae’s Beads for persistent memory and todo organization (optional)
Concrete Usage
- analysis of code (understanding and planning)
- research (e.g. architecture/best practices)
- stringing together shell commands for data manipulation (jq/sed/awk/bash/aws-cli/etc are awesome; remembering all their syntax is awful)
For the “typing” part of coding (the smallest part of software engineering):
- They are fantastic for one-shot’ing small sections of code. With current models, and general dev work (which let’s be honest, is 95% of what we all do), there’s not much they can’t do with good human direction and oversight (experience/expertise, and most important, holistic context of the problem domain)
My silly little vibe-coded virtual pet project: https://github.com/jonaustin/vpet/ i.e. Find some project for yourself that isn’t important but gives you something meaty to concretely play with.
The CLI Strikes Back
Unix / CLI tools have never been more readily useful.
I’ve generally not pushed folks to live in the terminal like I do, because it requires so much practice and memorization of arcane commands to be effective that only someone who really wants to do that will succeed.
But with LLMs, really anyone can be proficient on the CLI, and the humble | operator to pipe streams of text to focused processing commands is still the Killer App of software engineering.
- e.g. csv or log processing / filtering
- e.g. https://adamdrake.com/command-line-tools-can-be-235x-faster-than-your-hadoop-cluster.html
Obligatory note
None of this post was written by AI, any dumb thoughts are fully my own doing.