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