## (一)軟體工程師(實習)(Google, 以色列)
- 招募網站:https://www.google.com/about/careers/applications/jobs/results/135402207936684742-parttime-software-engineering-intern-2024?jex=ENTRY_LEVEL&jlo=en_US&q=site+reliability+engineer
- 職位需求:
1. 對象:電腦科學(資工)相關領域尚未畢業之學、碩士。
2. 修過資料結構與演算法,並有實作經驗。
3. 熟悉下列程式語言(其一):Python、Java、Go、C++。
- 加分項目:
1. 計畫在實習結束後繼續完成學業。
2. 擁有下列程式語言的實際開發經驗:Python、Java、Go、C++。
3. 擁有下列領域的相關經驗(其一):網站開發、Linux、手機軟體開發、分散式系統、機器學習、資料探勘、自然語言處理等。
4. 對學習新的程式語言有熱情。
- 職位說明:
1. 實習生將參與對 Google 至關重要的具體項目,涉及軟體解決方案的設計、測試、部署和維護。
2. 這個實習適用於 EMEA 地區的全日制學位課程倒數第二年的學生,完成實習後返回學業。
3. 實習生在實習期間必須位於該角色所在的具體國家,並且在整個實習計劃的期間,每週至少工作兩天,為期至少26周,包括2024年夏季。
- 工作內容:
1. 研究、構思和開發軟體應用程序,以擴展和改進 Google 的產品。
2. 通過自然語言處理、人工智慧、數據壓縮、機器學習和資料探勘參與各種項目。
3. 協作解決與數據和訊息訪問相關的可擴展性問題。
4. 利用在大規模生產軟體故障排除方面的經驗。
5. 幫助維護關鍵任務。
- 匹配程度:
* 我覺得自己很適合這份工作。雖然我沒有實際的工作經驗,但這份工作並沒有對年限有明確的要求,這讓我備感欣慰。文中提到的四種程式語言當中,我對 Python 和 C++ 兩種程式語言都相當熟悉。我曾修過機器學習和資料探勘課程,並在大學專題以及研究所實驗室裡開發了一些與自然語言處理相關的專案,因此擁有較為豐富的經驗。此外,在課餘時間,我也學習過網站開發(Flask、Vue.js)和手機軟體開發(Flutter)。
---
## (二)Staff Research Scientist, Biometrics and Machine Learning(Google, 波蘭)
- 招募網站:https://www.google.com/about/careers/applications/jobs/results/122411280486015686-staff-research-scientist-biometrics-and-machine-learning?q=quantitative+analyst%2C+statistician
- 職位需求:
1. 對象:具備電腦科學(資工)相關領域碩士學位。
2. 具備「機器學習」研究背景。
3. 擁有「影像處理」相關技能。
- 加分項目:
1. 在下列「期刊」或「會議」發表過論文:CVPR、ICCV、NeurIPS、ICML、ICLR 等。
2. 在「人臉反欺詐」、「生物辨識」、「3D/2.5D」、「面部識別/姿態估計」方面有經驗。
3. 熟悉「TensorFlow」、「Flume」、常見的「電腦視覺函式庫/框架」和「Android」。
4. 具備優良的軟體開發技能,像是「C++」及「Python」等程式語言,「資料處理」和「後端開發」等。
- 職位說明:
1. Google 的研究專案組合,涉及基礎研究、新產品創新和基礎設施目標,為個人和團隊提供強調特定工作類型的自由度。
2. 研究科學家的職責,包括設置大規模測試、迅速部署有前景的想法、管理截止日期,並應用最新理論開發新的和改進的產品、流程或技術。
3. 通過分享和發布發現,以及與世界各地合作夥伴大學和技術學院的研究計劃合作,積極貢獻於更廣泛的研究社區。
4. Google 的使命是組織世界的信息,使其在全球普遍可訪問和有用。 Devices & Services團隊的重點是通過結合人工智慧、軟體和硬體,為用戶創建極為有用的體驗。
- 工作內容:
1. 領導將支撐生物識別的機器學習模型的產品化規模化的努力。
2. 在 Google 華沙辦公室擴展項目的存在,不僅包括研究科學家,還包括軟體工程師。
3. 為生物識別研究確立新的機器學習研究方向。
- 匹配程度:
* 我對「電腦視覺」及「深度學習」抱有濃厚的興趣,曾修習相關的「電腦視覺」、「機器學習」和「深度學習」課程。除了十分熟悉「Python」和「C++」程式語言及「Tensorflow」框架外,課餘時間我也投入於「影像生成」模型的訓練和「遊戲外掛」的製作。然而,我的一大弱點是缺乏加分項目中第二點所需的相關經驗,以及未在上述會議發表過相關的論文。
---
## (三)Lead Systems Development Engineer, Google Cloud(Google, 波蘭)
- 招募網站:https://www.google.com/about/careers/applications/jobs/results/97260792941814470-lead-systems-development-engineer-google-cloud?category=NETWORK_ENGINEERING
- 職位需求:
1. 對象:具備電腦科學(資工)或相關領域。
2. 對「Python」、「Shell」等有相關開發經驗。
- 加分項目:
1. 在「Go」或「Python」等大型編碼項目、網絡、存儲、監控等領域有經驗。
2. 有災難恢復(DR)和數據備份策略的經驗,展現對系統可靠性和數據保護的關注。
3. 有 Google Cloud Platform 或其他相似雲技術的經驗。
4. 具備 TCP/IP 網絡(DNS、DHCP)的經驗。
5. 能夠進行測試、優化程式碼和自動執行任務的能力,強調技術解決問題的能力。
6. 能夠領導團隊和項目。
- 職位說明:
1. 管理大規模的服務和系統,不僅寫程式碼來修正錯誤,還要提出開發及解決問題的方案。
2. 強調可觀察性的重要性,測量並將數據轉化為知識,最終將知識轉化為行動。承認 Google 系統、服務、虛擬計算環境和支持它們的操作系統的運營效率影響環境,不僅僅是底線。
3. 強調協作的價值,多樣的背景和觀點的重要性,以及在無責備的環境中冒險的重要性。
- 工作內容:
1. 了解服務的各個方面,以及它支持的功能和工作負載。
2. 包括在監控、集成測試、存儲、網絡、生產支持等重要領域的特定項目上工作。
3. 需要在不同團隊和外部供應商之間領導和交付項目,包括需求收集、架構解決方案、設計、實施和測試計劃。
4. 包括擁有監控、集成測試、存儲、網絡、生產支持等重要領域之一,並向在該領域工作的其他團隊成員提供監督和指導。
- 匹配程度:
* 在專業的層面,我曾修過與無線網際網路相關的課程,並熟練使用 Python 程式語言進行開發。然而,在大規模服務系統的管理經驗方面,我相對較為欠缺,這是我認為在這方面存在的一個弱點。
---
## Mock Interview
* **Interviewer:** Good morning! Thank you for coming in today. Can you start by telling us a bit yourself?
* **Interviewee:** Good morning! Thank you for having me. I have a master's degree in computer science. After finishing my studies, I worked as a junior software developer at ASUS for three years. There I was responsible for developing Android applications and translation system with my experience in both app development and natural language processing.
* **Interviewer:** That sounds impressive, which school did you graduate from?
* **Interviewee:** For my master's degree, I graduated from National Cheng Kung University.
* **Interviewer:** Where's that? Sorry, I have never heard of it.
* **Interviewee:** It's a public school in Taiwan....
* **Interviewer:** Yeah, yeah. Your work experience on your resume is impressive, though, which is why Robert recommended you to our human resource department. Okay, enough talking, let's get into coding. Are you ready?
* **Interviewee:** Yeah, let's begin.
* **Interviewer:** Great! Here's the prompt: Write a program to complete an incomplete 9x9 Sudoku frame accurately.
* **Interviewee:** Okay, so given a Sudoku frame of size 9x9, we need to finish the remaining unfilled areas?
* **Interviewer:** That's correct. For example, if a 3x3 sub-grid has all numbers from 1 to 9 except for 8, then the remaining field would be 8.
* **Interviewee:** Gotcha. I'll approach this problem by breaking it down into smaller steps. First, I'll need to define the input and output for the function. The input will be the incomplete Sudoku frame, represented as a 2D array, and the output will be the completed Sudoku grid. I'll iterate through the rows and columns of the Sudoku grid and identify the missing numbers in each cell. To do this, I'll need to check the numbers already present in the row, column, and the 3x3 subgrid. Once I identify the missing numbers, I can fill in the cells with the appropriate values. Now, speaking from my own development experience, I've worked on similar problems where efficient data structure usage is crucial. For example, I've implemented algorithms for checking constraints in scheduling applications. In this case, I utilized hash maps and sets to efficiently track and verify constraints. I believe a similar approach could be beneficial here.
* **Interviewer:** That sounds like a solid plan. Please go ahead and start coding.
* **Interviewee:**
```
function isValidMove(board, row, col, num)
{
// check if number not in current row / col
for (let i = 0; i < 9; i++)
{
if ((board[row][i] === num) || (board[i][col] === num)) {
return false;
}
}
// check if number not present in 3x3
const startRow = Math.floor(row / 3) * 3;
const startCol = Math.floor(col / 3) * 3;
for (let i = 0; i < 3; i++)
{
for (let j = 0; j < 3; j++)
{
if (board[startRow + i][startCol + j] === num) {
return false;
}
}
}
return true;
}
function solveSudoku(board)
{
for (let row = 0; row < 9; row++)
{
for (let col = 0; col < 9; col++)
{
if (board[row][col] === 0) {
for (let num = 1; num <= 9; num++) {
if (isValidMove(board, row, col, num)) {
board[row][col] = num;
if (solveSudoku(board)) {
return true;
}
board[row][col] = 0;
}
}
return false;
}
}
}
return true;
}
```
* **Interviewer:** Great job on the implementation! Now, let's discuss the time complexity of your solution. Can you walk us through your analysis?
* **Interviewee:** Absolutely. Let's start with the time complexity. The backtracking algorithm explores all possible combinations until a solution is found or all options are exhausted. In the worst case, this leads to an exponential time complexity. However, the pruning of invalid paths helps reduce the search space significantly. So, the average time complexity is often much better than the worst-case scenario, approaching something closer to O(n<sup>2</sup>), where n is the number of cells in the Sudoku grid.
* **Interviewer:** That's a clear explanation. Considering the nature of the Sudoku-solving problem, your analysis makes sense. Now, looking at the implementation, do you think there are any potential areas for optimization or further improvements?
* **Interviewee:** One possible optimization could involve using bit manipulation to represent the possibilities for each cell. This would reduce the space complexity, but it might make the code more complex and could be an over-optimization depending on the specific requirements of the application. Additionally, there are more advanced algorithms, like Dancing Links, that can be applied to solve Sudoku efficiently, especially in the context of larger puzzles.
* **Interviewer:** We appreciate your enthusiasm, and it was a pleasure discussing the problem with you. We'll be in touch soon regarding the next steps in the interview process. Thank you for your time today.
* **Interviewee:** Thank you! I'm excited about the opportunity, and I look forward to hearing from you.