1. 程式人生 > >從業程式設計生涯十年,你要了解的程式設計師養生之道,以及進階之路。

從業程式設計生涯十年,你要了解的程式設計師養生之道,以及進階之路。

作為一個從業快10年的程式設計師,我想給新入行的程式設計師們一些建議。這些建議是我希望自己可以在畢業時就讀到的,也希望它們可以幫助你成為一個更好的程式設計師。文末有資料分享。

  簡單歸納一下,總共有7條:

  1. 保持健康
  2. 程式設計之外的愛好
  3. 持續學習
  4. 正確應對犯錯
  5. 不要囿於角色
  6. 展示你的創意
  7. 刻意練習手速

  下面我來詳細說說每一點。

  

保持健康

三寸氣在千般用,一旦無常萬事休。

——《金瓶梅》

  首先要說的當然是健康,脫離了這個本錢,一切都無從談起。

  久坐、不運動、睡眠不足、不注意及時補充水分、長期的伏案工作等都會對健康造成很大的影響,而不幸的是,程式設計師這幾樣全都佔了。很多程式設計師往往年紀輕輕就已經有了各種各樣的疾病:頸椎病、腰椎間盤突出、高血脂/高血壓、膽結石、腱鞘炎等等,關於程式設計師過勞死的新聞更是隔一段時間就來刺激一下我們的神經。

  研究表明,長期保持同一姿勢(不論坐著還是站著)對身體都有不同程度的害處,而且這種害處是無法事後彌補的。也就是說,如果白天上班坐8個小時,那麼就算你下班後去健身房練一個小時也於事無補。這幾年很流行的“站立式辦公”也是一樣,如果你白天站立時間過久,會對膝關節造成較大的壓力,同樣會損害健康。比較推薦的方式是,寫30-40分鐘程式碼就起來走一走,喝杯水,遠眺一會,跟同事聊聊天。

  我知道,作為程式設計師我也常遇到那種寫程式碼寫High了連廁所也不想去的時候。不過為了長遠的健康,還是要養成良好的習慣。

戒除不良習慣

  除了長時間保持同一姿勢之外,許多程式設計師還有各種不良習慣。比如:

  • 吸菸
  • 喝酒
  • 嗜糖(碳酸飲料,其他高糖飲料)

  這些習慣一般都會被美其名曰提神,大家都知道,程式設計師加班在業界算是比較常見的,萎靡不振是常態。然而這些號稱提神的方法,其實沒有一個是真正管用的。這些不良習慣說到底都是一種“毒癮”,跟吸食大麻在本質上並無二致。不過好訊息是你完全可以戒除這些不良習慣,只需要堅持一段時間,讓“毒癮”過去就好了(和真正的毒癮一樣,它們更多的是精神依賴,一旦你戰勝了自己對它的精神依賴,就可以獲得自由)。

  我在大學和剛開始工作的前幾年,也有煙癮。寫程式碼寫累了就會去辦公室外邊冒一根,那種一氧化碳中毒帶來的短暫微醺感確實令人有放鬆的錯覺,但是抽完煙回來寫程式碼會感覺更累。而且口中老感覺有異味,咽喉不適,最主要的是精神萎靡,終於有一天我受不了了,決定戒菸(事實上和很多人一樣,之前也有過無數次的戒菸)。當煙癮發作的時候,我就去喝杯水,晚上則站站樁(站完之後口齒生津,神清氣爽)。剛開始的3天是最難的,一週之後我基本可以控制住去抽菸的慾望,然後就越來越輕鬆,完全感覺不到煙癮對我的影響了。

  碳酸飲料、高糖飲料也是一樣。在飲食本來就不充裕的自然界,我們的祖先遇到了富含可以為身體提供能量的糖(比如蜂蜜),自然會大量攝入。這種嗜糖的基因在今天還在不斷的產生作用,但是不同的是,我們現在可以很輕鬆的在食物、飲料中攝入比身體所需多得多的糖。這些糖會給健康帶來很多問題,比如肥胖,高血糖,冠心病等等。

  

更多時候,我們想要喝飲料更多的是精神上的依賴,也就是上面說到的“毒癮”。戒除對糖的依賴比煙和酒要困難一些,因為生活中有很多陷阱,比如酸奶、麵包、餅乾、水果等等。

零度可樂的陷阱

  現在香菸的包裝上印有焦油含量,有10mg的、有15mg的。焦油含量是影響一支菸口感的重要因素,通常說的“綿”其實是說焦油含量較低,這會讓你感覺比較健康。然而陷阱是,一支菸抽完覺得不過癮,神經感受到的刺激不夠強烈,這會驅動你抽第二支,結果吸入的焦油反而更多。本來15mg焦油的一支菸就可以讓你過癮,現在兩支10mg的才能達到同樣的效果,相當於攝入了20mg。

  零度可樂也是一樣,那種無糖的有著甜味的新增劑會刺激你對糖的渴求,你需要攝入更多的糖來抵消這種虛幻的渴求,然後變得更不健康。

  有人可能會說,沒有這些嗜好,那活著有什麼意思呢?相信我,當你戒除了這些“毒癮”,有了一個健康的體魄,才真正能體會到活著的樂趣。當你為這些嗜好所控制,產生的那種病態的舒適感其實是虛無縹緲的。

一些建議

  有規律的做一些運動可以緩解頸椎、腰椎的不適,可以加快新陳代謝的速度,消耗多餘的、會沉積下來的能量。比如比較容易接觸到、也容易上手的運動:

  • 瑜伽/普拉提
  • 乒乓球
  • 跳繩

  

選擇一個適合自己的運動方式,然後將其培養成一個習慣(比如堅持每週兩次瑜伽,或者每天中午打30分鐘的乒乓球)。如果這些和工作有衝突的話,比如公司要求長期晚上加班,那你可以考慮換一家公司。

培養一個程式設計之外的愛好

  如果讓不同的人對程式設計師打標籤並排序,一定會排在前三。在任何的聚會上,程式設計師總是很容易被識別出來的:聰明、戴眼鏡、話不多、略顯悶騷、聊天容易冷場等等。也難怪,長期鑽研技術,沉浸在非黑即白的二進位制世界,愛刨根問底,這樣很容易把天聊死。

  我建議新手程式設計師可以找一個程式設計之外的愛好,一來可以拓展自己的社交圈,週末可以有個不一樣的過法(而不是宅在家裡寫程式碼);二來可以幫助你成為更好的程式設計師。

  你肯定有過這樣的經歷:一個程式設計問題一直困擾著你,試了很久都找不到解決方法,結果出去散了會兒步,或者和別人嘮家常,突然腦海裡靈光一閃,想到了問題的答案。事實上,我們大腦的工作方式就是如此奇妙,換一個完全不同的上下文就可以讓大腦得到很好的休息,而且往往可以產生1+1>2的效果。寫程式碼寫累了去聽聽音樂,或者打一會乒乓球就可以很好的緩解疲勞,甚至可以開啟思路,產生新的靈感。

  一些建議

  學習一項與程式設計無關的技能,比如:

  • 樂器(如吉他,架子鼓)
  • 繪畫(素描,水粉,水彩等)或者書法
  • 製作美食
  • 某一項武術(拳擊,泰拳,空手道等)

  這些看似毫不相干的愛好可以幫助大腦休息。另外需要注意的是,你無需真正成為某一項愛好的專家,不要有額外的壓力:擔心演奏不好、沒有繪畫天賦等等。沒關係,它只是一個愛好而已。

  

我自己就嘗試過很多不同的愛好,比如素描、書法等。

持續學習

  軟體開發是一個需要終身學習的行業(其實如果你不想做那種混吃等死的人的話,基本上每個行業都是這樣)。我畢業的時候,SSH(Spring Struts Hibernate)是Web開發的主流,jQuery則是前端的新銳。有一些企業開始嘗試AdobeActionScript,不過這個語言很快就消逝在了人們的視野中。基於jQUery,但是融入了MVC理念的Backbone.js提供更高階的抽象能力,成為了開發“大型”前端應用的首選;緊隨其後的,大而全的Angular.js則通過內建的雙向繫結、依賴注入、完善的測試支援等讓前端開發變得和後端開發一樣健全;再後來虛擬DOMReactive正規化React棧則又一次顛覆了前端的開發方式。雖然現在還不知道下一次的顛覆會在哪裡發生,但是可以肯定的是它一定會發生

  除了基礎框架之外,各種構建工具也是層出不窮,從最早和後端放在一起的mavenrake,到基於NodeJSgrunt,再到gulp,到webpack,最後又迴歸到npm script

  程式設計師被裹挾在技術演進的洪流中,不能自已。作為程式設計師,你不但要非常紮實的掌握基礎知識(作業系統原理,計算機網路,資料結構,演算法等),還需要有非常強的快速學習能力,以及願意不斷去學習的態度,而後者可能更重要。

  一些建議

  • 讀書
  • 通過視訊/文字教程等學習新技術

  建議新手每天抽出一個小時來讀書,週末可以多讀一些。比如掘金和CSDN等,都非常值得經常去看看,如果有比較新鮮有趣的技術,不妨自己親自動手試一試。

關於英文能力

  毫不誇張的說,英文能力是優秀程式設計師和普通程式設計師的華麗分割線。有了好的英文能力,可供你學習的資料庫會立刻擴大數百甚至數千倍:海量的優質免費教程,視訊,和優秀的中文教程一樣,它們都深入淺出,通俗易懂,風趣幽默,只不過中文的會比較少,而且一般總是會滯後於英文版本而已。

  英文能力不但可以幫你熟悉各種前端庫、CSS框架等的介紹。還可以讓你學習世界各國程式設計師對各種庫的測評、框架的使用心得、踩過的坑等等。

  我在2012年加入ThoughtWorks的時候,面試時磕磕絆絆的說不出話來。等到6個月試用期結束的時候,已經可以出差去澳洲和客戶的OPs談笑風生了。2013年的8月,在印度普內,我已經可以用英文給來自世界各國的學生講課。

  除了更順暢的和不同文化的人交流、討論問題之外,可以明顯感覺到學習的速度變得更快,更有效率。

  我自己實踐過的一個比較有效的方法。我每天會花兩個小時(早晚各一個小時)看澳洲之音上的視訊,我會聽寫出視訊中的每一句話,如果聽不清就重複,有的句子可能會重複十遍。聽到最後,視訊中的每句話我都能聽懂,而且能一邊聽一邊寫出來。這樣堅持了差不多3個月,我基本上就可以聽懂客戶的需求澄清,開會的時候也可以比較完整的聽明白每個人討論的點。

  其實訣竅就是堅持,這3個月中,每天兩個小時,我沒有一天間斷。過了這一關之後,就很容易了,儘量多聽多說就好。

  另一個提高的方法是翻譯書,我更建議你跟另外一個有經驗的同事一起翻譯,大家互相監督,也有個照應,比較不容易半途而廢。

正確應對犯錯

  斯坦福大學的Carol Dweck教授通過一些實驗和後續的研究提出了很有名的心智模型(Mindset)理論,簡而言之,她發現不同的人們對待失敗這件事有著完全不同的態度:有一類人害怕失敗,失敗後會變得不能接受,而且容易否定自身並影響進一步的嘗試,Dweck教授稱這類人為固定型思維模式(Fixed Mindset);而另一類人則“喜歡”失敗,視失敗/犯錯為學習的一種方式,他們更關注過程而不是結果,Dweck教授稱其為成長型思維模式(Growth Mindset)。

  Dweck在演講中提到,通過向成長型思維模式的轉變,關注從失敗/犯錯中學習,人們的潛力可以得到很好的發揮,也更容易獲得理想的結果。

  很多新人不敢嘗試,又不願意讓同事知道自己的不足,這樣的態度會導致他更傾向於選擇更容易的工作,這樣就可以避免暴露自己的不足,久而久之就會形成惡性迴圈。其實企業對於新人的期望一般都不會很高,對於新人犯錯也是有容忍度的,新人要勇於承認自己的不足,勇於嘗試新的事物,勇於犯錯並從中學習。

  承認自己的不足在剛開始是一件很困難的事情,不過在嘗試過幾次之後,你就會發現其實也沒有那麼恐怖。你慢慢會喜歡那種不帶任何包袱的、全身心聚焦在學習本身上的快樂。

不要被角色限制

  都樑在《血色浪漫》裡有段描述陝北農民的文字:

鍾躍民驚訝地發現,在如此貧困惡劣的生存狀態下,村民們卻很少愁眉苦臉, 他們始終很樂觀,他們最喜歡談論的話題是飲食男女。在飲食方面,由於他們沒見過更好的食品,所以堅持認為酸湯餃子和油潑辣子是天下最美味的食品,如果有人提出世上還有很多更好吃的東西,那大家會一致認為此人太沒見過世面,這八成是沒吃過酸湯餃子,才在這兒胡咧咧.

  就像酸湯餃子並非天下最美味的食品一樣,開發也不是世界上最牛逼的工作。任何一個良好的,健康的產品、專案都需要不同的角色共同配合,共同努力。如果僅僅將自己侷限在程式設計師這一角色,時間久了未免會有坐井觀天的狹隘。

  作為程式設計師,既可以往上游去探索需求的梳理,使用者痛點的分析,業務價值的挖掘,又可以向下遊如測試的編寫,產品的釋出,運維監控。視野開拓了,才有可能對產品有整體的瞭解,也更容易在程式設計師這個角色上做的更好。

  作為新人,能在自己擅長的方面發揮長處當然很好,但是如果僅僅侷限在自己擅長的方面則未免太過單薄。如果你在前端非常有經驗,那麼除了將這些經驗和知識分享給別人之外,你還可以向別的角色學習他們擅長的技能,比如向測試學習自動化、SBE等;向後端學習高效能,高可用伺服器的技術、資料庫設計及優化、API設計等;向DevOps學習運維技能,自動化provision技能等等。

  這些不同的技術不但可以讓你的視野更加開闊,也可以為自己以後嘗試不同的角色和機會打好基礎。以我自己為例,我剛工作的時候是一個Java開發,後來開始做產品的前端開發。換了工作後又跑到Linux下用C寫服務。再後來加入ThoughtWorks後,正經職位是開發,不過在專案上還兼職過一段時間QA,在有些專案上,當UX不在場的時候還可以做些簡單的設計,在技術社群當講師,還在一些客戶現場做過諮詢顧問。我自己覺得在不同的角色上切換非常有意思,我自己也很享受整個過程。

展示你的創意

  將一個創意、複雜概念或者想法簡潔而準確的描述出來是一個非常重要的能力。我見過太多的程式設計師都是沉默寡言,講東西聲音又小,又緊張,即使有很好的想法也難以完整的表述出來。

  不過這個能力是可以鍛鍊的,只需要藉助原型的製作就可以了:

  • 畫圖
  • 靜態原型
  • 紙上原型

  俗話說,一圖勝千言。你只需要學習一些簡單的繪畫技巧就可以大大提高自己的表述能力。

  通過用靜態頁面(HTML/CSS/JS),mock資料等方式,快速的將創意表達出來是程式設計師的一個優勢,你可以用靜態資料、資料檔案等方式,通過一些簡單的程式碼快速的作出可以做互動的原型,然後通過和使用者不斷確認的方式來漸進增強,這種做法可以避免太大的浪費,儘早的將客戶價值交付。

  原型並不侷限在草圖,可以工作的靜態頁面,還可以是一個清晰簡潔的演講。基於PPT的原型還可以用來分析目前產品痛點、對比方案的優劣、展示自己的看法等等。

  紙上原型是另一種低成本,可供快速交流溝通的原型方式:

手速

  關於程式設計師是否要求很快的手速是一個頗具爭議的話題。支持者認為這屬於基本功,每個程式設計師都應該打字都很快;反對者則認為程式設計師的價值在於思考並解決問題,追求速度快,那還不如招個打字員。我個人的觀點是,好的程式設計師應該有很快的手速(包括打字的速度,但不侷限於此)。

  我在ThoughtWorks西安辦公室組織過很多次提升手速的工作坊。基本原則就是對一個具體的“作業”,不斷的重複練習。

  最近帶兩個新人,我給他們佈置了一個簡單的作業:

  基本要求是以最快的速度實現這個頁面,並有一點微小的互動(比如選擇聯絡人之後的checkbox會顯示選中狀態,剩餘invites的數量減少等)。第一次做他們用了5個多小時(連同搭建環境,安裝Node.js,npm包等),第二次用時2個半小時,第三次用時1個半小時,第四次用時50分鐘。

  對同一個頁面的不斷練習聽起來是在做重複工作,其實可以聯絡到很多的內容:

  • 命令列的熟悉程度
  • 快捷鍵的使用
  • 搜尋引擎的使用
  • Stackoverflow的使用

  當你真的可以熟極而流的時候,你才有時間來考慮如何優化,比如如何抽取模板工程(這樣下次做同樣的事情就會快很多),如何精簡DOM結構,如何用命令列工具來幫助自己提速等。手速是大前提,沒有速度,一切優化都是腦海中的意淫,無法真實落地。

總結

  要成為一個厲害的程式設計師,首先當然是要有一個好的身體。此外需要培養一個程式設計之外的愛好,這樣可以讓你活的像一個正常人(而不是傳統的工科書呆子)。程式設計師是一個需要不斷學習,不斷充實的職業,在學習的過程中,英文能力可以幫助你學的更快,更有效,另外正確的應對學習過程中必然會犯的錯誤,並將每次錯誤都當成學習的機會。

  開發只是軟體開發流程中的一環,程式設計師需要拓展自己的視野,和其他角色一起配合才能保證產品的交付。在日常的開發中,程式設計師還需要快速、準確的將自己的想法和創意表達出來。最後,更快速的完成手頭的工作可以讓你有更多的時間來思考,來改進那些低效的工作方式。

分享一些我整理的資料:

需要的可以申請加入Java程式設計師進階群:878249276,免費分享給各位。