# 資訊科技產業專案設計課程作業 3
## [Resume](https://drive.google.com/file/d/1ZtXSh2u2gMrE0lWJDyN0-2jb-GT0c8Yn/view?usp=sharing)
## [Google - Software Engineer II, Diagnostics, Tools, Google Cloud Platform](https://www.google.com/about/careers/applications/jobs/results/93255956128768710-software-engineer-ii-diagnostics-tools-google-cloud-platform?location=Tainan%20City%2C%20Taiwan&location=Taipei%2C%20Taiwan&location=Taiwan&q=%22Software%20Engineer%22)
### JD
- Develop tools and **diagnostics** in support of system health verification, performance characterization, and on-going **reliability** of machine learning and AI acceleration platforms.
- Develop software that executes in multiple systems in parallel, and develop **dashboards** to analyze the results.
Enable the testing and decision making on hardware and software design and deployment.
- Enhance the quality, performance processes, or coverage of the diagnostic tool or utility of the **Google Cloud platform**.
- **Collaborate** with Google Software, Firmware, and Hardware teams to design, plan, implement and debug.
#### 所需能力
- 軟體開發技能
- 熟悉多語言開發,例如 Python、C++、Go
- 熟悉分散式系統和多系統的開發
- 熟悉 GCP 工具開發
- 系統診斷知識
- 理解系統健康檢查、性能測試和可靠度相關知識
- 設計診斷指標
- 團隊合作與協作
- git 版本、資源管理已利跨團隊開發
- 能將技術數據和診斷 insight 順利傳達
- 科技簡報讓無參與會議、不同 team 的人快速了解下階段各 team 的努力方向
#### 匹配分析
- 專業技能
- 對運算資源的使用狀況設計 metrics 做 observability 分析
- 使用過 AWS service,對 cloud service 有概念
- 會 Tableau 資料視覺化工作建 dashboards
- 跨團隊協作經驗
- 於成大資料分析社時期有頻繁和不同領域背景(e.g. 策略、行銷)同學合作的經驗,可以快速了解不同的 domain knowledge
- 過去實習為 SRE team member,針對了不同 RD 團隊設計不同的敏感資料偵測方法,過程中頻繁與不同團隊溝通現況、痛點
- 劣勢
- 對 Go 不熟、也沒有正式開發雲端工具的經驗
- 缺乏系統診斷知識,也沒有實際案例或經驗可以借鑒
### 可能面試題目
#### Q1:如何對 cloud service 的健康狀態進行監控和診斷?
首先對於雲端服務的健康狀態,要去評估就必須要有評估的依據,就是指標,我覺得以 Colab 服務來說,核心關注指標可以為以下幾個:
1. CPU 和 GPU 使用率
2. RAM 使用量
3. 網絡延遲與頻寬
4. I/O 使用情況
5. 系統錯誤和異常種類
而有了指標後,就必須做追蹤、管理,首先對於指標如何被儲存也是一個議題,寫好 log 的格式是很重要的,再者對於監測,必須先收集資料才能計算指標,data pipeline 也是要設計過的,要在系統上的哪些 endpoint 收數據回來、用什麼方法(e.g. API)讓資料流回來、若有資料遺失要如何處理等等都需要考慮。
最後是自動化通知異常的功能,假設某些關鍵指標達到預設閾值,就能自動發送 alarm,讓相關團隊快速知道目前可能發生的問題為何,針對對應問題即時處理。
#### Q2:什麼方法可以檢測機器學習模型在硬體上的記憶體瓶頸?
我覺得主要可以確認記憶體使用量,簡單舉例幾個具體可以檢測記憶體使用量的方法:
1. 最直接的方式就是利用硬體本身內建 command 檢視,像是 nvidia-smi 就能讓我們查看 GPU 的記憶體使用情況,若 GPU 記憶體被耗盡,就會影響模型的訓練效率
2. 在訓練過程也可以檢視記憶體消耗,可以透過像 torch.cuda.memory_allocated() 等 PyTorch 提供的 API 來定期檢查模型訓練過程中所需的 GPU 記憶體
3. 透過模擬硬體行為也可以檢測,像是 Google 的 TensorFlow Lite 就可以透過輕量架構初步估算可能需要的運算資源用量,或是提早發現在怎樣的 batch size 配置時會遇到瓶頸
## [Spotify - Data Engineer@Personalization](https://www.lifeatspotify.com/jobs/data-engineer-personalization-2)
### JD
- Build **large-scale data pipelines** with data processing frameworks like Scio, BigQuery, Google Cloud Platform and Apache Beam
- Develop, deploy, and operate Java services that impact millions of users
Work on machine learning projects powering the experience that suits each user **individually**
- **Collaborate** with other engineers, product managers and stakeholders, taking on learning and leadership opportunities that will arise every single day
- **Deliver** scalable, testable, maintainable, and high-quality code
Share knowledge, promote standard methodologies, making your team the best version of itself through mentorship and constructive accountability.
#### 所需能力
- 開發技能
- 熟悉大規模數據處理框架
- 熟悉機器學習,特別是個人化推薦系統
- 有開發和運維 Java 服務的經驗
- 快速團隊協作
- 能快速調整策略/方法以因應產業趨勢
- 能將技術數據 insight 順利和非專業背景的人傳達
#### 匹配分析
- 本身是重度用戶,可以假設多樣用戶情境設計推薦演算法
- 專業技能
- 在實習中都有遇到巨量資料處理,熟悉 numpy, pandas 等等經典資料處理 tools
- 大學畢業專題為推薦系統,對經典方法運作有基本理解、也可快速理解
- 有 CI/CD 及 IaC 經驗,更好 deliver good code
- 跨團隊協作經驗
- 於成大資料分析社時期有頻繁和不同領域背景(e.g. 策略、行銷)同學合作的經驗,可以快速了解不同的 domain knowledge
- 有策略相關專案,懂得建立問題假說去驗證,有利於個性化的達成
- 劣勢
- 不熟 Java
- 較少接觸過音訊格式的資料
### 可能面試題目
#### Q1:如何向非技術同事解釋某個 module 的作用?
假設以一個在做特徵工程的 module 來說,可以把這個 module 想像成我們在做分析或訓練模型之前,會收集到很多原始數據,但這些數據可能沒有直接的分析價值,或者它們的格式不適合直接用來做預測。
舉例來說我們有一個記錄音樂播放次數的欄位,這是一個很簡單的資料,但如果我們能把這個數據轉換成『這首歌在某段時間內的流行趨勢』,那麼這樣的資料對於我們要做推薦會更有用。特徵工程 module 的作用就是自動完成這些轉換,幫助我們提取出更有價值的資訊。
像這樣,在解釋的時候,我會盡量避免專業術語,且透過一些舉例說明 module 的效用和具體在遇到、處理問題時是怎麼做的。
#### Q2:如何設計個性化推薦的 data pipeline?
設計這種 pipeline 可以拆解成幾個步驟去想:
1. 資料收集:先從用戶的行為數據開始,比如他聽了哪些歌、喜歡的歌大部分為哪些類型、跳過了什麼、還有播放時長這些細節,在這邊也可以同時去多加延伸資料可能創造的價值,比如建立一些假說透過資料去驗證,更好去理解用戶的 behavior pattern,讓後續達成個性化的效果更好
2. 資料處理:也就是資料清洗,過濾掉沒有用的資訊,像是可能因網路斷線造成的資料損失,或是將某些資料轉換成模型較好理解的格式
3. 特徵工程:把行為數據轉換成數字特徵,比如用戶對某類型音樂的偏好程度、將文字描述轉為詞向量等等
其中這些步驟之間的資料流還涉及如何設計資料傳輸的 API、和用戶端的資料存取權限為何、收集到資料後如何存放在 database 中等等 data engineering 的議題,都是需要去考慮的。
## [Microsoft - Software Engineer 2](https://jobs.careers.microsoft.com/global/en/job/1773282/Software-Engineer-2)
### JD
- Full Software Development Lifecycle: As a key contributor, Design, develop, test, deploy, and monitor high volume, high scale services running on the Cloud based platform.
- Data Pipeline Management: Build and manage data pipelines processing the data driven features and intelligence to drive Ads business growth.
- Development & Ownership: Drive and build customer-focused features from planning and design through to release and maintenance.
- Cross-Functional Collaboration: Work with partners, engineers, and program managers within Microsoft to deliver compelling solutions.
- Infra builder for AI Empowered Scenarios: Act as a Designated Responsible Individual (DRI), development the intelligent questions answering and insights provider feature to bring convincing insights and actionable recommendations to customers
- Adaptability: Proactively seek new knowledge and adapt to new trends and technical solutions to enhance the performance and reliability of our products.
#### 所需能力
- 開發技能
- 熟悉 SDLC(包括需求分析、設計、開發、測試、部署和監控)
- 熟悉大規模數據流的工具和框架,例如 Apache, Spark 等
- 可以掌握各個技術領域的新工具推出、趨勢
- AI infrastructure
- 團隊合作與協作
- 能夠與其他工程師、PM 等合作,了解問題、需求分析,設計對應 feature/function
#### 匹配分析
- 專業技能
- 過去實習有 CI/CD 及 IaC 經驗,可以基礎掌握 SDLC 中後期如何運作
- 大學專題將 ML/NLP 應用在日常議題上,對於 AI 如何應用在客戶場景中稍有經驗
- 有做過 data-driven business value/行銷 EDM 相關專案
- 過去實習為 SRE team member,較熟悉整個 RD 完整的 SDLC,也常與不同團隊人員互動
- 劣勢
- 沒有讓 AI model 上雲的經驗
- cloud 工具沒有用過 Azure
- 目前用過工具不多,要掌握新技術叫沒有頭緒
### 可能面試題目
#### Q1:如何設計和實現一個基於內部技術文件的 AI chatbot?
我覺得可以透過 RAG 的方法來實現:
首先就是 retrieval,將輸入的問題轉換為向量,可能可以用一些 word2vec model 處理,生成向量後再取相似找到最相關的文件段落,在丟給處理生成的 model。
再來就是 augmented generation,可以透過目前現有的 LLM 搭配 prompt 去生成可以清楚傳遞資訊且易於理解的回答;prompt 可能像是:
```
根據以下公司內部技術文件的內容回答問題:
內容:{retrieved_content}
問題:{user_query}
```
而整個系統的話大概會分為三個主要 module:
前端 UI:提供視覺化好理解的界面,比如 web 或 Slack 等等通訊軟體
後端查詢:接收問題、轉換 request、處理查詢結果
AI(NLP):和後端互動、生成自然語言回答(就是剛剛提到 RAG 的方法)
#### Q2:如何和 PM 了解一個新的 feature?
由於 PM 通常非技術背景的合作夥伴,且是相對了解專案全局的人,我會特別注意兩個部分,一是需求、二是相關資源有何:
對於理解需求,這通常和用戶行為、團隊/專案目標、當前問題為何有關係,我會問一些具體的問題,例如:這個功能的目的是什麼?如果基於現有 XX feature 去優化可以達到預期效果嗎?等等。
涉及一個 feature 的相關資源包含開發時間、回饋機制(用戶端、PM 端、PM 經驗)、有無其他開發人員會參與或協助、可能用到的資料來源為何...等等,詳細去確認開發過程中可能遇到的狀況。
除了這兩個我特別關注的事情,關於技術面也很重要,比如功能架構、開發工具和語言選擇都是可以提出討論的面向。