
Michael Hoffmann
@mokkapps

For the past few years I've hopped back and forth between IDEs like many developers do. I spent a good chunk of time in Visual Studio Code — especially while working with Nuxt 3 in its early stage — because it felt fast, flexible, and got me up and running quickly. Recently I switched back to IntelliJ as my primary IDE. In this post I want to walk you through why I made that change: the parts of IntelliJ that won me over (Git, indexing, minimal plugins, debugging, and database tools) and the trade-offs I considered while leaving VS Code behind.
Tooling is more than a preference; it shapes how you think about code, collaborate with others, and ship features. Over time I noticed my frustration with small friction points - waiting on searches, wrestling with extensions, and losing context while debugging — added up into meaningful slowdowns. When I evaluate an IDE I look at a few non-negotiables:
These are the everyday moments that decide whether an IDE is “good enough” or actually accelerates work. For me, IntelliJ reduced the friction in all those areas.
I’ll admit - VS Code won me over initially, and for very good reasons:
When I was primarily prototyping or working on small front-end features, VS Code’s low-friction, modular approach made sense. It’s easy to extend the editor to fit a specific stack. But that’s also where the downsides appeared: those extensions accumulate, they interact in unpredictable ways, and the editors’ “glue” is extension-dependent rather than native.
One of the biggest reasons I switched back is IntelliJ’s Git experience. IntelliJ’s Git tooling is built-in and mature:
Practical example: when I’m reviewing a feature branch I rarely open a separate Git client anymore. I can:
That saves me time and keeps context - no toggling between windows.
Indexing is one of those invisible capabilities that becomes painfully obvious when it’s slow. IntelliJ’s indexing and project model are optimized for fast, reliable code navigation on large codebases. The results:
When you work on a monorepo or a multi-package application (for example, a Nuxt frontend with several shared libs), waiting for the editor to figure out symbol resolution is wasted time. IntelliJ’s background indexing gives it the heads-up knowledge it needs to serve contextual features immediately.
This matters not only for speed but for cognitive flow — when I can jump to a function and see usages without delay, I can keep momentum and make better decisions faster.
VS Code’s extensibility is its strength — and sometimes its liability. I used to accumulate a long list of extensions: ESLint, Prettier, snippets, Nuxt helpers, Docker integrations, testing runners, DB viewers, Git lens, and more. Every new extension added potential for conflicts, unexpected keybinding changes, performance issues, and configuration drift between machines.
IntelliJ, by contrast, ships with many tools baked-in:
That means fewer external dependencies, fewer updates to manage, and less time spent diagnosing breakages caused by a third-party extension. The built-in approach delivers a more consistent experience across projects and teams. I no longer need to tell everyone on the team which exact set of plugins to install; the IDE’s defaults are already solid.
Debugging is where IDEs earn their keep for me. IntelliJ’s debugger is powerful and predictable:
For backend work or complex front-end bundles (Nuxt server-side rendering, middlewares), this matters.
Having robust, reliable run configurations also makes switching contexts painless. You can save and share launch configurations, and IntelliJ will remember the working directory, environment variables, and entry points, which reduces the “it works on my machine” debug cycles.
One of the features that pleasantly surprised me in IntelliJ (Ultimate) was how seamlessly databases are integrated:
Instead of switching to a separate DB client, I can run queries, inspect data, and even edit rows right inside the IDE. That is a massive time-saver when diagnosing data-related bugs or doing quick migrations and validations. The convenience of having a single, consistent UI for code and DB access reduces friction — you’re not context-switching between windows and security contexts.
More on IntelliJ’s integrated database support
This isn’t a bash against VS Code — it’s an honest assessment of where it fell short for my workflow:
For lighter-weight tasks or quick edits, VS Code remains a strong choice. But for the kinds of full-stack work I do day-to-day — working across JavaScript/TypeScript, server code, running tests, debugging, and interrogating databases — the integrated approach of IntelliJ wins out.
I don’t think there’s a universal “best” editor. Rather, there’s the best tool for the job and the team. For quick prototypes, small front-end tasks, or when you need a small-footprint editor, VS Code is fantastic. For a deep, integrated development experience — where Git, debugging, indexing, run configurations, and database access are part of one coherent workflow — IntelliJ is where I’ve found less friction and more long-term productivity.
Switching back to IntelliJ felt like removing a lot of tiny pebbles from my shoes. If you’re frustrated with extension churn, slow searches, or disjointed workflows across Git, DBs, and debugging, give IntelliJ a fair trial. You might find, as I did, that the investment in a more integrated environment pays back in calm, consistent momentum.
If you want, I can share my IntelliJ settings, a list of the minimal plugins I keep enabled, and the run/debug configurations I use for a Nuxt 3 + Node backend setup — just ask.
