# 2022 年「資訊科技產業專案設計」課程第 3 次作業
## 符合興趣與規劃的職缺、該職缺需要的能力
列出 [IC 產業結構和軟體工程師的機會和](https://hackmd.io/@sysprog/BkE4X5vvF)《[0 到 100 的軟體工程師面試之路](https://ithelp.ithome.com.tw/articles/10288192)》
### Google: [Software Engineer, University Graduate, 2022](https://careers.google.com/jobs/results/124750385131725510/)
同為 Google 的職缺:[Software Engineer, Silicon](https://careers.google.com/jobs/results/89995286794904262/)
<!--
同為 Google 的職缺:[Google - TPU Architect, Devices and Services, Silicon](https://careers.google.com/jobs/results/118055665483555526/)
-->
:::info
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.
:::
### Nvidia: [Developer Technology Engineer, GPU](https://nvidia.wd5.myworkdayjobs.com/zh-TW/NVIDIAExternalCareerSite/job/Taiwan-Taipei/Developer-Technology-Engineer--GPU---New-College-Graduate_JR1958725-1?jobFamilyGroup=0c40f6bd1d8f10ae43ffaefd46dc7e78&locationHierarchy1=2fcb99c455831013ea52ed162d4932c0&workerSubType=ab40a98049581037a3ada55b087049b7)
同為 Nvidia 的職缺 [Developer Technology Engineer, HPU](https://nvidia.wd5.myworkdayjobs.com/zh-TW/NVIDIAExternalCareerSite/job/Taiwan-Taipei/Developer-Technology-Engineer_JR1961769?jobFamilyGroup=0c40f6bd1d8f10ae43ffaefd46dc7e78&locationHierarchy1=2fcb99c455831013ea52ed162d4932c0)
:::info
- What you’ll be doing:
- Study and develop cutting-edge techniques in deep learning, graphs, machine learning, and data analytics, and perform in-depth analysis and optimization to ensure the best possible performance on current and next-generation GPU architectures.
- Work directly with key customers to understand the current and future problems they are solving and provide the best AI solutions using GPUs.
- Collaborate closely with the architecture, research, libraries, tools, and system software teams at NVIDIA to influence the design of next-generation architectures, software platforms, and programming models.
- What we need to see:
- A good degree from a leading university or equivalent experience in an engineering or computer science related discipline (MS or PhD preferred).
- Experience with parallel programming, ideally CUDA, OpenCL and OpenACC.
- Confident knowledge of C/C++ and/or Fortran.
- Solid knowledge of software design, programming techniques, and algorithms.
- Strong mathematical fundamentals, including linear algebra and numerical methods.
- Good communication and organization skills, with a logical approach to problem solving, good time management, and task prioritization skills.
- Knowledge in a specific domain is a plus, such as Deep Learning, Machine Learning, Atmospheric Science, Optics and Photonics.
:::
### MediaTek: [Device Driver Engineer](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTB120220309000?langKey=en-US)
同為 MediaTek 的職缺 [SW/FW engineer in multi-core CPU application processor development](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120200710003?langKey=en-US)
同為 MediaTek 的職缺 [GPU compiler developer(Hsinchu/Taipei)](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120220301009?langKey=en-US)
:::info
1. Familiar with C programming language
2. Embedded system development experience
3. Driver development experience, such as USB, PCIe, Power Management...
4. System integration experience, such as system bring-up, security, power
:::
:::info
1. Define GPU compiler software architecture and interfaces.
2. Development/implement GPU compiler pipeline, linking and various optimizations/transformations.
3. Collaborate with Driver team, HW team to implement new API & HW features.
4. Collaborate with Driver team, HW team to improve/tune performance & power consumption.
5. Execute & deliver to meet milestones/schedules.
6. Analyze and debug code generation issues.
7. Analyze and influence future GPU architectures.
8. Construct reliable & trustable relationships across teams internally & externally.
9. The position can be located at Hsinchu or Taipei
:::
### 其它職缺
#### Mircosoft
- 沒有看見 Microsoft 列出相關的職缺
- [台灣微軟 2023 校園徵才線上說明會【完整版】](https://www.youtube.com/watch?v=c6hO9WQUtFo)
### 參考面試心得
- [[面試] 2020新鮮人面試(MixerBox/Nvidia/AWS/Shopee/Google)](https://www.ptt.cc/bbs/Tech_Job/M.1589040307.A.70F.html)
- [[心得] 面試 - Google/NCCST/趨勢/NVIDIA/中華資安/華碩](https://www.ptt.cc/bbs/Soft_Job/M.1586938143.A.268.html)
- [[心得] google embedded SWE 面試心得 (有年資)](https://www.ptt.cc/bbs/Soft_Job/M.1613548617.A.C70.html)
- 資訊科技產業專案設計的校友
### 分析職缺需要的能力
除了 MTK 的 GPU compiler (需要 4 年以上經驗),從公開網路資料的面試心得來看,皆有固定的面試內容跟流程。
職缺綜合基本要求:
- C++, C, Python 語言熟悉
- Linux Kernel (device driver)
- 作業系統相關概念
- 計算機結構
相關指定技能要求:
- 平行程式設計(OpenCL, Cuda, OpenGL, Vulkan 等等)
- GPU 架構
- 編譯器相關
- Machine Learning
- 影像處理
從網路上找到的面試分享來看,可以分成兩種方式準備面試:
- Google, Nvidia, Mircosoft 為一組
- 常見的軟體工程師面試流程
- MediaTek 為一組
- 從資訊科技產業專案設計課程中得知,MTK 有不一樣的面試方式(主管很忙會出考古題)。
### 考量自身能力與其職缺相符的程度
現階段相符的程度:
- LeetCode 寫了 32 題(Blind 75 的一半)
- 粗淺的寫過 Linux 核心設計
- Machine Learning 初學者
- 撰寫 Metal 程式語言使得 iPad 使用 LiDAR 捕捉點雲 (一種 GPU Programming)
- 沒有寫過 Computer Architecture 的作業(沒選修)
- 沒有修過平行程式設計課程
- 影像處理課程正在修
:::spoiler <a></a>

這是 Rejected 的節奏
### 職涯規劃
四年內:
- 以培養專業為主要事項
下個四年:
- 可能需要使用 Linkedin 參考類似的人物的職涯發展,目前沒有想法。
:::
### 職缺的面試題目
這裡列出 Google, Nvidia, Microsoft 可能的題目:
- C++ 題目:vtable, STL 實作, C++ 11 , C++ 14, C++ 17 特性
- 基礎 C 語言: volatile, const, function pointer, malloc, C 語言規格書
- LeetCode 題目
- 作業系統概論: Atomic
- 平行程式設計
MediaTek 面試題目:
- 都在 Linux 核心設計課程裡了
#### 相關連結:
- [C++](https://ithelp.ithome.com.tw/articles/10288192)
- [Linux 核心設計](http://wiki.csie.ncku.edu.tw/linux/schedule)
- [並行和多執行緒程式設計](https://hackmd.io/@sysprog/concurrency)
- [平行程式設計 sslab](https://nycu-sslab.github.io/PP-f20/)
- [平行程式設計公開課程](https://ocw.nthu.edu.tw/ocw/index.php?page=course&cid=231)
- [Metal on iOS: 30 days tutorials](https://medium.com/@warrenm)
## Mock Interview
<!--

-->
預計 Mock Interview 題目:
- LeetCode 面試題目
- [21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/description/)
- [23. Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/description/)
- [HetSys Course: Lecture 11: Parallel Patterns: Graph Search (Spring 2022)](https://youtu.be/cvP1aH31ar4)
- 指定領域相關提問
- C++11 相關提問
- GPU programming --> 以 iPad 點雲開發程式經驗作為例子。
#### 面試內容
- 第一階段提問:
Interviewer: 提問程式碼實作問題
Interviewee: 撰寫程式碼
- 第二階段提問:
Interviewer: 如果說有個使用情境,在 Merge k Sorted Lists 中 k 數值非常大,並且每個 lists 擁有大量元素,若要改成平行處理的方式,你會怎麼做?
Interviewee: 我會使用 Map-Reduce 方法,輸入兩組 linked lists,輸出一組 linked list。將原本多個 linked list 兩兩一組做平行處理,並且做多次迭代,最終獲得一個 linked list.
- 第三階段提問:
Interviewer: 你有實際使用 OpenGL, Cuda 經驗?
Interviewee: 我未使用 Cuda 的經驗,但有使用類似的平台,我使用 Apple 的 Metal 平台。
我在實驗室中撰寫 iPad App 的點雲掃描應用程式,就是應用 Apple GPU 。iPad 的 LiDAR 相機採樣大量的點雲資料,包含座標空間。利用 GPU 平行處理的能力,去判斷採樣的點雲的點座標是否正確採樣。
另外我依據 Apple 的 Metal 文件,在採樣過程中,將點雲透過 GPU render 到螢幕上即時顯示。目前 iOS App 已在我的 iPhone 安裝,可以現在就來使用功能。
- 第四階段提問:
Interviewer: 在撰寫過程中有遇到什麼困難?
Interviewee:
第一個困難是:在 Apple Store 中也有使用 Apple LiDAR 採樣應用程式,但是無法針對實驗室特定點雲數據做出調整,因此必須自行撰寫程式碼。
第二個困難是:LiDAR 是近年 Apple 推出的功能,而且需要 GPU, Metal, iOS App 撰寫能力,能參考的 Github 上的專案也較少。
最終的困難是:能源消耗跟記憶體使用率,修改出來的版本也要考慮耗電、跟 iPad 記憶體限制。
- 若採樣頻率極高,很容易產生上千萬顆點雲座標,在採集上容易過於密集,並且 GPU 壓力大,而且考量行動裝置特點,不能太耗電。因此要依據情境調整採樣頻率。
- 不像電腦有 8 GB 以上記憶體,iPad 與 iPhone 單一應用程式記憶體上限為 4 GB(依據作業系統版本,更高版本可以支援 6 GB),並且不支援 mmap 等等系統功能。因此必須在採樣一定數量的點雲後,寫入檔案並減少顯示在螢幕上的點。
## [Resume](https://docs.google.com/document/d/1btTvsaURR11F4Tk8E0ufGJYq1GuRT0JiMDwyyjJpXr0/edit?usp=sharing)
<!--
## [CV](https://docs.google.com/document/d/1ZljLX_XtnXV2KBB-SuxX0PEVQ4gqM-az2ecZ3DN3NDQ/edit?usp=sharing)
---
其它內容
#### [大一的時候臺大電機系大學長李聖珉](https://ithelp.ithome.com.tw/articles/10309011)
- [【人文講堂】20220730 - CTPS解決陌生問題,攸關人生大事 - 李聖珉](https://youtu.be/uUi3RLd-h1w) 2022年7月30日的影片
-->