因為「我們會再聯絡你」不是一個可觀察的狀態。
我最近投了一份工作申請。
那是那種你真的有認真準備的申請。我仔細讀了職缺描述、針對該公司調整履歷、特別寫了求職信,還回答了那些標示為可選的問題,而不是假裝它們真的可有可無。
然後我按下了 Submit,接著……什麼都沒有。
沒有確認信。沒有「我們已收到您的申請」。沒有任何候選人紀錄已建立的跡象。只有瀏覽器頁面告訴我提交成功,以及那種模糊的希望:在某個地方、在某個求職者追蹤系統(ATS)的深處,我那份費盡心力整理好的申請,沒有被直接寫進 /dev/null。
身為開發者,我覺得這很令人不安。不是因為我期待一定會有面試,也不是因為我認為每個招募人員都欠我一份客製化回饋。我只是想要一個狀態碼。
而且我認為,這個要求比聽起來還要小,原因我最後會再提:那些狀態本來就存在。某個 ATS 裡,我的申請一定處於某個狀態。選擇不把它顯示給我看,這是產品決策,不是隱私限制。
當軟體向另一個系統發出請求時,我們通常會認為,接收方最好能說明發生了什麼事。成功了嗎?還在處理中嗎?請求格式有問題嗎?資源不見了嗎?伺服器出事了嗎?
HTTP 早就提供了完整的語彙給我們。
相較之下,招募系統發展出的協定則是這樣:
POST /careers/applications
[沒有任何可觀察的回應]
這之後有時會在三分鐘到六個月之間的某個時間點,接著出現:
經過審慎考量……
與其發明像「審核中」這種模糊的候選人狀態,不如讓招募系統採用開發者已經看得懂的東西。
200 OK一位真人已經審閱了你的申請。
除此之外,沒有任何暗示。
老實說,光這一點就足以稱得上革命。
202 Accepted你的申請已收到,並已接受處理。
這是整個招募協定中最重要的狀態碼。候選人不需要招募經理的批註,也不需要內部流程導覽。他們需要的是:
202 APPLICATION_ACCEPTED
現在我們知道這件事確實存在了。
204 No Content你的申請已成功收到。
我們選擇不以任何形式回應。
302 Found我們找到了內部候選人。
謝謝參與。
304 Not Modified你的申請已經「審核中」47 天了。
自從你上次查詢以來,或者說更早前的 23 次查詢以來,都沒有任何變化。下次查詢也不會有變化。請考慮把這個回應快取在本機。
410 Gone你申請時這個職缺還存在。現在已不存在。沒有更多資訊可提供。
至少 410 會有用多了。現在的發現機制通常只是發現你收藏的職缺頁面,開始重新導向到招募首頁。
401 Unauthorized你必須先建立帳號才能應徵。
你的密碼必須包含至少 14 個字元、大小寫字母、數字、符號,以及一個古代蘇美爾文字符號。且不能與你自 1997 年以來使用過的任何密碼相同。
接著你還要手動把剛剛上傳的履歷中的每個欄位重新輸入一次。
而且你再也不會用這個帳號了。
403 Forbidden你具備所需的經驗與資格。
不幸的是,你住在距離我們判定這場 Zoom 會議可發生範圍之外 37 英里處。
404 Not Found找不到招募經理。找不到招募人員。找不到職缺公告。
沒有人知道這個職缺是誰負責的。
408 Request Timeout在七週沒有任何聯繫之後,候選人已接受另一份工作。
招募團隊會在明天聯絡他們,安排第二次面試。
409 Conflict這個職位要求 12 年的正式上線經驗,而該技術是在 6 年前才被推出。
衝突無法解決。
417 Expectation Failed你以為「我們會再聯絡你」表示未來還會有後續溝通。
但它不是。
422 Unprocessable Content你的經驗很相關,但你的職涯路徑無法乾淨地對應到我們 ATS 預先定義好的欄位。
可能需要人工介入。
但人工介入不可用。
425 Too Early你在職缺發布 14 分鐘後就投遞了。
LinkedIn 顯示已有 612 位應徵者。
我們也有疑問。
451 Unavailable For Legal Reasons你的資格不是問題。
問題是背景調查供應商、效力不明的競業禁止條款,或者沒有人想成為第一個開口詢問的簽證擔保問題。
500 Internal Server Error內部出了問題。你的招募人員離職了、職缺名額被凍結、招募經理改了需求、財務部重新考慮預算、組織重整了,或者這個職缺其實是誤發的。
我們會用同一種訊息來說明這些可能性:
我們已決定與其他候選人繼續進行。
502 Bad Gateway招募人員說他們在等招募經理。
招募經理說下一步歸招募團隊負責。
你的請求無法被路由。
503 Service Unavailable你的招募人員已經不在公司了。
但他的行事曆連結仍然有效。
504 Gateway Timeout「我們預計會在週五前做出決定。」
週五已經過了。規格沒有定義這裡指的是哪一個週五。
在這些玩笑底下,其實藏著一個嚴肅的重點。招募有可觀測性問題,而且通常被誤認成溝通問題。
公司理所當然不能把招募流程中發生的一切都對外公開。候選人評估是私密的。面試回饋可能敏感。招募經理需要空間去比較人選並做出決策。
這沒問題。沒有人要求:
GET /hiring-manager/private-thoughts/about-me
但在「公開機密討論」與「完全不提供任何資訊」之間,還有非常大的空間。
一個招募流程本來就有狀態。申請已收到。進入審查。有人審過了。要求面試。職缺暫停。職位已補上。職位已取消。候選人未通過。
這些狀態轉換本來就存在於系統裡。它們已被記錄、帶有時間戳,而且可以被報表化,因為招募團隊本來就是這樣衡量自己的漏斗。唯一看不到這些紀錄的人,就是這個流程中的候選人。
想像一個求職者入口網站,顯示的內容只有這樣:
202 已收到申請 3 月 4 日
200 已審閱 3 月 19 日
304 無變化 4 月 2 日
304 無變化 4 月 30 日
410 職缺已關閉 5 月 12 日
這算不上什麼顛覆性的透明。甚至幾乎談不上透明。但它至少能告訴你系統是正常運作的。
它能讓你不必擔心申請是不是消失了。它能減少毫無意義地刷新入口網站。它也能避免候選人把沉默解讀成資訊,因為沉默可能代表任何事——從「招募經理在休假」到「這個職缺兩週前就取消了」。
更重要的是,它把申請者當成流程中的參與者,而不是被送進某個沒有文件說明的端點的封包。
200 OK我不期待每份申請都能換來面試。我投了夠多份,已有相當多的實證支持這個看法。
我也不期待詳細的拒絕回饋。我理解公司為何不太願意提供。我甚至不特別介意 403 REQUIREMENTS_NOT_MET 或 410 POSITION_FILLED。那些都是答案。
現代招募最令人沮喪的,不是被拒絕,而是不知道到底有沒有任何事情正在發生。
軟體工程師花了幾十年圍繞著一個簡單原則建立系統:當一個系統請另一個系統做某件事時,回應應該要包含足夠資訊,讓人理解發生了什麼。
候選人不是在要求你們招募基礎設施的分散式追蹤。
我們只想要一個狀態碼。
原文出處:https://dev.to/kenwalger/your-hiring-process-needs-http-status-codes-png