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
Responsibility: Writing firmware in C/C++. Working with GPIO, UART, SPI, I2C. Debugging with JTAG/SWD. Writing unit tests.
Key skills:
Middle
2-5 years
Responsibility: Designing firmware architecture. Working with RTOS (FreeRTOS). Optimizing energy consumption. Device drivers.
Key skills:
Senior
5-8 years
Responsibility: Embedded systems architecture. Bootloader. OTA updates. Firmware security. Communication protocol design.
Key skills:
Lead / Staff
7-12 years
Responsibility: Embedded platform. Development standards. Hardware-software co-design. Coordination with hardware team.
Key skills:
Principal
10+ years
Responsibility: Embedded strategy. IoT platform architecture. Security certification. Standards compliance.
Key skills:
Gap analysis: skills to develop
To reach the next level you'll need to develop:
Independently develops bare-metal firmware: PLL configuration, peripheral setup through registers, boot sequence implementation on Cortex-M.
Independently develops BLE devices: custom GATT services, bonding/pairing, connection parameter optimization. Analyzes packets through sniffer.
Independently writes peripheral drivers in C for STM32/nRF52. Uses volatile, bitmasks, direct register access through CMSIS.
Applies C++17 for embedded: constexpr computations, type-safe register wrappers, CRTP for HAL. Avoids dynamic allocation and exceptions.
Reviews embedded code: checks memory safety, interrupt correctness, peripheral configuration. Gives well-reasoned feedback.
Applies advanced profiling: Segger SystemView for task profiling, ETM trace for instruction-level analysis, hotspot detection.
Applies advanced debugging: ITM trace, SWO viewer, Segger RTT, watchpoints on memory access. Uses oscilloscope for timing analysis.
Applies Git workflow: feature branches, interactive rebase, cherry-pick for hotfixes. Uses git submodules for HAL/SDK dependencies.
Designs CI/CD pipelines from scratch. Configures caching to speed up builds. Uses matrix builds for testing on different versions. Sets up deployment pipelines (staging → production). Works with secrets and environment variables.
Independently configures GPIO alternate functions, ADC with DMA multi-channel scan, DAC with timer trigger. Calibrates ADC for precise measurements.
Optimizes latency: interrupt prioritization, code placement in RAM (ITCM), interrupt tail-chaining, cache configuration.
Implements MQTT communications: QoS 1/2, retained messages, last will, topic hierarchy design. Optimizes reconnect and keep-alive for unstable networks.
Independently develops real-time systems: priority-based scheduling, deadline monitoring, jitter analysis. Implements watchdog timers and timing constraint verification.
Optimizes resources independently: Flash/RAM usage analysis, power profiling, code size optimization through compiler flags and linker scripts.
Independently develops on RTOS: task decomposition, inter-task communication (queues, semaphores, event groups), priority inversion prevention. Configures FreeRTOS for specific hardware.
Independently implements SPI/I2C/UART drivers: DMA transfers, error handling, multi-slave bus management. Debugs communication issues using logic analyzer.
Tests embedded code independently: Unity/CMock for C unit tests, test doubles for hardware dependencies, coverage analysis. Integrates tests into CI pipeline.
Applies algorithm optimization for embedded: fixed-point arithmetic, lookup tables instead of computation, loop unrolling. Analyzes time complexity considering cache effects.
Implements async patterns in embedded: interrupt-driven I/O, DMA completion callbacks, event-driven state machines. Manages shared state between ISR and main loop.
Maintains embedded code quality: static analysis (PC-lint, Coverity), MISRA C compliance checking, complexity metrics. Configures quality gates in CI.
Implements concurrent embedded systems: RTOS task management, mutex/semaphore synchronization, priority ceiling protocol. Detects and resolves priority inversion and deadlocks.
Implements data structures for embedded: statically-allocated ring buffers, memory pools, intrusive linked lists. Optimizes for cache locality and deterministic performance.
Manages memory in embedded systems: static allocation strategies, memory pool implementations, MPU configuration for memory protection. Detects and prevents memory leaks.