再读王垠的《编程的智慧》,有怎样的感想?
?王垠老師的《編程的智慧》這篇文章已經讀了最起碼5遍了,最近的項目做完一個階段,到了把他做干凈的時候,也就是優化代碼,全面整理的階段,這個時候我又想起了這篇編程的智慧,有一些啟發與大家分享。
王垠老師的《編程的智慧》
王垠老師是誰?想必很多朋友都有耳聞,不知道的也可以去查一查,首先是個真誠的人,性情中人,他也是一個頗具爭議的人物,有過多次退學、辭職被封殺、噴教育制度等等一些爭議事件,但是毫無疑問,他在計算機的理解、個人精湛的技術方面是無可爭議的。
這里沒有對個人進行正面或者負面的討論,主要是他對語言的理解和經驗讓我受益,而我也覺得看人就需要看他的優點和對自己有益處的東西就行了,《編程的智慧》這篇文章真的可以仔細看看。
從第一次看這篇文章的時候就感覺這文章十分的厲害,不在我當時的層次范圍里,甚至現在也不是,我也是漸漸的學習按照其中去做。把文中的習慣和好的做法融入到自己寫的代碼中去但是很多時候總是找不得要領,有點邯鄲學步,所以總是在想到的時候打開看一遍。
這次再讀的時候覺得應該整理一下,以自己的方式記錄出來,與大家分享交流,形成一個直觀的概念。
編程的智慧表達了什么?
王垠老師提出過很多次的教條主義,這篇文章也是苦口婆心的說了一些編程的知識與技巧,我們可能在編程的時候沒有那么多的創新與自己的見解,但是我們應該知道什么時候干什么不該干什么,這是編程的共識,也是編程的智慧。
反復推敲代碼
反復回頭推敲代碼真的很有益處,我認為在寫代碼之前就應該想著怎么寫,一般來說,想的時間占比70%,寫的時間30%即可。而在調試完成之后,更要回過頭推敲。
可能得以實現的功能你用了100行代碼搞定了,但是回頭來看可以刪掉不少的代碼,這就會漸漸的把我們的思路帶到精簡的階段,會讓我們的水平得到一個提升。
古人也說過,溫故而知新,不僅是回頭看代碼,甚至是過段時間回過頭看這個項目,可能都會有新的東西,這種感覺是難得的,不然每次看別人的留下的代碼都會吐槽:臥槽這個傻逼寫的什么代碼了。
寫優雅的代碼
優雅在代碼中也可以體現,這一點確實還是很有趣的,其實早就在很久之前,就聽過雷軍的一句話,寫像詩一樣的代碼,我想這就是優雅的一方面了。
一面說到,我們書寫的格式以及大體結構上需要整齊,有好的分支與傳遞,還有在嵌套或者縮進方面都需要注意。我相信好的結構可以使我們的理解更加清晰,也會讓我們的邏輯更加緊密。
另一面就是我們寫代碼的時候,需要注意一些用法,比如使用if語句的時候,else分支里面有可能出現少量重復的代碼,但是這樣的結構卻是更加嚴密的。
寫模塊化的代碼
什么是模塊化?大家都知道我發過很多模塊化的文章,但是真正的模塊化,并不是文本意義上的,而是邏輯意義上的。
精選匯總 | 模塊化編程 也講到了很多。這里最讓我收獲大的一句話就是:每個函數只做一件簡單的事情。
寫可讀的代碼
每當我們看代碼的時候,總是會說這個人寫的代碼連注釋都沒有,讓人怎么看。或者這么多注釋,表達的也不清晰或者錯位了,可能讓我們產生更大的誤解了,不但沒有更可讀反而成了障礙。
所以注釋不是主要原因,真正可讀的代碼體現在每個細節上面。王垠老師說到:真正優雅可讀的代碼,是幾乎不需要注釋的。這一點我可能還沒體會到,有時候還是需要一些語言來輔助一下。
但是其說到各種命名、合理換行、局部變量的使用、把復雜的邏輯提取出去,做成幫助函數、把復雜的表達式提取出去,做成中間變量,這些思想與做法真的是難能可貴的。
寫簡單的代碼
隨著時代發展,語言也漸漸的變得豐富起來,也就是寫法變得更多了,支持更多特性了,有些代碼變得短小精悍了但是依然可以解決當前的問題,這些特性往往是一些難以直觀理解的代碼。
的確,豐富的特性在一些特殊的場合是很耐用的,但是我們不能盲目去追求,去標新立異并以此為榮。我們需要寫簡單的代碼,免得在后續讓整個邏輯看起來沒問題實際上正是這種特性使我們變得模糊,比如這個少了花括號。
if?(...)?action1();這個判斷沒使用{},可是這其實經常引起奇怪的問題。比如,你后來想要加一句話action2()到這個 if 里面,于是你就把代碼改成這樣,不用說,這肯定是有問題的,而往往我們可以避免。
if?(...)?action1();action2();寫直觀的代碼
王垠老師說到:寫代碼有一條重要的原則:如果有更加直接,更加清晰的寫法,就選擇它,即使它看起來更長,更笨,也一樣選擇它。
假如一段代碼寫出以下樣式,你看得出想表達的是什么意思嗎?
if?(action1()?||?action2()?&&?action3())?{... }這種寫法是濫用了邏輯操作&&的短路特性,這種累加的判斷會讓人很費腦,而隨著代碼或者邏輯復雜度的增加,這樣的代碼就很容易出現錯誤了。其實很簡單的就可以改成以下代碼,會清晰很多。
if?(!action1())?{if?(action2())?{action3();} }寫無懈可擊的代碼
無懈可擊的代碼其實是很難的,以前在上語文課的時候,老師說過好的詩句沒有一個字是多余的,甚至沒有哪一個字是可以替代的,但是代碼不盡相同。
王垠老師想表達的應該是讓代碼不容易出現疏忽和漏洞,比如if語句分支最好考慮到極端狀況,也就是說最好要有else,在里面處理一些東西。比如下面s缺省為 null,如果x<5,那么把它等于ok,如果不成立,你需要往上面看,才能知道s的值是什么。
String?s?=?""; if?(x?<?5)?{s?=?"ok"; }那么將代碼改成下面的形式,雖然多打了兩個字,然而它卻更加清晰。
String?s; if?(x?<?5)?{s?=?"ok"; }?else?{s?=?""; }正確處理錯誤
在異常出現的當時就作出處理,不要丟回給調用者。
這是給我印象最深的一句話,一旦有錯誤,就應該立即處理,即使是任何一種可能會出現的情況,都可能產生意想不到的災難性結果。
我在項目中經常遇到這樣的情況,為了趕項目進度,這種方法實現不了或者實現的不是那么靈活,就放任不管,而繼續做下去。進度是趕上了,但是總會出現一些莫名其妙的錯誤,或者當需要更改一些功能的時候,這一塊代碼又出現問題了,你不得不重新去解決,所以不要逃避錯誤,每個錯誤都不容放過。
防止過度工程
只說三點,直擊要害
先把眼前的問題解決掉,解決好,再考慮將來的擴展問題。
先寫出可用的代碼,反復推敲,再考慮是否需要重用的問題。
先寫出可用,簡單,明顯沒有 bug 的代碼,再考慮測試的問題
Over engineering在我看來就是一個過度裝逼的設計,我在工作中也遇到過這樣的同事,一副架構師的樣式指點江山,但實際上最重要的還是眼前的問題,解決掉!
最后
我認為王垠老師身上最讓我缺少的就是:對權威以及先行者敢于質疑,對編程語言原理、框架、概念等等理解的深度,以及他的鉆研精神,不論怎么樣,我都收獲了很多。
愿我們都可以看到他人的閃光點,同樣的這篇《編程的智慧》真的值得我們好好讀一下。
???????????????? ?END ?????????????????
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關注我的公眾號
點擊“閱讀原文”查看更多分享。
總結
以上是生活随笔為你收集整理的再读王垠的《编程的智慧》,有怎样的感想?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: K12在线教育平台的产品需求
- 下一篇: 读书:SQL必知必会