2012年5月3日 星期四

不要自稱程式設計師,老鳥的 9 個職涯建言

原文標題: Don’t Call Yourself A Programmer, And Other Career Advice 

英文原文:http://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-programmer/
中文原文:http://sslab.co/content/bu-yao-zi-cheng-cheng-shi-she-ji-shi-lao-niao-de-9-ge-zhi-ya-jian-yan
紅字是我加的註解

如果有一門課,我能將它加到任何工程相關的學程,它將不會涉及編譯器、閘道或時間複雜度。 這門課的名稱可能是 不可不知的產業真實面 ;我們從來不教這門課,結果造成許多苦難。 若你將成為年輕的工程師,這篇文章就是你的「讀我檔案(README)」文件。 這邊文章告訴你那些學校沒有教的事,讓你知道「真實世界」實際如何運作,目的是讓你能夠快樂工作。 從缺乏自信及商務知識的工程師開始,我大概花了十年的歲月,經歷很多次的痛苦,才能明白這些。 我並不覺得這篇文章會是終極指南,但希望能告訴你那些大學職涯中心沒有講的事。

身為台灣的年輕工程師,我覺得有些事情還是該思考的。或許這一個指南乍看之下對新手是一個不錯的方針,因為這會讓你看起來「很有利用價值」。以前有個長者告訴我,要先具備被人利用的價值,你才能有一份穩定的工作與薪水。不過當工作時間久了,就不適用於這個指南,因為你真的覺得你想要一輩子被利用嗎?或許有些人真的希望喔,因為他想要安安穩穩地過一輩子,這也是可以的。




九成的程式設計工作來自企業內部軟體

(90% of programming jobs are in creating Line of Business software)
從經濟學的觀點:任何東西(包括你)的價格,都是以它的供給和需求計算出來。 我們先來談需求面。 大部分的軟體,都不是公開販售、透過網際網路發行,或是從線上應用程式商店(App Store)下載。 多數的軟體來自企業內部需求、解決營運問題,例如追踪費用、最佳化運送成本、協助會計部門、設計新組件、計算保單價格、識別詐欺訂單等。 各式各樣的商業公司,開發內部軟件,解決它們自己的問題。市場上對程序員的大部分需求來源於此,只有極少數程序員直接編寫面向外部顧客的軟件。 內部軟件的開發,通常非常乏味,令人厭倦。因為它們的技術複雜性低、技術決策非常保守、預算很少、缺乏長遠考慮。但是,世界上大部分編程工作都是這種。

軟體經常用於解決商業問題,不管它是多麼無趣或沒技術可言。 以公司內部的出差費用單為例,對於有 2,000 名員工的企業,紙上作業在電子化之後,可能節省每年 5,000 工時,以每小時 50 美元的成本計算,就可以省下每年 $250,000 的開支。 出差表單可能只是全世界最簡單的 CURD 程式,但如果它能夠為公司節省成本或增加收入,它就很重要。

這確實沒錯,即便在台灣,應用領域的軟體,大部分就是最簡單的CRUD,最好還要是Web,這就是為啥php這種語言在台灣會這樣流行。儘管我們可以在網路上,看到許多下載的,互動的,免費的軟體,但這些軟體的價值,包括他的開發時間,並沒有佔去整體太多。例如說中華電信的網路客服介面,當你開始習慣不打電話而去利用這樣方便的東西,儘管他設計不好是IE Only,省去你的時間,這樣的價值是更高的。

公司僱用你是為了創造商業價值,不是讓你恣意寫程式

(Engineers are hired to create business value, not to program things)
商業公司最關心的(或者說唯一在乎的)事情,就是增加收入、降低成本。因此,它們實際上需要的不是程序員,而是能夠幫助它們增加收入、降低成本的人。 開發優美的軟件,解決技術難題,編寫沒有bug的代碼,這些都不是商業公司的目的。它們僱傭你,是為了讓你幫牠們完成某個可以增加收入、降低成本的項目,而不是因為你是geek。 你個人對於公司的唯一價值,就在於你能多大程度上為它們增加收入、降低成本。

我並不覺得很希望在台灣看這個現象,美國及一些歐洲大國,確實是以資本主義的方式在經營各種東西,但同時能夠突出的,也代表他們不光是資本主義。對許對於一個年輕工程師,我是同意的,剛從學校畢業,其實是看不清這個社會的需求,所以多半會將自己在學校長久以來的幻想加注在這個社會上。好久之前我面試到一個國立大學研究所的,他說他在團隊裡是「設計UI」的,經過詳細追究他的工作情況,他竟然只會利用介面拉UI而不太會寫程式。個人的能力,工作態度,初期確實對公司來說很重要,我並不否認這樣就是為了要降低成本,增加收入,不然薪水哪來的?但問題就是,身為雇主,也不該這樣腦殘無能地只注意到金錢的事。身為勞工,員工,他們的個人生涯規劃,技術發展方向同樣地也是重要,而適度地調整,更是可以增加公司整體的產值。如果一間公司的老闆擺出這種姿態,「我只要一堆能聽話會做事的編程機器」,那我相信你也不敢進去。

不要自稱為程式設計師

(Don't call yourself a programmer)
很多公司的主管不懂電腦,他們覺得,「程式設計師」就是一票成本很高的勞工,做一些複雜很難瞭解的事情。 如果你的職稱是「程式設計師」,當公司需要縮減成本的時候,某些主管會想要先解僱你。 有一家公司叫 Salesforce,口號是「沒有軟件」,意思就是如果經理們購買了他們的服務,就不再需要別的軟件管理銷售業務了,也就是說,不再需要自己僱傭程序員了。 正確的做法是,你應該把自己描述成與增加收入、降低成本有關係的人,比如"xx產品的開發者"或"改進者"。有一個Google Adsense程序員的自我介紹,是這樣寫的:"Google公司97%的收入,與我的代碼有關。"

與上述也同樣,如果我是這個人的面試官,我一定會問他,你除了會為Google賺錢,你還會什麼?你有照顧你的同事?朋友?家人?你身為人還有什麼價值?這並非否定,而是我一定會認真地問他,而且也希望對方認真地回答我。我覺得「寫程式」的人,如果沒有具備一定的能力,包括分析產品,環境等現況,直到理解使用者,市場,是沒有資格「設計」的。確實是因為對於台灣來說,程式是一門需要非常多領域知識的學科。但我想Programmer對於歐美來說頂多就是「編程員」,雖然底薪高,但價值可能與技術員無異,這樣的現在在台灣的一些大公司也可以見到,所以台灣也開始有人就直說「他們只不過是一群工程師」。

別受限於你選擇的軟體技術

(You are not defined by your chosen software stack)
年輕工程師透過 Twitter 向我詢問職涯問題時,許多人問的是關於該學什麼程式語言或平台(例如 Java 或 .NET?),其實這無關緊要。

Java 的程式設計師,是否比 .NET 的程式設計師賺更多錢?爭論的人總是說 Java 或 .NET 程式設計師已經有一大票; 若你認真就輸了,因為 (1) 你不該把自己定義為程式設計師(理由請看上一節), (2) 執著這種無意義的辯論,對於從事程式設計工作毫無建樹。 現實生活中,不管學哪一種程式語言,通常只要幾個星期就能上手,再過個一年半載,當你成為老鳥,就沒人在乎你用什麼語言了。 最近我在 2010 年 3 月,用癡肥醜陋的 Java EE 開發網站後端系統,請相信我,根本沒人在乎我用什麼技術開發。 如果用 Python 的公司想找技術高手幫公司賺一大筆錢,即使我從不寫任何一行 Python 程式碼,也同樣能夠勝任。

天才型的工程師很稀少,在就業市場根本供不應求。 在 Matasano 公司每個人都會用 Ruby,但儘管你不是天才,只要你是優秀的工程師,他們還是願意錄用你。 (優秀的工程師的履歷,就是一連串幫公司增加收入和降低成本的事蹟。) Fog Creek 公司幾乎都用微軟平台,但儘管我無法拼寫「ASP.NET」這專有名詞,他們還是錄用我。

有些公司的人資部門招聘制度很差勁,如果你的履歷缺少一些關鍵字(如 Java 或 .NET),他們甚至不會找你去面試。 你應該不會想去這些有病的公司,但如果你真的想去,你還是可以花幾個晚上或週末時間, 把那些「熱門就業關鍵字」補寫到履歷中,也可以修改一下手邊的專案,讓你的經歷和那些詞彙扯上邊。 如果你想在一家用 .NET 的公司學 Ruby,那就用 Ruby 完成那種一次性的專案, 接著你就成為專業 Ruby 程式設計師,因為你用 Ruby 寫程式,而公司也為此付給你薪水。 (好笑嗎?我在用 Java 的公司這樣做,以 Ruby 寫個小專案,幫公司賺了 $30,000 美元,我的老闆很高興,而且可以預料的,他根本從來沒問過我用什麼技術開發。)

我認為這個說法有另外一層意義,確實跨領域專業知識,跨語言的人才是必要的。當你會大多數人都會的東西,你的價值自然就低。當你會少數人會的東西,反過來也還是得找到需要的人。不管如何身為一間公司的老闆,確實是應該將錢投資在可能的跨領域人才上(就是薪水調高),因為是有機會為公司創造更高產值。

同事和主管不會一直是你的朋友

(Co-workers and bosses are not usually your friends)
你花了很多時間和同事在一起,你和其中幾位可能變成很要好的朋友,通常在這三年,你為維持親切的關係,邀請他們共進晚餐,而他們也同樣邀請你。 你認識的每個人,都會覺得你是個不錯的人,這對你的人際關係很有幫助;但是,可別妄想每個人都是你的朋友。

舉例來說,你在求職面試時,正在和一位看起來和藹可親的 28 歲主管談話,他看起來有點像幾年後的你。 但你畢竟不是他的朋友,面試官只是試著想幫公司用最便宜的價格把你招募進來。 也許討論魔獸爭霸讓你覺得彼此之間存在某種情誼, 但事實上面試官真正要做的事情,雖然合乎常理,卻是你真正的朋友不可能做的, 像是希望你對薪資的要求能降低個幾千塊; 或是要你多為公司付出一些時間,而減少跟真正的朋友在一起的時間。 你會有其他待人親切、好相處的同事們,開始建議你做一些你不是很想做的事情,例如「我需要從你剛完成的這個專案多拿到一些績效」,甚至「我們必須一起完成這件事情,雖然對你沒什麼好處,但是對我的目標達成很重要」。 當這些事情發生時,可別太訝異!

當然這是對於新鮮人而言,很多人進去滾了一兩年,除了自己對人性的認知開始感到懷疑,也會變得開始不相信人。可是想當初在學校,大家都是好朋友的感覺,結果一到商場上就翻臉不認人,這種事情是常有的。這其實是考驗身為人的價值觀,我也認為並不是每個人都會做出這樣現實的選擇,有些人他是有不同的想法的,會認為施比受更有福。當然還是一樣,過度地對社會現實假設,或幻想都是不對的。不管在任何時候,不要太快有激烈的論點,去花時間看清楚了,想通了,在為自己做決定,或許是一個在這種現實社會下存活很好的方法。

別過度評價競爭者的平均技能

(You radically overestimate the average skill of the competition because of the crowd you hang around with)
許多人已經成功晉升資深工程師,卻無法正確實作 FizzBuzz 。想想看:你或許已經可以去那些你自認不夠資格應徵的公司工作,他們雖然聘用比較厲害的麻瓜,但依然是麻瓜。

在台灣尤其要小心,用嘴巴在練武功,把寫程式講得像打太極拳一樣的人大有人在。

看徵才廣告求職成功是一場意外

(“Read ad. Send in resume. Go to job interview. Receive offer.” is the exception, not the typical case, for getting employment)
很多工作從來不公開招募,多數值得被聘用的人也不公開求職(參考約耳談軟體的 文章)。 職缺的資訊可以很快用電子郵件傳遞,當某家公司的決策者知道他需要找誰,只要透過他的朋友或生意夥伴,他們其中會有人認識這位要找的人,可能是家人、大學室友、會議中結識或過去的同事等。 約出來見面晤談,達成工作協議後,再交給人資部門正式聘用即可。

對於大多數你想要得到的工作,「新創公司的第一位員工」實際上很難讓你的履歷可以被人資部門接受,只有兩個人的新創公司,對於人資部門來說並不算正式的工作經歷。 (你不會想成為新創公司的第一位員工,但你可以當最後一位共同創辦人。) 想要成為 Googler 的一份子嗎?只要你像其他 Googler 一樣工作,他們會有正式的程序,可以助你一臂之力。 (他們也有許多非正式的管道,給有機會成為 Googler 的你,例如:將你正在工作的公司買下來。當你被幾億美元的資金圍繞,就會有很多有趣的選項來解決問題。)

有許多理由可以說明為何求才都是私下進行,其中一點是公開求才會收到數以百計的大量履歷轟炸(特別是目前的景氣狀況下),包括許多根本不適合這項職缺的人。 另外一點是,如果你對要找的人沒有更進一步的認識,很可能找來一位平庸的資深工程師(non-FizzBuzzer)。

  • 譯註:你可以創業,或是和別人一起創業,當個共同創辦人,實際創業的經驗會讓你學習到非常多;但是請避免在一家只有兩人的新創公司當員工,因為員工和創辦人是不同的心態,當一家公司還沒有任何規模,而你就只想當一位員工,那對你的履歷沒有加分效果,甚至你要避免在履歷上面出現這種工作經驗。
  • 譯註:如果你想在優秀的軟體公司工作,儘管現在的公司差強人意,但最好的方法是,當下就開始學習用優秀軟體公司的方法工作,當你成為優秀的軟體開發者,你將有機會進入優秀的公司,或是你的公司被優秀的軟體公司買下,總之你有機會變成一份子。
以前也與一位長輩聊過,他覺得當你已經在創造價值,資金就會向你流過來。然而台灣年輕工程師很少看過世界,甚至害怕去看任何常用的OpenSource,他們的軟體都是怎樣寫的。這些人多數都會恐懼,當看到自己不熟悉的東西,似乎自己的存在價值也即將消失。我必須承認這是一道很難跨過的門,所以多數人也選擇建立自己的小群組小角落,在不瞭解事實真相的人身上,用專業名詞哄騙他們,來尋找安全感。別說比較有能力的年輕工程師一剛開始就會陷入這種陷阱裡,甚至許多資深工程師也都是這樣一路走過來。只要是帶著類似這樣的心態,是很難跟所謂優秀的人才並肩同行,因為這些人都不害怕去接觸他們不熟悉的東西,也不害怕將自己所知道的分享出來。這些人也都非常清楚,並不是瞭解,會講就有用,也並不是會做就有用。

如何提高求職時的談判能力?

(How do I become better at negotiation?)
(1)記住你不是在求職,不是在展示編程技巧,而是在推銷某種商業需求(增加收入或降低成本)的解決方案。 (2)面試時,要有自信,要平等的對話。你要的是一個互利的錄用合同,不要每次對方提出要求,你都說Yes。 (3)雇主可能會問"你的上一份工資是多少",他們其實在說"給我一個理由,壓低你的報酬"。你要想好如何適當地回答這個問題。 (4)要還價。這裡不僅僅指錢,還指其它你關心的方面。如果你無法要求更高的薪水,那就試著要求更多的假期。 (5)在對方決定錄用你以後,才開始討論薪水。因為那時,他們已經在你身上,投入了大量的時間和金錢,產生了一定的成本,此時他們可能覺得一些小問題已經不值得再糾纏了,比如每年的工資增加幾千元。

我必須說這些都是很好用的談判技巧,不過果真要去做這樣的談判前,還是先做好對這間公司的功課,瞭解他們欠啥,瞭解你要去談判的人是誰。

創業公司是否適合應屆畢業生?

(Are startups great for your career as a fresh graduate?)
如果你一畢業就加入創業公司,最可能的結果是,接下來幾年你都工作得非常辛苦,然後公司悲慘地失敗了,你失業了,不得不又去另一家創業公司工作。 如果你真的想去創業公司,應該首先找一家大公司幹上兩年,攢一點錢,積累一些經驗,然後精心挑選後再去創業公司。 在創業公司工作,一般情況下,你遇到的都是創業者。他們大多​​數人沒有能力在兩年後僱傭你;而在大公司工作,你遇到的都是其他大公司的人,他們中很多人將來有能力僱用你或者幫你介紹工作。

當然除非你相當有自信,自信到確定你進去那些非常缺人的新創公司,你能不眠不休單打獨鬥,然後將公司的一切東西學習起來(甚至包括別人的工作內容,老闆在幹啥)。那我想這樣的經驗值會變得比去一間大公司還要高,你升級也升得快。但如果相反,或是你有一個希望你準時回家的老婆,還是乖乖待在穩定的大企業慢慢學吧!人生還長的咧!

是否推薦在新創公司工作?

(So would you recommend working at a startup? )
選擇創業公司,就是選擇一條職業道路,而不是選擇一種生活方式。可惜很多人把這兩者顛倒了,他們推薦創業公司,實際上是在推荐一種你感興趣的生活方式。 如果你確實喜歡這種生活方式,老實說,你在大公司裡也可以得到它們。在許許多多大公司裡,你都有機會鑽研最新的技術,而且還能5點半準時回家照顧孩子。

如同上述,進入新創公司,甚至你已經是這間公司的一員,是必須去修改你生活方式,甚至要家人支持。在台灣有些新創公司運氣不錯,有背後資金,也有明理的老闆,或許不會這樣累,但這是可遇不可求。

溝通技能是最重要的職業技能

(Your most important professional skill is communication)
前面說過,工程師被雇傭,不是因為會編程,而是因為能夠創造商業價值。所以,你讓人們相信你能創造價值,這是幫助你找到工作的最重要的能力。這種能力與你真的能創造多少價值,實際上聯繫不是很緊密。 我認識的一些最優秀的程序員,往往拙於表達。因此,別人不是不想與他們一起工作,就是低估了他們的價值。相反地​​,如果你看上去很會編程,並且很善於表達,別人就會真的這樣看待你。

換句話說,你究竟是想要當工程師,還是你想問問自己能夠做什麼,以你的個性能夠去嘗試什麼,這些也都會決定你將來是否一直會當工程師下去。我相信不管是誰具備怎樣的技巧,只要是能夠創造商業價值,都會有人想要雇用。

而工程是很死的東西,必須搭配非常多其他的人際技巧,否則也甭說怎樣的商業價值了,因為會做會講的人到處都是。而就算你會做,號稱比你資深的人都有可能擋在你前頭,一邊否定你的設計,一邊利用你的一兩個獨到念頭。再說對於新鮮人而言,連自己是不是真正地「設計」都是一個問題,儘管對方可能書沒你讀得多,但你只是照抄教科書上的東西,沒加入自己的思考,總有一天還是會被抓到小辮子。而直到你修練了許多技巧,瞭解許多事情,讓你的工作發揮真正的商業價值,或許那個時候你也會考慮是不是要改行了。

10 則留言 :