In this post I will give details
of how I evaluate a candidate for embedded engineer post. I will mention the
question that I ask, reason for asking a particular question and my selection
criteria to short list an individual.
I partition my interview
in four topics; programming, operating systems, computer architecture and
concepts regarding debugging an embedded target.
Programming
I normally start an interview by asking
questions related to programming
- I start this topic by asking if the
candidate is comfortable with java, c++ or c. I ask this to give a fair
chance to the candidate, I don't want to drop a potential java candidate
only because he is not good at c/c++. However if the job asks for c/c++
expertise, I make sure that he is good at this. This question also helps
me figure out if this person is aware of the major differences between
java and c/c++. I normally expect them to know that java is not
structural, has no pointers, platform independent, has an automatic
garbage collector, on the other hand c/c++ are not platform independent,
painful when garbage collector is considered and gives great freedom with
pointers. If candidate is showing comprehensive knowledge regarding java and
c/c++ I get in to liberty of asking questions like how to call c/c++
function from java ( I want them to be aware of JNI). I also ask questions
why java code can be run on Windows, Linux or MAC OS with no
need to recompile the output file and why this can't be done for c/c++.
- I ask regarding the differences between c
and c++. I expect to get answers like no classes in c, no new and delete
operators in C, unavailability of templates in C, C is procedural while
C++ is multi-paradigm ( procedural and object oriented). I
normally follow these type of questions by asking to change a C++ object
based program in to C. I expect them to change the classes to structures,
member data to structure data and member functions to function pointer, I
normally observe that anyone who is good at this conversion is a great
candidate.
- Bitwise Operations. I love this topic, because it not only depicts their ability to do bit level operations using a language which is quite essential for embedded domain, but also opens up a window to ask regarding some tricky and fast operations using bitwise operations like 1 line statement to figure out if a number is power of 2 or not ( I was also asked this question ). If they answer the last questions with ease I give them a rather difficult task of converting big endian number to small endian using bitwise operations, I bet you only a person with detailed knowledge of embedded domain will be able to pull it off.
- Pointer arithmetic is also a
great topic to figure if an individual is good in C/C++ as he is claiming
to be. I also ask regarding pointer to pointer and difference between
pointer to a constant object, constant pointer to non constant object and
the other variations.
- Concept of memory
mapped registers and how they can be accessed in C/C++
- Difference between volatile
and non volatile variables. I usually follow this by asking can we have a
volatile variable which is also const.
- Difference between storage classes auto, register, static and extern.
- Difference between member access specifiers public, protected and private.
- I ask some other questions
like implementation of sizeof operator in c, figuring out non duplicate
element from an array with odd number of elements using O(n) operations.
Of course I give hints where necessary.
Debuggers
I have more than 8 years of experience in development and testing of various debuggers including EDGE, EDGE for FlexASIC
and CodeSourcery. However in these type of questions my aim is not to figure
out if a person is a good debugger developer or tester, but I just make sure
that candidate is aware of how to effectively use a debugger to debug an
embedded target.
- I ask regarding types of breakpoints
(software and hardware). If they know the types I ask if they know how
they are implemented by the debugger. I normally follow these by asking
regarding breakpoint hit count, thread filters, conditions, enabling and
disabling etc.
- I expect that the candidates are aware of various debug
connectors like JTAG, JLink, ULink etc.
- I ask regarding difference between baremetal and agent
based debugging (gdb server is also an agent).
However for jobs which
involve debugger development or testing, I ask questions regarding following
topics.
- Types of debugging interfaces like MDI, RDI, XDM, BDI
etc
- How stepping is implemented by debugger.
- Purpose of Debug probes while debugging.
- Debug information. DWARF etc.
If they had already worked with embedded debugger it is definitely a plus for them.
Architecture
- Different types of RAMs, their advantages and
disadvantages and selection criteria.
- Types of caches. I normally follow this by asking which is fast RAM, ROM, cache, hard disk etc.
- Difference between Nand and Nor Flash. I only ask this one if they are showing great understanding of the topic.
- Direct Memory Access. Why do we need this?
- Interrupt Vector Table and processing of interrupts
- Difference between Instruction set simulator and
Emulator.
- WatchDog timers
- What is program counter or instruction pointer
- Interrupt vs Polling
Operating Systems
- Types of operating systems like RTOS, Hard RTOS, Soft
RTOS, single processing, multiprocessing etc.
- DeadLock. Prevention and Detection.
- Difference between multithreading and multiprocessing.
- How multiprocessing is implemented by Operating System. These types of questions are followed by types of schedulers.
- Virtual Memory. Why do we need this and how this is implemented by operating system. I move to the next topic the moment I heard them say Virtual Memory is created on hard disk. I feel sorry for them when they say its created on RAM.
- Difference between Paging and Segmentation.
- What is Fragmentation. What is difference between internal and external fragmentation.
- What kind of OS is Windows?
great article, thanks !
ReplyDelete