發(fā)布于:2020-12-24 16:14:46
0
279
0
在Stack Overflow上作為答案的一部分發(fā)布的一些示例代碼最終變成了產(chǎn)品代碼,這在編碼人員中是一個(gè)公開的秘密。也許你問了一個(gè)問題,得到了一個(gè)完美的for循環(huán)。也許您已經(jīng)找到了一個(gè)很好的答案,它已經(jīng)有了完全符合您的應(yīng)用程序的async await實(shí)現(xiàn)。
所以當(dāng)我看到宣揚(yáng)偷代碼的好處時(shí),我開始思考:復(fù)制和粘貼代碼真的有用嗎?
復(fù)制和粘貼可能是危險(xiǎn)的,但同樣,如果不小心進(jìn)行,軟件開發(fā)的許多方面也可能是危險(xiǎn)的。在這篇文章中,我將討論代碼復(fù)制對(duì)于軟件開發(fā)的實(shí)際意義,好的代碼盜竊的意義,以及糟糕復(fù)制的陷阱。
鄭重聲明,我并不是主張你隨意地從我們的公開問答網(wǎng)站復(fù)制和粘貼代碼,在某些情況下這會(huì)給你帶來麻煩。但是,正如我們的播客嘉賓Anna Lytical向我們展示的那樣,快速生產(chǎn)出功能性原型是可以做得很好的。
如果你復(fù)制代碼的例子,請(qǐng)記得提供署名。根據(jù)代碼最后一次在Stack Overflow上編輯的時(shí)間,它使用Creative Commons許可證的一個(gè)版本進(jìn)行授權(quán),最近的版本是CC BY-SA 4.0,它需要署名。
編寫一次代碼,就會(huì)運(yùn)行數(shù)百萬次
從堆棧溢出復(fù)制代碼是代碼克隆的一種形式;也就是說,從項(xiàng)目?jī)?nèi)部或項(xiàng)目之間復(fù)制代碼并重用它。根據(jù)你問的人,有5-10%或7-23%的代碼是從別處克隆出來的。這些克隆體是好是壞還有待討論。
不管具體的數(shù)量是多少,代碼克隆都是非常普遍的。樣板代碼本質(zhì)上是在整個(gè)項(xiàng)目中定期重復(fù)的代碼。很有可能這些程序員并不是手工輸入每一個(gè)。Lombok等工具試圖減少對(duì)樣板文件的需求,但事實(shí)仍然是:有一些代碼會(huì)在項(xiàng)目中反復(fù)出現(xiàn)和因?yàn)樗鼈兛赡苄枰粋€(gè)小的修改,所以這些代碼片段不能被分流到單獨(dú)的函數(shù)或依賴項(xiàng)中。說到這里,庫(kù)和外部依賴關(guān)系是重用功能而不重用代碼的有效方式。它幾乎就像復(fù)制代碼一樣,只不過您不負(fù)責(zé)代碼的維護(hù)。更糟糕的是,現(xiàn)在的大多數(shù)web都運(yùn)行在各種框架和插件庫(kù)上,這些框架和插件庫(kù)簡(jiǎn)化了開發(fā)。以庫(kù)的形式重用代碼是非常有效的,并且允許每個(gè)集中的庫(kù)在它所做的事情上非常出色。而且與學(xué)術(shù)界不同的是,許多庫(kù)甚至不需要任何東西來表明您是在使用他人的代碼或在他人的代碼之上構(gòu)建的。
JavaScript包管理器npm將這一點(diǎn)發(fā)揮到了極致。您可以通過命令行將很小的單個(gè)函數(shù)庫(kù)(有些只有一行代碼)安裝到您的項(xiàng)目中。您可以從超過一百萬個(gè)開源包中獲取任何一個(gè),并開始將它們的功能構(gòu)建到您的應(yīng)用程序中。
當(dāng)然,和所有的工作方法一樣,這種方法也有缺點(diǎn)。通過安裝一個(gè)包,您放棄了對(duì)代碼的一些控制。一些惡意的編碼者已經(jīng)創(chuàng)建了合法的有用的包,等到他們有一個(gè)不錯(cuò)的使用率,然后更新代碼來偷比特幣錢包。值得贊揚(yáng)的是,npm工作人員設(shè)法很快地?fù)敉肆诉@類攻擊,但是您擁有的外部依賴越多,您面臨的攻擊面就越大。
即使堆棧溢出答案本身也不能幸免于代碼克隆。一個(gè)獨(dú)立的研究人員發(fā)現(xiàn)了幾個(gè)例子,堆棧溢出的答案從其他地方復(fù)制的代碼。一個(gè)Java片段找到了40多個(gè)答案。
好的藝術(shù)家借鑒,偉大的藝術(shù)家偷竊
在藝術(shù)世界里,盜竊是偉大作品產(chǎn)生的一部分。我記得去阿姆斯特丹的梵高博物館看了他的一些早期作品。我被震撼了,但我當(dāng)時(shí)不知道這些其實(shí)是日本藝術(shù)和木刻的研究。我所認(rèn)為的那種風(fēng)格在那個(gè)時(shí)代是獨(dú)一無二的,實(shí)際上是連續(xù)體的一部分,而不是我所認(rèn)為的連續(xù)體。他從巴黎找到的日本版畫中汲取靈感——構(gòu)圖和筆法——并將它們?nèi)诤显谝黄?,而不是僅僅沿著荷蘭繪畫大師們擺在他面前的道路前進(jìn)。
畢加索有句諺語(yǔ)稱贊他:“好的藝術(shù)家借鑒,偉大的藝術(shù)家偷竊。”畢加索從非洲和波利尼西亞藝術(shù)中汲取了很多靈感,并將它們與自己的研究相結(jié)合。偷竊聽起來是錯(cuò)誤的,事實(shí)上,聲稱別人的作品是自己的就是剽竊。但是這句話用“steal”這個(gè)詞來表達(dá)有點(diǎn)不同的意思。借來的物品仍然屬于別人;你復(fù)制了一種風(fēng)格,但它仍然屬于其他人。然而,偷竊,就是把這個(gè)想法變成你自己的想法。把別人的想法歸功于自己就是借用;理解一個(gè)想法并將其融入自己的工作中,這就是他所說的盜竊。史蒂夫·喬布斯是這句話的粉絲,在他的領(lǐng)導(dǎo)下,蘋果公司成功了,因?yàn)樗麄兏`取、合并和改進(jìn)。
當(dāng)您克隆代碼時(shí),您可能只是借用了它。借來的代碼大量進(jìn)入項(xiàng)目,只要它編譯或不拋出錯(cuò)誤,但它可能有bug或惡意的意圖,你沒有意識(shí)到。代碼被嚴(yán)重復(fù)制或代碼被修改的風(fēng)險(xiǎn)是巨大的。事實(shí)上,大多數(shù)關(guān)于克隆代碼的抱怨都可以追溯到借款人。如果您不理解代碼,就很可能在僅僅用于演示概念的代碼中留下安全漏洞。即使從堆棧溢出復(fù)制最多的代碼片段也有錯(cuò)誤。
另一方面,當(dāng)你偷代碼的時(shí)候,你知道它是做什么的。它的核心,那些怪癖,所有這些都成為你自己代碼的無縫組成部分。如果你能憑記憶再寫一遍,這就是偷竊行為;一個(gè)重做,讓你得到的不僅僅是克隆,而是原始的東西。
是的,偷代碼。接受它,理解它,并在你自己的項(xiàng)目中實(shí)施它。讓你的。你可以更有效率,改進(jìn)你的項(xiàng)目,甚至改進(jìn)你的簡(jiǎn)歷(也就是你的ctrl+C ctrl+V)。但是,如果在沒有完全理解新獲得的代碼及其功能的情況下進(jìn)行復(fù)制,就有可能使代碼變得更糟
作者介紹
熱門博客推薦