DEV Community

Sanket Jagtap
Sanket Jagtap

Posted on • Originally published at sanket-jagtap.in on

Angular Beyond the Docs: What 4+ Years of Production Code Taught Me

Angular Beyond the Docs: What 4+ Years of Production Code Taught Me

Most Angular blogs explain what a feature does.

Very few talk about when it hurts, when it helps, and when not to use it.

After more than 4 years of building Angular applications in production , I’ve learned that the hardest problems were never about syntax or APIs — they were about decisions.

This post is for developers who already know Angular and want to think more clearly while building real systems.

The Real Problem Was Never Angular — It Was Over-Abstraction

Early in my career, I believed:

More architecture means better code.

So I built:

  1. 1. Deep folder hierarchies
  2. 2. Over-generic services
  3. “Shared” modules that depended on everything
  4. Reusable components that were rarely reused

The result wasn’t scalability — it was:

  1. Slower development
  2. Harder onboarding
  3. Fear of touching existing code

Modern Angular didn’t just introduce new features — it removed the need for unnecessary structure.

Lesson:

Simplicity scales better than cleverness.

Signals Didn’t Replace RxJS — They Replaced Misuse of RxJS

Signals are often described as “Angular without RxJS.”

That’s not accurate.

RxJS was never the real problem.

Using RxJS for synchronous UI state was.

What went wrong in real projects:

  1. Observables for button state
  2. Subscriptions inside components
  3. Boilerplate like takeUntil(destroy$) everywhere
  4. UI bugs caused by async timing

What signals fixed:

  1. UI state became synchronous again
  2. No subscriptions
  3. No memory-leak anxiety
  4. Predictable rendering

Lesson:

Signals didn’t replace RxJS — they rescued it from being overused.

Today my rule is simple:

  1. Signals → UI and local state
  2. RxJS → async streams (HTTP, WebSockets)

Change Detection Wasn’t Slow — Our Mental Model Was

For years, Angular performance advice felt like magic spells:

  1. Use OnPush
  2. Add trackBy
  3. Avoid functions in templates

We followed rules without understanding why.

Signals changed this by making change detection explicit :

  1. Angular updates only what reads a signal
  2. Not the whole component tree
  3. Not “everything just in case”

Lesson:

Performance improves when the framework matches how developers think.

Standalone Components Solved a Human Problem

NgModules worked — but they created cognitive overhead :

  1. Where is this provided?
  2. Why is this imported here?
  3. Which module owns this component?

Standalone components didn’t just reduce code.

They reduced questions.

Developers can now open a file and understand it without tracing imports across multiple modules.

Lesson:

The best abstractions are the ones you don’t have to explain.

State Management Is a Cost — Not a Feature

NgRx is powerful.

It’s also expensive.

In production, I’ve seen:

  1. Simple apps buried under actions and reducers
  2. Teams afraid to touch state logic
  3. Bugs hidden behind boilerplate

Signals enabled something important:

Local state that stays local.

My approach today:

  1. Start with signals
  2. Introduce heavier state management only when complexity demands it

Lesson:

State management should grow with the problem — not ahead of it.

The Biggest Angular Upgrade Is Restraint

Modern Angular gives us:

  1. Signals
  2. Standalone APIs
  3. Deferrable views
  4. Better performance tools

But the real upgrade isn’t knowing more APIs.

It’s knowing when not to use them.

I now ask:

  1. Does this abstraction reduce thinking?
  2. Will this still make sense in two years?
  3. Can someone else debug this easily?

Lesson:

Senior Angular development is about clarity, not cleverness.

Final Thoughts

Angular today is:

  1. Faster
  2. Simpler
  3. More predictable

But frameworks don’t make applications maintainable — decisions do.

The best code is the one that survives change — not the one that impresses today.

Top comments (0)