| Junior | Middle | Senior | |
|---|---|---|---|
| Core Engineering | |||
| Go language |
Write clear handlers and packages
Uses interfaces, structs, errors, and standard library patterns without overengineering. |
Refactor service boundaries safely
Separates domain logic, transport, and infrastructure while keeping backward-compatible behavior. |
Set language and codebase standards
Defines conventions for package layout, error strategy, code reviews, and shared utilities. |
| Concurrency |
Use goroutines and channels carefully
Adds concurrency only where needed and understands cancellation, context, and race basics. |
Build worker flows with backpressure
Designs bounded pipelines, avoids leaks, and handles retries or timeouts explicitly. |
Design concurrency models for critical paths
Chooses synchronization patterns based on throughput, latency, and production failure modes. |
| HTTP and APIs |
Implement REST handlers with validation
Parses input, validates contracts, and returns stable response schemas. |
Own API changes end to end
Plans migrations, versioning, idempotency, and downstream compatibility. |
Shape service integration strategy
Defines API standards, resilience rules, and cross-service communication patterns. |
| Delivery Quality | |||
| Testing |
Cover code with unit and handler tests
Adds practical test cases for business logic and common error branches. |
Build integration test scenarios
Tests databases, queues, external APIs, and rollback behavior for non-trivial changes. |
Improve test strategy at system level
Balances fast feedback, production realism, and failure isolation across services. |
| Observability |
Add logs and metrics for new flows
Instruments changes so support and teammates can understand runtime behavior. |
Diagnose incidents with telemetry
Reads traces, dashboards, logs, and alerts to isolate bottlenecks or regressions. |
Define reliability indicators
Sets SLI and SLO conventions, alert quality standards, and incident review patterns. |
| Architecture |
Understand existing service boundaries
Knows where to extend the system and when to ask for a larger design discussion. |
Design medium-sized modules
Documents tradeoffs for storage, background jobs, and synchronous versus async execution. |
Lead architecture for product domains
Balances simplicity, cost, operability, and long-term evolution of the platform. |