venkatesh

Building backend systems (of course with AI)
that (don't) break at scale.

I'm Venkatesh Patnala — a backend engineer always thinking in tradeoffs, shipping alongside AI, and writing down what I learn along the way. Currently at Cars24.

Watercolor illustration of Venkatesh, sketched by AI
sketched by AI · along a river
THE PATH SO FAR

From IIT Jodhpur to Engineering.

2019 — 2023
B.Tech, Mechanical Engg
IIT Jodhpur
Aug 2023 — Mar 2025
Software Engineer
Cogoport · Sprinklr
Apr 2025 — now
Builder: Backend engineering
Cars24 · payment & C2C systems
What's next
SDE-2
Building at deeper scale
MY NOTEBOOK

My backend stories and what they taught me.

№'008'
The ORDER BY Trap
Looked free. Cost 8 seconds.
→
№'010'
The System Design Pyramid
You don't need 25 systems. You need 8, done right.
→
№'011'
Redis Keys vs Scan — Which to Use?
One command froze production for 2 seconds.
→
№'014'
'@Transactional Was There. Rollback Wasn''t.'
Self-invocation is the sneakiest Spring trap.
→
№003
Circuit Breakers Alone Won't Save You
Timeouts + breakers + smart ramp-up — three layers, one pattern.
→
№004
Half Our Events Just Vanished
AI writes the code. Architecture decisions are still on you.
→
№006
10,000 DB Queries Per API Call
N+1 hiding in plain sight.
→
№007
Debugging AI's Code
Only one of us sleeps after deployment
→
№009
Hundreds of Payments Broken in 1ms
Two webhooks. Same row. One vanished.
→
№013
When Round Robin Drowned Our Agents
Fair on paper. Chaos in production.
→
№015
The DB Migration That Took Down Payments
Code deploys gradually. DB changes are instant. Never mix them.
→
№016
How Redis Betrayed Us With Locks
Lock expired mid-job. Users got duplicate notifications.
→
№017
User Reuploaded. Still Saw the Old Image.
Webhook order is unpredictable. Version numbers aren't.
→
№019
One Redis Key Expired. 100 Requests Hit Our DB.
Cache stampedes are invisible until they're not.
→
№024
Circular Dependency in Spring
Circular dependency isn't a Spring problem. It's a design problem.
→
№030
a payment succeeded, then failed: handling out-of-order payment callbacks
Two callbacks landed 200ms apart. Whichever arrived last won — sometimes the wrong one.
→
№031
Why Java Strings Are Objects, Not Character Arrays
The extra ceremony around Java strings buys immutability, pooling, cached hashes, and thread safety.
→
№032
One @Transactional Annotation Doubled Our API Latency
The database was fast; we were holding its connections while waiting on the network.
→
№033
Polling vs Long Polling vs SSE vs WebSockets
A practical way to choose the simplest real-time protocol your feature actually needs.
→
№034
Why @Transactional Failed During Self-Invocation
The annotation described the transaction, but a bypassed Spring proxy never applied it.
→
№035
A Perfectly Optimized Objective With Imperfect Constraints
An AI sandbox escape illustrates a familiar engineering lesson: objectives need guardrails.
→
№036
TCP vs UDP: Safe Delivery or Lower Latency?
A memorable comparison of coordination, retries, delivery guarantees, and speed.
→
№037
A Cache Is More Than the Happy Path
The real design question is what happens when cached data is empty, stale, or unavailable.
→
№038
Never Put Lombok @Data on a JPA Entity
A generated hashCode changed after persistence and made the same object disappear inside a HashSet.
→
№039
AI Moved My Design Review Until After Implementation
The questions still matter; I just started letting the agent make assumptions before I reviewed them.
→
№040
Loading Is Slow; Thinking Is AI-Native
A five-second panel is apparently a branding opportunity when the real fix takes time.
→
№041
The Interview Was Just: Find the Bugs
An unfamiliar repository and a 45-minute clock test reading, prioritization, and engineering judgment.
→
№042
Why Offset Pagination Repeated Page-One Records
New rows shifted the window, while deep offsets forced the database to walk and discard thousands of rows.
→
№043
The Software Engineer Interview-Prep Loop
Monday motivation, Wednesday's hard problem, weekend guilt, and another fresh start.
→
№044
Retries Turned a Four-Minute Outage Into Four Hours
Fixed delays synchronized clients and multiplied load on the exact service trying to recover.
→
№045
AI Cut Read Latency and Made Two Write APIs Slower
Three new indexes improved one query by 70%, but the table's total workload paid the bill.
→
№046
Friday-Evening Debugging With Codex
When gathering context takes forever, Monday becomes the most reliable debugging strategy.
→
№047
My Production Checklist for AI-Generated Code
Functionally correct code can still hide unsafe assumptions about scale, failures, retries, and data.
→
№048
I Asked AI to Build My DSA Practice and Revision Path
A personalized schedule turns a static problem sheet into a practice, tracking, and revision loop.
→
ABOUT THE AUTHOR

I graduated from IIT Jodhpur in 2023, interned at Aspiro, shipped my first production services at Cogoport, wrote automation at Sprinklr, and now build backend systems at Cars24.

Two questions I ask myself: how do you design systems that break gracefully under chaos, and how best can I use AI so it multiplies my work instead of breaking it. Almost everything I write is either AI or breaking production.

I also read more than I probably should, travel when I can, and write down what I'm thinking about in the /life section. Because this site should feel like a real person maintains it.

— v.
apr 2026
IF YOU'RE HIRING OR JUST CURIOUS

Let's talk AI. Or anything else.

I'm open to software roles where systems thinking matters and AI is a tool, not a threat. Also genuinely happy to talk to engineers working on interesting backend problems — hiring or not.

copied!