Blog Main Page

Why AI Agents Make Developers Afraid to Touch Their Own Code (And How to Fix It)

As AI coding agents become standard tools in 2025, many engineering teams observe a subtle but widespread pattern: the more features an agent implements autonomously, the less confident developers feel about manually modifying the codebase. This phenomenon, often called intervention paralysis, arises because incremental AI contributions gradually reduce the human maintainer’s mental model of the system. Over time, the growing gap between “what the code should do” and “how it actually works” creates significant psychological friction against refactoring or direct intervention. In this article, I examine the mechanisms behind this erosion of ownership and present a practical mitigation strategy used successfully at scale: scheduled human-led refactoring checkpoints combined with component-level agent sandboxing. The approach is straightforward. Pause new feature work after every n AI-added capabilities, invest m focused day in architectural cleanup, and thereafter restrict agent prompts to single, well-bounded modules.

Read more →

Thriving as a Software Engineer in the Age of Vibe Coding

Software engineering is evolving rapidly with AI coding assistants like GitHub Copilot and ChatGPT, giving rise to the era of “vibe coding,” where machines handle repetitive code and humans focus on judgment, design, and impact. This article explores the pressing questions every engineer faces today: If AI can handle much of the coding, where should we focus our effort? Should we become broad generalists or go deep into narrow areas? How do curiosity-driven explorations, like diving into Domain-Driven Design, fit into an outcome-focused industry? How should we adjust our learning to keep up with AI? And ultimately, how can engineers remain valuable, even irreplaceable, in this new landscape?

Read more →

Why Software Projects Spiral into Complexity and How to Keep Them Simple

As developers, we love exploring new frameworks and patterns, but sometimes that curiosity backfires. Simple projects can quickly spiral into complex, over-engineered systems that are hard to maintain. In this article, I explore why this happens and share practical strategies for keeping code clean, focused, and maintainable without sacrificing functionality or quality.

Read more →

A Process-Driven Approach to System Design and Software Architecture

Excited to share this blog post on a process-driven approach to system design and software architecture. Rather than starting with architecture as a fixed blueprint, I explore how a structured, flexible design process leads to decisions that are evidence-based, context-aware, and built to evolve. From understanding requirements and exploring options to evaluating trade-offs and defining architecture, this approach prioritizes clarity, adaptability, and long-term success in software systems.

Read more →