有哪些老鳥程式設計師知道而新手不知道的小技巧?自我感受

深藍發表於2016-01-28

最近在朋友圈看到別人分享的一篇知乎回答:https://www.zhihu.com/question/36426051/answer/76031743

我覺得寫得挺有道理的,作為一個寫了10多年C#程式碼的老程式設計師來說,很多地方我能感同身受,所以也談談我的自我感受。


1.重構是程式設計師的主力技能。

是的,我之前經常也提到一點,就是好多設計模式不是提前就設計出來的,而是重構出來的。很多情況是我們在做設計的時候考慮不到的,是寫程式碼時也考慮不到的,只有在專案上線後,客戶使用過程中才會反應出來,這個時候就需要對專案進行擴充套件,版本升級,這時就體現老程式設計師實力的時候了,就是根據已有的情形,結合新的客戶需求,使用合適的設計模式,使得程式碼能夠優雅的擴充套件。
2.工作日誌能提升腦容量。

這個我沒有什麼體會,我平時也寫工作日誌,但是那是專案工作的需要,不是我本人的主觀意願。不過我個人覺得技術部落格能夠提升腦容量才是真的。很多專案中遇到的問題,解決了,也許以後還會再次遇到,也許別人也會遇到,那麼就寫成部落格,自我總結,方便以後自己或者其他程式設計師遇到同樣的問題。
3.先用profiler調查,才有臉談優化。

是的,我之前也專門做過SQL Server的效能優化,很有體會,Profiler是第一步。如果做.net程式碼的優化,也有對應的Profiler工具,這個可以幫我們快速的定位瓶頸在哪裡。找到了瓶頸才有接下來的優化工作。
4.註釋貴精不貴多。杜絕大姨媽般的“例注”。漫山遍野的碎碎念註釋,實際就是背景噪音。

我不是很同意這個說法,還有更極端的觀點是不需要註釋,命名就是註釋,好的命名就能註釋一切。我覺得好的命名那是必須的,但是在複雜的邏輯中,我們有必要在程式碼中註釋我們的思路,為什麼會用這樣一種寫法。
5.普通程式設計師+google=超級程式設計師。

確實,很多不懂的,解決不了的就Google吧,一般Google會告訴你,Stackoverflow知道答案。
6.單元測試總是合算的。

這個觀點我贊同,也許對於很多程式設計師來說,單元測試就是浪費時間,但是當專案複雜了以後,真的很需要單元測試,尤其是在不斷的hotfix和版本升級的過程中。
7.不要先寫框架再寫實現。最好反過來,從原型中提煉框架。

這個就是我前面第一點提到的一樣,很多框架設計好了,但是不一定適應當前這個專案,那就是畫蛇添足。
8.程式碼結構清晰,其它問題都不算事兒。

這個就是編碼規範的問題,程式碼寫的漂亮,讓Debug沒那麼痛苦,讓別人Review你的程式碼也沒那麼痛苦。
9.好的專案作風硬派,一鍵測試,一鍵釋出,一鍵部署; 爛的專案生性猥瑣,口口相傳,不立文字,神神祕祕。

這個也是我最近在研究的CI(持續整合),適應TeamCity可以把測試,釋出,部署都自動化搞定。
10.編碼不要畏懼變化,要擁抱變化。

基於介面的程式設計,我們只關注介面,實現嘛,隨時可以變。
11.常充電。程式設計師只有一種死法:土死的。

好吧,程式設計師的命就是這樣,技術變化太快了。
12. 程式設計之事,隔離是方向,起名是關鍵,測試是主角,除錯是補充,版本控制是後悔藥。

面向介面,控制反轉與依賴注入,都是編寫複雜的軟體的必備良藥。測試,除錯,沒啥可說的,必備。版本控制,那是必須的!即使是隻有一個開發人員的專案,也需要版本控制。
13. 一行程式碼一個兵。形成等建制才能有效指揮。單位規模不宜過大。千人班,萬人排,容易變成萬人坑。

這裡說的一個關於函式的規範問題,有一種說法是一個函式的內容不應該超過7行,如果超過7行,那麼肯定是把多個Function合併到一個函式中的,應該拆分成多個函式。這個要求可能有點高,很難做到。不過上百行,上千行的函式那是不應該的,必須拆分!
14. 重構/優化/修復Bug,同時只能作一件。

這個我還是有點體會的,把多個目標合併到一次修改中,那是多麼困難的事情,真的不好做。最好是分開,先重構,保證重構後的功能和原來的功能一致,然後再Fix Bug。
15. 簡單模組注意封裝,複雜模組注意分層。

物件導向程式設計基本要點,封裝,企業應用架構的基礎就是分層。最經典的三層架構做企業應用的應該都知道。
16. 人腦效能有限,整潔勝於雜亂。讀不懂的程式碼,嘗試整理下格式; 不好用的介面,嘗試重新封裝下。

還是說到編碼規範的問題,簡潔易懂,介面要清晰。
17. 迭代速度決定工作強度。想多快好省,簡化開發流程,加快迭代速度。

軟體工程中的快速迭代,敏捷開發,涉及到前面提到的持續整合。
18. 忘掉優化寫程式碼,忘掉程式碼作優化。因為過早優化,往往事倍功半; 不通過全域性效能度量,優化也難有建樹。

不是很認同,有經驗的程式設計師,在寫程式碼時採用的就是最優的演算法,最好的查詢方式。沒有什麼忘掉優化寫程式碼的事情,在寫程式碼時,想到的就是最優的演算法,因為在他看來就這種演算法才是對的。
19. 最好的工具是紙筆;其次好的是markdown。

紙和筆只適用於在Face 2 Face的交流過程中,交流後頂多拍照留存,根本無法建立有效的知識庫,以後想到之前的討論,怎麼檢索?怎麼修改?。寫Wiki才是王道,Markdown只是一種寫Wiki的方式罷了。
20. leader問你任務時間,你答不上來。很可能是任務拆分不夠細。細分到沒有疑問吧。

應該是的,如果不知道任務時間,那麼說明要麼你根本不懂這個任務怎麼做,完全不會,要麼就是任務太大了,不好估計時間。
21. 寧可多算一週,不可少估一天。別總因為你的“樂觀”而boss受驚嚇。

是啊。程式設計師在估計工時的時候總是太樂觀。隨便開口就是一個小時就能搞定,半天就能做完。完全沒有想到該修改對其他模組的影響。一個修改後的單元測試,可接受測試,UAT環境測試,再到上線,很多地方都得花時間的。一旦某個測試不通過,然後又得除錯,修改,再進行單元測試,可接受測試~~~~,好吧,誰能保證每次修改都是一次通過呢。
22. 最有用的語言是English。其次的可能是Python。

好吧,我英語不好,Python更不懂。我不評論。
23. 百聞不如一見。畫出結果,除錯耗時將急劇縮短。

沒懂這裡在說什麼。
24. 資源、程式碼應一道受版本管理。資源匹配錯誤遠比程式碼匹配錯誤更難排查。

這個應該是這樣。在專案資料夾中,有很多個子資料夾,其中一個資料夾叫src,那裡存放的才是程式碼,那麼其他的資料夾呢?就可能存放相關的設計啊、測試啊、工具之類的。
25. 不要基於想象開發, 要基於原型開發。原型的價值是快速驗證想法,幫大家節省時間。

恩,是啊,最好是先畫出原型。有了原型才方便討論,明確需求。
26. 序列化首選明文文字 。諸如二進位制、混淆、加密、壓縮等等有需要時再加。

應該是吧,比如Json是比較好的序列化選項。
27. 編譯器永遠比你懂微觀優化。只能向它不擅長的方向努力。

有了好的設計和演算法,誰關係編譯器內部怎麼做的。
28. 不要定過大、過遠、過細的計劃。即使定了也沒有用。

過大過遠的目標還是可以定吧,規劃一下下一個版本的Roadmap,也許還沒有開始做,但是願景可以建立。只是經常會有計劃趕不上變化的情況,所以遠期的計劃不需要太詳細,反正也會不斷變。
29. 至少半數時間將花在整合上。

這得看做什麼專案了吧,很多專案就是一個完全獨立的孤島,沒啥好整合的。最近的基礎可能就是單點登入的整合,太簡單花不了多少時間。另外常見的是HR系統的員工資料的整合還有財務系統的財務資料整合,確實很花時間。
30. 與主流意見/方法/風格/習慣相悖時,先檢討自己最可靠。

沒啥說的。
31. 出現bug主動查,不管是不是你的。這能讓你業務能力猛漲、個人形象飆升; 如果你的bug被別人就出來,那你會很被動~≧﹏≦

查Bug是也很難的事情,自己做的專案,自己再支援運維一段時間,看看自己的程式碼寫的有多爛,有多難修改,多難除錯。真的可以讓自己能力提升很多。
32. 不知怎麼選技術書時就挑薄的。起碼不會太貴,且你能看完。

我很懶,很多書都看了一半就看不下去了。
33. git是最棒的。簡單,可靠,免費。

原始碼管理,必選Git,自己可以架設Git Server,也可以用GitHub。
34. 僅對“可預測的非理性”拋斷言。

恩。是啊,尤其使用者輸入的時候。
35. Log要寫時間與分類。並且要能重定向輸出。

這個用現成的Log元件即可。有Log4J,Log4Net,真的很好用。
36. 註釋是稍差的文件。更好的是清晰的命名。讓程式碼講自己的故事。

前面已經說過了。
37. 造輪子是很好的鍛鍊方法。前提是你見過別的輪子。

這裡說的是程式設計師的自我修煉的過程。確實,對於一個需求場景,我們應該先想想有沒有現成的開源專案可以用,然後再看能否把開源專案拿來改,最後自身足夠強大了,就自己做一個輪子。
38. code review最好以小組或結對為主。因為對業務有足夠了解建議才更有價值。而且不會成為負擔。注意,提交過程中的管理員review很容易成為瓶頸。

這點我做的不好,在我這麼多年的工作中,也只有為數不多的Code Review Meeting。
39. 提問前先做調研。節約大家的時間。

是啊,Google能夠直接告訴你答案的,那就不用再問別人了。
40. 永遠別小看程式媛(╯3╰)

只要是正在的碼農,在我看來是沒有區別的。所以沒有小看或者高看的意思。

以上都是我的個人感受寫給自己,看看差距,希望以後能做的更好吧。

相關文章