<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ayush Soni — Writing</title><description>Distributed systems, reliability, migrations and staff-level engineering judgment.</description><link>https://ayushwing.com/</link><item><title>Ten years of building: the patterns that keep repeating</title><link>https://ayushwing.com/blog/ten-years-of-building/</link><guid isPermaLink="true">https://ayushwing.com/blog/ten-years-of-building/</guid><description>SMB commerce, an e-commerce marketplace, a travel platform, an AI startup, cloud infrastructure — different domains, the same lessons. A map of everything I&apos;ve written, and what I&apos;d tell my 2015 self.</description><pubDate>Tue, 27 Oct 2026 03:20:00 GMT</pubDate><category>career</category><category>softwareengineering</category><category>distributedsystems</category><category>architecture</category></item><item><title>AI-assisted engineering: what actually stuck</title><link>https://ayushwing.com/blog/ai-assisted-engineering/</link><guid isPermaLink="true">https://ayushwing.com/blog/ai-assisted-engineering/</guid><description>Claude Code, Cursor and MCP servers changed how I write tests, review code and explore unfamiliar systems — and changed nothing about who makes design decisions. Where AI tools help, where they don&apos;t, and the guardrails that make them safe on a team.</description><pubDate>Tue, 27 Oct 2026 03:19:00 GMT</pubDate><category>ai</category><category>productivity</category><category>softwareengineering</category><category>llm</category></item><item><title>Self-serve platforms: turn your team from a queue into a product</title><link>https://ayushwing.com/blog/self-serve-platforms/</link><guid isPermaLink="true">https://ayushwing.com/blog/self-serve-platforms/</guid><description>If every request to your team becomes a ticket, your team is the bottleneck. How to find the requests worth automating, build guardrails so non-experts can run them safely, and measure whether self-serve actually worked.</description><pubDate>Tue, 27 Oct 2026 03:18:00 GMT</pubDate><category>platformengineering</category><category>devops</category><category>developerexperience</category><category>leadership</category></item><item><title>Tech debt as a portfolio: how to get it paid down</title><link>https://ayushwing.com/blog/tech-debt-as-a-portfolio/</link><guid isPermaLink="true">https://ayushwing.com/blog/tech-debt-as-a-portfolio/</guid><description>&quot;We need a refactor sprint&quot; rarely gets approved; &quot;this costs us two days every release&quot; does. How to classify debt, measure its interest, pick what to pay first, and bundle paydown with work the business already wants.</description><pubDate>Tue, 27 Oct 2026 03:17:00 GMT</pubDate><category>techdebt</category><category>engineeringmanagement</category><category>career</category><category>softwareengineering</category></item><item><title>Design docs that get approved</title><link>https://ayushwing.com/blog/design-docs-that-get-approved/</link><guid isPermaLink="true">https://ayushwing.com/blog/design-docs-that-get-approved/</guid><description>A design doc is a decision record, not an essay. A one-page structure that gets to a decision quickly: context, goals and non-goals, options with trade-offs, the decision, risks and rollout — plus how to run the review.</description><pubDate>Tue, 27 Oct 2026 03:16:00 GMT</pubDate><category>softwarearchitecture</category><category>leadership</category><category>career</category><category>documentation</category></item><item><title>Debugging production: a method, not a hunch</title><link>https://ayushwing.com/blog/debugging-production/</link><guid isPermaLink="true">https://ayushwing.com/blog/debugging-production/</guid><description>The fastest production debuggers aren&apos;t the ones who know the most. They stop the bleeding first, build a timeline, ask what changed, and narrow the search by halves. A repeatable method for incidents.</description><pubDate>Tue, 27 Oct 2026 03:15:00 GMT</pubDate><category>debugging</category><category>sre</category><category>incidents</category><category>observability</category></item><item><title>Choose a database by access pattern, not by hype</title><link>https://ayushwing.com/blog/choose-a-database-by-access-pattern/</link><guid isPermaLink="true">https://ayushwing.com/blog/choose-a-database-by-access-pattern/</guid><description>List your queries first; the database choice mostly falls out. A practical guide to relational, key-value, document, search, graph and warehouse stores — with one real query for each — and when to use two.</description><pubDate>Tue, 27 Oct 2026 03:14:00 GMT</pubDate><category>databases</category><category>architecture</category><category>systemdesign</category><category>backend</category></item><item><title>Model business workflows as state machines</title><link>https://ayushwing.com/blog/business-workflows-as-state-machines/</link><guid isPermaLink="true">https://ayushwing.com/blog/business-workflows-as-state-machines/</guid><description>Many &apos;weird bugs&apos; in order, refund and tenant systems are illegal state transitions. Make states and transitions explicit, enforce them in the database with a conditional write, and keep an audit trail.</description><pubDate>Tue, 27 Oct 2026 03:13:00 GMT</pubDate><category>architecture</category><category>java</category><category>databases</category><category>ddd</category></item><item><title>Durable workflows vs. a queue and a cron job</title><link>https://ayushwing.com/blog/durable-workflows-vs-queue-and-cron/</link><guid isPermaLink="true">https://ayushwing.com/blog/durable-workflows-vs-queue-and-cron/</guid><description>If your job has more than three steps and must survive restarts, you&apos;re writing a workflow engine by hand. What queue + cron + status table turns into, what a durable workflow engine like Temporal gives you, and when it&apos;s overkill.</description><pubDate>Tue, 27 Oct 2026 03:12:00 GMT</pubDate><category>temporal</category><category>distributedsystems</category><category>java</category><category>architecture</category></item><item><title>The strangler fig in practice: carving a service out of a monolith</title><link>https://ayushwing.com/blog/strangler-fig-in-practice/</link><guid isPermaLink="true">https://ayushwing.com/blog/strangler-fig-in-practice/</guid><description>Big-bang rewrites stall; carving out one capability at a time works. How to pick the first slice, route traffic at the edge, prove the new path with shadow traffic, move data ownership — and know when to stop.</description><pubDate>Tue, 27 Oct 2026 03:11:00 GMT</pubDate><category>microservices</category><category>architecture</category><category>migrations</category><category>monolith</category></item><item><title>Zero-downtime schema and data migrations with expand–contract</title><link>https://ayushwing.com/blog/expand-contract-migrations/</link><guid isPermaLink="true">https://ayushwing.com/blog/expand-contract-migrations/</guid><description>Renaming one column without downtime takes five deploys, and that&apos;s fine. The expand–contract pattern step by step: dual writes, batched backfills, verification, switching reads, and rolling back at every stage.</description><pubDate>Tue, 27 Oct 2026 03:10:00 GMT</pubDate><category>databases</category><category>migrations</category><category>devops</category><category>architecture</category></item><item><title>Kafka consumers in production: ordering, poison messages and lag</title><link>https://ayushwing.com/blog/kafka-consumers-in-production/</link><guid isPermaLink="true">https://ayushwing.com/blog/kafka-consumers-in-production/</guid><description>Most Kafka incidents are consumer incidents. Partition keys and ordering, at-least-once processing, poison messages and dead-letter topics, rebalances, and the one metric to alert on.</description><pubDate>Tue, 27 Oct 2026 03:09:00 GMT</pubDate><category>kafka</category><category>distributedsystems</category><category>java</category><category>eventdriven</category></item><item><title>The transactional outbox: stop losing events between your database and Kafka</title><link>https://ayushwing.com/blog/transactional-outbox/</link><guid isPermaLink="true">https://ayushwing.com/blog/transactional-outbox/</guid><description>&quot;Save to the database, then publish to Kafka&quot; loses events whenever the process dies in between. The outbox pattern fixes it with one extra table — here&apos;s how to build it, relay it and live with its trade-offs.</description><pubDate>Tue, 27 Oct 2026 03:08:00 GMT</pubDate><category>kafka</category><category>distributedsystems</category><category>microservices</category><category>java</category></item><item><title>Retries without a retry storm: timeouts, backoff, jitter and circuit breakers</title><link>https://ayushwing.com/blog/retries-without-a-retry-storm/</link><guid isPermaLink="true">https://ayushwing.com/blog/retries-without-a-retry-storm/</guid><description>Retries turn short failures into successes — and, done carelessly, turn a one-minute blip into a long outage. The four tools that keep retries helpful, with Resilience4j code.</description><pubDate>Tue, 27 Oct 2026 03:07:00 GMT</pubDate><category>distributedsystems</category><category>resilience</category><category>java</category><category>microservices</category></item><item><title>Idempotency keys: making retries safe for money</title><link>https://ayushwing.com/blog/idempotency-keys/</link><guid isPermaLink="true">https://ayushwing.com/blog/idempotency-keys/</guid><description>A request that times out may still have succeeded. If the client retries a refund, you pay twice. How idempotency keys work, the edge cases that bite, and a Spring + Postgres implementation.</description><pubDate>Tue, 27 Oct 2026 03:06:00 GMT</pubDate><category>distributedsystems</category><category>payments</category><category>java</category><category>api</category></item><item><title>Three small tools, three lessons</title><link>https://ayushwing.com/blog/three-small-tools/</link><guid isPermaLink="true">https://ayushwing.com/blog/three-small-tools/</guid><description>A vaccine-slot checker from 2021, a WebSocket chat on a free tier that no longer exists, and a Docker setup that streams five videos to YouTube at once. Small projects, each with one lesson that applies to big systems.</description><pubDate>Tue, 27 Oct 2026 03:05:00 GMT</pubDate><category>java</category><category>sideprojects</category><category>websockets</category><category>docker</category></item><item><title>YT Studio AI: wiring Vision, NLP and LLMs into a creator tool</title><link>https://ayushwing.com/blog/yt-studio-ai/</link><guid isPermaLink="true">https://ayushwing.com/blog/yt-studio-ai/</guid><description>Score a thumbnail and title before you upload. How I combined deterministic Google Cloud APIs with Gemini and Claude in a Spring Boot + React app, why facts go in before opinions, and what I&apos;d change.</description><pubDate>Tue, 27 Oct 2026 03:04:00 GMT</pubDate><category>ai</category><category>java</category><category>springboot</category><category>llm</category></item><item><title>One dependency for logs, traces and metrics: writing a Spring Boot starter</title><link>https://ayushwing.com/blog/spring-boot-starter-observability/</link><guid isPermaLink="true">https://ayushwing.com/blog/spring-boot-starter-observability/</guid><description>Every service wires observability slightly differently, and the differences show up during incidents. How I packaged logging, tracing and metrics into one Spring Boot starter — and three gaps a code review of my own starter found.</description><pubDate>Tue, 27 Oct 2026 03:03:00 GMT</pubDate><category>springboot</category><category>observability</category><category>opentelemetry</category><category>java</category></item><item><title>GraphQL Federation with Java subgraphs, without the N+1</title><link>https://ayushwing.com/blog/graphql-federation-java/</link><guid isPermaLink="true">https://ayushwing.com/blog/graphql-federation-java/</guid><description>Three Spring Boot services, one graph, one query. How entity resolution, DataLoaders and resolver timing work in a federated Java setup — and the N+1 I left in on purpose to find.</description><pubDate>Tue, 27 Oct 2026 03:02:00 GMT</pubDate><category>graphql</category><category>java</category><category>microservices</category><category>performance</category></item><item><title>Building an annotation-driven MCP server in Java</title><link>https://ayushwing.com/blog/java-mcp-server/</link><guid isPermaLink="true">https://ayushwing.com/blog/java-mcp-server/</guid><description>Exposing a Java method to an AI agent should take one annotation, not a protocol implementation. How I built java-mcp-server on Spring Boot 3, and what I&apos;d change next.</description><pubDate>Tue, 27 Oct 2026 03:01:00 GMT</pubDate><category>java</category><category>springboot</category><category>ai</category><category>mcp</category></item></channel></rss>