# RE 韌體工程師是不是都考C語言?
2019年6月29日 19:23
先簡短說一下原 Po
因為不太清楚原 Po 除了語言之外還會什麼
先假定暫時只會 C 語言 (其他如硬體沒碰過/ OS觀念沒有...etc)
台大理工非本科碩要找系統廠基本上是有投有上
像華碩仁寶鴻海正文系維...等等公司
但一線 design house 或是需要即戰力的小公司可能要充實一下和有點運氣
只是投系統廠的話 學歷基本上佔優勢 70% 以上
所以先別怕自己年紀大 你反而要擔心的是錢景不好XD
打得有點沒頭沒尾 需要補充的就勞煩廣大的卡友幫忙補充了
# 那面試可能問些什麼呢 ?
撇開智力測驗/性向測驗/期望薪水/為啥來應徵等等問題
專業性的問題大致會有幾種考法:
1. 手寫
可能選擇或申論 像是要你簡單實作 Linked-list
或是給你一段程式碼 希望你找出可能潛在的問題
最刺激的就是白板題, 有時候在考官面前要手寫出來並說明真的會讓人很緊張
2. 口頭
通常是比較是考觀念 你要解釋某些觀念或是專項的知識 或是講述你的專案經驗
不過有時候會問碩論的內容 還是要稍微看一下
3. 上機考
我是沒遇過, 不過聽我朋友說有外商/新創除了skype面談
還會當場要你 online coding, 順便看你解題思路
大致就以上三種考法
# 當務之急
先假設原 Po 已經大致會基本的 c/c++ 語法
那麼那些重點是國內系統廠可能會考的重點呢?
以下是我遇過的問題, 有些可能不是 junior 會遇到的 答案大部分書上網路上都有
但是準備充足點總是好的 你可以試著看看把它當作 check list
數值系統:
數值範圍(char/int/float/double 的上下限, 數值比較)
有號無號(二補數概念, 常見陷阱: unsigned wraparound)
IEEE754(單精度浮點的上下限, 表示法, 浮點計算, 常見陷阱: floating truncated, floating comparing)
promotion(各型數值的 promotion, 常見陷阱: implicit promotion)
數值系統的效能(從軟硬體分析效能 e.g. 為何乘除法運算比加減法慢)
簡易數值計算(實作積分求面積, 用加法取代乘法, 判斷奇數偶數, 求GCD/LCM ...etc)
型別:
型別轉換(常見陷阱: unsigned and signed addition)
型別與記憶體(sizeof 問題)
primitive 型別可能會合併數值系統問題一起考
derived 型別就會與 pointer 等概念一起考
struct, union, enum, typedef 務必熟練 刁鑽一點的會考void type
其他可能會考型別的 portable 如使用 uint32_t, int16_t 等等
operator
常考 bitwise operation, prefix/suffix increment/decrement, side effect,
預處理器
#if, #elif, #else, #ifdef, #ifndef, #pragma, #include, #define, #, ##
等等... 其中最常考 #define macro 各種技巧及陷阱
const, static, extern
常考相關概念有 duration time, linkage scope, design abstraction...等等
pointer
必考中的必考, 取值, 取址的概念要牢記 盡量各種陷阱誤區都要了解透徹
pointer to pointer, function pointer, pointer points to const, an array of pointer, pointer to an array 是常考的題型
有時候也考複雜宣告的判讀如經典的 signal function pointer 宣告, 要特別注意符號的優先權, 稍難一點的會考 void pointer
相關如與 malloc, memset, calloc 衍伸的問題, 如double free, dangling pointer, memory leaks...也可能會考
volatile/inline/register/auto/restrict
少考 但建議至少知道原理
不過實務上 volatile/inline 很常見就是了
c99/c11 specificed keywords macro
少考 但常見就 alignof/static_assert/atomic/complex/generic了解一下
Gnu 一些attribute也知道更好
loop/conditional loop
基本上是不會單獨出來考, 都是當你基本功本來就該會的
真要考的話是考一些使用上的小陷阱 至多考到 goto
Libc
其實蠻少考的, 大概就會問Libc安全性如strcpy, memcpy 及是否thread safe等等
會用懂原理比較重要 可能會考到的難題就 setjump/longjump
要不然就是搭配系統呼叫來考之類的概念
對了 基本上不會考 printf這種(實際上也沒拿來真的用) 頂多考 vsprintf, error msg
threading and synchronzition
通常是問有沒有寫過或用那一種library, 分析各種鎖的優缺點及使用時機
判斷會不會造成 deadlock, starvation... 問一下process, thread的區別 什麼是thread pool 說明linux的同步機制等等...
語言概念
大概就分辨argument,parameter 什麼是call by value, call by reference, 什麼是undefined behavior, sequence points..etc
刁鑽一點的就要你大概c語言轉譯asm吧
其他
可能當作加分題或是只有某些專項可能會問
基本 linux 應該要會使用會下 cmd
CPU/FPGA 平台 (通常只是問使用過那些平台)
通訊協議(TCP/IP, RFID, HCI, ATT, BUS protocol: 常考I2C, SPI, CAN)
多人協作(git, perforce)
平行/異質計算(Intel mmx/sse intrinsics, SIMD, openMP, openMPI 的概念與操作)
toolchain and IDE (GNU toolchain/Keil/visual studio..etc)
基本焊接/示波器三相電錶使用/基本電學
其他專項的知識(如影像處理/數值分析/濾波..etc)
algo, data strcture
必考大概就是 linked-list , binary search tree, stack, queue 的實作
這些要你現場手寫也不難
其他常考就蠻多種了 基本上學校教過的也有可能出現
少部分外商會多考一些較難的資結算法(如 bit vector, b+ tree, skip-list, bloom filiter, K-D tree, A star path searching, KMP, huffman encoding 及經典的NP問題)
至於要不要刷leetcode 我覺得非純軟非算法 刷easy就好 這不是搞fw要鑽研的
至於硬體與系統部分
真的就太多要知道了 打也打不完
建議買本書有機會就K吧 走韌體遲早要知道的
必考就可能是 memory, cache, synchronize, interrupt, timer 等方面的吧