Member-only story
軟體工程師的修煉與成長 (10) — 四維的技術能力

過去幾年正好是軟體工程師的黃金年代,各大科技公司不斷擴張並抬高工程師的行情,每個產業也都想要雇用軟體工程師來把企業改造成科技公司。資訊科系的畢業生供不應求,這個需求甚至外溢到任何跟電腦或程式有扯上邊的科系,只要有在學校寫過一點程式,不管是Fortran還是Matlab,也一批批的跑來找軟體工程師的工作。即使原來在完全不同領域工作的人,也都紛紛加入coding bootcamp,想要密集訓練幾個月的程式設計後就轉職成軟體工程師。
現在很多科技公司甚至還有「學徒計畫」,想要招聘一些非傳統CS (Computer Science) 背景但有潛力的人來當工程師,不但能增加公司的多元性還能補足一些招聘上的需求。在這麼多需求的情況下,還真的有不少人透過bootcamp或是學徒計畫成功轉職,結果就是讓更多人趨之若鶩。
但成為工程師真的有這麼容易嗎?一個大學CS學位和bootcamp產生出來的工程師技術能力到底會差在哪裡?如果能透過bootcamp學幾個月就變成工程師,為什麼還要去大學念四年的CS甚至是花更多時間唸碩士或博士?另外,這是不是代表成為工程師的門檻很低,大齡工程師未來很快就會失去價值了?
技術能力的差距
這年頭要說自己是「軟體工程師」似乎太容易了點。買本書學個HTML和Javascript照著範例做一做,不用幾天就能做出自己的web app。如果目標是進入軟體公司工作,去個bootcamp花三個月,然後刷個一兩百題LeetCode,似乎就能找到工作了。想想要成為醫師或律師要花多少時間在學校要考過多少考試才能得到執業的資格,天底下好像沒有哪個專業工作的進入門檻是這麼低的。
會有這樣的現象,當然很大原因是這個行業的需求太過強烈。想要軟體工程師的公司太多,但供給卻太少,所以只要稍微能寫點程式的都可以成為某種程度的工程師。但是,我在「軟體工程師的修煉與成長 (2) — 規模與複雜度 」一文中提過,架一個「看起來像Facebook的網站」服務幾個人並不是什麼難事,但要真正把規模從服務10個人提升到能服務10億人的程度就非常、非常難。在巨大的流量下,只要是會出錯的事就一定會出錯,即使是百萬分之一機會才會出現的bug都會變成每天都出現的常態。
同樣的,看起來同樣是軟體工程師,其背後的技術能力是有一個非常寬的光譜的。這個技術能力的差別,會體現在他們能解決問題的廣度和深度上,還有他們打造出來的系統品質上。
那麼,這個「技術能力的差距」到底是什麼?
剛開始學寫程式的人,很常會把技術能力跟「對程式語言的熟悉度」劃上等號,好像如果很熟悉某個語言的奇技淫巧,或是能寫出複雜難懂的程式碼就是技術高手。我在剛開始學程式時也經歷過這種時期,但後來慢慢瞭解到程式語言不過就是跟電腦上其他系統溝通的一種介面。如果只知道自己的程式行為,而不了解其他跟著連動的系統,是完全沒辦法寫出正確又高效的程式的。
如果對程式語言的熟悉度不是那麼重要,那什麼才是?第二種常見的誤解就是把「對某種API或開發框架的熟悉度」當作技術能力的標竿,像是做web用的React、Vue,或是做desktop的Electron、.NET。
我在以前的文章提過不少次,培養技術能力要避免一直追逐最新的語言或最新的框架。這些新技術會不斷地出現,如果只是停在對技術的表層理解,就會覺得好像永遠學不完。要真正在技術實力上有所成長,就要能看穿這些「介面」並真正理解這些技術背後運作的原理還有設計的脈絡。
高手對技術的理解是四維的
我在D社看過不少非常厲害的工程師,他們的共同特點是對於軟體系統的理解是「四維」的。如果把我們用來開發的程式語言和框架比喻成整個系統最上層的「二維表面」,在這個表面下面其實還有非常多層的抽象介面,就像一個千層蛋糕一樣,一層一層疊起來變成現在大家看到簡單易用畫面又精美的軟體。
厲害的工程師並不是不用常見的程式語言或框架,而是他們在用這些工具的同時,也可以往下多看到好幾層的系統內部發生了什麼事。這個對於系統「深度」的掌握,就是第一個維度的差別。
技術的深度
有一個古老的技術面試題目可以很容易地看出一個人對於系統深度的掌握程度:「當你在瀏覽器上打入一個網址並按下enter後會發生什麼事?」如果沒想過這件事的人,不妨停下來先想想看你可以想多深。
普通的工程師,基本上要能回答出「查詢網址對應的IP」、「瀏覽器送出HTTP(S)請求到該IP的伺服器上」、「伺服器處理這個請求,送出包含HTML的回應」、「瀏覽器收到回應後開始parse HTML,送出更多請求取得CSS、Javascript和圖片,並把畫面render出來」…。
這些步驟從表面上看起來不難,每個軟體工程師都應該要知道,但每一步其實都可以往下鑽得非常深。例如說,「查詢網址對應的IP」到底在底下發生了什麼事?最表層的答案是「透過DNS…