# 2025 年 「資訊科技產業專案設計課程作業」課程作業3
## 相關工作職缺項目
### [Qualcomm : Embedded Software Engineer (C/C++), Machine Learning](https://careers.qualcomm.com/careers/job?domain=qualcomm.com&pid=446715562420&domain=qualcomm.com&sort_by=relevance&job_index=0)
:::spoiler **Job Description**
**Company :**
Qualcomm India Private Limited
**Job Area :**
Engineering Group, Engineering Group > Software Engineering
General Summary:
Atleast 2 to 5 years experience in below areas
- Design, development and optimization of embedded software and/or device drivers in one or more Real-Time Operating Systems - Android, QNX or Embedded Linux.
- Enable vision algorithms/kernels realizable on DSPs, vision accelerators or GPUs
- Design and implement complex fault-tolerant safety systems in accordance to industry standard specifications (eg. ISO26262, ASPICE).
- Contribute to all phases of software development - bring-up, design and deployment.
- Work with engineers, partners and customers across different geographical sites and technology domains.
- Solid hands-on software design, development, optimization and debugging experience on complex embedded computing platforms.
- Skills and experience required in C/C++ programming and operating systems like QNX, Linux and other RTOSs.
- Candidate should be detail-oriented and have strong analytical and debugging skills, strong communication skills (written and verbal), working with teams across multiple time zones.
- Fluent in industry standard software development tools: debuggers, code revision control systems (GIT, Perforce), IDEs and build tools.
- Excellent verbal and written communication skills required
- Experience working on computer vision kernels/imaging and vision accelerators is preferred.
- Experience designing complex fault-tolerant safety systems, and designing in accordance to industry standard specifications (eg. ISO26262, ASPICE) is preferred.
**Minimum Qualifications :**
• Bachelor's degree in Engineering, Information Systems, Computer Science, or related field and 2+ years of Software Engineering or related work experience.
OR
Master's degree in Engineering, Information Systems, Computer Science, or related field and 1+ year of Software Engineering or related work experience.
OR
PhD in Engineering, Information Systems, Computer Science, or related field.
• 2+ years of academic or work experience with Programming Language such as C, C++, Java, Python, etc.
- Completes assigned coding tasks to specifications on time without significant errors or bugs.
- Adapts to changes and setbacks in order to manage pressure and meet deadlines.
- Collaborates with others inside and outside project team to accomplish project objectives.
- Communicates with project lead to provide status and information about impending obstacles.
- Quickly resolves moderately complex software issues and bugs.
- Gathers, integrates, and interprets information specific to a module or sub-block of code from a variety of sources in order to troubleshoot issues and find solutions.
- Seeks others' opinions and shares own opinions with others about ways in which a problem can be addressed differently.
- Participates in technical conversations with tech leads/managers.
- Anticipates and communicates issues with team to maintain open communication.
- Writes readable code for large features or significant bug fixes to support collaboration with other engineers.
- Unit tests own code to verify the stability and functionality of a feature.
**Level of Responsibility :**
- Working under minimal supervision.
- Using verbal and written communication skills to convey information that may be somewhat complex to others who may have limited knowledge of the subject in question.
- Completing tasks with multiple steps that can be performed in various orders; some planning and prioritization must occur to complete the tasks effectively; mistakes may result in some rework.
- Exercising creativity to draft original documents, imagery, or work products within established guidelines.
- Using deductive and inductive problem solving; multiple approaches may be taken/necessary to solve the problem; often information is missing or incomplete; intermediate data analysis/interpretation skills may be required.
:::
### 職缺所需能力分析
* 電腦科學、工程、資訊或相關領域學士學位或碩士以上
* 熟悉C/C++程式設計
* 熟悉嵌入式系統或硬體架構
* 具備機器學習知識, 能優化AI推論效能、底層硬體映射與操作
* 有深度學習/機器學習框架經驗, 例如Tensorflow、PyTorch、Keras、Caffe
* 精通Linux、Android作業系統工具或環境
* 熟悉底層匴體與硬體互動
* 具備統計學和機率基礎(條件機率、貝氏定理)
* 優化經驗(如記憶體規劃、編譯器、效能分析)
#### 加分條件
* 嵌入式ML領域優化實務
* 有大型組織/跨部門團隊合作、和高階主觀溝通經驗
* 具備AI/ML產品設計或協同硬體-軟體開發經驗
### 專業匹配程度
#### 符合
* 電資相關科系碩士學歷
* 熟悉Python, 會使用PyTorch、Tensorflow等ML/DL工具, 職缺需要ML/AI效能優化和模型部署能力
* 實驗室研究涵蓋CV/影像處理, 職缺中需要優化多媒體等ML應用
* 在實驗室研究方向為影像壓縮, 故有大量運用機率與統計在AI/ML的經驗
* 修過電腦視覺、深度學習、機器學習等課程, 有少許專案開發經驗
* 熟悉Git, GitHub和開源專案管理, 符合大型組織協作需求
#### 不符合
* 缺乏C/C++的實作或大型專案經驗, 只做過簡單作業或演算法練習
* Linux環境只有在嘗試、學習階段, 沒有實際運用在驅動程式、底層軟體開發、適調或大型系統部署的經驗
* 機器學習框架僅限於基礎訓練和模型測試, 缺乏針對異構系統、硬體加速或低功耗部署的優化實作
* 對於Android的硬體交互、kernel操作不熟悉
* 社會新鮮人, 故鮮少跨部門合作或和高階主管的溝通經驗
### [NVIDIA : Senior Software Engineer – Deep Learning and Computer Vision](https://nvidia.eightfold.ai/careers?query=computer+vision&start=0&pid=893391951080&sort_by=relevance&filter_job_category=engineering)
:::spoiler **Job Description**
We are now looking for an experienced software engineer with strong Computer Vision and Deep Learning experience to contribute to the development of NVIDIA AI for Multimedia components like NVIDIA Broadcast & NVIDIA Maxine – a comprehensive suite of applications, SDKs and framework that enables different broadcast streaming features.
**What you’ll be doing:**
* Work alongside forward-thinking engineers on core technologies and implement algorithms and optimize software to solve challenging computer vision and deep learning problems & create features for state-of-the-art applications.
* We'll give you exposure to the rapidly evolving space of deep learning computer vision. And you will be working on many groundbreaking features and applications that are transforming our industry.
* We will see features go through the whole cycle - from proof-of-concept to production.
* Together we will communicate with multiple teams in our company, as well as our partners and customers.
**What we need to see:**
* Hands on experience with building, training and optimizing neural networks with strong focus on video processing and 3D.
* Hands on expertise with one or more Deep Learning frameworks (Pytorch, Tensorflow, etc.).
* Passion for optimizing network performance at kernel level for scalability across hardware.
* Experience in different learning techniques.
* Proficiency in Python programming & C/C++ programming.
* CUDA programming experience would be a plus.
* Familiarity with software lifecycle-based processes
* Strong communication and analytical skills
* Self-motivated, fast to act and eager to learn as well as guide.
* Bachelor/Master/PhD in Computer Science or Electronics or Electrical Engineering.
* 5+ years of experience developing systems software on Windows or Linux.
**Ways to stand out from the crowd:**
* Experience with optimizing deep learning algorithms for real time processing based on different platform form factors.
* Exposure to video conferencing, broadcasting applications and environments.
* Familiarity with AR applications.
* History of publications.
:::
### 職缺所需能力分析
* 需具備電腦科學、電子或電機工程碩士以上學歷
* 5年以上 Windows 或 Linux 平台系統軟體開發經驗
* 熟悉 Computer Vision(電腦視覺)與 Deep Learning(深度學習)領域,能解決影像、視覺問題
* 具備神經網路模型的建立、訓練、最佳化經驗,尤其在影像、視頻處理或 3D 領域
* 熟悉並能實務操作 Deep Learning 框架,如 PyTorch、Tensorflow
* 熟練 Python 與 C/C++ 程式設計能力
* 優化網路效能、kernel 級開發能力,並能針對硬體平台調校
* CUDA 程式設計經驗(加分項)
* 熟悉軟體開發生命週期,有大型專案開發與優化經驗
* 優良溝通與團隊協作能力,能和跨團隊及客戶協作
#### 加分條件
* 有即時(Real Time)深度學習應用優化經驗者更佳
* 有影像會議、串流、多媒體、AR 等技術經驗者優先
* 有技術論文發表紀錄可加分
### 專業匹配程度
#### 符合
* CS/電子/電機碩士以上
* 實驗室研究主體涵蓋AI/CV/影像壓縮, 有深度學習和電腦視覺經驗
* 有模型訓練、壓縮和效能優化的經驗, 對應到職缺要求的大量神經網路和影像任務開發
* 有實際以PyTorch/Python進行影像壓縮和深度學習研究
* 有C語言程式設計能力, 支援底層系統軟體最佳化工作
* 實驗室和跨系的選修課程讓我有對複雜的問題、技術進行分析和論述的能力, 對應職缺強調的團隊協作和溝通能力
#### 不符合
* 因為此職位是Senior, 我目前缺乏5年以上的業界系統軟體開發經驗, 且在研究所階段只有以學術研究和論文發表為主, 系統軟體開發的年資不足
* 目前研究方向主要為2D影像處理和壓縮, 只有稍微接觸3D視覺, 且AR應用技術需要去了解&補強
* Video conferencing/broadcasting是加分項, 這種軟體需要整合前後端、串流平台、用戶端SDK、雲端計算、跨平台協定和硬體加速技術, 這些是我**開發經驗較少**的, 但是有通訊/網路的背景, 需要後續將這些技術/概念補足, 將通訊、網路和ML/CV
* 缺乏業界軟體生命週期開發經驗, 沒有參與過產品從PoC到production的完整落地流程
*
### [Google : Machine Learning Software Engineer, Performance](https://www.google.com/about/careers/applications/jobs/saved/107001493277549254-machine-learning-software-engineer-performance?q=embedded+software)
:::spoiler **Job Description**
**Minimum qualifications:**
* Bachelor’s degree or equivalent practical experience.
* 5 years of experience with software development in one or more programming languages.
* 3 years of experience testing, maintaining, or launching software products, and 1 year of experience with software design and architecture.
* 3 years of experience with one or more of the following: Speech/audio (e.g., technology duplicating and responding to the human voice), reinforcement learning (e.g., sequential decision making), ML infrastructure, or specialization in another ML field.
* 3 years of experience with ML infrastructure (e.g., model deployment, model evaluation, optimization, data processing, debugging).
**Preferred qualifications:**
* Master's degree or PhD in Computer Science or related technical field.
* 5 years of experience with data structures/algorithms.
* 1 year of experience in a technical leadership role.
* Experience developing accessible technologies.
:::
### 職缺所需能力分析
* 電腦科學或相關技術領域學士學位,或等效實務經驗
* 程式開發經驗:至少 5 年軟體開發經驗(不限語言,但需主流開發實務)
* 軟體產品實戰:具有軟體產品測試、維護或正式上線經驗 3 年以上,並至少有 1 年軟體設計與架構經驗
* 機器學習領域:至少 3 年在 ML 領域有實際專案經驗(如語音/音訊、強化學習、ML infrastructure 或其他專長)
* ML Infrastructure 技能:具有模型部署、模型評估、效能最佳化、資料處理、debug 等實務經驗達 3 年以上
#### 加分條件
* 碩士/博士學位(CS或相關領域)
* 至少 5 年資料結構與演算法經驗
* 1 年技術領導經驗(組內或跨部門 leader)
* 有開發「accessible technologies」的經驗(符合無障礙設計標準)
### 專業匹配程度
#### 符合
* 相關專業領域碩士
* 研究題目含ML、CV、影像壓縮, 熟悉多種ML frameworks (e.g. PyTorch)
* 有模型訓練、優化、壓縮和分析的實務經驗, 可以處理ML infrastructure和模型效能
* Python、C有實作經驗
* 熟悉Git和程式碼管理, 全端開發/研究流程有經驗
* 影像壓縮和生成模型研究中有大量實作機率與統計方法, 符合職缺的數理基礎需求
#### 不符合
* 缺乏ML Infrastructure(e.g. CI/CD、部署自動化)的專案、實戰
* 新鮮人, 未擔任過技術Leader, 或跨部門協作/管理
* 研究聚焦影像領域,在語音合成、無障礙技術專案的涉獵有限
* 5年業界開發資歷的門檻
---
## 職缺相關面試題目
### C/C++ Programming
[軟韌體工程師面試考題 - 程式碼考題](https://www.raind.blog/c&cpp-zh/c&cpp_interviewexam.html)
[嵌入式經典面試題](https://b8807053.pixnet.net/blog/post/3610969)
[C Multiple Choice Questions](https://www.geeksforgeeks.org/c/c-multiple-choice-questions/)
[C/C++ - 常見 C 語言觀念題目總整理(適合考試和面試)](https://www.mropengate.com/2017/08/cc-c.html)
[C 程式語言相關的面試問題與解答](https://blog.gtwang.org/programming/c-interview-questions/#google_vignette)
[一些我夢到的常見面試題](https://hackmd.io/@DirtyDIrty/ry2v2i2Ui#%E4%B8%80%E4%BA%9B%E6%88%91%E5%A4%A2%E5%88%B0%E7%9A%84%E5%B8%B8%E8%A6%8B%E9%9D%A2%E8%A9%A6%E5%95%8F%E9%A1%8C)
[Interview Guide for Embedded C Programmers](https://binaryupdates.com/interview-guide-for-embedded-c-programmers/2/)
[韌體工程師的0x10個問題](https://hackmd.io/@Chienyu/S1loEqCuo)
### ML/DL/CV Concepts
1. Overfitting 是甚麼 ? 遇到時要如何處理 ?
2. Focal loss原理是甚麼 ?
3. 如何解決CUDA out of memory ?
expected answer : 調整batch size, gradient checkpointing, model sharding
5. 會怎麼解決gradient vanishment的狀況 ?
6. 如何處理data imbalanced ?
7. 是否有將ML model deploy 到 embedding system的經驗可以分享 ?
8. Autoencoder在影像壓縮中的應用是甚麼 ?
9. 傳統JPEG和深度學習壓縮的區別是甚麼 ?
10. 語意(semantic)分割和實例(instance)分割的差異 ?
11. Homography/相機校正, 這些技術在3D任務或是多視圖系統中扮演甚麼角色 ?
12. 在Real-time inference如何優化模型來達到更高的幀率 ?
13. 模型輕量化/加速要部署到edge devices時會使用哪些技術 ?
### Operating System (OS)
1. Stack & Heap的差異 ?
2. 甚麼時候會發生Segmentation Fault ?
3. Process v.s. Thread
4. Process之間如何溝通 ?
5. Thread之間如何溝通 ? 溝通時會碰到甚麼問題 並且可以如何解決 ?
6. CPU Protection是怎麼做的 ?
7. 如何解決Race condition的問題 ?
## 模擬面試
> :female-astronaut: Interviewer
> :male-firefighter: Interviewee
### 背景詢問
:female-astronaut: : 你好, 歡迎來參加今天的面試。我是X工程師, 負責我們機器學習系統團隊的技術面試。首先請你簡單自我介紹一下。
:male-firefighter: : 您好,X工程師。我目前剛完成碩士學位,研究方向是生成式影像壓縮。
在研究過程中,我主要使用Python進行深度學習模型的開發和實驗。除了學術研究,我也對韌體開發很有興趣,因此特別學習了C語言和RISC-V架構。我做過幾個專案,包括用Python做的深度學習專案、IoT相關的智能羽球拍,還有用Chisel設計硬體的專案。
我希望能結合我在機器學習和底層系統的知識,在這個職位上發揮所長。
:female-astronaut: : 很有趣的背景組合, 機器學習和硬體系統兩方面你都有涉略。
那能請你先談一下你在碩士研究中的影像壓縮研究嗎 ? 你使用了哪些技術 ? 還有深度學習專案也請你稍微介紹一下。
:male-firefighter: : (簡單介紹碩士研究&深度學習專案內容)
### 基本知識
:female-astronaut: : 聽起來蠻扎實的。
然後你提到你對韌體開發有興趣所以學習了C和RISC-V。那我這邊想問你一些C語言的基礎問題。
在C語言裡面, 指標是甚麼 ? 他和Python的變數有甚麼本質差異?
:male-firefighter: : 指標他是一個變數, 他儲存的是另一個變數的記憶體位置, 我們可以透過指標直接操作記憶體。
他和Python最大的差異是Python的變數其實都是reference, 記憶體的管理是自動的, 我們不需要, 且也沒辦法直接去操作記憶體位址。
但是在C語言中我們要明確的管理記憶體, 包括malloc和free的使用。指標也可以做指標運算像是`ptr++`來遍歷陣列, 這是在Python中無法做到的事情。
:female-astronaut: : 很好。那你提到了記憶體管理, 那我來考你一下stack和heap的差異?
:male-firefighter: : Stack是系統自動管理的記憶體區域, 用在存放區域變數和函式呼叫的資訊。變數離開scope就會自動釋放, 速度很快但是空間有限。Heap的話則是需要手動分配和釋放的記憶體, 空間比較大但是管理比較複雜, 要用malloc/free操作。
### 專業知識
:female-astronaut: : 好那回歸到本職位的專業知識, 如果今天你的深度學習專案在處理大型訓練資料遇到記憶體不足你會如何解決 ?
:male-firefighter: : 我在使用DataLoader可以設定num_workers做多進程的資料載入, 且只在需要時才再入batch資料到記憶體。
降低batch size是一個蠻常見的方法, gradient accumulation來模擬大batch, 也可以用混和精度訓練, 使用FP16而非FP32可以減少一半的記憶體使用。
然後我有時候也壞使用`torch.cuda.empty_cache()`來在適當的時機清理GPU記憶體。
:female-astronaut: : 那你能解釋一下gradient accumulation是甚麼嗎 ? 為何它可以用來模擬大batch
:male-firefighter: : 這個方法就是指把多個小batch的梯度累積起來, 再一次性的更新權重, 例如說我記憶體只夠放batch size 8, 所以我累積四次再更新梯度來完成batch size 32。
這就利用到梯度線性可加的原理。
:female-astronaut: : 好那我最後有一個技術的問題, 在C語言要如何防止記憶體洩漏, 你有相關的經驗嗎 ?
:male-firefighter: : 好, 我有處理過類似的問題。那記憶體洩漏就是代表分配的記憶體沒有被正確釋放, 累積下來會導致系統記憶體耗盡。
那有幾種處理方法大概就是讓每個malloc都有對應的free, 然後過程中可以讓不再需要的記憶體提早釋放, 不拖延至函數結束。
我通常在進行專案的時候會對buffer的管理特別小心, 我會在初始化的時候分配一次, 然後在整個程式的生命週期中重複使用這個buffer, 在程式結束時才釋放, 這樣就可以避免頻繁的malloc/free, 也可以降低現在討論的記憶體洩漏的風險。
:female-astronaut: : 好的, 你對專案的設計都考量得很完整, 看的出來你從高階Python到底層語言有一定的了解。
那今天的面試就到這邊, 感謝你的時間, 我們大約會在一週內給你回覆
:male-firefighter: : 非常感謝你的時間和詳細的說明, 我也期待您的回覆 !
---
## Resume
[Resume](https://docs.google.com/document/d/1XV3TXpBiNfAiW24pguedmDcuCXXLrfi6Q2qkPztRkbA/edit?usp=sharing)