# 2022 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2022)」作業 3
###### tags: `資訊科技產業專案設計` `jserv`
[第三次作業](https://hackmd.io/@sysprog/info2022-homework3):參考 [IC 產業結構和軟體工程師的機會](https://hackmd.io/@sysprog/BkE4X5vvF)、[《0 到 100 的軟體工程師面試之路》](https://ithelp.ithome.com.tw/articles/10288192) 列出 JD (job description)
* 包含對應公司的 JD (job description) 超連結
* 分析 JD
* 探討自身的匹配狀況
* 相關的面試題目
* 文字導向的自問自答
## 目標產業
(軟)韌體 Firmware、物聯網 IoT、電腦視覺 CV、系統整合
## 相關職缺與職缺分析
### [Google](https://careers.google.com/jobs/results/)
#### [DSP architect, Digital Signal Processor](https://careers.google.com/jobs/results/73993830069609158/)
:::spoiler
Minimum qualifications:
* Bachelor’s degree in Electrical Engineering, Computer Engineering, Computer Science, Computer Architecture, Machine Learning, or equivalent practical experience.
* 3 years of experience in any vector engines.
* Experience in performance analysis or workload characterization.
* Experience in vector programming architecture and microarchitecture.
Preferred qualifications:
* PhD degree in Electrical Engineering, Computer Engineering, Computer Science, Computer Architecture, or Artificial Intelligence/Machine learning, or a related field.
* Experience in porting and optimizing workload to the Digital Signal Processor (DSP) or any vector engines.
* Experience in integrating compute cores into ASICs at architectural and RTL levels.
* Experience in performance analysis on the IP and SoC level.
* Knowledge of DSP tool-chain, runtime, and system software (i.e., Linux, drivers).
* Knowledge of vector Instruction Set Architecture (ISA) in ARM or other vector processor.
:::
#### [Software Engineer, Embedded Systems, Silicon](https://careers.google.com/jobs/results/111637298098905798/)
:::spoiler
Minimum qualifications:
* Master's degree in Electrical Engineering, Computer Science, relevant technical field or equivalent practical experience.
* Experience **coding in C or C++**.
Preferred qualifications:
* Experience in **ARM** architecture and standard interfaces, bare-metal programming, bootloader, and firmware.
* Experience in **Linux kernel, device drivers**, and Android system programming.
* Experience in **software/hardware integration**.
* Experience in optimizing algorithms with OpenGL/OpenCL/NEON/LLVM on CPU/TPU/GPU/DSP.
* Verification experience using FPGAs and/or emulation platforms.
* Familiarity with computer architecture, compilers, machine learning, or image processing.
:::
#### [Firmware Engineer, Wifi, Google Pixel Wireless Connectivity](https://careers.google.com/jobs/results/114882743898120902/)
:::spoiler
Minimum qualifications:
* Bachelor's degree in Computer Science, a related technical field, or equivalent practical experience.
* 3 years of experience in coding with a general purpose programming language **(C/C++)**.
* Experience with **Wi-Fi driver or firmware or framework development**.
Preferred qualifications:
* Experience with IEEE 802.11 protocol.
* Experience with embedded Linux driver “SDIO”.
* Experience with Unix/Linux environments and the development of Linux device drivers.
* Experience with application software development.
* Excellent problem-solving, analytical, and troubleshooting skills.
:::
### [MTK 聯發科](https://careers.mediatek.com/eREC/)
#### [藍牙/ZigBee 韌體工程師 - 台北](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120200721008?langKey=zh-TW)
:::spoiler
職缺說明
* 1.開發Bluetooth/ZigBee韌體並實現Bluetooth/ZigBee最新規格.
* 2.開發Bluetooth, WiFi, ZigBee, LTE, 5GNR共存技術.
* 3.與硬體與軟體共同開發 Bluetooth/ZigBee 系統架構.
* 4.協助手機,消費性產品客戶 最佳化效能 與解決問題.
職缺需求
* 1.熟悉**C語言與嵌入式系統**
* 2.有Bluetooth,ZigBee, 或WiFi等wireless protocol經驗為佳
* 3.有UART, SDIO, USB, PCIe, SPI等Host interface經驗為佳
:::
#### [5G modem 系統整合工程師(新竹/台北)](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120220321000?langKey=zh-TW)
:::spoiler
職缺說明
* 1. 負責 5G modem 通訊軟韌體整合, 從規劃/開發整合方法, 帶領測試人員驗證, 到推動問題分析解決, 完成整合工作
* 2. 規劃可用性驗證, 建置並優化持續整合開發/驗證環境 (Continuous Integration) 以提昇軟體品質及開發效率
* 3. 5G modem 軟體工程相關事務問題解決, 與 5G modem 工程團隊合作持續提昇軟/韌體品質
職缺需求
* 1. 電子/電機/電信/電控/資工/通訊相關研究所畢業
* 2. 具備二年以上**無線通訊或嵌入式系統相關開發經驗**
* 3. 具有**手機或無線通訊軟體開發或系統整合經驗**尤佳
* 4. 個性主動積極正向,具優秀協調溝通能力,並能接受挑戰性工作
* 5. 邏輯論述與簡報能力強,英語溝通與數據分析能力佳
:::
### [瑞昱 REALTEK](https://www.realtek.com/zh-tw/careers)
#### [Driver/MCU firmware 系統設計開發工程師](https://recruit.realtek.com/zh/index.php?option=com_content&view=article&id=10322)
:::spoiler
工作經驗 : 2 年
學歷要求 : 大學
工作項目:
* 1.Card Reader Controller 的 Firmware 或 Driver 開發
* 2.FPGA 與 ASIC 系統驗證
應徵條件:
* 1.學士以上;電機工程、電控工程、電子工程、資訊工程、自動控制相關科系畢業為主
* 2.具2年以上
* (1)**熟 C 語言與微處理機架構**
* (2)有 **Driver 開發或 MCU firmware 開發**經驗尤佳相關經驗者為
:::
### 原相
待續
## 自身評估
### 自我分析
* 學歷
* 非純血電資:私大電機學士 + 成大資訊偏所碩士
* 經驗與能力
* 韌體開發(C Programming)
* 嵌入式應用:使用 Modbus 控制 DSP 實作小型的號誌控制
* IoT 應用:使用 Arduino 實作 MPPT 充電技術
* 跨領域整合(Python)
* 智慧農業:整合物件辨識與路徑規劃技術,用於無人機農噴(農藥噴灑)
* CV/DL 用於無人機高空害蟲辨識
* 計算智慧演算法進行無人機路徑規劃
* 專案管理(排程)經驗
* 執行計畫時負責協助安排和監督工作時程
* 與其他團隊協調工作項目和進度
* 優勢
* 軟硬體整合
* 韌體開發經驗
* 設計或執行上較能以硬體角度出發(EE + CS)
* 跨領域能力
* 做過較多不同面向的專案
* 實際參與跨領域合作計畫,與不同專業的人溝通並解決問題
* 劣勢
* 沒有某一項能力特別專精或突出
* 純軟體(軟體設計)/純硬體(硬體設計)的能力弱
* 資料結構、演算法弱
* 電路學、電子學弱
* 雖然碩論和 AI / DL 相關,但自認為沒有用到很深入(應用導向)
* 英文不夠流利
### 專業匹配分析
* 缺乏 vector engine、SoC、FPGA、driver 經驗
* Linux、ARM 有使用經驗,但還需更加深入
* 無硬體 optimizing algorithm 的能力與經驗
* 需更加熟悉現有無線通訊的應用(目前看到的韌體工作許多都是通訊相關) e.g. Bluetooth, WiFi, ZigBee, LTE, 5G protocol
* 韌體職缺面試題目尚可應付,軟體職缺面試題目不太行
## 面試問題整理
### 履歷
* 公司沒要求的話不要放照片
* 履歷需精簡,每個項目用 1~2 句話說明
* 善用人脈去內推
### 面談
* 自我介紹
* 大學研究所成績單
*
* 碩論
* 動機、方法、結論
* 修課的課程學到甚麼(相關工作內容的課程,e.g. OS, CA, DSP, ML)
* [competing offer](https://www.storm.mg/lifestyle/4246330)
### 考題
> 之後要再根據已將條列的內容,把對應的題目列上去
#### Firmware
* C Programming
* Pointer、Bitwise Operation
* OS
* Memory coherence, Race condition
* Dead Lock
* parallelization、threading
* CO / CA
* Pipeline hazard
* Embeded C
* 程式最佳化
#### Software
* Leetcode
* difficulty: easy
* GNU C Library
* strcpy, strcmp, strlen, memset...等等的 function 如何implement
* DS
* Binary search(upper bound, lower bound)
* Stack(Array, Linked list), Queue(Array, Linked List)
* Sorting : Bubble, Insertion, Selection, Merge, Quick
* **Linked List** : Creat, Insert(Index), Delete(Value, Index), Free
* Linked List Bubble sort、Selection sort、Merge sort
* **Dynamic Programming**
* Graph: BFS、DFS
* BST
* Trie
* ML
* Algo
* [Sliding Window](https://medium.com/%E6%8A%80%E8%A1%93%E7%AD%86%E8%A8%98/%E6%BC%94%E7%AE%97%E6%B3%95%E7%AD%86%E8%A8%98%E7%B3%BB%E5%88%97-two-pointer-%E8%88%87sliding-window-8742f45f3f55)
## 模擬面試
### Firmware
> 🧔:interviewer (Andy) 👶:interviewee (Edward)
🧔:你好,我是 Andy,歡迎你參加今天的面試,請簡單做一個 3 分鐘內的自我介紹。
👶:Andy 你好,我是 Edward,大學就讀 XX 大學電機系,碩士就讀 XX 大學 OO 系資訊組,大學因為就讀電機系,所以有硬體背景,之後比較往計算機組的方向走,所以研究所往資工走。大學的時候的專題和實習做的內容都是寫韌體,研究所的做的內容比較是用影像辨識結合路徑規劃,用在無人機上,應用在智慧農業,比較像是在將計畫的結果做系統整合。
🧔:從你的履歷可以看到你有些韌體開發的經驗,可以舉個例子嗎?
👶:我在實習的時候有做過透過 Modbus 傳輸封包,然後自己做了一個小的號誌系統,可以做出像紅綠燈的功能,可以在紅綠燈上直接進行設定,也可以透過 Modbus 傳輸訊號遠端控制。
🧔:你是使用 C 寫的嗎?執行過程中有沒有遇到甚麼特別的除厝經驗?
👶:對,德州儀器的 DSP 有一個它自己的 IDE,是 C 語言,然後有一些特定的函式。那時候有遇過控制 DSP 上的腳位,然後使用的時候發現韌體寫的和實際執行有出入,後來是當時的主管帶著一起解決,邊看 DSP 的 datasheet 去看可能是哪裡出了問題,才發現有一個開關和 datasheet 上預設的狀態剛好相反,所以寫的程式才沒有照預期的運作。
🧔:好,Edward,接下來請你報告一下的碩論的研究是在解決甚麼問題,簡單介紹一下從問題發想、研究過程、遇到甚麼問題、怎麼解決。
👶:我的碩論是用 YOLO 物件辨識偵查果園中的害蟲,將訓練出的模型用在小型偵查用的無人機上,無人機能在高空拍到害蟲後回傳到伺服器辨識,接著知道害蟲的數量和分布。再來就依據這些資料,區分不同條件,分出有無蟲害發生,然後告訴植保機,也就是農藥噴灑用的大型無人機,每個點所需的噴藥量,結合資訊和農業,達成精準農業的目標。
🧔:ok,過程中有遇到甚麼問題嗎?
👶:因為高空的物件很小,所以當時對於要怎麼辨識到花上不少心力,像是收集更多資料,調整模型。
🧔:模型你調整了甚麼?
👶:有把輸入影像的解析度加大,其他還有調了一些,但因為那時候為了要趕出成果,是參照作者的 Github 上針對小物件去做調整,沒有很深入了解參數的意義跟影響。
🧔:好,我知道了。
🧔:我有看了你的成績單,你的大學被當蠻多課的,你覺得當時的問題出在哪?
👶:當時花很多時間跑活動和打工,蠻逃避課業的,覺得自己學不來。後來想說還是要畢業就咬牙撐過去,花了很多時間重修。之後大三大四有比較知道怎麼準備考試,有些選修也比較有興趣,就比較認真,也比較有方向。
🧔:那你怎麼會想考研究所?
👶:當時家裡有點經濟壓力,想說考研究所出來薪水比較好,還有受到同儕影響,有些人我覺得我不比他們差,他們都能念了,為甚麼我不能,還想說如果考到排名比較前面的學校,可以去跟比自己厲害的人相處,讓自己變得更強。
🧔:好,我大致了解了。Edward 接下來會問一些有關韌體的問題,第一題是韌體裡面會用到不少 bitwise operation,如果今天有一個暫存器 A,目前 8 個 bit 都是 1,如果要用位元操作的方式把第 0 bit,也就是最右邊的 bit 設為 0,要怎麼做?
👶:要把 A 的最右邊第 0 個 bit 設為 0,就是把 A 和 11111110 去做 AND 運算,結果就會是 11111111 & 11111110 = 11111110。
🧔:好,組合語言你有學過對吧?
👶:有。
🧔:ok,那請你用組語寫一下,如果要把 t0、t1 兩暫存器的內容互相調換,要怎麼寫。
👶:好的,要把 to、t1 互相調換會像是這樣。
```clike=
add t2 t0 x0
add t0 t1 x0
add t1 t2 x0
```
🧔:好,我看你的成績單,你有修過計算機組織,可以請你說明一下有哪幾種 hazard 嗎?然後每個 hazard 分別形成的原因是甚麼?
👶:hazard 的話有三種,一種是 structural hazard,因為硬體資源不足,所以無法執行,通常發生在 single cycle machine。第二種是 data hazard,在 pipeline 裡有五個 stage,如果第二個指令會用到第一個指令的結果的話,而第一個指令還沒到 WB 的時候,第二個指令就去存取 memory,但抓到的內容就會是舊的,所以會發生 data hazard。第三個是 control hazard,還不知道 branch 結果的時候,後續的指令就已經進到 pipeline,假設是將不跳的指令都讀入,但到 WB 才知道要跳,這時候前三個指令就白讀了,就是 control hazard。
🧔:那請你針對三個 hazard 各舉一個解決的辦法。
👶:解決辦法的話,structural hazard 就是增加硬體資源。data hazard 可以插入兩個 nop,讓第一個指令 WB 的時候,第二個指令在 ID,就不會讀到錯的內容。control hazard 的話可以用猜的,猜跳或不跳,如果猜對的話能減少白讀的情況。
🧔:好,今天的面試就到這邊,Edward 謝謝你的參與,再見。
👶:謝謝 Andy,再見!
# Reference
## 面試題目與經驗分享
* [軟韌、演算法工程師三次面試經驗大公開 ! 前輩親授 : 非常重視成績單 ! |面試經驗分享](https://www.1111.com.tw/1000w/fanshome/discussTopic.asp?cat=fans&id=300901)
* [[LeetCode] 增強自我能力檢視表](https://angelswengineer.medium.com/)
* [2020 Google/Amazon/Line Pay/Paypay日本/Apple上海/Lenovo/Momo/Garmin/趨勢/支付寶/Facebook 面試分享&工作6年,年薪170萬以上的公司分享](https://angelswengineer.medium.com/google-amazon-line-pay-paypay%E6%97%A5%E6%9C%AC-apple%E4%B8%8A%E6%B5%B7-lenovo-momo-garmin-%E8%B6%A8%E5%8B%A2-%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E6%94%AF%E4%BB%98%E5%AF%B6-%E9%9D%A2%E8%A9%A6%E5%BF%83%E5%BE%97%E5%88%86%E4%BA%AB-b9262fccaa2)
* [五家知名公司軟體工程師面試流程全攻略,想去 Google、Microsoft 必看! |面試經驗分享](https://www.1111.com.tw/1000w/fanshome/discussTopic.asp?cat=FANS&id=300080)
* [公開 Google 面試準備要點,長達3個月的 Taiwan Google 面試過程|面試經驗分享](https://www.1111.com.tw/1000w/fanshome/discussTopic.asp?cat=FANS&id=301667)
* [Top 50 Google Interview Questions (Example Answers Included)](https://theinterviewguys.com/google-interview-q)
## 面試題目內容
* [Day-9 在Hazard尋求解法是否搞錯了什麼](https://ithelp.ithome.com.tw/articles/10268810)
## 考古
* [陳致佑 - 2017Homework1-整理面試題目](https://hackmd.io/@6zSPCmL1Szq0bq_rOqcO6w/HkkhJ-ah-)