# 2024年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2024/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FH1-4KbanC)」作業 3
# [簡歷](https://docs.google.com/document/d/1WjCqEdisJU4pmmC21wcvYkNlpSovrIyI/edit?usp=sharing&ouid=102027140990335419329&rtpof=true&sd=true)
# 符合自身興趣/規劃的職務:
## MediaTek
### [軟韌體開發 Embedded System software](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120240902008?returnUrl=%2FeREC%2FJobSearch%3FsortBy%3D%26order%3D%26page%3D2%26searchKey%3D%26category%3D9020%26workExp%3D0011%26branch%3D%26program%3D)
:::spoiler
### **Job Description:**
我們在找這樣的你: 資工/資管/電子/電機/電信/通訊/電控相關研究所背景,對行動通訊、無線及寛頻連結、家庭娛樂晶片解決方案有濃厚興趣的2025年應屆畢業生。 勇於表達意見,以團隊成功為目標,面對困難不輕易放棄,總是在想更好的做法,擁有創新及不斷學習的精神。 聯發科技邀請您,與全球最頂尖的菁英一同合作,彼此激盪最新的創意與解法,共同挑戰每一個不可能。
### **Requirement:**
[2025年應屆碩士/博士畢業生適用,投遞履歷請附上大學/研究所成績單] 歡迎具備以下經驗及專長的你: 資工/資管/電機/電子/通訊相關研究所畢;嵌入式系統 (Embedded System) / Computer Organization & Architecture (計算機組織 & 結構) / 作業系統 (Operating System) / 資料結構 (Data Structure) / 程式語言 (Programming Language);RTOS (Real-time Operating System) / Linux / Android
### **匹配程度**
* 有相關研究所
* 尚未學嵌入式系統、計算機架構
* 計算機組織、作業系統、資料結構有學過,只能說大概了解
* 尚未學RTOS
* 程式語言只能說略懂,沒有做專案的經驗,可以寫出稍微複雜的程式。了解一些基礎的資料結構和常用函式庫。可以處理基礎錯誤並做簡單的除錯。
:::
## Google
### [Software Engineer, Embedded Systems, Platforms](https://www.google.com/about/careers/applications/jobs/results/108754608012042950-software-engineer-embedded-systems-platforms?location=Taiwan&q=%22Software%20Engineer%22)
::: spoiler
### **Job Description:**
* Collaborate with cross-functional teams to gather requirements. Write detailed specifications and design docs for software architecture and systems we build.
* Work with open-source software, develop and integrate server management software.
* Maintain and provide support for systems in the fleet.
* Develop, maintain and integrate software test infrastructure, unit tests and integration tests.
* Lead our vendors to achieve a high level of code quality.
### **Requirement:**
#### Minimum qualifications:
* Bachelor's degree in Computer Science, a related technical field, or equivalent practical experience.
* 2 years of experience with software development in C or C++.
* 2 years of experience working with embedded operating systems.
#### Preferred qualifications:
* Experience working with upstream linux, bootloader, or embedded firmware.
* Experience in the BMC development, machine management software development.
* Knowledge of high-speed IOs Peripherals (e.g., PCIe, USB, Ethernet, eMMC) or low-speed IOs Peripherals (e.g., UART, SPI, I2C, I3C, JTAG).
* Familiarity with Linux kernel and driver development.
* OOB manageability knowledge with exposure to standards like DMTF (PLDM, MCTP (over PCIe, I2C), Redfish, SPDM, etc.).
### **匹配程度**
* 沒有 C 或 C++ 的軟體開發經驗
* 沒有嵌入式系統的工作經驗
* 沒有參與upstream Linux、引導程式或嵌入式韌體的工作經驗。
* 沒有BMC開發、機器管理軟體的開發經驗
* 沒有了解高速 IO 周邊裝置(e.g., PCIe, USB, Ethernet, eMMC)或低速 IO 周邊裝置(e.g., UART, SPI, I2C, I3C, JTAG)
* 不熟悉Linux核心和驅動的開發
* 不了解 OOB 管理技術(包括 standards like DMTF (PLDM, MCTP (over PCIe, I2C), Redfish, SPDM, etc.)
:::
## NVIDIA
### [BMC Firmware Developer](https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Taiwan-Taipei/BMC-Firmware-Developer_JR1981528?q=firmware&locationHierarchy1=2fcb99c455831013ea52ed162d4932c0)
:::spoiler
### Job Description
* Designing, implementing, and delivering innovations for managing GPU based AI servers with focus on OOB management, firmware development, server architecture and building systems for enterprise.
* Working with a global team of BMC developers on NVIDIA server designs.
* Designing and developing performance optimized active monitoring BMC solutions using DMTF Standards including MCTP, Redfish, SPDM and PLDM specifications.
* Instrumenting code to ensure maximum code coverage, writing and automating unit tests for each implemented module and maintain detailed unit test case reports.
* Providing software quality reports based on static analysis, code coverage, CPU load.
* Working with security team to ensure developed code is in line with product security goals.
* Working closely with hardware teams to influence hardware design and review HW architecture & schematics.
* Working with QA/Test architects to come up with proper test tools and automation for qualifying the whole system software and firmware stack.
### Requirement
#### What we need to see:
* Domain expertise in BMC Firmware development on X86 or ARM Platforms including BMC-BIOS communication, thermal management, power management, firmware update, device monitoring, firmware security, etc.
* Strong experience with AMI/Insyde or OpenBMC Firmware architecture.
* Solid experience of end-to-end delivery of high-end enterprise servers from definition to customer deployment.
* Solid understanding of low-level interfaces between SBIOS, BMC and OS like I2C/SPI/PCIe/JTAG etc. PCIe enumeration, IO at platform level for enterprise systems.
* Experience working closely with HW teams, ODMs and vendors to introduce and support server platforms.
* Experience with C/C++ development, bash/python for scripting, and debugging skills in embedded Linux operating environments.
* You should possess excellent written and oral communication skills, good work ethics, high sense of team-work, love to produce quality work and commitment to finish your tasks every single day. You are a self-starter who loves to find creative solutions to exciting problems.
* Bachelor’s Degree or higher in Electrical Engineering or Computer Science, and 2+ years of experience, with demonstrated strong ability as individual contributor.
#### Ways to stand out from the crowd:
* Contributor to industry standards like Open Compute, IPMI, DMTF Standards, and open source.
* Proven record in delivering BMC or equivalent manageability stack for enterprise servers with AMI SPX firmware stack.
### **匹配程度**
* 沒有 X86 或 ARM 平台上 BMC 韌體開發的領域專業知識,包括 BMC-BIOS 通訊、熱管理、電源管理、韌體更新、裝置監控、韌體安全性等
* 沒有在 AMI/Insyde 或 OpenBMC 韌體架構方面擁有豐富的經驗。
* 沒有從定義到客戶部署的高階企業伺服器端到端交付的豐富經驗。
* 沒有對 SBIOS、BMC 和作業系統之間的低階介面(如 I2C/SPI/PCIe/JTAG 等)有深入的了解。
* 沒有擁有與硬體團隊、ODM 和供應商密切合作來引入和支援伺服器平台的經驗。
* 沒有擁有 C/C++ 開發經驗、用於腳本編寫的 bash/python 以及嵌入式 Linux 操作環境中的偵錯技能。
* 不是開放計算、IPMI、DMTF 標準和開源等行業標準的貢獻者。
* 沒有在為具有 AMI SPX 韌體堆疊的企業伺服器提供 BMC 或等效可管理性堆疊方面擁有可靠的記錄。
:::
# 模擬面試
🧔: Interviewer
🙂: Interviewee
## 聯發科
> 🧔: 我們的一個系統中,有一個記憶體管理的模組使用了自由列表(free list)來追蹤可用的記憶體塊。當一個記憶體塊被釋放時,我們需要將它插入到適當的位置以保持列表的排序。請設計一個函數來完成這個操作。
>
🙂: 所以是我需要設計一個自由列表(free list),它是一個鏈結串列,用來追蹤記憶體管理中的可用記憶體塊。每次釋放記憶體時,我們會將新的記憶體塊插入到該列表中,同時需要保持列表中的記憶體塊按地址順序排列。如果列表為空,則直接將新塊插入。
🧔:是的。
🙂:那麼我想舉一個範例, 假設一開始 free list 是空的:
插入 50,結果為 50 -> NULL。
插入 20,結果為 20 -> 50 -> NULL。
插入 70,結果為 20 -> 50 -> 70 -> NULL。
插入 30,結果為 20 -> 30 -> 50 -> 70 -> NULL。
🧔:是的,你有清楚的了解了。
我目前想到的方法是,先定義節點的結構,包含了記憶體地址和指向下一個位置的指標。然後我們需要處理三種情況:
第一種是 free list 原本是空的,那我們只需要直接插入在頭部的位置即可。
第二種是 free list 不是空的,但是比頭部還小,那我們需要把它插入頭部。
第三種則是裡面是有排好的順序,那我們就需要找到適當的位置放我們的節點,我目前想到的方法就是遍歷,從頭部開始比直到找到一個比要插入節點小的節點的話,就插入到該節點後方,然後這樣的作法是 O(n) 。
### 遍歷 code
```cpp
#include <stdio.h>
#include <stdlib.h>
// Node definition
struct Node{
int address;
struct Node *next;
}
// function: Node create
struct Node* create(int address) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->address = address;
newNode->next = NULL;
return newNode;
}
// Insert into free list
void insertNode(struct Node **head, int address) {
// create new node
struct Node *newNode = createNode(address);
// 如果 free list 一開始為空
if (*head == NULL) {
*head = newNode;
return;
}
// 如果插入地址小於頭節點地址,插入到頭部
if (address < (*head)->address) {
newNode->next = *head;
*head = newNode;
return;
}
// 找到適合插入的位置
struct Node *current = *head;
while (current->next != NULL && current->next->address < address)
current = current->next;
// 插入新節點
newNode->next = current->next;
current->next = newNode;
}
// func: print free list
void printFreeList(struct MemoryBlock *head) {
printf("Free List: ");
while (head != NULL) {
printf("%d -> ", head->address);
head = head->next;
}
printf("NULL\n");
}
// test
int main() {
struct Node *freeList = NULL; // 初始化自由列表
// insert block
insertNode(&freeList, 50);
insertNode(&freeList, 20);
insertNode(&freeList, 70);
insertNode(&freeList, 30);
// print
printFreeList(freeList);
return 0;
}
```
🧔:依照你的方法的話會是O(n),那請問在這個free list很長的情況下有沒有更高效的作法?
🧔:不好意思,目前我還沒想到其他的做法。