一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考
事情是如何發(fā)生的
最近干了件事情,發(fā)現(xiàn)了 underscore 源碼的一個(gè) bug。這件事本身并沒有什么可說的,但是過程值得我們深思,記錄如下,各位看官仁者見仁智者見智。
平時(shí)有瀏覽園區(qū)首頁文章的習(xí)慣,看到一篇關(guān)于 "函數(shù)節(jié)流" 的文章(具體是哪篇就不說了),不過很遺憾作者似乎并沒有搞清楚 throttle 和 debounce 的區(qū)別(或許根本不知道 debounce)。于是隨手 Google 了一下,發(fā)現(xiàn)大多數(shù)談 "函數(shù)節(jié)流" 的文章都會(huì)引用《高程三》中的經(jīng)典代碼:
代碼本身并沒有問題,但是很可惜,函數(shù)名有問題,應(yīng)該叫 debounce 而非 throttle,這就引發(fā)了我的思考,這個(gè)錯(cuò)誤的概念,這段錯(cuò)誤的代碼,為什么能夠 "流芳百世"?
throttle vs debounce
由于篇幅以及主題的關(guān)系,本文并不會(huì)講 throttle 和 debounce 的具體用法以及區(qū)別等。(對此有興趣的朋友可以跟帖,人數(shù)多的話樓主會(huì)另開一文)
有些人可能會(huì)說,憑什么你以為的 throttle 就是 throttle,debounce 就是 debounce?這就要聊聊我對于 "理解某一個(gè)概念" 的方法。
就以 throttle 為例,某日,老師給你布置了一個(gè)作業(yè),讓你深入理解一下 throttle,第二天上課來聊聊。張三心里非常高興,這個(gè)概念在經(jīng)典書籍《JavaScript高級程序設(shè)計(jì)》中見過,打開一看,就兩頁,而且解釋地非常清晰,看完就高興地干別的事情去了。而李四,覺得高程三講的有點(diǎn)少,而去谷歌了下其他關(guān)于 throttle 的知識點(diǎn),興奮地看到 throttle 函數(shù)的好幾種寫法,發(fā)現(xiàn)高程三只是用了最簡單的方式,還有更優(yōu)雅運(yùn)用場景更多的寫法,或許此時(shí)他已經(jīng)發(fā)現(xiàn)和 throttle 同時(shí)出現(xiàn)的還有個(gè) debounce,這是什么鬼?反正老師沒說,以后再看吧,于是心滿意足地玩游戲去了。而王五,和李四一樣發(fā)現(xiàn)了 debounce,這是什么?一起了解了吧,繼而發(fā)現(xiàn) debounce 的用法居然和高程三中的 throttle 一樣!繼續(xù)挖下去,發(fā)現(xiàn)高程三中的 throttle 函數(shù)其實(shí)應(yīng)該叫 debounce,看到最后,王五已經(jīng)把 throttle 和 debounce 徹底理解了。
我們要做王五。
首先,我們并不能只聽一家之言。這里的一家是指 "個(gè)人",對于一些官方的文檔我們還是應(yīng)該充分信任的。澤卡斯也是人,犯點(diǎn)小錯(cuò)在所難免。
其次,我們對信息要做充分刪選。網(wǎng)上的信息大多魚龍混雜,出錯(cuò)了也并不會(huì)對你負(fù)任何責(zé)任。那么如何能夠辨別出正確有用的信息呢?首先當(dāng)然是看官方文檔,比如說要了解 HTTP 那么就去看官方的 RFC,要學(xué)習(xí) jQuery 的話可以去官網(wǎng) https://jquery.org/ 查查資料,這些一般都不會(huì)有什么問題。如果覺得官網(wǎng)資料晦澀難懂,可以試著去看看 Wikipedia 或者XX百科,維基的精確度被很多人噴過,樓主覺得還是值得一看的,如果看英文比較吃力的,就看看國內(nèi)的一些百科。第三,就是瀏覽一些前人的文章了,這也是最普遍但是也最容易混淆概念的地方,所以我們要盡量挑一些權(quán)威的專家級作者(比如樓主,開玩笑啦^_^)。第四,如果還是覺得沒法理解,可以試著去一些問答社區(qū),首推 stackoverflow,國內(nèi)的話可以看看 segmentfault,知乎,看贊同多的回答,一般來說問題不大。
樓主找到的關(guān)于 throttle 和 debounce 區(qū)別的資料如下:
- http://benalman.com/projects/jquery-throttle-debounce-plugin/
- https://davidwalsh.name/javascript-debounce-function
- https://css-tricks.com/the-difference-between-throttling-and-debouncing/
- https://ict.ken.be/javascript-debounce-vs-throttle-function
- http://stackoverflow.com/questions/25991367/difference-between-throttling-and-debouncing-a-function
關(guān)于拿來主義
為什么這么多文章里會(huì)出現(xiàn)澤卡斯的錯(cuò)誤代碼?樓主想到了一個(gè)詞,叫做 "拿來主義"。
很多人寫博客,只是為了寫博客而寫博客,隨便谷歌百度下,找到搜索頁前幾個(gè)鏈接,東拼西湊下,一篇新鮮的博文就誕生了,甚至都沒有自己寫 demo 測試下,就把代碼粘貼上去了,樓主對這樣的行為是嗤之以鼻的。以前寫過一篇文章,叫做 get與post需要注意的幾點(diǎn),寫這篇文章的時(shí)候,看到過一篇叫做 GET和POST有什么區(qū)別?及為什么網(wǎng)上的多數(shù)答案都是錯(cuò)的。 的文章,就深刻抨擊了 "拿來主義" 這一現(xiàn)象。很多知名的博主寫過文章來遍歷寫博客的好處,于是大家都紛紛效仿,為了寫博客而寫博客。對于樓主來說,寫博客是一種享受,通常寫一篇類似本文的博文需要花費(fèi) 2~4 個(gè)小時(shí),卻也樂此不疲,用心寫過博文的人都知道,寫一篇好的文章,需要花費(fèi)大量的時(shí)間,而樓主身為一個(gè)完美主義者,每次寫完一篇文章,至少自己已經(jīng)讀過十幾遍了,寫完之后還要讀個(gè)兩三遍才敢發(fā)表,所以很少有錯(cuò)別字以及不通順的句子,但是 "拿來主義" 者則不然,簡單地拼接一些資料,就能生產(chǎn)一篇博文,在此,樓主呼吁大家,如果寫,請用心。
the bug of underscore
很多談?wù)?throttle 和 debounce 的文章,最后都會(huì)談到 underscore 已經(jīng)將這兩個(gè)方法完美封裝,有的給個(gè) underscore 的鏈接,有的直接上段代碼,很少有去深入看看它的實(shí)現(xiàn)的。樓主簡單地用了下 underscore 封裝的 debounce 方法,發(fā)現(xiàn)了 bug,建了個(gè) issue https://github.com/jashkenas/underscore/issues/2478。
好幾個(gè)外國人表示并沒有重現(xiàn)我的 bug,最后我直接指出了代碼的錯(cuò)誤之處,并給出了自己的 fix 方案(詳見 https://github.com/jashkenas/underscore/pull/2479),老外才認(rèn)識到了代碼中的 bug,并進(jìn)行了修復(fù)(雖然最后沒有采納我的代碼)。詳細(xì)的過程可以看上面的兩個(gè)鏈接里的內(nèi)容,主要是和 underscorejs 兩個(gè)維護(hù)者之間的交流,最后從他們的更新來看應(yīng)該是 test cases 寫錯(cuò)了。
總結(jié)
最后,樓主總結(jié)兩點(diǎn):
- 對于知識點(diǎn),請盡量查閱各種靠譜的資料,將其弄懂,不要一知半解
- 對于寫博客,請弄懂了再寫,不能誤人子弟;如果寫,請用心
最后的最后,如果可以的話,希望大家能在 Github 上關(guān)注我,或者關(guān)注我的項(xiàng)目,我覺得 followers 多的話,也不會(huì)在發(fā)現(xiàn) bug 的時(shí)候被維護(hù)者如此忽視了 ╮(╯▽╰)╭
Github:https://github.com/hanzichi 或者直接點(diǎn)擊頁面右上角,謝謝關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ECMAScript6 新特性——“字符
- 下一篇: Raevo最近疯狂迷上了WP