三種軟體工程師——編碼員、程式師和架構師

edithfang發表於2015-01-15
從小時候開始,工程師在我的心目中就不是一份高尚偉大的職業。

工程師必須要用沒人聽得懂 (也沒人有興趣) 的語言,去架構出能被使用的東西。這些東西可能是建築物、車子、機器、電路板、軟體等等⋯⋯

人們總是會將產品的功勞歸給「計劃者」(如 Steve Jobs) 以及設計、行銷、管理者。而我們的工程師似乎就像是一些可以被替換的零件,沒有人會記得他們的名字。他們所做的事情也可以被其他人取代。

直到後來,我自己加入了軟體工程師的行業,對於工程師的想法也有所改變。今天,我想在這邊跟大家分享一下我對於「工程師」的看法。

雖然在中文裡,大家都叫做工程師,但其實根據工程師喜歡做的事情、心中對於程式的想法,可以分成幾種類別的人。這邊簡單的以我的認知,把寫程式的工程師分成三類。

第一,寫程式的人 (Coder、Employee、Worker)

這種型別的人單純的只是為了工作、功課、任務而寫程式,雖然職務名稱叫做工程師,但是寫程式對他們來說只是獲取成績、金錢的工具,寫程式對他們來說枯燥無味,但為了生活,他們繼續產出他們的程式碼。他們喜歡簡單的任務,最好是一看到就知道要怎麼做,最好有開源的程式碼可以直接套用。只要他們的程式可以過關,他們就開心的回家睡覺去了,一秒鐘都不想再看程式碼。

第二,有目標而寫程式的人 (Hacker、Doer、Entrepreneur)

這種型別的人並不是因為熱愛「程式」本身而開始寫程式,他們寫程式是為了要達成某些目的。這些人雖然不是天生的程式高手,但是很會用別人寫好的套件去兜出一些應用,當有一個好的點子時,他們第一件事不是去想:「我本身不是學這個的,我要怎麼樣才能找到別人來幫我做⋯⋯」他們會去找既有的資源架構,嘗試做出原型 (Prototype),有時候雖然做出來雖然有點破 (像是下圖右方的機器人),但他們樂在其中,並且常常不眠不休的寫程式。我自己會將 Mark Zuckerberg(Facebook)、Drew Houston(Dropbox)、David Karp(tumblr) 這些創辦人歸在這類。



第三,熱愛程式本身的人 (Architect、Theorists、Change Maker、Geek)

這類工程師喜歡程式本身,他們欣賞程式設計的架構、可擴充性、可被測試性。他們喜歡最新的科技,並且會主動的去接觸、試用它們。他們喜歡寫有架構、能夠被別人重複使用的套件 (Library)。他們樂於貢獻自己所知所學到這個世界,並且常常在想有沒有什麼最新科技、理論能夠套用到某個工具或服務上,讓這個服務更快、更大、更好。他們是三種型別的工程師中技術最高超的一群 (如上圖左方的人),也常常是能夠改變整個程式世界遊戲規則的人。如 jQuery 的發明者 John Resig、Linux 發明人 Linus Torvalds、個人電腦發明者 Stephen Gary Wozniak,還有許許多多的 Google 工程師們。


寫到這裡,我忽然想要澄清一個大眾對於工程師的誤解。當大家看到一個東西、軟體不好用,或是 UI、UX 設計上有問題時,常常會說製作這個東西的人用「工程師思維」在設計。又或是團隊在討論一樣東西時,PM(Product Manager) 或管理者常會對工程師說:「你那是『工程師思維』,站在『使用者』的角度來說⋯⋯」工程師常因為大眾對自己身份的刻板印象,被弄到連發言權都沒有,或是提出的意見不被重視,但事實是怎樣呢?

如上面所說,工程師分成三種。而所謂的「工程師思維」,充其量只能形容第一種人 (Coder) 的所作所為。

Coder 的工程師思維

Coder 因為只想把事情做到交差了事,因此他們每天的任務就是把上面說要做的事情完成,一分不多、一分不少。因此,假設管理者、PM 在 Spec、Feature 中沒有把整個使用流程、步驟、使用情境全部拆解成任務,這些 Coder 是不會自動幫忙把 UX 做好的,當他們發現這個系統使用起來會有問題,他們會選擇默不吭聲,因為提出一個好的意見,只代表自己的工作會增加 —— 而這是讓 Coder 最不開心的事情。

在充滿 Coder 的工作環境,做出來的東西就有機會充滿「工程師思維」(不好用、UX 爛),因為這些東西只是一堆 Feature(Coding 任務) 的結合。要營運這樣的公司必須要有很強的 PM 和設計者,能夠有效管理員工、定義產品,才能讓 Feature 拼湊出好的產品。

Hacker 的工程師思維

而第二種人 (Hacker) 是最討厭別人說他們有「工程師思維」的人,因為他們其實是普通人和第三種人 (Architect) 的混種。Hacker 知道怎麼完成一樣事情,但技術沒有這麼高超。他們重視目的和 UX,因為他們喜歡使用自己做的東西。當公司要規劃一項新產品時,他們不會因為這項新產品做起來簡單、輕鬆,工作負擔輕而開心 (Coder 會)。相反,他們會因為這些東西好用、創新而興奮不已。當有任務下來,Hacker 不會讓使用的細節從眼前溜過,他們會默默的將設計不完整的地方補完。有時候他們甚至會和管理者爭論,這個 Feature 到底該不該有,因為他們認為使用者不會喜歡。

假如在公司沒有權力,Hacker 其實是角色最尷尬的人。至於尷尬在哪⋯⋯,我想這個祕密就留給 Hacker 們了。

架構師的工程師思維

而第三種人 (Architect) 的確是有工程師思維,但工程師思維對他們來說應該要是種稱讚。Architect 的工程師思維源自於兩個面相,第一個是他們喜歡有秩序、可以永久儲存、重複使用的東西,第二個是他們無私的想要貢獻自己做出的東西給這個世界。當公司或團隊在討論時程時,Architect 的第一個思維會讓他想要阻止大家天馬行空的亂提點子,因為他知道這些點子拼湊在一起,程式或產品架構會是個一團亂 (但這時候 PM 會說:「那是因為你從工程的角度去想,但使用者使用起來不會這樣覺得,你這是工程師思維」)。但實際上,一個好的產品設計,從工程上面來看應該也要是規律、優雅而有深度的。若工程設計本身具有規則,使用者在使用時是可以隱約感受到其背後令人舒適的邏輯的。因此我認為 Architect 喜歡秩序的工程師思維是好的。

而 Architect 的第二種思維——貢獻於整個世界,有時候對於末端使用者 (也就是我們所稱的「大眾」) 來說,會是一個小災難。Architect 會希望把一個東西做到擁有很大的擴充性、以及很多的功能,如此一來任何一種人都可以視自己的需求,去變化使用這個東西。而這種想法最知名的例子,就是蘋果電腦的發明人沃茲·尼克,曾和 Steve Jobs 爭論,它希望電腦上面要有很多可擴充的插槽,如此一來各類的科技人才能視自己所需去改裝電腦。(後來 Steve Jobs 沒讓他這樣做,沃茲尼克還小生氣了一陣)。

但 Architect 的第二種思維,常常是他們做出來的東西能影響這整個世界的關鍵。Internet、Linux、python、ruby、C 語言⋯⋯Architect 創造出來的東西,無私的奉獻給這個世界,成為科技發展的基石,因此一般大眾才有機會使用簡單易懂的科技產品。



在我們的環境中,有太多的 Coder、也有許多從 Coder 變成的 Hacker(他們的差別只在有沒有目標,還有去實作的毅力),但比較少真正願意奉獻、熱愛程式的 Architect。

至於我呢? 目前還只是個有目標的 Hacker 而已,距離真正厲害的工程師還有很長的一段距離。但自詡為一個 Hacker,還是希望自己能夠繼續做出對世界有貢獻的東西 ( 之前做的 Timego 也該繼續更新了 )。



當你有一個想法,並用自己的雙手實現出來,然後按下一個按鈕,讓幾百萬人都能分享你的成果。我想我們是世界上第一代能夠有此經歷的人。 —— Drew Houston in “What most school don’t teach”

後記:

話說這次之所以會寫這篇文章,是因為昨天想要在 iPad 上看第一銀行的電子書,但很不幸的,它是 Flash,iPad 無法觀看。而使用 Puffin 它竟然說網頁記憶體用量太大不讓我開,這時我想起自己是個工程師,於是就用 Dropbox 的公開資料夾當做伺服器,自己寫的幾行程式碼當做載具,簡單的做了一個 iPad 觀看版本。做完後覺得,嗯,當工程師還是有一些特殊的地方的。晚上心血來潮,就寫了這篇文章。

我想人們之所以會走向不同的工程師型別,和工作環境、投入的 Project 也有很大的關係,即使在 Google,也有很多聰明的人因為一些因素成為單純生產 Code 的 Coder。

希望每個工程師都能選擇自己想走的路,生活、創業、貢獻⋯⋯ 一切都是自己的選擇。

本文作者 St. Threath,以網路領域為自己的志業,同時喜歡科技和人文這兩個極端,夢想是到矽谷的偉大航道創業。目前和創業夥伴一同開發和經營美食 app「愛食記」。




後來我的朋友 Szu-Yu Chen有迴應一篇文章,提出不一樣的觀點,大家也可以參考看看:

這篇主要的目的是迴應上文《三種工程師——Coder, Hacker and Architect》,並亂扯一下我目前的心得,建議可以先看完上篇,會比較好懂。

最大的問題是我不認同這個分類,通常分類都是互斥的,但文中的這三個類別,給我的感覺卻怪怪的,另外也不該有哪一個更高尚的比較。

Coder

第一個角色是 Coder,就是僅僅把寫程式當成工作的人。廣義的來說這不受限於寫程式或是工程師。這種人就是沒興趣沒熱情,為了謀生而工作的人,或是其實不缺錢,但搞不清楚為什麼而工作的人。

這個問題是,這些人就是把工作當成雜事或是職業,而不是志業,每天早上去上班,因為必需要去,而不是自己想去,去了之後就開始期待領薪水,期待放假。而讓自己做好的主要工作動機都是外部因素,升遷、加薪、權力。

把工作看成志業的人,會認為工作本身就是他的目的,動機來自於內在因素,覺得有貢獻,覺得在實現自我。當然這種人也是在乎薪水跟升遷的!

這兩個的差別就是工作態度。會走上 Coder 之路的人,是因為他在選擇工作時,思考的是「會做什麼」,「擅長做什麼」,因為我會寫 Code,所以找了一份寫 Code 的工作。
曾經我也很瞧不起這種人,就是因為有這種人在,造成劣幣驅逐良幣,工程師的地位低落,我甚至覺得,在一個公司裡,這樣的人大概有八九成,一個人到底有沒有興趣有沒有熱情,其實都會彰顯出來的。不過阿,就像最近很紅的這篇「我在微軟學到大學沒教的事」所說,不是每個人提到寫程式時都會滿腔熱血,是阿,It’s all about priorities,也許他就是不想成為一個偉大的工程師,試著去尊重每個人的選擇!

不過雖然這麼說,這種人也讓人覺得很可惜,我認為他們應該試圖尋找一個可以當作自己人生志業的工作。就如同馬斯洛說的「一個人最好的運氣和最大的福分,就是有人付錢請他從事他衷心喜愛的工作。」

所以怎麼找到自己的志業呢?

管理學大師 Stephen Covey 認為一個人的獨特貢獻應該是天賦才能、工作熱情、需求、道德良知的交集處 (From <Great work, Great Career>)。

哈佛幸福課講師 Tal Ben Shahar 則說,可以透過 MPS (Meaning Pleasure Strength)的流程來幫助自己,思考什麼東西做起來有意義,快樂,而自己也擅長。

LinkedIn 創辦人 Reid Hoffman 也說了一個類似的,什麼是你的競爭優勢,是資產、抱負、市場狀況,三者缺一不可。

所以,我想應該很清楚了吧!

Hacker

再來就是什麼是 Hacker,有人提到文中 Hacker 的定義怪怪的,是的,這正是我想說的,Hacking 是一種精神,擁有 Hacking 精神的人就是 Hacker,更詳細的可以看 How to become a hacker,另外說自己是一個 Hacker 也怪怪的,「You aren’t really a hacker until other hackers consistently call you one」,就像你不能自己說自己是個好爸爸,這要由你的小孩來說。話說,我也想成為一個 Hacker,可以有 Hacker 來認可我嗎 XD

前陣子在PyCon TW 聽了一個 talk,有一個我很喜歡的 Hacking 定義:「在條件限制下,達到預期外的效果」,講者說了一個 Hack checkIO 的故事,checkIO 是一個透過玩遊戲學寫程式的網站,基本上 online judge 就是給你一組 input,要求算出某個東西,然後跟標準 output 比較,看你是否正確,checkIO 使用

assert checkio (<given input>) == <golden output>


的方式比較,結果他把 == 做 operator overloading,讓結果不管是什麼,== 都是 True,瞬間通通破臺了。這就是 Hack,預期外的效果。

而 Hacker 也沒有限制要是工程師,只是對於軟體工程師來說,作這樣的事有較大的優勢,很容易作些什麼就讓這個世界更好。是的,就是解決問題,然後回饋社會。用這樣的觀點來看,g0v就是一群很棒的 Hacker。

架構師

Architect 其實是個職稱,地位比 Engineer 高很多。我認為應該分成會寫 code,跟不會寫 code 的,在大公司裡很多這種不會寫 Code ,只會動嘴巴的,well… 不予置評。

其實人人都是 Architect,程式設計師的三個美德,懶惰、不耐煩、傲慢。為了懶惰,自然而然就會產生有秩序,可以永久儲存、重複使用的東西。這麼說好了,打造這些東西都是為了日後可以偷懶而努力。

再來原文中所說的 Architect 災難,比較像是 Joel on software 中的 architecture astronauts,當架構過了頭,而失去了原本真正要解決的問題。

最後

我發現我有點想要偷懶,開始虎頭蛇尾了 XD,不如就在這邊下個結論吧。

我一直認為工程師是很偉大的,也期許自己可以成為一名偉大的工程師,所以就讓我們一起。

Hack the world and code for tomorrow!



在後面我回復他的文章如下:

其實假如要我重新再寫一次文章,我可能會照這樣的分類來分。依照熱情和能力分成四個象限,兩個軸,X 軸是有沒有熱情,Y 軸是能力高不高超。
Coder Hacker (我說的 Architect)
——–+——–
Coder Hacker (我說的 Hacker)
而在文中說把自己歸類在 Hacker 只是要說自己技術還沒到這麼高超而已 XD
現在看起來,我似乎濫用了 Hacker 這個名詞,因為 Hacker 在程式界似乎包含了「高超技術」的印象,相反地 Architect 反而被歸類在 Manager 之類的角色。


謝謝大家的留言,在一般觀念中大家提到 Hacker 指的是程式技術高超的人,而這邊是把採用 Funders and Founders 的定義:「Hackers are doers」。不論程式技巧高不高超,只要能實際去做、去實踐自己想要達到的目標,就是個 Hacker。

但這樣的定義似乎不是傳統定義,不好意思因為這樣的標題混淆到大家的視聽。文中所提到的 Architect 是真正的 Hacker(而且是 Super Hacker),因為他們願意做,而且技術又高超,兩種 Hacker 的定義都完全符合。希望文末這樣的說明,能夠讓名詞的定義更加清楚
相關閱讀
評論(1)

相關文章