好程序員不寫代碼?網(wǎng)友:沒必要重復(fù)發(fā)明輪子
無劍勝有劍,是金庸武俠世界的***境界。
現(xiàn)實(shí)的西方程序員世界里,也有與之如出一轍的精神:The Best Code is No Code At All。***的代碼就是根本沒代碼。
簡單說來,無碼勝有碼。
△Francois Chollet
山景城坷垃斯劍派祖師 Francois Chollet 最近就連連發(fā) Twitter,傳揚(yáng)這種精神,贊同者云集。
他說:
程序員寫多少代碼不重要,重要的是解決問題的效率。
不用你寫、不用你維護(hù)的才是好代碼——直接用的現(xiàn)成解決方案嘛。
簡單幾句話,仿佛說到了眾多同行的心坎里。他們高喊“太對了”,還用“@”呼朋喚友前來觀摩。
Chollet 有充分的資格發(fā)推布道:他是入門框架 Keras 的作者、Google 研究員、《Python 深度學(xué)習(xí)》一書作者,頂會論文沒少發(fā),打 Kaggle 競賽也很厲害,***排到過全球第 17 名。
圣誕之后新年之前的垃圾時間里,他這條不總結(jié)不展望不拜年的 Twitter,已經(jīng)被轉(zhuǎn)發(fā)了 700 多次,收獲了 2100 多贊。
多寫代碼就是好?
引來這么贊同的核心觀點(diǎn)說來也簡單:
代碼是幾十行還是幾千行不重要,解決問題才是正經(jīng)事。
就拿 Chollet 舉的例子來說吧:如果老板讓你搞個系統(tǒng),監(jiān)控有沒有人在廚房做飯,該怎么辦?
解決方案一擺,高下立判。
如果買個攝像頭,花 10000 美元收集數(shù)據(jù),然后親自把控訓(xùn)練流程,奮戰(zhàn)幾周用低級庫定制一個 CNN-LSTM 架構(gòu)……那是糟糕的程序員,程序員里的戰(zhàn) 5 渣。
好程序員會怎么辦呢?
買幾個 5 美元的溫度傳感器,幾個小時收集完數(shù)據(jù),然后用 sklearn 訓(xùn)練一個簡單的邏輯回歸模型。
一下午就能搞定,而且系統(tǒng)更可靠、更好維護(hù),甚至,還沒什么隱私之憂。
有人做飯,廚房自然會熱起來嘛!如果只知道拿攝像頭檢測人形物體,簡直是不知變通,費(fèi)時費(fèi)力還費(fèi)錢。
不過這還不算慘,如果程序員搭了 CNN-LSTM 之后對效果不太滿意,再花幾周時間,用 GAN 來擴(kuò)增數(shù)據(jù)細(xì)心打磨……
“認(rèn)真”到這個程度,已經(jīng)超出了戰(zhàn)五渣的境界,可以叫那個啥隊(duì)友了。
方向走錯了,花再多力氣都是白費(fèi)。
而這些“認(rèn)真”程序員花掉的力氣,大概也會讓 Chollet 一臉無奈:
就算你非搭 CNN 不可,為什么要用低端庫定制呢?我的 Keras 里都打包好了,拿來試試不行就換別的啊……
評論區(qū)就有網(wǎng)友一針見血地總結(jié):沒必要重復(fù)發(fā)明輪子。
不要重復(fù)造輪子
這句話在各行各業(yè)都深入人心,程序員界也不例外。
作為 Keras 這個高級框架的作者和布道者,Chollet 對重復(fù)造輪子這種行為,更是持之以恒地批判。
前不久,他還在吐槽某些“痛恨框架”的程序員,說他們自己從頭構(gòu)建的東西只不過是重新實(shí)現(xiàn)了框架的部分功能,而且設(shè)計(jì)拙劣、無法復(fù)用。
為什么這么推崇用框架呢?是為了站在巨人的肩膀上。那些大型框架是眾多人想法和努力的結(jié)晶,想自己實(shí)現(xiàn)其中一部分功能?那相當(dāng)于想靠 0.01% 的努力&腦力出人頭地。
好程序員,要善用前人打下的基礎(chǔ)。
不過,關(guān)于“重復(fù)造輪子”這個問題,爭論很是激烈。Twitter 上、Reddit 論壇里,關(guān)于“什么時候用框架、什么時候手寫”的討論總是熱火朝天。
想自己手動搭模型的程序員各有各的理由。比如說,為了優(yōu)化程序的性能:
這種說法太短視了,如果追求性能、低延遲,就要重寫很多代碼,這也沒什么問題。
更多重造輪子的人,是為了學(xué)習(xí)。
不少人都認(rèn)為,在剛開始學(xué)習(xí)編程的時候,重造輪子不失為一個好辦法,能夠讓初學(xué)者能更好的理解技術(shù)或方法背后的邏輯。
比如,如果你想了解 PyTorch 的原理,以及怎么讓它運(yùn)行得更快,***的方法,就是自己實(shí)現(xiàn)一個簡單版本的 autograd。
雖然不能夠得到一個比 PyTorch 更好的框架,但通過這個過程,你對 PyTorch 的理解會變得更加深刻,在之后用到 PyTorch 的時候,也會更加順手。
同為 Google 研究員的 David Ha 就曾經(jīng)和 Chollet 激烈爭論過,David 說:
從零開始(用純 Python、numpy、甚至 JS)實(shí)現(xiàn)全連接網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、RNN、反向傳播、SGD,然后用小訓(xùn)練集來訓(xùn)練這些模型是一種學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)如何工作的好方法。在跳到框架上之前,應(yīng)該花時間從這里收獲寶貴的直覺力。
除此之外,還有一個充滿無奈的原因:現(xiàn)成的輪子還真不一定能用。
沒開源、不適合這個特定任務(wù),都讓開發(fā)者們面對輪子的時候很無奈。最近的“圣誕彩蛋”事件,更是讓程序員們對輪子充滿警惕:
誰知道作者會在輪子里藏些什么東西!
但切記,不論你為什么要自己動手從頭實(shí)現(xiàn)一個算法,千萬不要造出來一個方輪子。
One More Thing
知乎上曾經(jīng)流傳著這樣一個問題:程序員真的很少寫代碼嗎?
有網(wǎng)友嘲諷&自黑,說寫代碼多、天天敲鍵盤的程序員是“苦力”、“段位不夠”。
也有不少人吐槽:還不是因?yàn)榇蟛糠謺r間都是在找 bug!
話說回來,無論調(diào)框架還是從頭搭、寫文檔還是找 bug,都是為了實(shí)現(xiàn)功能。
你支持有碼還是無碼呢?