Skills Matrix
Junior → senior Node competencies for backend TypeScript teams. Use for leveling, growth plans, and interview rubrics - not tenure alone.
How to Use
- Self-assess quarterly with manager; attach PR/incident evidence.
- Hiring: score candidates per column; no single trick question.
- Onboarding: map Frontend → Node Path to junior column gaps.
Competency Table
| Competency | Junior | Mid | Senior |
|---|---|---|---|
| Runtime | Explains event loop; avoids sync blocking | Diagnoses loop stall from logs/metrics | Sets team policy on uncaughtException, worker split |
| HTTP/API | CRUD routes, Zod, 4xx/5xx standards | Pagination, auth middleware, idempotency keys | ADR on Fastify vs Nest; versioning strategy |
| Data | Parameterized queries; simple migrations | Transactions, indexes, N+1 awareness | Migration expand-contract; pool sizing |
| Async jobs | Enqueues job; understands retry | BullMQ worker, DLQ, concurrency tuning | Queue vs event bus ADR; backpressure design |
| Config/secrets | Uses .env.example; typed env module | Secrets manager integration | Rotation runbooks; fail-fast boot policy |
| Testing | node:test or Jest unit + inject | Integration tests with test DB | Contract tests; load test interpretation |
| Observability | Reads JSON logs with jq | Structured fields, requestId, metrics | SLO definition; alert tuning |
| Security | No secrets in git; basic auth | OWASP API top 10 in review | Threat modeling for new surfaces |
| CI/CD | Green local = same scripts as CI | Writes GitHub Actions job | Release train; canary/rollback decision |
| Linux ops | curl health, lsof port | kubectl logs, top during incident | IC on SEV2; runbook authorship |
| Git | Feature branch + PR template | Cherry-pick to release | Hotfix lane ownership |
| Leadership | Asks for pairing | Mentors one junior | Sprint capacity for tech debt; ADR facilitation |
Junior: Expected Evidence
- Merged PR with route + Zod + test (Fastify Basics)
- Fixed
EADDRINUSEwithlsofwithout senior rescue - Explained why
awaitmatters in one code review comment - Ran
npm ci && npm testbefore every push
Study path: Node.js Basics → zod → Onboarding Basics
Mid: Expected Evidence
- Owned feature spanning API + migration + worker
- Debugged pool exhaustion or slow query with metrics
- Added BullMQ consumer with DLQ (Queue Worker Skill)
- Reviewed PR with auth and SQL injection checklist
Study path: bullmq / ioredis → API Design Basics → Pairing on API PRs
Senior: Expected Evidence
- Authored ADR adopted by team (framework, ORM, queue)
- Led incident to resolution with rollback decision documented
- Improved onboarding doc from hire feedback loop
- Negotiated non-feature sprint capacity for LTS upgrade
Study path: Technical Leadership Best Practices → Incident Triage Skill → DORA Metrics for Node Teams
Growth Plan Template
## Q3 growth - Alex (Junior → Mid)
Current gap: transactions + BullMQ
Sprint 1: Pair on order checkout transaction PR
Sprint 2: Own email worker with DLQ
Evidence: merged PRs + retro notes
Review date: 2026-09-30- One competency focus per sprint - not "become senior"
- Evidence = merged work, not courses completed
Promotion Signals (Mid → Senior)
| Signal | Weak | Strong |
|---|---|---|
| Incidents | Waits for instructions | Runs IC checklist; documents timeline |
| Design | Implements spec only | Proposes ADR with tradeoffs |
| Review | LGTM on style | Catches auth, pool, PII issues |
| Scope | Single service | Cross-service release coordination |
FAQs
Frontend senior but Node junior?
Title may stay "Senior Engineer" with Node track = Junior in matrix. Dual tracks prevent false expectations on first API on-call shift.
How many juniors per senior mentor?
1 senior : 2 juniors max for meaningful weekly pairing. Overflow hires wait or use group office hours.
Related
- Onboarding Basics - day-one setup
- Frontend → Node Path - learning ramp
- Pairing on API PRs - review depth
- Team & Onboarding Best Practices - team norms
Stack versions: This page was written for Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, and NestJS 11.