Select your current position

Pick a role and level — we'll show the growth path, skills and gap analysis.

Development path

Junior

0-2 years

Current

Responsibility: Completing tasks under the guidance of senior colleagues. Learning the codebase, standards, and team processes. Writing code to spec, fixing simple bugs, writing tests.

Key skills:

Apache Kafka Need
Elixir Phoenix Need
GraphQL Design Need
NATS / NATS JetStream Need
RabbitMQ Need
Redis Need
API Documentation Need
Immutability & Persistent Data Structures Need
Database Indexing Need
Database Migrations Need
Multithreading Need
Monads & Functors Need
Query Optimization Need
Functional Programming Principles Need
WebSocket API Design Need
Data Modeling & Schema Design Need
API Versioning Strategies Need
Caching Strategies Need
Transactions & Concurrency Need

Middle

2-5 years

Next

Responsibility: Independently developing features from decomposition to deployment. Participating in code review. Optimizing performance. Mentoring junior developers. Taking part in architecture discussions.

Key skills:

Apache Kafka Need
Elixir Phoenix Need
GraphQL Design Need
NATS / NATS JetStream Need
PostgreSQL Need
RabbitMQ Need
Redis Need
Algorithms & Complexity Need
Async Programming Need
API Documentation Need
Immutability & Persistent Data Structures Need
Database Indexing Need
Code Quality & Refactoring Need
Database Migrations Need
Multithreading Need
Monads & Functors Need
Query Optimization Need
Functional Programming Principles Need
WebSocket API Design Need
Data Modeling & Schema Design Need
API Versioning Strategies Need
Caching Strategies Need
Transactions & Concurrency Need

Senior

5-8 years

Responsibility: Designing the architecture of components and services. Solving complex technical problems. Managing technical debt. Code review as a quality gatekeeper. Mentoring middle developers. Choosing technologies for new tasks.

Key skills:

Apache Kafka Need
Elixir Phoenix Need
GraphQL Design Need
High Load Architecture Need
NATS / NATS JetStream Need
PostgreSQL Need
Property-Based Testing Need
RabbitMQ Need
Redis Need
REST API Design Need
Algorithms & Complexity Need
Async Programming Need
API Documentation Need
Immutability & Persistent Data Structures Need
Database Indexing Need
Code Quality & Refactoring Need
Database Migrations Need
Multithreading Need
Monads & Functors Need
Query Optimization Need
Functional Programming Principles Need
Design Patterns Need
WebSocket API Design Need
Data Modeling & Schema Design Need
API Versioning Strategies Need
Caching Strategies Need
Data Structures Need
Transactions & Concurrency Need

Lead / Staff

7-12 years

Responsibility: Technical leadership of a team or area. Designing system architecture. Coordinating with other teams. Establishing standards and best practices. Participating in hiring. Planning the technical roadmap.

Key skills:

Apache Kafka Need
Elixir Phoenix Need
GraphQL Design Need
High Load Architecture Need
JWT / OAuth2 / OIDC Need
NATS / NATS JetStream Need
OpenTelemetry Need
PostgreSQL Need
Property-Based Testing Need
RabbitMQ Need
Redis Need
REST API Design Need
Algorithms & Complexity Need
Async Programming Need
API Documentation Need
Immutability & Persistent Data Structures Need
Database Indexing Need
Code Quality & Refactoring Need
Database Migrations Need
Multithreading Need
Monads & Functors Need
Query Optimization Need
Functional Programming Principles Need
Design Patterns Need
WebSocket API Design Need
Data Modeling & Schema Design Need
API Versioning Strategies Need
Caching Strategies Need
Data Structures Need
Transactions & Concurrency Need

Principal

10+ years

Responsibility: Technical strategy at the company or domain level. Cross-organizational influence. Solving systemic business problems through technology. Mentoring lead engineers. Publicly representing the company.

Key skills:

Apache Kafka Need
Elixir Phoenix Need
GraphQL Design Need
High Load Architecture Need
JWT / OAuth2 / OIDC Need
NATS / NATS JetStream Need
OpenTelemetry Need
PostgreSQL Need
Property-Based Testing Need
RabbitMQ Need
Redis Need
REST API Design Need
Algorithms & Complexity Need
Async Programming Need
API Documentation Need
Immutability & Persistent Data Structures Need
Database Indexing Need
Code Quality & Refactoring Need
Database Migrations Need
Multithreading Need
Monads & Functors Need
Query Optimization Need
Functional Programming Principles Need
Design Patterns Need
WebSocket API Design Need
Data Modeling & Schema Design Need
API Versioning Strategies Need
Caching Strategies Need
Data Structures Need
Transactions & Concurrency Need

Gap analysis: skills to develop

To reach the next level you'll need to develop:

Apache Kafka

Implements Kafka integration for Elixir services: Broadway/Kafka consumer pipelines with backpressure, GenStage-based event processing, and efficient partition assignment for BEAM processes. Configures consumer groups leveraging Elixir's concurrency model. Implements fault-tolerant message processing with supervisor strategies.

Elixir Phoenix

Independently implements tasks with Elixir Phoenix. Understands internals and optimizes performance. Writes tests.

GraphQL Design

Develops GraphQL API on Absinthe with nested types, enums and interfaces. Solves N+1 problem through Dataloader and batch resolvers. Implements Relay-style pagination with cursors, configures Absinthe middleware for logging and authentication.

NATS / NATS JetStream

Independently implements tasks with NATS / NATS JetStream. Understands internals and optimizes performance. Writes tests.

PostgreSQL

Independently designs schemas and optimizes queries with PostgreSQL. Understands indexing and query execution plans. Uses Ecto effectively.

RabbitMQ

Independently implements RabbitMQ messaging in Elixir with Broadway/AMQP library. Leverages OTP supervision trees for consumer fault tolerance. Configures prefetch counts and acknowledgment strategies for reliable processing.

Redis

Independently implements Redis caching patterns in Elixir services — pub/sub with Redix.PubSub for real-time features, sorted sets for leaderboards, and pipeline batching for performance. Understands Redis persistence options and memory management. Writes integration tests validating cache behavior and TTL correctness.

Algorithms & Complexity

Independently applies algorithmic thinking in Elixir: evaluates process message routing efficiency, selects appropriate data transformation algorithms with Enum/Stream, understands recursion optimization with tail-calls. Analyzes complexity of distributed computation patterns in OTP applications.

Async Programming

Independently applies async programming in Elixir/OTP: GenServer async calls, Task.async/await for concurrent operations, process supervision for fault tolerance. Understands trade-offs between synchronous and asynchronous message passing in OTP.

API Documentation

Develops structured API documentation for Phoenix with OpenAPI through open_api_spex. Configures Swagger UI for interactive endpoint testing. Generates automatic documentation from Ecto schemas and controllers, maintains changelog and guides through ExDoc.

Immutability & Persistent Data Structures

Independently applies immutability patterns in Elixir backend services including persistent data structures, structural sharing, and efficient transformation pipelines with Enum and Stream. Writes pure functions that transform immutable state through GenServer callbacks and process-based state isolation. Understands performance implications of immutable data copying and leverages Elixir's BEAM-optimized memory model.

Database Indexing

Independently designs schemas and optimizes queries with database indexing. Understands indexing and query execution plans. Uses Ecto effectively.

Code Quality & Refactoring

Independently applies code quality practices in Elixir/OTP development. Writes clean GenServer and Supervisor implementations with proper documentation. Understands trade-offs between process isolation and shared state. Reviews code for proper error handling, pattern matching clarity, and OTP convention adherence.

Database Migrations

Independently designs schemas and optimizes queries with database migrations. Understands indexing and query execution plans. Uses Ecto effectively.

Multithreading

Independently applies concurrency patterns in Elixir/OTP: GenServer for stateful process management, Task for fire-and-forget concurrent operations, process linking and monitoring for fault tolerance. Explains trade-offs between different OTP concurrency abstractions in code review.

Monads & Functors

Independently applies monadic patterns (with/case chains, Result tuples) for composable error handling in Elixir pipelines. Understands trade-offs between Railway-oriented programming and exception-based flows. Explains functor mapping over Ecto changesets and option types in code reviews.

Query Optimization

Independently designs schemas and optimizes queries with query optimization. Understands indexing and query execution plans. Uses Ecto effectively.

Functional Programming Principles

Applies FP principles naturally in Elixir: pattern matching, immutable data, pure functions, and pipe-based transformations. Understands when to use processes vs pure functions for state management. Reviews code for side-effect isolation and proper use of GenServer callbacks.

WebSocket API Design

Develops real-time functionality on Phoenix Channels with authorization through socket assigns and tokens. Implements presence tracking through Phoenix.Presence for online user tracking. Configures PubSub for distributed message broadcasting between nodes.

Data Modeling & Schema Design

Independently designs schemas and optimizes queries with data modeling. Understands indexing and query execution plans. Uses Ecto effectively.

API Versioning Strategies

Implements API versioning in Phoenix through scope routes and Plug pipelines. Maintains parallel versions with separate controllers and view modules. Applies header-based versioning through custom Plug, ensures client migration between versions.

Caching Strategies

Independently implements tasks with caching strategies. Understands internals and optimizes performance. Writes tests.

Transactions & Concurrency

Independently designs schemas and optimizes queries with transactions and concurrency. Understands indexing and query execution plans. Uses Ecto effectively.