[熱門文章] 程式設計、重構、與其它任何東西的終極問答
"The Ultimate Question of Programming, Refactoring, and Everything"
網頁版: http://goo.gl/6jIcIp
PDF 版: https://yadi.sk/i/pBZqebxsr5Wyg
#Craftmanships #SoftwareEngineering #CPP #Refactoring #ProgrammingSkills
好的!遲交比不交好,今天的推薦文來了(笑)~
今天介紹這篇,是過去一個禮拜在國外鄉民聚集地 Reddit 程式設計版瘋傳的文章。標題很臭屁「The Ultimate Question of Programming, Refactoring, and Everything」(沒錯!我就在意它最後一個字 "Everything"。咬我啊! XD)。因為轉載的人實在太多,讓我不禁努力地把它看完了。
其實這篇文章講的是 C/C++ 程式寫作者應該注意、或建議遵守的 42 個小訣竅。既不「Ultimate(終極)」,也不是涵蓋「Everthing」。不過裡面還是有不少中肯的建議,所以我還是將它介紹給大家。
為了讓英文苦手的朋友也能稍微感受一下這篇文章在講什麼,所以我不負責任地快速翻譯了每個標題一下。如果對哪個主題有興趣的,就麻煩大家直接對照標題號碼去看原文解說。原文有些標題用「戲謔」或「隱晦」寫法,我若直接翻譯,大家可能不知道原作者想表達什麼。所以我會將某些標題,用比較易懂的中文重新表達。一切以「標題編號(1~42)」為準。
接下來就請享用我這個不負責任的翻譯了。有會錯原文意思的,還請各位留言在下方、然後鞭小力一點 XD。我會馬上修正的:
1. 不要去做編譯器會做的事情
如:用迴圈能存取 a[0] ~ a[9],就不要用「拷貝貼上」a[0], a[1], a[2]..., a[9] 來存取裡面的內容值。
2. 大於 0 不代表它等於 1
若文件告訴你某函數執行成功會傳回「大於0」的值、但目前這個大於0的值是「1」。請你寫程式的時候不要自作聰明地偵測「傳回值 == 1」當成成功,請乖乖遵照規格書用「傳回值 > 0」等於成功。因為將來的版本有可能還會傳回 2, 3...等其他值。
3. 當你拷貝貼上一段程式碼,記得檢查它的副本兩遍
有時候你拷貝貼上一段程式碼,會忘了去修改裡面一些不同的小數字,導致花了大把時間去檢查錯誤到底出現在哪裡。
4. 小心使用「? :」運算子。並記得多加括號
「? :」是 C/C++ 內常用的運算子。若您寫了一段這樣的原始碼「a - b?0:1」,您可能以為它是這樣運作的「a - (b?0:1)」,事實上,它是這樣運作的「(a-b)?0:1」。結論是,多加括號保平安。
5. 多用市面上有的工具來分析您的原始碼
市面上有些工具,如:原始碼靜態分析工具、原始碼排列工具...可以幫您在把原始碼送入編譯器前,就抓到錯誤。不過作者也提到,別以為倚賴這些工具,錯誤就不會發生。真正要減少錯誤還是得靠多讀規格書,增加程式寫作經驗才辦得到。
6. 確認您所有的指標,都已經轉型成整數型態
作者擔心,某些使用 64 bits 當成指標變數寬度的系統,到 32 bits 的機器內重新編譯時,會產生高位元組被截斷的慘劇。某些編譯器提供「uintptr_t」這個專門給指標變數使用的型態,會隨著編譯器所在的環境,自動調整指標寬度。
7. 別在迴圈內呼叫「alloca()」這個函數
萬一迴圈失控,alloca() 函數會霸佔大量記憶體無法釋放。建議事先在迴圈外霸佔一大塊足夠的記憶體,然後在迴圈內慢慢蠶食之。
8. 在「解構函數(Destructor)」內使用「例外處理(Exception)」是很危險的!
作者認為,在負責釋放記憶體、收尾等工作的解構函數,還去霸佔新記憶體作事情是不好的。若真的發生例外(Exception),直接「吃掉(Supress)」不要讓它出現在使用者面前可能還比較好。
9. 若你要比對字串結尾,請用 '\0' 代表
有些程式設計師因為 '\0' 其實就是數字 0,而在比對字串結尾時,直接使用 0 來比對字串結尾。作者認為這個習慣不好。
10. 請勿濫用 # ifdef
# ifdef 很好用,但很容易讓原始碼雜亂難讀。作者不會建議大家不要用,但他反對連可以用 if ~ else 解決的場合,都濫用 # ifdef。
11. 別把一堆運算子全都擠在同一列
多分成幾列,Debugger 可以比較容易指出發生錯誤的是在哪個環節。
12. 當你「拷貝貼上」程式碼時,特別注意「最後一列效應」
作者還是不太建議濫用拷貝貼上,他認為需要重複使用一段程式碼,不如好好考慮寫成稍有彈性的函數,然後重複叫用。此外,他建議大家去看「最後一列效應」這篇文章(連結在本文),並了解最後一列效應在拷貝貼上程式碼內,所扮演的角色。
13. 程式碼若很長,盡量多折幾列,然後排成像表格般一樣整齊(Table-style)
14. 好編譯器 + 好的寫碼習慣是不夠的
內文舉了個後括號「)」括錯位置,但編譯器抓不出來的例子。
15. 若有一堆意義相關的常數,請用 enum 括住它們
16. 「看我能把程式碼寫得這麼屌!」的炫耀寫碼心態不可取
寫程式碼要以「穩」「易讀」為主,不是把一些剛學不久,覺得很酷,但三個月後會忘個精光的技術用進程式碼內。
17. 想用程式碼把一塊資料清乾淨,最好把清除程式碼獨立拉出來成一個專屬函數
18. 你在一個語言行得通的方法,在另一個語言不一定行得通
19. 盡量用技巧避免在同一個類別內,建構函數彼此呼叫的情況
20. 讀檔時,只檢查有沒有讀到檔尾(EOF)似乎是不夠的
21. 正確檢查 EOF 的方法
22. 有比使用 # pragma warning(...) 來印錯誤訊息更好的方法,勿濫用
23. 如果你想取得字串長度,用函數自動幫你算,別用手算然後硬填數字上去
24. 請多使用 "override" 與 "final",它們會是你的好朋友
25. 別再把 "this" 指標跟 "nullptr"(空指標)拿來作比較
26. 小心使用 VARIANT_BOOL 這個陰險狡猾的東西
27. BSTR(Binary STRing)這個用於微軟 COM/Automation 技術中的資料型態,請小心使用
28. 能用函數把一段程式碼包起來重複用,就別用巨集包它(使用巨集函數的缺點多於優點)
29. 在迴圈或迭代程式碼間,使用 ++i,來取代 i++(i++ 編譯後的執行效能稍微差那麼一點)
30. wprintf() 函數的使用陷阱:Win32 印寬字元字串要用 %S(大寫),Win64 要用 %s(小寫)。
31. 陣列在 C/C++ 傳給函數時,並非是「傳值呼叫」(Call by Value)
32. 要把檔案內的文字直接印在螢幕上時,請不要直接使用 printf() (怕檔案內夾雜 % 開頭的字,這些字對 printf 是有特殊意義的)
33. 想對一個指標取值(亦即:*p),記得檢查它是否為 NULL。否則你對 NULL 取值會導致系統出錯的
34. 別以為 int 的上限 21億+ 很多,在 64 bits 系統中,這個數字很容易爆掉
35. 若您把 enum 常數與 switch~case 連用,增加新元素進 enum 時也別忘了加新 case 進 switch
36. 如果有怎麼抓都抓不出來的 bugs,記得往「記憶體」的方向去思考(32bits vs. 64bits 之類的問題)
37. 在 do~while() 內用 continue 指令要小心,有可能會跳過你放在底部的「更新條件」,導致無窮迴圈
38. 對於指標,請用 nullptr 代替 NULL,這是新的 C++ 規格書希望您遵循的
39. 試著別把一列式子搞得太複雜,這樣比較不會有「咦?為何這段寫錯的程式碼居然可以運作」的問題出現
40. 開始使用「原始碼靜態分析工具」吧!
41. 別為了要使用某函式庫的一個函式,而引進整個函式庫。如果只用了一個函式,建議自己寫比較容易維護。
42. 別再用 empty 這個曖昧的字眼當函數名稱了。用 erase(), clear() 都比 empty() 好。
如果您覺得小弟翻譯了這麼多,沒有功勞也有苦勞,那就麻煩按個讚犒賞小弟一下吧!當然歡迎轉發給您 Facebook 的朋友共同討論。最後提醒一句,上述 42 點別把它們全都當聖旨,親身體會驗證才是最重要的喔!
祝福大家假期愉快!
無窮迴圈例子 在 嫁給 RD 的 UI Designer Facebook 的最佳貼文
學東西的方法。
好,我開始講原理。人很犯賤,做事情他都要問 Why,否則他不想做。然後知道 Why 後,他就會想 What to do 。
幹,這就是最慘的地方。初學東西絕對不要用大腦,要用肌肉,要用肌肉,要用肌肉。
如果你一開始用大腦學,你就慘了。這是一個大陷阱,也是很多人學東西學不起來的原因。
你的肌肉有記憶,只要重複,就會有記憶。你只要一件事情,練五次,他就會有記憶。所以不要問「為什麼」,先做就對了。也不要「想一般做一邊想改成自己要的」。
也就是絕對不能讓「大腦」介入學習你的訓練過程。
也就是絕對不能讓「大腦」介入學習你的訓練過程。
也就是絕對不能讓「大腦」介入學習你的訓練過程。
一旦你有這個念頭,你的大腦就會掉入一個無窮迴圈。
"Why" -> "What" -> "Why" -> "What" -> "Why" -> "What" -> "Why" -> "What"
問題是你完全不懂這門知識,你的大腦就會當機,而且擺脫不了這個迴圈。
不熟悉 What 操作方式,大腦就會慌張,就會問 Why。這時候就毀了。
有些人方法是去背熟 Rule Book,試圖掌握規則。
幹,這就更慘了,因為 1) Rule Book 讓人想睡,學習效率會超低 2) 就算你掌握 Rule book,新手根本無法根據 Rule Book 展開世界觀,因為世界不是 Rule Book 建構的,Rule Book 只是世界的一個「削減到最小,接近邏輯的規則」,但他們不是基礎的「邏輯」。
為什麼台灣人學語文 fail 呢?因為台灣學語文是由 Rule book 開始,所以一堆人八百年學不會。
其實世界上各領域都是這樣的,都是勉強會用,「文法標準」,只能證明你「有教養」「可能是 native」「高等教育」,卻不會說文法不標準,人家「完全聽不懂」。
比如說寫程式也是這樣,你照別人 example 做,一開始會動,但是效率不好,coding style 超噁心。然後你再慢慢學慢慢修,變成漂亮的程式。但人家不會說「你沒照正確 best pratices 寫」,這個功能就不會動。
幹,如果新手一開始花超多時間學語法,而且去找語言 best practices 寫,而且試圖去背 rule book,試圖了解他。讀完整本 design pattern 再學寫 code,幹,包準他什麼鬼都寫不出來。因為他會鬼打牆在 「我不要犯錯」,「怎麼一直保持完美」,「why,why,why」。
好。寫到這裡,你會發現開始有感覺了。好像學的起來的技能,都是這樣學起來的。而且我跟你講一件更可怕的 fact,這些學的起來的東西,你學的時候,要是是傻傻初學者狀態最好。
要是你已有類似領域學習經驗。完蛋了。會學超慢。為什麼呢?
因為第一直覺,你一定是會想要 what,把新東西方法 map 到你的舊技能去,然後你發現不 work,然後你開始問 why。
what -> why 迴圈要開始了。
我舉兩個例子。
當初我們最早一輩人,有 svn 經驗的人學 git 時,學超久。結果不知道什麼是 git 的人,學 git 超快。
因為我們會一直試圖把 svn map 到 git,然後找規則,幹,然後找不到規則。我認識一堆大神剛學 git ,都學得比現在新手慢超多......
然後現在新手學超快,是因為 git 現在有教學 example,照著打就好。不然你真的照 git rule book 來。媽的我跟你說 git command 真是超 nonsense 的。這點還被程式界拿出來恥笑。
學人類新語言還特別嚴重,因為這是一個領域,人人都有一門精熟的技能,但是絕大多數人不知道規則是怎樣的技能。
所以學語言時,下意識你會驚慌,一直想用what 去remap,然後去問 why。於是大腦就卡住鬼打牆了。
That's why。
無窮迴圈例子 在 Joe's investment Facebook 的精選貼文
有些人應該體會過這種經歷
主管:「公司營運不好,都是老招無法吸引顧客,想些辦法弄些新的嘗試來改變,要創新。」
員工:「好的。」
數日後
員工:「這個做法好像有機會,要不要試試看。」
主管:「以前有人做過嗎,風險高嗎。」
員工:「沒有,這應該是新的做法。」
主管:「那你做這個做啥,你看A公司的那個方法,效果很好,你弄一個類似的來。」
數日後
主管:「公司營運不好,都是老招無法吸引顧客,想些辦法弄些新的嘗試來改變,要創新。」
員工:「好的。」
無窮迴圈
一位年輕男士分享他對家族企業的想法,之前在美國念書、工作,現在在一間台灣傳統產業公司,雖然已經是上市公司了,但基本上掌控權還是握在他的家族中,那家公司是由他爺爺所建立。
「我舉例子,我們為體育用品公司生產布料、透氣布料、輕量布料。我們從布料開始,然後終於進入成品生產,最後現在則是替許多國際運動品牌或零售廠商做OEM(原廠委託製造商)或ODM(原始設計製造商),他們從提供便宜的材料和人工開始,最後變成替西方品牌做外包工廠,並在幾代之後慢慢變得比較富裕。
而現在全都卡住了。在過去的15年中,所有的工廠都移往中國或是東南亞,那些地方成本更低、規模更大。許多台灣傳統產業撐不過去是因為長期來說他們完全無法競爭;那邊一直有更便宜的勞工和更大的市場。我父親那代的人都知道這點。
下一步很自然是往供應鏈的上游移動或是多角化經營他頓了頓,我們不再在成本上競爭,最終要建立我們自己的品牌,他們也都同意這一點,我現在負責要打造公司第一個品牌,就在上個月,我提出要做網路行銷的預算。資深主管拒絕了。」
為什麼?
「因為我要求新台幣500萬元的預算來做網路和社群媒體行銷,他們完全不能理解這筆錢花去哪裡,如果我們要打造一個新的運動品牌,那我們自然會瞄準要購買運動裝備市場、年齡介在12到30歲的人。那我們就需要買Facebook或Google的行銷廣告,但對於上一代,很多人甚至從來沒有用過 Facebook,也不懂什麼是社群媒體,你如何解釋要花這500萬?
他們寧願花這500萬元去買更多棉花或是投資在工廠上,然後讓工廠更有效率,更節省成本。工廠、省成本、買更多材料,這些是他們能夠看到、摸到的,所以他們能夠想像,上一代運用這些傳統的製造思維獲得非常大的成功,所以很難要他們去想像其他的方法。因此即便公司過去10年都在喊著我們要有自己的品牌,但我們卻仍持續專注在成本上競爭......。」
許多類似的年輕人來自於自己的家族企業,都可能同意他針對台灣、無數台灣中小企業以及他們未來想要表達的意思。
經濟停滯,起薪倒退,全球競爭力下降,無法在國際級創新方面競爭,員工和資深主管之間不信任、老人和年輕世代之間不信任,最大的原因是什麼?
因為良好的營運管理,通過努力工作和高效率生產打造高品質的產品,這種源自於60年前的管理經驗來競爭已經不夠了,走進死胡同了。
公司知道該改變,但是因為舊的公司包袱和文化,越接近要改變的時候,公司就會越害怕,因為就像對一個完全沒上網的世代解釋打造一個新品牌的細節,以及在臉書上行銷一樣,這些改變對於公司過去熟知的情況距離太遙遠。辯論本身只會曠日費時,而其他競爭對手則加速往前。遇到挫折、公司內不同團體開始互相指責對方讓公司停滯,最後演變成外面的收購者進來買下公司。
15年前,百視達(Blockbuster)在全台各地到處都是,現在它們全部不見了,因為它們在和網路影音分享競爭上面反應速度不夠快而失敗。現在回頭看,如果持續削減DVD的零售價格,並讓店面更便宜,百視達現在真的就還能夠活著嗎?
許多方面來說,這就像是現在台灣的鏡子一樣,有過時的企業思維,以及不斷改變的政府政策。而因為台灣是一個相對封閉的社會,我們很少有機會接受外界的刺激,來迫使我們有新的點子和改變,我們必須擁抱風險和改變,把自己藏在角落,希望我們會是幸運的1%、不會在全球化競爭中被屠宰,那是很不實際的,就像這間公司一樣,認為持續在更有效率的工廠上競爭,就能夠讓他們從永遠不被消滅。
每個人都在抱怨現在的政治情況,以及台灣企業管理是錯的,但是當新的選擇或是激進新的點子提出來的時候,最常見的意見總是:
不要想太多,做好你的工作,遵循著規則,尤其是像在這樣糟糕的經濟情況下。
其實在現在這樣經濟不好的情況下,我們一定要歡迎更多的風險,更多的創業家精神,更多的冒險,尤其是在企業上,因為失敗的機會成本較低,我們不能夠繼續這麼優柔寡斷和規避風險,不能夠在表面上宣稱擁抱改變,嘴巴上說了解每個世代想去追尋不同的路、不同答案以解決挑戰日益增加的情況,但最終卻強迫他們選擇和上個時代一樣的決定,追求相同安全的生涯選擇,並期待社會會奇蹟般變好。
文章主要內容來源
http://www.businessweekly.com.tw/KBlogArticle.aspx…
無窮迴圈例子 在 13 無窮迴圈 的推薦與評價
0:00 / 8:10•Watch full video. Live. •. Scroll for details. 13 無窮迴圈. 2,137 views Oct 16, 2013 … ...more ...more. Show less. 0. Dislike. ... <看更多>
無窮迴圈例子 在 while無限迴圈在PTT/Dcard完整相關資訊 - 萌寵公園 的推薦與評價
無限迴圈- 自由嘅百科全書無限迴圈例子有以下呢啲:. 一段Java 碼:. while (true) // 當「true」係真嘅 ... tw無窮迴圈- 维基百科,自由的百科全书無窮迴圈( ... ... <看更多>
無窮迴圈例子 在 Java學習筆記-迴圈式 的推薦與評價
for. 先以一個範例說明:. 程式, 輸出. public class example{ public static void main(String[] ... ... <看更多>