Every week, another breathless headline declares software engineering dead. Another AI demo shows a chatbot building a full-stack app in 90 seconds. Another LinkedIn thought leader posts a funeral wreath emoji next to the words "traditional coding." And every week, I watch senior engineers at real companies quietly doing something that looks nothing like those demos. They're not typing code line b
By Simeon Griggs Houseplants often die from over-watering, not neglect. It is easy to project human needs onto them: "If I am thirsty, they must be thirsty too." But many indoor plants actually benefit from drying out between waterings. Similarly, your empathy can lead to misinterpreting signals from your database. You don't like feeling overwhelmed, so you don't want your database overwhelmed eit
So far, we’ve covered: why MCP exists what MCP is what tools are Now let’s answer a key question: When the model decides to use a tool… who actually runs it? An MCP server is: The component that exposes tools and executes them. An MCP server is not just your backend. It is: a layer on top of your backend designed specifically for LLM interaction It has three main responsibilities: It tells the sys
Lately, I’ve been reflecting on something: The question for most developers is no longer "Are you using AI?", but rather "How and why are you using AI?". I’ve noticed AI tooling becoming increasingly embedded in my daily workflow. At this time last year, my usage of AI was limited to code autocomplete suggestions in my IDE that I would manually validate. Now I am using coding assistants to help id
Every few years the industry rediscovers that programming languages are not religions. Then we immediately behave like they are religions. Someone posts a benchmark. Someone else says memory safety. Someone says developer experience. A distributed systems person appears from under a bridge and whispers “Erlang solved this in 1998.” A startup founder announces they are rewriting their CRUD app in R
PostgreSQL Query Rewriting Techniques The previous articles in this series covered performance problems you fix by adding indexes, restructuring joins, or tuning memory. This one is about the queries where the plan is "fine" — every node is doing something reasonable — but the query itself is asking the wrong question, producing unnecessarily large intermediate results or forcing the planner dow
An opinionated list of Python frameworks, libraries, tools, and resources
Becoming a tech lead was the goal from pretty early in my career. I had a clear picture of what the role was. More responsibility, more influence over the work, more of the interesting problems landing on my desk because someone had to figure them out and that someone, finally, would be me. It read like the natural next step. The thing you graduate to once you're good enough. What that picture did