一個平庸程式設計師的自白

douban發表於2015-06-16

Jacob Kaplan-Moss是著名 Python 框架 Django 的 Co-Creater 和核心開發者,在 Heroku 擔任安全部門的 Director, 他常年參加 Python 社群的年度聚會 PyCon ,並經常上臺演講。在這次 PyCon 2015 上,他聲稱自己頂多只是一個平庸的程式設計師,幻燈片上也寫著:

“Hi, I’m Jacob, and I’m a mediocre programmer.”

這次演講非常精彩,視訊可以在 Youtube 上看到(如果不想看視訊,這裡也有一篇文字總結:https://lwn.net/Articles/641779/)。Jacob 以馬拉松為例,試圖說明大部分人在大部分領域都是平庸的(Most people are average at most things.),特別好的和特別壞的都是極少數,但在程式設計師領域,我們聽到的大都是某某程式設計師 rocks 或者 sucks ,基本沒有中間狀態,這是一件非常奇怪的事情。他還提到“真正的程式設計師”(real programmer)這個概念,也就是所謂的 “10x programmer” ,你只有精通某些原理或者長得像 Mark Zarkerberg 才算是一個 real programmer ,而一個使用各種雲服務以及 API 快速搭建自己應用的人就不算,這非常可笑。順帶一提,Jacob 的 Twitter 個人簡介就是 “not a real programmer. “

Jacob 認為這種關於“程式設計天才”的神話非常有害,一方面它把行業門檻設定得特別高,令很多人望而卻步,另一方面它也在折磨行業內的人,因為你如果不能 rocks ,就會變成 sucks ,所以不得不用一切時間來努力學習和工作,導致影響生活。他認為我們應該改變這種態度,程式設計只是一些技能,並不需要太多天分,它是可以學習的,而且做一個平庸的程式設計師不丟人,”it’s cool to be okay at these skills”。跑步的人有很多種——短跑運動員,純粹為了鍛鍊身體的人,參加馬拉松的人,等等。為什麼程式設計就一定要做 real programmer ,而且做不到就覺得自己不配程式設計呢?

這個演講在大會現場贏得很多掌聲,在提問環節也可以聽到一些怯生生的聲音說:“我也是一個平庸的程式設計師。” 不過在其它地方也引起一些爭議,有人認為拿跑步和程式設計對比並不恰當,有人說程式設計師能力的差距確實大得驚人,有興趣的人可以去看 Hacker News 上的討論

對於我個人來說,Jacob 的演講觸動了我多年來的心結,讓我非常感動。我一直認為自己頂多只是一個平庸的程式設計師,而且無論多麼努力學習,總覺得自己不是一個 real programmer ,而且好像越走越偏。Jacob 的演講讓我明白,有此苦惱的大概不只我一人,所以這裡寫一下自己的心路歷程,希望對別人有一些啟發。

公開承認自己平庸是一件危險的事情,如果不能說明你智商低或者沒有天分,至少說明你態度有問題:“平庸就應該去努力練習,而不是寫文章為平庸辯解”。而當你說 Jacob 這樣的人也承認自己平庸時,就會出現一堆帶有“資格論”的反駁:“Jacob 至少寫了那麼多程式碼,你怎麼能和別人比” “人家那樣說是謙虛,你這樣就是無恥了”,頓時你就會覺得自己和那些只會從偉大人物身上挑毛病的小人沒什麼兩樣。幸運的是,今後我很可能不會以程式設計為業了,所以這些事情都無所謂了,可以誠懇地說一下自己的經歷。

我對 real programmer 的印象始於大學,儘管對於其它專業的人來說我們和修電腦的沒什麼兩樣,但專業內部已經隱約有對某種高階事物的崇拜,記得大一時一個同學對我說:“我們現在還學 C,外面早就開始用 Java 了”。那個時候專業內也已經流傳了不少程式設計師的傳說,比如某個學長多麼厲害,或者微軟某個程式設計師一個人做完了一個專案組的工作。相信很多人都聽說過那個故事,大意是一個人電腦壞了,於是找一個電腦高手來修,電腦高手拿來電話,連上電腦,花了整整一夜的時間用 0 和 1 寫了一個作業系統,故事的結局是“這個電腦高手去了美國,杳無音信”。當時我聽到這個故事的時候半信半疑,居然寧願相信它是真的!因為如果萬一它是真的而我不相信,只能說明我的技術水平或者智商無法理解那個層次的東西,那就太糟糕了。那個時候真的很想變得厲害。

隨著對專業的瞭解,很快我們就開始嘲笑那種“Java 比 C 新,所以比 C 好”的看法,轉而去相信“越底層越牛”的論調,寫 C 的比寫 Web 的厲害,寫彙編的又比寫 C 的厲害,為什麼呢?因為他們“基礎更紮實,更瞭解原理。” 這種論調發展到一個極致就是:學數學或者物理這種“硬科學”的人如果轉行寫程式,肯定比我們厲害。他們演算法一定比我們好,而且就是這幫家發明的計算機啊我靠。有一段時間隱約覺的別的專業的轉行寫程式都會比我厲害,哪怕是一個鋼琴家——因為他手指靈活打字更快。

大學裡另外一個讓我印象極其深刻的傳說就是:高手寫程式不用 IDE ,都是直接記事本。高手摘花飛葉皆可傷人,談武器和工具,那就是落了下乘,只有不入流的才整天研究哪個工具更有效率。所以在很長一段時間內我都因為自己沒用記事本寫程式而懷疑自己的能力,直到後來工作之後我接觸到了Vim ,發現它長得和記事本還真的挺像的。

除此之外,還有對經典書籍的頂禮膜拜,MIT 的 Introduction to Algorithms 和 SICP ,Knuth 的 The Art of Computer Programming ,TCP/IP 詳解,以及一些其它的經典作業系統、資料庫等方面的書。不啃完這些就說明你天分不夠,或者沒有熱情,還是趁早轉行比較好。在我一直很喜歡(現在依然喜歡並推薦)的一篇文章 Teach Yourself Programming in Ten Years 中,作者在結尾推薦了 SICP ,他說:”The book is challenging and will weed out some people who perhaps could be successful with another approach.” 所以儘管我一直沒有讀完這本書,而且應該也不會去讀了,但對它總有一種情結,以至於兩年前出國的時候還把它帶在身邊。

畢業之後開始做職業程式設計師,每天都是和程式設計師打交道,關注的也都是科技新聞,那時候矽谷文化也越來越流行,所以更加嚮往和崇拜 real programmer 。Joel Spolsky 寫過一篇《飆高音》,其中的兩段可以算作是對 real programmer 的最佳詮釋:

用許多平庸的程式設計師取代少數優秀的程式設計師,這種做法的真正問題在於,不管平庸的程式設計師工作多長時間,他們做出來的東西,都無法像優秀程式設計師做得那樣好。
……
一流的歌唱演員不管在什麼時候,都可以很輕鬆地唱出高音,而平庸的歌唱演員就是永遠做不到這一點。莫扎特的歌劇《魔笛》中有一段著名的詠歎調”Queen of the Night”,音高必須達到F6(女高音的最高音高)才能唱好這首歌,世界上能達到這個標準的女高音都快要絕跡了,而飆不到著名的F6,你就是不能表演”Queen of the Night”。

簡單地說,如果你缺乏天賦,那麼你再努力,也做不到 real programmer 可以做到的事情,而一個平庸的程式設計師就是一個爛程式設計師。這種斷言式的文章一直比較能鼓舞人心,那些認為自己比較聰明的人也很喜歡這種說法,但對於我這種一直懷疑自己智商和能力的人來說,它就像一個陰影:萬一我真的沒辦法飆高音怎麼辦?

因為這種對 real programmer 的仰視,從工作以來,不對,是從大學以來,有一個想法一直揮之不去,那就是:I don’t deserve it.

大學裡我也有作品拿過獎,但總覺得自己的程式碼是一坨屎,不配拿那個獎,如果當時有另外一個 real programmer ,肯定輪不到我。

大四找工作的時候,儘管我是通過正規的筆試和麵試拿到的 offer ,而且被錄用的只有我一個本科生,我還是覺得自己不配得到那份工作,因為沒寫過 10 萬行程式碼,也不是一個 real programmer.

剛工作的時候我每天從早晨 9 點到晚上 9 點都在公司,有時候週末也去,手頭工作做完了就看技術文件,無聊了就用打字軟體練習正確的指法,以便程式設計可以快些。即便這樣,我還是懷疑自己對程式設計的熱情,覺得自己離一個 real programmer 越來越遠,不適合做程式設計師。

後來去雅虎北研面試,從早晨 8 點面試到 12 點,第二天又跑去美國的同事視訊面試。測試其實已經很嚴格了,而且我平時沒有針對性地刷題或做其它應試準備,但很奇怪,我還是覺得自己能力不行,只是僥倖拿到了 offer.

平時幫別人寫程式碼,或者和別的部門合作,第一個念頭就是自己的能力不行。儘管最後專案順利完成,對方也對我評價不錯,但我還是覺得自己不配得到那些誇獎,甚至想:如果他們見到 real programmer ,就不會稱讚我的工作了。

這種心理還有另外一個負面作用,那就是時時刻刻焦慮,害怕掉隊。Jacob 在演講中也說到:

If the only options are to be amazing or terrible, it leads people to believe they must be passionate about their career, that they must think about programming every waking moment of their life. If they take their eye off the ball even for a minute, they will slide right from amazing to terrible again. That leads people to be working crazy hours at work, to be constantly studying programming topics on their own time, and so on.

這段話準確地說出了我以前的某種狀態。我對除了程式設計之外的很多事情都有興趣,從生活的角度來看,這其實是一件好事,但我卻常常因此有負罪感,因為它們耽誤了我程式設計、看文件和學習新技術的時間。那些事情本來是可以帶給我快樂的,但每次做好像都有一種偷偷摸摸的感覺,被別人問到也羞於提起。現在回頭看,之前有段時間我的工作和生活其實平衡得很好,但當時我只有不斷告訴自己“你本來就平庸”,甚至把自己想象成一個自甘墮落的人才能安心享受,實在太扭曲了。

以前我有時還喜歡寫點東西,認為自己是在分享,但後來總覺的自己又不是 real programmer ,分享的東西有什麼價值呢?而且寫文章會耽誤程式設計的時間,程式設計師文化又特別推崇“務實”,反對“務虛”——寫作就是“務虛”,“只會打嘴炮”在程式設計師群體裡面是一個非常嚴重的侮辱,記得之前看到過一條招聘資訊,明確地說“不歡迎經常寫部落格的人”。事實上寫作不止是表達,它反過來還可以幫助思考,很多想法在下筆之前是不存在的,我從中獲益良多。而且,“不願意表達”和“不會表達”有著本質的區別。以前如果一個猥瑣不堪、一句話都說不清楚的人過來朝我扔一句”Talk is cheap. Show me the code.”,我立刻就會慚愧不已,甚至認為他或許就是一個 real programmer.

以上種種不安和困擾,讓我常常覺得自己從性格到業餘愛好都不適合做程式設計師。程式設計師文化告訴我的是:如果你不是一個 real programmer 或者不在成長為一個 real programmer 的路上,那麼你連一個 programmer 都不是。Hacker News 上針對 Jacob 演講的討論中,panjaro 說了他自己的經歷:

I’m an example how this myth can destroy you. I was programming for 6 years in normal projects and I thought I was not talented. I left job, came to research degree. Now I realized I’m terrible at maths and advanced algorithm techniques. I think about going back but since it has been 3 months I haven’t worked in a company, I feel I am a very bad programmer and no one will hire me. I’m depressed and paralyzed. All I do all day is look into HN and read articles, think how all these people are talented and I’m so dumb.

他的描述讓我感同身受,當初我也痛恨自己對數學不感興趣,整天在自習室苦苦複習離散數學和演算法,工作之後也常常想要重新回頭學習這些“基礎知識”。有時候即使你發現在某些工作中演算法並不像傳說中那麼重要,也不能說出來,否則你就是忽視基礎,或者你從事的就是程式設計師當中的低階工作,以至於體會不到演算法的重要性。

程式設計師文化當中“能力決定一切”的態度很多時候都值得商榷,因為除了極少數的電腦科學家,大部分程式設計師從事的是產品開發工作,而在產品開發中是沒辦法用一個簡單的標準衡量一個程式設計師的能力的。一個人可能程式設計能力很強,但他可能執意要實現自己的想法,以至於拖累整個專案。另外,程式設計能力強的人不一定能從事某些“低階的”、不需要太多智力的工作,那樣的工作可能需要大量的耐心,而耐心和傳說中的天賦一樣,也不是一種人盡可夫的品質。以前看到過一個招聘資訊很有意思,裡面說希望應聘者“已經結婚,或者至少有過一段長期的戀愛關係”,他們覺得這樣的人懂得與別人相處,不太容易是一個鄙視別人工作的 jerk.

我並不是否認大牛的存在,Linus 和 John Carmack 就不用說了,剛畢業在中國雅虎的時候就遇見過一位大牛同事,清華畢業,基督徒,已婚,業餘時間喜歡程式設計和做飯,經常一個人做完整個團隊的工作,打字奇快,每次技術分享都有很多人去聽,甚至 HR 都因為好奇過去。聽眾提問的時候,他能清楚講解某個不常用命令的某個引數的作用,簡直就是活的 user manual 。他非常樂於助人,經常看到他在 mail list 裡面回答別人問題,從問題的成因分析到解決方案都一一給出,表達非常清晰。讓我比較驚訝的是他對很多瑣碎的事情也極有耐心,記得公司想要一些人申請專利,週末就看到他在那裡專心寫申請。另外一個和我比較要好的同事本來覺得自己還算有天分,比我厲害得多,在大學裡真的寫過 10 萬行程式碼,但見過大牛之後立刻發現自己其實沒天分。那個時候他女朋友在外地,他業餘時間也就是看看電影寫寫程式碼,不想寫的時候就開啟大牛的 Github 看看,一般都會發現他又有新的 commit ,然後就有動力繼續寫了。

問題在於並不是所有人都是大牛,整個行業需要的也不止是大牛。舉個例子,很多寫 PHP 的大概看不起那種 “WordPress 工程師”,就是隻懂 WordPress 而對 PHP 瞭解不夠深入的人。但很多公司確實就需要做一個小網站,只需要你能開發 WordPress Theme 就夠了,不需要研究更多東西。幫別人開發 WordPress Theme 完全可以謀生,甚至掙得不少,但他們大概自己也覺得自己不是 real programmer ,所以很少發聲。前一段時間有個應用很火,但他們團隊的文章開頭就說“我們團隊中沒有大牛”,好像那是很丟人的事情,一定要大牛組成的團隊才配開發出好東西?如果拋開其它不談,“一個人憑藉自己的能力養活自己,他就應該得到尊重”,這話聽起來沒有任何問題,只是一旦牽扯到程式碼,好像只研究 WordPress 的工程師就不能見人。

很多公司也迷信只有大神程式設計師才能做事,所以在招聘的時候會說他們只招聘 Top 1% 的程式設計師,這其實根本不可能,Joel Spolsky 早就寫文章談過。你不可能招聘到 Top 1% ,只可能招聘到應聘者中的 Top 1%. 我們可以想象一下,最厲害的人可能直接去了 Facebook, Google 或者矽谷的創業公司,差一點的可能選擇百度騰訊等國內巨頭,或者非常有前景的創業公司,剩下的人才是市場中的人,這裡面的 Top 1% 已經不是全部人中的 Top 1% 了。所以看到這種招聘可以評估一下這個公司,如果不是特別牛,完全可以大膽去應聘,因為你在那些願意應聘這個公司的人當中,可能已經是 Top 1% 了。

其實我非常喜歡這個行業的某些理想主義色彩,過去這幾年也認識了不少朋友,發現了不少 thinker ,對我啟發很大。可惜我常常感到不舒服,也覺得和這種程式設計師文化或者 Geek 文化格格不入,雖然很努力去嘗試過,但發現還是不行。當然,也可能並不是文化問題,而是因為像我和 panjaro 這樣的人膽小浮躁,太在乎別人看法,容易焦慮和抑鬱,這樣的人大概在任何行業都是 loser 。希望其他人可以活得理直氣壯一點。

過去常常希望找到人生目標,而當懷疑自己不是 real programmer 的時候又慶幸生活是一團亂麻,而人生可能並沒有意義,不然的話,可能每時每刻都要生活在一條“鄙視鏈”當中了。

相關文章