2013年6月15日

三種工程師 -- Coder, Hacker and Architect



從小時候開始,工程師在我的心目中就不是一份太高尚的職業。

工程師必須要用沒人聽得懂(也沒人有興趣)的語言,去架構出能被使用的東西。這些東西可能是建築物、車子、機器、電路板、軟體等等...
一般大眾會將一樣產品的功勞歸給"計畫者"(如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的工程師思維源自於兩個面相,第一個是他們喜歡有秩序、可以永久保存、重複使用的東西,第二個是他們無私的想要貢獻自己做出的東西給這個世界。當公司或團隊在討論時程時,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。

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


6/16
後來我的朋友有回應一篇文章,提出不一樣的觀點,大家也可以參考看看:
關於工程師 (Reply to 三種工程師 -- Coder, Hacker and Architect)

在後面我回覆他的文章如下:
其實假如要我重新再寫一次文章,我可能會照這樣的分類來分。依照熱情和能力分成四個象限,兩個軸,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的定義都完全符合。希望文末這樣的說明,能夠讓名詞的定義更加清楚。

26 則留言 :

  1. 寫的很好,謝謝學長的分享,繼續加油!

    回覆刪除
  2. 我只是個 Coder。我覺得 Coding 很有趣滴,賺錢也很重要的。沒有必要特別貶抑把 coding 視為只是個工作的人,畢境人生的目標、主要價值觀各階段都不同的。
    先賺到足夠的錢,讓自己能活得下去才能無後顧之憂地寫下去。工作上遇到煩人的狀態,就是被爛實作一直來打擾的情況,很容易壞掉常被 bug report 的程式、系統之類的。這時才會切換成架構師模式,把它改得合情合理,讓大家夜夜好眠、高枕無憂。

    回覆刪除
    回覆
    1. 我想你說的對,文中我把Coder描述成不喜歡寫程式的人,其實有點過分了。

      如同文末所提到的,即使是很聰明的工程師(Architect)在不好的環境或Project下,也會變成一個Coder。在這種環境下,似乎也不能說他們再也不喜歡寫程式了。

      文章中的分類和工作環境、工作內容有挺大的相依性,有些人可能從事這樣的工作,但內心深處有別的想法。但其實工作環境、內容就是人生的一部分,做同樣的事情久了,它就會變成描述人格的一部分。

      文章是想要提醒自己(還有其他工程師),假如有一天我單純只是為了賺錢而Coding,而在這個環境中我不快樂(或許有些人可以很快樂),那我是否有別的選擇? 這是我想要的嗎?

      謝謝你的回覆,很開心有人能夠一起討論想法~

      刪除
  3. 我覺的你把 architect 和 hacker 的角色和特徵弄反了。 hacker 通常才是有使命感的那一群人。而 architect 只醉心在於技術和架構,或許是加上一些公司的商業利益。而 hacker 更能反思自己的供獻度。你舉的那些作品 Linux、Python... 等等,發明者都是貨真價值的 hacker。

    回覆刪除
    回覆
    1. 嗯...,或許是因為近來我對Hacker這個詞的理解有所改變。

      有人說Hack是用不太完整、不太優雅,但是可以行得通的方式去把一個問題給解決掉。有時候一個人或許沒有這麼好的技術,因此用的方式才會如此不優雅、不完整(像文中所附的那張圖一樣),但他們去做了,他們就算是個Hacker(圖中左邊的那個人)

      但我所描述的Architect,或許該說他們是"有技術和架構概念"的Hacker。(圖中的右者)

      只要有想做的事情和使命,都可被稱為Hacker(廣義定義的),而這邊定義的Hacker,則是那些技術沒有那麼強、但願意去嘗試兜出可能解法的人們

      謝謝你的留言!

      刪除
  4. Hacker 有一些廣泛被認同的定義,建議你還是去看看像"How to be a hacker" 這類有歷史的文件,才不會誤用這個名詞。"對技術的熱情和深入" 只是 hacker 的基本條件而已,hacker 還包括更深的文化內涵、生活方式、道德觀念。反到是 architect 這個詞,更純粹的接近單純技術和工程部分,沒有太多人文包括在其中。

    hacker 不只是 security 而已。網路上有很多 hacker 文化的文件,相信看過之後,大家會有很大的改觀。

    回覆刪除
  5. 名詞有點混淆了,,,其實第三種人比較自稱為 Hacker,例如 Linus Torvalds,第二種比較可以進階版 Coder 通常比較喜歡叫 Programmer,要叫Architect叫也行,但很多人主張 Architects don't Code!

    回覆刪除
  6. 剛好對應三種寫程式的境界:

    coder : correct
    hacker : correct+fast 或 correct+beautiful
    architect : correct, beautiful, and fast

    http://www.railstips.org/blog/archives/2010/01/26/correct-beautiful-fast-in-that-order/

    不過我也覺得 hacker 跟 architect 要顛倒稱呼比較好

    回覆刪除
  7. 由 Google 近期 product 的 UX 來看(如 Google+), G社工程師多是 coder 才對。

    回覆刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 名詞混淆了
    這些名詞並非在這裡獨創的
    而且把態度跟職業畫上等號的分類方式非常的不適合
    Hacker 絕對不是這樣思考的
    用名詞發分類文以前 建議還是要看一下名詞的定義比較好

    回覆刪除
  10. 我覺得可以分為三種人(或是說其實只有兩種人):
    1. 只為了謀生而寫程式. 2. 為了做出某種工具(or為了某種目的)而利用程式的. 3. 醉心於研究程式本身的.

    其實身邊的RD大多是希望成為第二種人, 但目前都只能算是第一種人.
    畢竟很多的想法或動機並不是真的能夠付諸實現,也不是真的經得起考驗,更不一定會讓你成名得利.
    而第三種人其實也是第二種人的子集合, 只是他想達到的目的跟"程式設計"本身有關..

    剩下的人就是真的只是用寫程式來當做謀生的工具了...
    但實際上, 不僅程式設計界, 各行各業都有這種人..
    這跟家庭環境, 社會價值, 個人生涯目標都有很大關係..就不在這評斷誰是誰非了..

    回覆刪除
  11. 沒有這些人上班領薪水 全世界那麼多公司怎麼營運?
    大家都是發明家 發明就不稀奇了
    我覺得沒有必要去貶低各行各業各個人的職務還有想法
    尤其如果有養家需要的 有經濟壓迫的
    他還能想這麼多嗎?

    回覆刪除
  12. 寫得非常好,感謝分享

    回覆刪除
  13. 我想我自己對 hacker 與 architect 的區分很簡單。hacker 看 software 是 software,而architect 看 software 是 peopleware。hacker 重視自我實現;而 architect 重視成本(風險),剛好軟體溝通成本最大,維護成本次之。

    回覆刪除
  14. 我覺得還差一個稱謂:高級作業員
    何謂高級作業員:就是無法依照自己的意志去做想做的事情,只能依照上面的指令動作,你所做的事情都要想到公司利益才能去做,這種行為就像政客一般,差別就是個人利益還是公司利益。

    回覆刪除
  15. 雖然對名字定義部分也有些個人想法,但我對於你想要陳述的重點不只是一個工程師職位,而是在嘗試敘述各種的生活處世態。雖然我是產品設計背景,也能感同身受: )

    回覆刪除
  16. Coder -- 使用工具 發生問題會傾向於去找另一套來用
    Hacker -- 改造工具 發生問題會傾向於找出哪邊有毛病或不喜歡 向原作者建議或自行土炮改造
    Architect -- 創造工具 發生問題會傾向於全部砍光自己土炮新的工具出來

    這三者我個人的認知應該是這樣

    是覺得元PO可能執著於做事時的態度吧?但是以名詞本身的涵義來想,Hacker和Architect有時候只差在能力有沒有辦法自行土炮新東西;以態度論他們的界線滿模糊的,所以我個人比較建議分兩種即可。

    這位小朋友對於Hacker的定義可以參考看看
    http://www.youtube.com/watch?v=UJKitCtkti0

    回覆刪除
  17. 你講的類型基本沒大錯,但是英文名稱完全不對。hacker 的確是第三類 (see Eric Raymond's "How to become a hacker" and Paul Graham's "Great Hackers"),但是 architect 並不是第二類。至於 coder 現在一般用法從 junior programmer 到 hacker/architect 都算是,用 coder 形容第一類人讓你的文章讀起來很奇怪。

    對了,前面的一些 comments 也都不完全對,大概都是台灣 coder 想當然耳。

    回覆刪除
  18. 在米國某些州 應該說大部分的州 architect 這個字是不能亂用的
    那是有受到法律保護的
    意旨 建築師 通過建築師考試的才可以稱為建築師
    即使是做建築業 沒有執照 也不可以在title 上寫architect
    其他人亂用 是會被告的

    回覆刪除
  19. really don t think too much. you re far for a hacker actually.

    回覆刪除
  20. 每個人都會混有這三種特質的,
    我長年在寫底層與編寫協定,這種工作吃力不討好,不能賺大錢也不能改變世界,
    可是我們公司與合作廠商卻有一大堆工程師要依靠它們;

    最近新興的語言根本都不能弄底層,所以我確實對其沒啥興趣;

    軟體工程的範圍太廣大了,不要輕易去分類別人。

    回覆刪除
  21. 駭客不是工程師也不是架構師
    像SCADA security就是架構師範圍外的東西
    但也不一定在資訊領域
    quantum security都是物理學家
    光是資安領域中的社交工程就牽涉到心理學 社會學 資訊科學
    這些都改變了世界
    我覺得駭客是不在分類裡的人
    現代較少有這種人
    大部分都是因為現實世界的關系

    回覆刪除
  22. 我是Coder, Hacker和Architect 的Mix....

    回覆刪除