Knowing the concepts is necessary but not sufficient. This article covers the patterns that show up in real projects and the anti-patterns that bite teams who skip fundamentals.
Patterns that scale
- Start with the boring, mature tool. Reach for advanced features only when you need them.
- Automate the steps you repeat — CI/CD, scripts, one-off runbooks.
- Instrument early — you cannot improve what you cannot measure.
- Make the common case fast and the uncommon case possible.
Anti-patterns to avoid
- Using `==` instead of `===` — Always use strict equality — `==` coerces types and produces surprising results.
- Mutating state inside a reducer — Reducers must be pure: return a new object, do not mutate the existing one.
- Forgetting await on a Promise — Unhandled rejections become runtime warnings and break error handling.
- Using `var` in modern code — Use `const` by default, `let` only when reassignment is needed. Block scoping avoids hoisting bugs.
- Direct DOM manipulation in React — React owns the DOM — mutate via setState or refs, never querySelector+innerHTML inside a component.
What senior engineers do differently
They write code that fails loudly and predictably. They prefer boring solutions over clever ones. They instrument first, optimise second. And they document the why, not just the what.
Summary
Pick one anti-pattern from the list above that you have actually done. That is the one to fix first.