むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:39 PM
1
現在不想寫作業,所以今天應該會早點睡,睡前來填一個之前挖的坑,「糞 code 是怎麼鍊成的」
掰噗~
@baipu
好奇
Mon, Jul 6, 2020 2:39 PM
那麼你覺得呢?
sudo rm -rf /
@Sirctal
說
Mon, Jul 6, 2020 2:40 PM
時程壓力下造成的,大部分都是這樣。
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:40 PM
老實說,我自己應該不算是經手過非常大的 project,目前維護 / 寫過最大規模的程式差不多就是數千行左右,但還是試著來分享一下自己的看法
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:42 PM
如果要我定義糞 code 到底是什麼,基本上我認為只要「顯著」滿足幾個條件中的其中一個都能算是(之所以用顯著這個詞是因為這些標準一般不會有絕對的對錯,而且幾個條件其實有時候是互相折衝的):
1. 可讀性差 2. 執行效率低 3. 可拓展性低
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:43 PM
sudo rm -rf /
: 其實我覺得不一定,很多不是在時程壓力下寫出來的 code 一樣很糞,我覺得是基本觀念的問題
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:45 PM
簡單舉一個條件之間互相折衝的例子:你可以試著把程式碼裡所有2的次方的乘法都換成 bit-wise shift,但如果你真的這樣寫,之後維護的人可能會頭很痛
ノワールみたいなPちゃん
@ProchainNoire
說
Mon, Jul 6, 2020 2:47 PM
還有一種叫做接手的人沒看懂就亂改所產生的糞code
__
@adzen
Mon, Jul 6, 2020 2:48 PM
我看過有人手動 unroll loop
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:49 PM
在我個人的經驗中,可讀性差的 code 通常是那些對 coding style 沒有自我要求,習慣隨便命名變數跟函數,平時 debug 就是各種亂改改到對的人寫出來的
sudo rm -rf /
@Sirctal
說
Mon, Jul 6, 2020 2:49 PM
__
: ...那個交給template不就好了?
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:51 PM
__
: ???????為什麼?????
ノワールみたいなPちゃん
@ProchainNoire
說
Mon, Jul 6, 2020 2:51 PM
__
: 怎麼覺得8成他不懂那種東西是什麼
__
@adzen
Mon, Jul 6, 2020 2:53 PM
變數命名就從 buttonA, buttonB, ... 取到 buttonZ
所以本來可以一個 loop 幾十行就做完的事情
就各種複製貼上寫成數百行
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:53 PM
通常剛開始寫程式的人比較容易寫出可讀性很差的 code,但這主要可能是因為他們寫的程式的規模還不夠大,還可以把各個變數的意義記在大腦裡,或者可能出錯的地方少到他可以無腦枚舉各種組合,之類的;實際上大多數人脫離了初學者的階段之後,只要自己有意識去好好寫 code,都會慢慢改掉這些壞習慣
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:55 PM
__
: 我不知道這應該被歸類為可讀性很低,還是可拓展性很低 xDDD 實際上應該兩者皆是吧
sudo rm -rf /
@Sirctal
說
Mon, Jul 6, 2020 2:55 PM
變數命名的問題我覺得是這樣,你自己要先了解你自己寫這一段code的邏輯然後這變數在這當中的參與。這樣才可以知道。
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 2:58 PM
sudo rm -rf /
: 或許可以說,寫出這樣的 code 的人在寫程式的時候的 scope 不夠廣,沒有辦法從比較 high-level 的角度看自己正在處理的問題?
__
@adzen
Mon, Jul 6, 2020 3:00 PM
那個專案是 ASP .NET Webform
前人介面應該都用拉的
N 個類似功能的按鈕就拉 N 次
所以命名就長那種鬼樣子了 XDDDD
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:01 PM
可拓展性低的 code 通常會充斥著大量的複製貼上,這些複製貼上會導致每個 bug 都需要異常長的時間處理,要增加功能也要到處拼拼貼貼;我想這仍然是寫程式的人的自覺問題:寫程式是為了把事情變簡單,把重複的事情簡化成固定的步驟
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:04 PM
執行效率低這一點是我特別想要提出來講的部份,因為這其實某種意義上可以說是現在大量工程師如雨後春筍般冒出後衍生的核心問題之一,而且這一點很難用相對簡單的方式教會一個人 ...
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:04 PM
Mon, Jul 6, 2020 3:05 PM
e.g. 雖然聽起來很好笑,但有些人真的會覺得 Python 裡 dict() 跟 list() 的 operations 的時間
/ 空間複雜度是一樣的。
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:12 PM
我感覺那些對於底層運作不瞭解的人很容易落到各種時間與空間複雜度的「陷阱」中。在一般情況下這些東西不一定會造成很大的效率落差,但如果今天要做的是非常密集的運算,或者這個程式運行在 mobile device 上,這些看似無關痛癢,而且在小規模的測試裡不一定感覺得到的差異就會讓一份原本看起來很正常的 code 直接變成糞 code
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:16 PM
或者我們也可以說當代硬體的發展讓這些東西變得好像不那麼要緊了(雖然其實並不是這樣)。有些人會抱著僥倖的心態覺得「我這邊不優化沒關係,反正這段 code 只會跑個 10 次,花不了多少時間」,但如果每個檔案、每個函式裡都出現類似的情況呢?積少成多的結果是讓這份 code 變得奇慢無比,而且要改也不知道從哪裡改起,因為
到處都是問題
むきぶつ - SoTA-
@coderalo
Mon, Jul 6, 2020 3:18 PM
Mon, Jul 6, 2020 3:20 PM
雖然表面上可能沒什麼關係,但這也是我最近開始覺得用 leetcode 題面試很危險的原因之一:當每個人都靠著刷刷刷,而不是穩紮穩打地學會這些概念的時候,這些概念根本不會是你自己的,你實際遇到問題的時候還是會退回你過去會的那些方法,那些高效率的資料結構或算法永遠都不會出現在你的 code 裡,只會出現在面試的白板上
載入新的回覆
1. 可讀性差 2. 執行效率低 3. 可拓展性低
還有一種叫做接手的人沒看懂就亂改所產生的糞code所以本來可以一個 loop 幾十行就做完的事情
就各種複製貼上寫成數百行
前人介面應該都用拉的
N 個類似功能的按鈕就拉 N 次
所以命名就長那種鬼樣子了 XDDDD
/ 空間複雜度是一樣的。