owned this note
owned this note
Published
Linked with GitHub
---
title: 2022 年資訊科技產業專案設計課程面試範例
tags: INFO2022
---
# 資訊科技產業專案設計課程作業 3
## [NVIDIA - Embedded Software Engineer](https://nvidia.wd5.myworkdayjobs.com/zh-TW/NVIDIAExternalCareerSite/job/Taiwan-Taipei/Embedded-Software-Engineer_JR1962146?locationHierarchy1=2fcb99c455831013ea52ed162d4932c0)
### What you’ll be doing:
- Work directly in developing or integrating NVIDIA automotive or embedded software technology into various NVIDIA automotive or embedded platforms.
- Create and implement software features.
- Might work with customers to provide deep technical assistances.
- Assist customers to achieve fully optimized design with NVIDIA products.
- Provide partner feedbacks as to product features and software improvements
### What we need to see:
- Experience in relevant domain.
- Good English language skills to work effectively with global teams.
- Full experience at Linux, QNX or Android.
- Excellent C skills.
- Experience working on embedded systems and ARM processor specific.
### Ways to stand out from the crowd:
- Excellent debugging and problem solving skills.
- Self managing and ability to break down complex problems in to manageable tasks.
- Experience working in following areas is a plus: AutoSAR, device drivers, multimedia, graphics, camera software stack, image quality tuning (ISP tuning), OpenCL, OpenCV, CUDA, Deep Learning, and AI.
### 匹配程度 - 中
- 對embedded systems未必很熟
- 進階要求寫得很籠統
## [Google - Software Engineer, University Graduate, 2023](https://careers.google.com/jobs/results/125320247524631238-software-engineer-university-graduate-2023/?location=Taiwan&q=software%20)
### Minimum qualifications:
- Bachelor's degree in Computer Science, related technical field, or equivalent practical experience.
- Experience in computer science, data structures, algorithms and software design.
- Experience in Software Development and coding in a general purpose programming language (e.g., Java, JavaScript, Python, C/C++, etc.).
### Preferred qualifications:
- Experience programming in C, C++, Java, and/or Python.
- Experience with Unix/Linux or Windows environments, distributed systems, machine learning, information retrieval, and TCP/IP.
### 匹配程度 - 中
- 基本要求都有符合
- 進階要求寫得很籠統
## [MediaTek - Smartphone SoC Digital IC Design Engineer](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120220316006?langKey=en-US)
### Job Description
1. Architecture design and RTL implementation of Smartphone chipset
2. Smartphone SoC and mobile computing platform design
3. System bus and mobile peripheral design, integration, and modeling
4. SoC system performance analysis
5. SoC low power design, integration, and modeling
6. SoC adaptive voltage scaling development
### Requirement:
1. Familiar with digital IC design, DFT, and FPGA emulation flow
2. Experienced in SoC architecture, Embedded Processor
(DSP/MCU), and bus (ARM bus) system architecture design is a plus
3. Experienced in chip integration is a plus
4. Experience with External Memory Interface design is a plus
5. Experience with system verification job is a plus
6. Experience with security hardware design is a plus
7. Experience with low power design is a plus
### 匹配程度 - 低
- 除了有寫過一點 verilog 之外,其他相對來說都未必熟悉
## 模擬面試
🧔:interviewer 🐶:interviewee
🧔:你好,今天由我負責幫你面試。我考你一些相關的資訊問題,請你解釋一下Program , Process , Thread 之間的差別。
🐶:
- Program : 意旨軟體工程師所寫的程式碼 (code) 的集合,也就是還尚未 load 進記憶體的程式碼,存放在次級儲存裝置 (Secondary storage)。也可以想像成是設計一座工廠的藍圖就是 Program。
- Process : 意旨已經執行並且 load 到記憶體中的 Program,行程中的每一行程式碼隨時都有可能被 CPU 執行。在實際生活中,點開應用程式就是將 Program 活化成 Process,我們在活動監控器 (mac) 或 jobs (linux) 中看到 PID,也就是執行中的 Process ID。Program 是工廠藍圖,Process 就是照著設計藍圖所完成的實體工廠。
每一個 Process 又由下面兩項組成:
- 一個 Memory Space。相當於 Object 的 variable,不同 Process 的 Memory Space 也不同,彼此看不到對方的 Memory Space。
- 一個以上的 Thread。
多工作業系統 (Multitasking Operating System) 可以同時執行數個 Process,然而一個 CPU 一次只能執行一個 Process (因此才有現在的多核處理器),CPU 的總量又總是少於 Process 的運行總量,且 Process 會佔用記憶體。因此如何排程 (Scheduling)、如何有效管理記憶體 (Memory Management) 是作業系統 (OS) 所關注的事。另外,每個 Process 所需的記憶體總合,也可能大於實體記憶體,因此需要用次級儲存裝置充當虛擬記憶體 (Virtual Memory),因此如何對虛擬記憶體做到最小的依賴,盡可能避免 Page Fault,並防止 Thrashing 的發生以達到最佳化,也是作業系統 (OS) 需要處理的學問。
- Thread : 前面有提到 Process 是 Thread 的容器,在同一個 Process 中會有很多個 Thread,每一個 Thread 負責某一項功能。以聊天室 Process 為例,可以同時接受對方傳來的訊息以及發送自己的訊息給對方,就是同個 Process 中不同 Thread 的功勞。Thread 就是實體工廠內的工人,確保工廠的每項功能,並且共享工廠內的每一項資源。
每一個 Thread 又由下面兩項組成:
- Stack:紀錄從某個起始點開始 (例如main),到目前為止所有函數的呼叫路徑,以及在這些呼叫路徑上所用到的區域變數。
- 紀錄 CPU 內部的暫存器 (如 Program Counter, Stack Pointer, Program Status Word 等) 的狀態。
在多執行緒中 (Multithreading),兩個執行緒若同時存取或改變全域變數 (Global Variable),可能會發生同步 (Synchronization) 問題。若執行緒之間互搶資源,則可能產生死結 (Deadlock),如何避免 (Prevent) 或預防 (Avoid) 上述兩種情況的發生,仍是作業系統 (OS) 所關注的。
- 結論 :
- Thread 是系統處理工作的基本單元。
- 一個 Process 會同時存在多個 Thread。
- 一個 Process 底下的 Thread 共享資源,如記憶體、全域變數 (Global Variable) 等,不同的 Process 則否。
- 同一個 Process 內的 Thread 使用相同的 Memory Space,但這些 Thread 各自擁有其 Stack。換句話說,Thread 能透過 reference 存取到相同的 Object,但是 local variable 各自獨立。
- 作業系統 (OS) 會根據 Thread 的優先權以及使用過的 CPU 時間,在不同的 Thread 作切換,讓各個 Thread 都有執行的機會。
🧔: 好的,那接下來請你實作一個除法function,並且不能使用到除法運算子。
🐶: 那這邊想到最直覺的方式直接用減法的方式來求出結果。
```cpp=
int div(int dividend, int divisor){
if(dividend == 0) return 0;
if(divisor == 0) return INT_MAX;
bool resultIsNeg = false;
if(dividend < 0){
dividend = -dividend;
if(divisor < 0){
divisor = -divisor;
}else{
resultIsNeg = true;
}
}else if(divisor < 0){
divisor = -divisor;
resultIsNeg = true;
}
int quotient = 0;
while (dividend >= divisor){
dividend -= divisor;
quotient++;
}
if (negResult) quotient = -quotient ;
return quotient ;
}
```
## 參考資料
- [140 Google interview questions](https://www.impactinterview.com/2020/04/140-google-interview-questions/)
- [Taiwan Google 面試過程|面試經驗分享](https://www.1111.com.tw/1000w/fanshome/discussTopic.asp?cat=FANS&id=301667)
- [五家知名公司軟體工程師面試流程全攻略](https://www.1111.com.tw/1000w/fanshome/discussTopic.asp?cat=FANS&id=300080)
## 檢討評論
- 可以讓自己更加了解想要的公司對於甚麼樣的問題的偏好
- 發現每一家的公司對於面試題目的類型都有所不同