🌊 求職寒冬下的現實衝擊
2024 年初,矽谷爆發新一波裁員潮。這次,我沒能躲過。回想上一次是在 2022 年中國封控時的全球裁員潮,當時就感受到寒意,但 2024 的情況更為嚴峻。
外商職缺驟減、薪資凍漲、全遠端職幾乎絕跡,就連平時積極的獵頭都無奈表示:「目前沒有適合你的機會。」市場變得異常擁擠,工程師不願接受降薪或降職,搶職缺變成一場實力與運氣的馬拉松。
矽谷的朋友說,有人找工作半年、一年仍沒下文;沒有簽證的,只能默默打包回國。台灣雖然半導體相對穩定,但軟體圈的外商卻紛紛裁員。我的前公司仍有許多優秀同事至今待業中。
🧰 求職準備:知識、網絡與運氣的拉鋸戰
這兩年來,我累積了接近 400 題的刷題量,白板題與上機測驗早已駕輕就熟。系統設計則靠前公司的讀書會練習了半年,雖然實務經驗仍有缺口,但概念與架構逐漸成形。
此外,我也持續在線上平台進修,並擔任線上課程導師,協助轉職學員,無形中也強化了自己的領導與溝通能力。
可惜的是,過去工作中的一些技術挑戰,沒有即時寫成筆記或整理成案例,導致在行為面試中臨時難以給出有說服力的具體例子。這也是我這次面試中最明顯的弱項之一。
整體來說,我大約投了 40 多間公司,靠著內推與主動 networking,成功獲得約 1/6 的面試機會。以下是三間印象特別深刻的公司與面試經驗。
🏠 Houzz(失敗)
- 工作型態:可全遠端
- 薪資待遇:具競爭力
這是我滿期待的一間公司,HR 面談後迅速進入技術面試環節。流程分兩關,都是演算法題。第一題難度為 easy,但會直接延伸為 medium,整體時間約 40 分鐘,最好能在 10 分鐘內解完第一題。
第一題目內容與 Stack 結構有關,第二題則進一步結合排序與遞迴。
🎯 題目:給定一組括號類型 ()
、[]
、{}
,請問輸入長度為 2n
時,有幾種合法的組合?請列出所有合法的解法。
舉例
輸入:n = 1
(每種括號一組)
輸出:
arduino
複製編輯[
"({[]})",
"({}[])",
"([]{})",
"{([])}",
"{[()]}",
...
]
這是一題結合 stack 驗證合法性 與 遞迴生成所有可能組合後排序合法解 的題目,難度類似 Leetcode 22 Generate Parentheses
的進階版本。
💡 解法思路
- 有 3 種括號對:
()
,[]
,{}
,每種一對,共 6 個字元要排列。 - 產生所有可能的排列(排列樹:6! = 720 種)
- 使用 stack 判斷每一個排列是否合法
- 收集所有合法組合
🔧 JavaScript 程式碼(產生所有合法解)
js
複製編輯const brackets = [
['(', ')'],
['[', ']'],
['{', '}']
]
function generateValidBrackets() {
const result = []
const used = Array(6).fill(false)
const chars = ['(', ')', '[', ']', '{', '}']
// Step 1: Generate all permutations of brackets
function permute(path) {
if (path.length === 6) {
if (isValid(path)) {
result.push(path.join(''))
}
return
}
for (let i = 0; i < chars.length; i++) {
if (used[i]) continue
used[i] = true
path.push(chars[i])
permute(path)
path.pop()
used[i] = false
}
}
// Step 2: Use stack to validate correctness
function isValid(seq) {
const stack = []
const match = {
')': '(',
']': '[',
'}': '{'
}
for (let ch of seq) {
if ('([{'.includes(ch)) {
stack.push(ch)
} else {
if (stack.length === 0 || stack[stack.length - 1] !== match[ch]) {
return false
}
stack.pop()
}
}
return stack.length === 0
}
permute([])
return result
}
💸 Coda Payments(失敗)
- 工作型態:全遠端
- 薪資待遇:優渥,並在東南亞多國設有據點
這是透過朋友內推進去的機會,整體流程包含線上演算法測驗、實作題以及回家作業。
面試官來自泰國、新加坡、印尼等地,面試語言為英文,使用 Google Meet 進行,題目會透過聊天室文字提供,再在線上編輯器中實作。口音有些不同,需要額外注意理解與回應節奏。
其中一題是經典的 JS 閉包與作用域題目,像這樣:
js
複製編輯function createFunctions() {
const result = []
for (var i = 0; i < 3; i++) {
result.push(function () {
console.log(i)
})
}
return result
}
const funcs = createFunctions()
funcs[0]() // ?
funcs[1]() // ?
funcs[2]() // ?
如果不了解閉包與 var
的特性,很容易誤答為 0 1 2
,實際上會印出三次 3
。因為 var
是 function scope,i
在所有回呼中共享同一個參考,當回呼執行時迴圈早已結束,i
已經變成 3。這類題目看似簡單,但臨場容易掉以輕心。
正確寫法如果要印出 0 1 2
,可以用 let
:
js
複製編輯for (let i = 0; i < 3; i++) {
result.push(function () {
console.log(i)
})
}
或是用 IIFE 包裹每次的 i
值:
js
複製編輯for (var i = 0; i < 3; i++) {
(function (j) {
result.push(function () {
console.log(j)
})
})(i)
}
🚗 LINE GO(失敗)
- 工作型態:辦公室為主,部分可遠端
- 薪資待遇:標準中上
這場面試中,重視前端技術 React 與 Next.js。作業重點除了基本的 fetch 與渲染之外,更要注意 Next.js 13 之後的重大改動,包含:
- 使用
app
directory 架構(非舊版pages
) - 採用
Server Component
與Client Component
區分,理解use client
的使用時機 - 改用
fetch()
取代getServerSideProps
/getStaticProps
等舊 API - 搭配 TypeScript 與 Tailwind CSS 增強開發效率與畫面品質
實作過程中,我特別強調資料的 loading 狀態處理、API 錯誤容錯、以及 UI 的可讀性與一致性。作業完成後會提交 GitHub repo 給面試官審查。
第二關則是針對作業進行技術討論。這場面試一次面對四位工程師,像是 mini code review。會被問到許多關於:
- 為什麼選擇用
useEffect
搭配fetch
而不是 server-side render? - 資料請求錯誤時會怎麼處理?
- 如果這個功能需要做成 SSR,你會怎麼改寫?
- Next.js 的 routing 在
app/
資料夾下怎麼運作?
📌 結語:累積經驗,修正錯誤
這段過程讓我深刻體會:會寫程式只是基本,真正能勝出的,是那些在壓力下仍能清晰表達、主動補位、細節做到位的人。
不氣餒,持續前進。下一站,也許就會是好消息。