The Agentic Test Pyramid
The test pyramid sorts tests by scope. That breaks the moment a model is part of your system. ]]>
Continuous improvement of software and people
The test pyramid sorts tests by scope. That breaks the moment a model is part of your system. ]]>
Every platform team lives between two failure modes: say yes to everything and drown in custom code, or say no to everything and watch your users route around you. ]]>
Most developers use AI agents to ship faster. Fewer use them to learn faster. That’s the bigger missed opportunity. ]]>
Everyone’s optimizing for speed. Faster deployments, faster iterations, faster code generation. But speed without direction is just expensive wandering. ]]>
In agentic engineering, humans don’t need to read every line of code anymore. What matters is whether the change solved the problem. ]]>
Your expertise is a deployable artifact. A well-written SKILL.md file means anyone can spin up an AI agent that carries your judgment, your patterns, and your opinions into their codebase. ]]>
Use AI agents to break your app in ways your scripts won’t. ]]>
The more I use AI-assisted tools, the more I realize the real work isn’t writing features faster. It’s teaching the tools better. ]]>
I’ve been using Claude Code with agent teams in a tmux terminal, and it fundamentally changes the development workflow. ]]>
If coding agents are going to be useful, they need the same thing humans do: fast feedback. ]]>
Most command-line tools still work like it’s 1995. But what if your CLI could think? ]]>
Dex Horthy’s “No Vibes Allowed” talk nailed it: AI agents are stateless. The only way to get better output is better context in. ]]>
AI never would have installed left-pad. It would have written its own in five lines, added three tests, and moved on. ]]>
I love writing code. But the point has always been to solve real problems for real users. ]]>
Earlier this week a vibe-coded Google Calendar app went semi-viral. I was excited about it, but also worried about how loose most of these projects are with security. ]]>
AI writes almost all my code now. It’s fast, confident, and occasionally wrong in subtle ways. ]]>
I slipped a prompt injection into my LinkedIn “About” section to see which recruiters were actually bots. The results were both hilarious and revealing. ]]>
The more I work with AI coding tools, the more I think context window management is the skill nobody talks about, and the one that matters most. ]]>
I built git ai-commit because I was tired of writing commit messages that said nothing useful, and I knew Claude could do better with the diff right in front of it. ]]>
Your tests that make network requests are, by definition, flaky tests. ]]>
Over-engineering is just future-proofing gone too far. ]]>
A platform is a raised level surface on which people or things can stand. That definition is the whole philosophy of platform engineering in one sentence. ]]>
Mikhail Parakhin said something recently that stuck with me: “Ship as fast as possible, but not faster.” It’s a paraphrase of Einstein’s famous line about simplicity, and it captures the same essential tension. ]]>
PEP 20 got it right. “Sparse is better than dense.” Code packed too tightly is hard to read and easy to misinterpret. Whitespace isn’t wasted space. It’s how you communicate intent. ]]>
Deeply nested code is a readability tax. Every level of indentation is another thing the reader has to hold in their head. ]]>
I always found it difficult to summarize my impact during review cycles. So I built Reflect to do it for me. ]]>
Complexity is the cost of solving a real problem. Complication is the cost of solving it badly. PEP 20 draws a clear line between the two: “Complex is better than complicated.” ]]>
PEP 20’s most quoted line is also its most ignored. Everyone agrees that simple is better than complex. Almost nobody writes simple code on the first try. ]]>
Implicit code hides decisions. Explicit code puts them where they belong: right in front of you. ]]>
I came across some weird behavior today when running PostgreSQL queries with dates. Specifically when using BETWEEN to search for records that are within some date range. It turns out, the BETWEEN comparison predicate behaves differently for the date type as it does for the timestamp type. ]]>
Due to a bug fix or maybe a new feature to Docker Compose, I caught myself yak shaving how Docker and Docker Compose handle local networking. ]]>
This is the first part of a multi-part series I want to start titled “Understanding Clojure”. Often times I come across Clojure code that can be refactored a bit better or even there’s an existing function to do X . Hopefully I can shine some light on some aspects of Clojure you didn’t know existed. ]]>
When optimizing datomic queries, it’s best to put the most restrictive clauses first. This lets the datomic query engine do less work. ]]>
I was inspired to try growing an avocado tree after some new friends mentioned theirs. As I was about to cut open my daily avocado this morning for breakfast, I figured I would give it a shot. I mean, we do have four empty planters on our deck we need to fill. ]]>
Datomic does not allow the storage of null values. We must reconcile which values were edited and which values were emptied. The emptied values must be retracted. ]]>
Importing and requiring Clojure protocols has its tricks. There are some edge cases you must be aware of when using them from separate namespaces. ]]>
Mixpanel is great for tracking and analyzing user behavior within your application. Here, I will show how to mock out the JavaScript agent to keep from sending events during local development. ]]>
Protocols are Clojure’s way of defining Java interfaces. Here, I will show how to define protocols and how to implement them. ]]>
When writing tight unit tests, you should use the Null Object Pattern to isolate the method under test. Here is a helper class I would use when writing unit tests in Groovy. ]]>
Oftentimes I see programmers get a little “Extract Constant” happy. Here, I will discuss some of the scenarios in which I believe it is okay to use constants and when it is not okay to use constants. ]]>
Hello world! Every engineer’s first program, and now my first blog post. ]]>