2017年5月6日 星期六

[程式] 寫出精簡的程式碼,難道錯了嗎?

最近在好友圈出現了一篇 2014 年的翻譯文章,主要是要大家不要寫精簡的程式碼!
這其實是個有趣的議題,而且沒有確切的標準。
畢竟,過去有人用程式行數衡量績效(也許現在可能還有⋯),也有人覺得寫出很短的程式碼的一定是高手。

現在,回到那篇文章,閒聊一下我個人的看法。


先說標題,翻譯的中文標題是『神級 Coder 絕不犯的錯誤:為炫耀編出超短碼』,但是實際上原文的標題是『Shorter code is inconsiderate』、副標『And it’s a waste of time.』。
看起來中文的標題好像有點過度解讀了,人家只說精簡的程式碼不顧他人、且浪費時間。

然後再來說個人的結論:
根據文中提及『short』的情況看來,作者並沒有恰當的區分『精簡』和『為短而短』。尤其是那段範例程式碼我不太能認同。
但是,他所提到的三個重點的確很重要!

看看文中所提及的不良程式碼:Source Code

以及推崇的程式碼:Source Code


我們來看看他的解釋:良好的註解、簡單的操作、良好的命名。

其一,註解。
在冗長的範例中寫了註解,卻故意不在較短的範例中註解,這根本就與精簡的程式碼無關!
寫的精簡不代表不寫註解,這是兩碼子事情!

其二,簡單。
其實 map 並不太複雜,而且在 Python 中利用 map, filter, reduce 或 list comprehension 去快速撈出資料已經是非常基本的東西了!
把語言所提供的良好工具棄之不用,卻說能好好使用這些工具的人是自私鬼?
我其實不太能理解這樣的邏輯!
這就好像明明有輪子可以用,但是自己不會用輪子,所以批評用輪子省力的人是旁門左道,而自己單純地用手搬東西才是正道一樣。

其三,命名。
這跟第一點一樣,在冗長的範例中有命名,在較短的範例中隨便寫!
變數沒好好命名是個人問題,也跟精簡的程式碼無關!
而且回到註解的部分,如果有好好寫註解,大多數時間不會有搞不清楚輸入的變數是什麼東西的情況。

所以追根究柢,此範例的問題不是太短太精簡,而是沒寫好註解、命名。
當補足了清楚的註解和命名之後,就是一個對我來說足夠清楚又精簡的函式了。
如果有讀者因為看了文中的範例而不去瞭解、使用程式語言所提供的方便工具,就實在太可惜了。

當然,我同意有不好的的程式碼風格:過度的把程式碼濃縮、 縮短變數來減少字數、刪除註解節省行數、使用特殊的寫法讓邏輯混亂難懂⋯等。
我會把有上述這類問題的程式碼認為是刻意的『為短而短』。
例如:
f=lambda s:s and f(s[4:])+s[:4]
就真的不能一目了然知道這行要做什麼。

也許文章的初衷正是要指出這種問題,但這首先要先把『精簡的程式碼』與『為短而短的程式碼』區分開來。
這兩者在實質上是不一樣的。