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:

AST & IR Manipulation Need
Benchmarking Tools & Methodology Need
Code Generation Need
DSL Design & Implementation Need
Interpreter Design Need
Language Server Protocol (LSP) Need
Lexing & Parsing Need
Memory Profiling Need
Property-Based Testing Need
Type Inference & Type Checking Need
Graph Algorithms Need
Generics & Parametric Polymorphism Need
Immutability & Persistent Data Structures Need
Functional Programming Principles 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:

AST & IR Manipulation Need
Benchmarking Tools & Methodology Need
Code Generation Need
CPU Profiling Need
DSL Design & Implementation Need
Interpreter Design Need
Language Server Protocol (LSP) Need
Lexing & Parsing Need
Memory Profiling Need
Property-Based Testing Need
TDD & BDD Need
Type Inference & Type Checking Need
Graph Algorithms Need
Generics & Parametric Polymorphism Need
Documentation as Code Need
Immutability & Persistent Data Structures Need
Functional Programming Principles 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:

AST & IR Manipulation Need
Benchmarking Tools & Methodology Need
Code Generation Need
CPU Profiling Need
DSL Design & Implementation Need
Interpreter Design Need
Language Server Protocol (LSP) Need
Latency Optimization Need
Lexing & Parsing Need
Memory Profiling Need
Property-Based Testing Need
TDD & BDD Need
Type Inference & Type Checking Need
Graph Algorithms Need
Generics & Parametric Polymorphism Need
Documentation as Code Need
API Documentation Need
Immutability & Persistent Data Structures Need
Multithreading Need
Functional Programming Principles Need
Type Safety & Type Systems Need
Memory Management 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:

AST & IR Manipulation Need
Benchmarking Tools & Methodology Need
Code Generation Need
CPU Profiling Need
DSL Design & Implementation Need
Interpreter Design Need
Language Server Protocol (LSP) Need
Latency Optimization Need
Lexing & Parsing Need
Memory Profiling Need
Property-Based Testing Need
TDD & BDD Need
Type Inference & Type Checking Need
Algorithms & Complexity Need
Graph Algorithms Need
Async Programming Need
Generics & Parametric Polymorphism Need
Documentation as Code Need
API Documentation Need
Immutability & Persistent Data Structures Need
Multithreading Need
Functional Programming Principles Need
Type Safety & Type Systems Need
Memory Management 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:

AST & IR Manipulation Need
Benchmarking Tools & Methodology Need
Code Generation Need
CPU Profiling Need
DSL Design & Implementation Need
Interpreter Design Need
Language Server Protocol (LSP) Need
Latency Optimization Need
Lexing & Parsing Need
Memory Profiling Need
Property-Based Testing Need
TDD & BDD Need
Type Inference & Type Checking Need
Algorithms & Complexity Need
Graph Algorithms Need
Async Programming Need
Generics & Parametric Polymorphism Need
Documentation as Code Need
API Documentation Need
Immutability & Persistent Data Structures Need
Multithreading Need
Functional Programming Principles Need
Type Safety & Type Systems Need
Memory Management Need

Gap analysis: skills to develop

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

AST & IR Manipulation

Implements AST transformations for refactoring tools and linters. Builds IR-level optimizations such as constant folding and dead code elimination. Writes comprehensive test suites for tree manipulation correctness.

Benchmarking Tools & Methodology

Independently designs benchmark suites for compiler and language tool performance evaluation. Implements regression detection benchmarks integrated into CI pipelines. Applies statistical methods to distinguish real performance changes from measurement noise in compiler optimization passes.

Code Generation

Implements code generators targeting multiple output formats (source code, bytecode). Builds peephole optimizations and handles platform-specific code emission. Writes property-based tests for generated output validation.

CPU Profiling

Independently profiles compiler and language runtime performance using perf, pprof, and VTune. Identifies CPU bottlenecks in parsing, type checking, and code generation stages. Understands trade-offs between sampling and instrumentation profiling for tooling workloads.

DSL Design & Implementation

Designs and implements domain-specific languages with custom parsers and semantic analysis. Builds error reporting and IDE integration for DSL tooling. Writes comprehensive test suites covering DSL edge cases and error handling.

Interpreter Design

Implements bytecode interpreters with proper scope management and closure support. Builds garbage collectors and memory management for interpreted languages. Writes comprehensive test suites covering control flow, error handling, and edge cases.

Language Server Protocol (LSP)

Implements LSP features including go-to-definition, references, hover info, and diagnostics. Builds incremental document parsing for responsive editor feedback with efficient change tracking.

Lexing & Parsing

Implements recursive descent and PEG parsers for DSLs. Builds error-recovery mechanisms for partial parsing to support IDE features. Generates syntax-highlighted token streams from lexer output.

Memory Profiling

Independently profiles memory usage in compiler pipelines and language server processes using Valgrind massif, AddressSanitizer, and heaptrack. Understands trade-offs between sampling-based and instrumentation-based profiling for AST/IR data structures. Diagnoses memory bloat in parser allocators and optimizes arena allocation strategies for typical compilation workloads.

Property-Based Testing

Independently designs property tests for compiler passes and code transformations. Builds custom generators for complex AST structures. Integrates property-based test suites into CI/CD pipelines to catch semantic regressions.

TDD & BDD

Applies TDD for language tool development: test-driven parser rule implementation, comprehensive grammar test suites with edge cases, and BDD scenarios for language feature specifications. Uses snapshot testing for AST/IR outputs. Implements test fixtures for complex language constructs. Integrates language conformance tests into CI.

Type Inference & Type Checking

Implements type inference passes and integrates them with IR transformations. Writes comprehensive test suites for type checker correctness including edge cases with generics and variance.

Graph Algorithms

Independently applies graph algorithms (DFS, BFS, topological sort) for AST traversal, dependency resolution, and symbol table construction. Understands trade-offs between adjacency list and matrix representations for compiler IR. Explains graph coloring for register allocation and cycle detection in code reviews.

Generics & Parametric Polymorphism

Implements generic type resolution in language tooling: builds type parameter substitution maps during type checking, handles generic method inference and constraint solving. Understands generic instantiation strategies (monomorphization vs type erasure) and their impact on tooling — code completion, refactoring, and type display in IDE features.

Documentation as Code

Implements docs-as-code for language tooling: auto-generated API docs from source, interactive grammar playground documentation, and versioned language specification. Uses documentation generators (TypeDoc, rustdoc, godoc) as part of build pipeline. Maintains changelog automation from commit history.

Immutability & Persistent Data Structures

Independently applies immutability patterns in language tool development including red-green syntax trees, immutable rope data structures for text editing, and persistent type environments for incremental type checking. Writes analysis passes that operate on immutable snapshots enabling safe concurrent diagnostics and code action computation. Understands memory management strategies for immutable tree structures in long-running language server processes.

Functional Programming Principles

Applies FP principles when building compiler passes and language tools: pure transformations on ASTs, immutable intermediate representations, and referential transparency in analysis phases. Understands algebraic data types for modeling syntax trees and uses pattern matching for tree traversal.