Embedded Developer, what skills are important

MrGigu picture MrGigu · Jun 20, 2013 · Viewed 35.9k times · Source

I want to make a list of things that need to learn that is valuable for my career. What skills do you think are vital for an embedded developer, now and the distant future?

I have become quite proficient with C and ARM assembler through working with embedded Linux kernel and I'm about to dive into Linux drivers. However I can't help to think that I'm maybe narrowing my skill set to much. I want to keep working with embedded systems in the future but you never know the job market (paranoid that I'm going to be outsourced to China and India).

I feel that I'm currently quite weak with C++ and Java, I would also like to learn the Android kernel in the future. I also don't know any scripting languages.

Can anyone who has worked with embedded systems for a while, give some input on what skills/languages they think is vital for an embedded developer? Should I continue to only hone my C skills or should I learn new things.

Answer

ruben2020 picture ruben2020 · Jun 20, 2013

Here's my list:

  • C essentials
  • OOP/ C++ - classes, encapsulation, polymorphism, overloading/ overriding, templates
  • Algorithms - search, sort, b-trees
  • Design Patterns - factory, observer, singleton etc.
  • Real Time Operating Systems - primitives (semaphore, mutex), scheduling techniques, user/ kernel space
  • Linux fundamentals, driver writing, shell
  • microprocessor fundamentals - interrupt processing, registers, assembly code, etc.
  • microcontroller fundamentals - ADC, DAC, Timers, PWM, DMA, watchdog, etc.
  • Memory - NOR, NAND, SRAM, DRAM, wear levelling
  • Basic protocols - I2C, SPI, UART, LIN
  • Advanced protocols - SATA, PCIE, USB, CAN, MOST
  • Concurrent/ parallel programming - MPI for SMP etc.
  • UML - class diagram, component diagram, state diagram, sequence diagram
  • Perl or Python for scripting, for e.g. to modify simple text files.
  • Java and Android
  • Basic electronics - schematics reading, using oscilloscope, multimeter, soldering iron
  • Specialized techniques for embedded programming e.g. debouncing of switches, resistive ladder switches, rotary encoders, etc.
  • software engineering - SDLC, CMMI, agile methods e.g. SCRUM, version control (ClearCase, git, svn), bug tracking (JIRA?), static code checking, Lint, unit testing, continuous integration
  • build environments - makefile, cmake
  • Basic FPGA/ ASIC design, basic DSP