Archive

1046 posts · Page 4 of 88. ← Blog

Pratik Dhanave · ·6 min read

LangChain in Production

The gap between a LangChain demo and a LangChain production system is the same gap as any LLM application — observability, evaluation, cost, and reliability — and LangChain's answer is LangSmith plus the discipline the rest of your engineering already has. This closing post covers operating LangChain applications and the honest verdict on when to use the framework.

The gap between a LangChain demo and a production system is the same as any LLM application — observability, evaluation, cost, and reliability — and LangChain's answer is LangSmith plus the discipline your engineering already has.

Pratik Dhanave · ·6 min read

Pydantic AI in Production

A framework earns its place not in the demo but in production — under real traffic, real failures, and the need to observe, control cost, and evolve. Pydantic AI's typed, testable design carries into production well, and paired with observability and the model-agnosticism it's had all along, it makes agents you can actually operate. This closing post covers taking a Pydantic AI agent live.

A framework earns its place in production — under real traffic, failures, and the need to observe, control cost, and evolve. Pydantic AI's typed, testable design carries into production well, paired with observability and model-agnosticism.

Pratik Dhanave · ·5 min read

The Git Object Model

Git looks like a tool for tracking changes, but underneath it is something simpler and stranger: a small content-addressed key-value store. Four object types — blob, tree, commit, tag — are all it keeps, each named by the hash of its own bytes. Once you see that everything else (branches, history, staging) is a thin layer over these four objects, Git stops being a bag of memorized commands and becomes a system you can reason about.

Underneath the commands, Git is a small content-addressed key-value store built on four object types — blob, tree, commit, tag — each named by the hash of its own bytes. Seeing that everything else is a thin layer over these objects turns Git from memorized incantations into a system you can reason about.

Pratik Dhanave · ·7 min read

Positioning and Messaging

Positioning is the answer to a question every customer asks in the first five seconds: "what is this, and is it for me?" Get it right and everything else — your website, your sales pitch, your ads — writes itself and lands. Get it wrong and no amount of clever marketing compensates, because you're fluently communicating the wrong thing. Positioning is the most leveraged and most neglected decision in go-to-market, and engineers get it wrong in a predictable way: by describing what they built instead of what it's for.

Positioning is the answer to a question every customer asks in the first five seconds: 'what is this, and is it for me?' Engineers get it wrong in a predictable way — by describing what they built instead of what it's for. It's the most leveraged and most neglected decision in go-to-market.

Pratik Dhanave · ·7 min read

Threads and Concurrency

A thread lets one process do several things at once — and the moment you have two threads touching the same memory, you've entered the hardest territory in all of programming: concurrency. Race conditions, deadlocks, and the need for synchronization are not exotic edge cases; they're the fundamental consequences of shared mutable state, and understanding them is what separates working concurrent code from code that fails mysteriously.

A thread lets one process do several things at once — and the moment two threads touch the same memory, you're in the hardest territory in programming: concurrency. Race conditions, deadlocks, and synchronization are the fundamental consequences of shared mutable state.

Pratik Dhanave · ·6 min read

Controllers and the Reconciliation Loop

Controllers are where Kubernetes's core idea — declarative desired state plus reconciliation — becomes machinery. A controller is a loop that watches "what you want" versus "what exists" and acts to close the gap, forever. Self-healing, scaling, and zero-downtime rollouts are all just controllers doing that one thing. This is the engine of Kubernetes.

Controllers are where Kubernetes's core idea — declarative desired state plus reconciliation — becomes machinery. A controller is a loop that watches what you want versus what exists and acts to close the gap, forever. Self-healing, scaling, and rollouts are all just that.

Pratik Dhanave · ·6 min read

GitOps and Declarative Delivery

GitOps takes one idea to its logical conclusion: if your infrastructure and deployments are declarative code, then git should be the single source of truth, and a machine — not a human running commands — should continuously make reality match git. It turns "deploy" from an action you perform into a state you declare, and it's how modern platforms run.

GitOps takes one idea to its conclusion: if infrastructure and deployments are declarative code, git should be the single source of truth, and a machine — not a human running commands — should continuously make reality match git.

Pratik Dhanave · ·7 min read

Lifetimes

Lifetimes are the part of Rust that looks most alien — those `'a` annotations scattered through function signatures — and the part most misunderstood. They don't change how your code runs; they're just the compiler making explicit a question it's always been asking: how long does this reference need to be valid? Understanding that reframes lifetimes from cryptic syntax to a natural extension of borrowing.

Lifetimes are the part of Rust that looks most alien and is most misunderstood. They don't change how your code runs — they're the compiler making explicit a question it always asks: how long does this reference need to be valid?

Pratik Dhanave · ·6 min read

Trait Objects and Dynamic Dispatch

Generics with trait bounds give you many types, resolved at compile time. But sometimes you need a collection of different types that share a trait — a list of shapes, a set of plugins — decided at runtime. Trait objects provide that, trading a little performance for runtime flexibility. Knowing when to use which is a real Rust design decision.

Generics with trait bounds give many types resolved at compile time. But sometimes you need a collection of different types that share a trait, decided at runtime. Trait objects provide that, trading a little performance for runtime flexibility.

Pratik Dhanave · ·5 min read

Models

A code agent is only as good as the model writing the code — and smolagents, true to its Hugging Face roots and minimalist ethos, lets you run almost any model behind it: open models from the Hub, hosted APIs, local models, anything reachable through its integrations. Model choice matters especially here, because the model's code-writing ability is the agent's ability.

A code agent is only as good as the model writing the code — and smolagents lets you run almost any model: open models from the Hub, hosted APIs, local models. Model choice matters especially here, because the model's code-writing ability is the agent's ability.

Pratik Dhanave · ·6 min read

Multi-Agent Systems

One model-driven agent handles a lot, but some problems want a team — a specialist per subtask, or a coordinator delegating to workers. Strands builds multi-agent systems from the same minimal parts, most elegantly by making an agent a tool another agent can call, so the model-driven approach scales up without new machinery.

One model-driven agent handles a lot, but some problems want a team. Strands builds multi-agent systems from the same minimal parts, most elegantly by making an agent a tool another agent can call — the model-driven approach scaling up.

Pratik Dhanave · ·7 min read

Measurement and Unit Economics

Every lever in this playbook shares one precondition: you have to measure. The vendor percentages are directional signposts, not promises — the only number that governs your bill is the one from your own workload. Measurement, and the right unit of measurement, is what turns a list of tactics into an actual reduction.

Every lever shares one precondition: you have to measure. The vendor percentages are directional signposts, not promises — the only number that governs your bill is the one from your own workload, measured as cost per unit of value.