高效能程序員的修煉-總結篇

在此,無關技術,只是從效能上探討下,如何提升工作效率,結合了大量研究,分析,實踐證明。

同一時間最好只做一個任務

溫伯格提出一個經驗法則,用以計算由於切換項目而引起的浪費。
同時進行項目與浪費時間關係
即使你只做一個項目,這種情況也可能會發生,你會被郵件、聊天所打擾。

這裏的奧祕是:在你管理程序員的時候,你會發現切換任務會花費很長時間,那是因爲編程這類任務需要你在大腦記住很多東西。你同時記住的東西越多,編程效率就越高,一個程序員在全力編程的時候,腦袋裏面同時記着數不勝數的東西(程序裏的一切),包括變量名稱、數據結構、重要的編程接口、他們自己寫的常用工具函數的名字,甚至是他們存放源代碼的子目錄的名稱。如果你送那個程序員休假三週,他會把這些東西忘得一乾二淨,人類的大腦似乎把這些東西移除了短期的隨機存儲器(RAM),然後把他們備份到了磁盤上;但再想通過磁盤恢復那些記憶,也許要花上一輩子的時間。

可是我們在工作的過程中很難做到只做一個項目,在開發的過程中被別人的問題打擾,以前的代碼出了bug,別人過來找你,等等,在辦公室想安心寫代碼,不存在的。下面我介紹下我的處理方式:

  • 工作中我一般都會帶着耳機,但未必會放歌曲,以此來避免外界打擾
  • 當有測試、前端來找我問問題的時候,我一般都是能馬上回答的我回回答一下,如果不能,我會回覆說等幾分鐘,我寫完這段東西去找你
  • 對於釘釘發送的消息,除非有人釘我,在桌面彈出,否則我都會過一段時間纔會看一次,把釘釘消息的聲音提示關掉很重要

性能的重要性

根據谷歌的真實測試,請求時間消耗每增加100ms,損失的性能都是巨大的,所有在壓測環境使用鏈路請求時間監控工具,並極力優化性能,是非常重要的。
如果自己寫的代碼想要優化性能,就需要知道,數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳躍表、圖、樹的操作原理和算法:遞歸、排序、二分查找、搜索、哈希、貪心算法、分治算法、回朔算法、動態規劃、字符串匹配算法,以及“算法複雜度大O”的基本原理。
關於算法複雜度的文章,博主找到一篇說明的比較清晰的:算法時間複雜度、空間複雜度

領導團隊適得其法

Dennis Forbes曾經發表過一篇文章,名爲“有效地融入軟件開發團隊”。我覺得他很出色地概括了關於有效領導方面的策略。他用一封假想的電子郵件開頭,描述了被人當做強制執行着的弊端:

我最近被拉取幫助一個軟件開發團隊完成一款產品的開發,具體的要求是協助一些web程序的編碼,我盡了自己最大的努力去融入這個團隊,熱心地幫助他們以贏得一些信譽和尊敬。
我時長轉發“Joel on Software”上的各種小文章給大家,還建議公司裏擺上一堆像《代碼大全》類的書籍。任何事情,只要我覺得可以做的更好,我都會盡力給大家指出來,我經常瀏覽源代碼庫,以找出可以讓其他成員工作的更好的方法。
當其他開發者來向我尋求幫助的時候,我不僅幫他們解決實際的問題,還舉一反三——指出他們在開發上的問題,教他們怎樣改進打字形式,告訴他們該使用哪種命名規範,提倡一種更好的代碼編輯工具。
然而這些努力似乎都沒起到作用,我還是會常常受到他們的抵制,而且我覺得整個團隊不是很喜歡我。我的很多建議都沒有被採納,並且我覺得有些人給我的迴應是毫不掩飾的諷刺。
我到底哪裏錯了?

相信我們都曾和這樣的人一起工作過。也許我們自己就是這樣的人。即使你有最好的意圖,並且已經熟讀我給大家推薦的優秀書籍,你最終還是會落得跟槍炮士官哈特曼一樣的下場:被你自己的團隊“槍殺”了。
在文章最後 Dennis對如何避免被自己的團隊“槍殺”,做了一個很有想法的總結:

保持謙虛:總是先假定你是錯的。雖然開發者的確是會犯錯誤的,並且作爲一個新人,你理所當然應該幫助其他人發現和修正錯誤,但是在你驕傲地宣佈你的發現之前,你應該努力確保你的觀察結果是正確的。如果你總是喊着“狼來了”,你的信譽將受到巨大的打擊。
提出建設性的批評時要小心:開發者更容易接受非正式的建議和具有巧妙引導性的問題,而不是把同樣的內容以電子郵件的形式發送給整個開發組。擴大受衆面可能會引起開發者的防禦和逆反。團隊總是會去猜測你的動機。如果你貶低他們的工作是爲了提升你自己,你會因此被投訴而流芳的。
要想贏得信譽和尊敬,最好的方法就是努力工作並且取得實實在在的成績:廉價而膚淺的替代品——例如羣發關於最佳實踐的郵件,或者轉發別人鼓吹某種關於“銀彈”的評論——它們不會產生同樣的效果,到頭來你可能也只是枉費心機。
百說不如一干:實施一種新的代碼控制機制,或者實現一種新技術——這些事情說起來都很容易。所有人都知道,你只是在聲明這些主意是你想出來的,而實現他們所需付出的艱苦努力卻最終會落在別人的頭上——他們會因此而討厭你。如果你想建議些什麼,你應該爲此付出實際的行動、做好充分的準備。例如,解決技術接入的難點。這並不能保證團隊你的倡議會一呼百應,而且你還可能徒勞無功,但團隊會意識到:你付出了努力,你再積極的推動它,而不是在試圖撿便宜。
真的關心那些你所領導的人:有的架構師領導爲了讓程序員快速開發,當看到員工在學習一些開發過程中有疑問的知識的時候,他會阻止你,當你加班在公司學習的時候,他們換個說法讓你回家,因爲有些人雖身爲領導,但他看到你提高便心生妒意,而且這種領導還會美其名曰“爲你好”,其實人都不是傻子,如果你真的爲別人好,別人感受得到。我想說遇到這種領導就離職把,沒有提升空間,沒有創新空間,更沒有發展空間。
最有效的一種技術領導就是以身作則

程序員的高效工作場所

符合人體工程學的設施

正確的設施坐姿

如果有時候會在家裏辦公的話,花比較高的金額購買一把在家用的舒適椅子是很重要的。

加強代碼測試

測試先行的優點

  1. 單元測試可以證明你的代碼是能真正解決問題的
  2. 你可以獲得一個底層模塊的迴歸測試工具
  3. 你可以在不破壞現有功能的基礎上持續改進設計
  4. 一邊寫單元測試,一邊寫實現代碼,這種工作方式更有樂趣
  5. 它們可以被用來真實地展示開發進度
  6. 單元測試可以被用作示例代碼
  7. 它逼着你在寫代碼之前做好計劃
  8. 它可以降低bug修復的成本
  9. 單元測試甚至比代碼審查的效果還要好
  10. 它實際上爲程序員消除了工作上的障礙
  11. 單元測試可以催生更好的設計
  12. 它比不寫單元測試而直接寫代碼的效率更高

程序員,你幸福嗎?

《哈佛幸福課》的作者概括了幸福的真諦

  1. 經歷勝過物質:我的理解是,一個人更應該在意自己做過什麼,而不是得到了什麼
  2. 助人爲樂:幫助別人的時候也是在幫助自己,任何可以幫助別人的事情都可以加深你和別人的關係,但是有條準則,這個人,這件事值不值得你出手,以爲無底限地去幫助別人反而讓自己跟傻子沒有區別
  3. 讓幸福細水長流:人是最能適應變化的,因此,最有效的花錢方式是經常買來一些小變化,而不是花大錢一下買來一個大驚喜,然後坐等新鮮勁很快過去。就拿幸福來說吧,頻率比強度更重要。大家需要改變一下觀念,記住很多次小的,愉快地購買能比一次鉅額的購買帶更能有效的給你幸福感
  4. 少買保險:關於爲什麼有這條,我也不太明白
  5. 爲將來買單:即刻的喜悅可能會讓你衝動買下承受不起的東西。它無情地扼殺了你期待的感覺,而期待恰恰是幸福的源泉。
  6. 三思而後行
  7. 小心比較購物的陷阱:比如,花2元錢買到一塊巧克力(不錯的買賣),跟這塊巧克力好不好吃其實沒什麼關係。
  8. 隨大流:不要高估你的能力,別以爲你能預測你會有多喜歡某樣東西。從科學的角度講,我們在這方面及其不擅長!但如果某些東西可靠地給其他很多人帶來了幸福,那它很可能也會給你帶來幸福。在你做出購買決定之前,請認真考量一下別人的看法和用戶評論。

賺錢不容易。幸福更不容易,請記住上面8點。

最後,是我想說的,也是所有程序員都要思考的,你選擇做程序員是爲了什麼?喜歡麼,熱愛麼?還是爲了這個行業還不錯的報酬?
我從事這個行業已經有些年頭,但是我稱不上喜歡或者熱愛,期初只是讓自己有資本在世界上活下去,其實如果我大學不是被調劑到了相關專業,我是一定不會去做計算機相關工作的,對我來說,這只是我的一份工作,我要靠此養家餬口,僅此而已,但是這就像是一個江湖,進入之後就再也無法退出,因爲沒人會想讓自己多年付出的努力,做出的積累付諸東流,我的路只有砥礪前行。
但是我再過一年就30了,隨着年齡的增長,身體會越來越差,腦子反應會越來越慢,這是一個需要體力去加班的行業,沒有人能逃脫的了歲月的摧殘,終究我們會被時代所淘汰,未來還是屬於那些年輕人的,我們將何去何從,是選擇通過驚人的自律來延長職業生涯,還是等到年紀不行的時候,放棄在第一線的工作而另謀出路,是每一個程序員都必經的選擇。
同時這個行業有無止盡的工作與加班,你會喪失與妻子相聚,陪伴孩子,養育父母的時間,這些時間都是一去不復返,失去這些去換一份還不錯的工作究竟值不值得,你從事程序員的目的是什麼,你想通過你的職業得到什麼,你所得到的與你所失去的是否值得,也是每一個程序員需要去權衡的問題。你做此行業的目的是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章