一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

十年程序員的告誡:對(duì)重寫(xiě)代碼說(shuō)不

電子工程師 ? 來(lái)源:lp ? 2019-03-01 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對(duì)重寫(xiě)代碼說(shuō)不。

以下為譯文:

重寫(xiě)代碼消耗了12個(gè)月!

我們從頭開(kāi)始重寫(xiě)代碼浪費(fèi)的時(shí)間。

你能想象在軟件行業(yè),12個(gè)月的時(shí)間沒(méi)有任何新產(chǎn)品推出,沒(méi)有任何新版本更新嗎?

真的,我不由自主地問(wèn)自己這個(gè)問(wèn)題:

在這個(gè)快速發(fā)展的世界里,12月的時(shí)間能讓我們做多少事情?

“2015年1月20日,星期二,下午5:10,AntiMalware軟件終于進(jìn)入了第一次公測(cè)?!?/p>

經(jīng)過(guò)幾十個(gè)小時(shí)的不眠不休后,第一個(gè)版本的軟件說(shuō)明書(shū)終于發(fā)布到了網(wǎng)站上,這標(biāo)志著我們的新旅程的開(kāi)始。

我在一家為企業(yè)和終端用戶提供安全軟件的小型網(wǎng)絡(luò)安全公司工作。我們開(kāi)發(fā)的軟件保護(hù)用戶免受惡意軟件的侵害。如果用戶的電腦被惡意軟件感染,我們的軟件會(huì)幫助他們清理。AntiMalware就是其中一個(gè)軟件。

第一個(gè)測(cè)試版收到的反饋令人鼓舞。我們有四個(gè)開(kāi)發(fā)人員為這個(gè)產(chǎn)品工作,不斷地修復(fù)Bug, 改進(jìn)產(chǎn)品功能,推出新版本。

第一個(gè)穩(wěn)定版本

經(jīng)過(guò)兩個(gè)月的糾錯(cuò)、功能改進(jìn)和編碼工作,我們發(fā)布了AntiMalware的第一個(gè)穩(wěn)定版本。

看看用戶怎么說(shuō)?

大多數(shù)用戶的反饋都很好,他們喜歡這個(gè)產(chǎn)品。這讓我們的團(tuán)隊(duì)深受鼓舞,大家卯足了勁地干活,來(lái)改進(jìn)這個(gè)產(chǎn)品的核心功能。

進(jìn)入市場(chǎng)

2016—2017。

大風(fēng)暴來(lái)臨前的黃金歲月。

AntiMalware軟件處于它的最佳期,它成為了我們的旗艦產(chǎn)品。用戶紛紛把它推薦給他們的朋友們。所有與安全相關(guān)的博客和論壇也都在推薦這個(gè)軟件。它成了拯救被惡意軟件感染的用戶的首選軟件。

下載、安裝、銷售,一切都向好的方向發(fā)展,用戶群在幾個(gè)月內(nèi)迅速增長(zhǎng)。 創(chuàng)始人很高興,團(tuán)隊(duì)也是如此。大家都在想:“我們做到了! 像其他大公司一樣,我們認(rèn)為我們創(chuàng)造了自己的成功故事?!?/p>

新機(jī)遇(至少我們這樣認(rèn)為):進(jìn)入企業(yè)市場(chǎng)

后來(lái),公司決定進(jìn)入企業(yè)市場(chǎng)。一個(gè)新的企業(yè)產(chǎn)品團(tuán)隊(duì)成立了。原產(chǎn)品負(fù)責(zé)人離開(kāi)了公司,我們的CTO接任成為新的產(chǎn)品負(fù)責(zé)人(這是災(zāi)難的開(kāi)始,稍后我會(huì)解釋)。

一些開(kāi)發(fā)人員離開(kāi)了公司,但沒(méi)有什么影響。我們把每件事情處理得很好,AntiMalware軟件仍然是市場(chǎng)上最好的選擇。

好日子結(jié)束, 麻煩開(kāi)始

正如我前面所說(shuō),我們的CTO成了AntiMalware的產(chǎn)品負(fù)責(zé)人,他需要處理AntiMalware的方方面面。而且他還是該軟件的首席開(kāi)發(fā)人員,負(fù)責(zé)不間斷地發(fā)布更新和功能提升。同時(shí),他的職位讓他還需要處理公司的其他事務(wù)。

當(dāng)然,一開(kāi)始都很順利,我們的情況就像所有軟件開(kāi)發(fā)一樣,我們不間斷地維護(hù)和改進(jìn)我們的軟件。

正如我們應(yīng)該預(yù)料到的(顯然我們沒(méi)有),不知何故,軟件開(kāi)發(fā)過(guò)程開(kāi)始慢下來(lái)。

新的版本更新開(kāi)始延期了,這種情況持續(xù)了一陣子,很快就變成沒(méi)有版本更新了。這讓我很不安,有一天我問(wèn)CTO:

“這個(gè)產(chǎn)品出了什么問(wèn)題?為什么版本更新要花費(fèi)那么多時(shí)間而且開(kāi)發(fā)進(jìn)展緩慢?”

他深吸一口氣,開(kāi)始回答:

“我們的代碼太復(fù)雜,它的結(jié)構(gòu)不好,耦合太緊。架構(gòu)設(shè)計(jì)完全錯(cuò)誤,用戶界面和核心邏輯代碼混雜在一起,每當(dāng)修復(fù)一個(gè)Bug或作某些改變時(shí),其他部分就會(huì)受影響。即使是小的改變也很難做好。每次更新,都會(huì)引起新的問(wèn)題。

一些方法竟然有20個(gè)參數(shù),方法體的代碼有兩頁(yè)長(zhǎng)!你能想象嗎?有許多不應(yīng)該實(shí)現(xiàn)的東西不知為何都實(shí)現(xiàn)了。

這就是為什么每次更新都要花費(fèi)很長(zhǎng)時(shí)間而我們無(wú)法推出新功能的原因。每次我們推出一個(gè)新版本,我都擔(dān)心可能會(huì)引入新的Bug,而那些現(xiàn)在工作得很好的核心功能則有可能因此無(wú)法工作。在這種情況下,發(fā)布新版本太冒險(xiǎn)了,我們可能會(huì)失去我們的用戶,我們的軟件無(wú)人再愿意使用?!?/p>

他的回答中提到的一系列問(wèn)題其實(shí)我們都知道。只是,我們期望從他的口中說(shuō)出來(lái)。

我還問(wèn)了一個(gè)問(wèn)題。負(fù)責(zé)這個(gè)軟件的前任首席開(kāi)發(fā)人員為這個(gè)軟件開(kāi)發(fā)了一年時(shí)間,而他都在CTO的管理下,那么CTO為什么允許這樣混亂的代碼出來(lái)呢?

“我不想打擊他的積極性,我們必須盡快進(jìn)入反惡意軟件市場(chǎng),他很擅長(zhǎng)這個(gè),所以我才沒(méi)有制止他這樣做。”

CTO這樣回答。

也就是說(shuō),為了以最快的速度進(jìn)入市場(chǎng),我們犧牲了代碼質(zhì)量,這樣做也等于破壞了這個(gè)產(chǎn)品的未來(lái)。

經(jīng)驗(yàn)教訓(xùn):

要在第一時(shí)間對(duì)不好的代碼設(shè)計(jì)說(shuō)“不”,不要讓“面條式代碼”毀了你的產(chǎn)品的未來(lái)。要確保做出的軟件產(chǎn)品有可持續(xù)開(kāi)發(fā)性。

那么,如何修復(fù)這個(gè)可怕的代碼?

“我們都是程序員,而程序員的心中都駐著個(gè)建筑師,當(dāng)他們到達(dá)一個(gè)地方的時(shí)候,他們想做的第一件事就是把這個(gè)地方夷為平地,然后在上面建造一些宏偉的建筑。我們對(duì)那些漸進(jìn)式的更新不感興趣:如小修小補(bǔ)、改進(jìn)、種種花草等等。”

-?Joel Spolsky,Stackoverflow公司CEO

開(kāi)發(fā)人員總是傾向于拋棄舊代碼然后從頭開(kāi)始,他們有這樣做的理由。因?yàn)樗麄冋J(rèn)為舊代碼都是無(wú)用而且凌亂的。但是這只是想當(dāng)然的理由。當(dāng)我們?cè)噲D找出背后的真正原因時(shí),我們會(huì)發(fā)現(xiàn):

我們可能錯(cuò)了!

舊代碼對(duì)我們來(lái)說(shuō)可能看起來(lái)很凌亂,必須從頭重寫(xiě)的原因并不是因?yàn)榇a本身,而是因?yàn)橐粋€(gè)重要的,基本的編程法則:

讀代碼比寫(xiě)代碼難。

這解釋了代碼重用困難的原因,也解釋了為什么我們認(rèn)為舊代碼象頭發(fā)一樣凌亂。因?yàn)檫@個(gè)原因,當(dāng)我們閱讀另一個(gè)開(kāi)發(fā)人員的代碼時(shí),我們的潛意識(shí)會(huì)不斷對(duì)著我們耳語(yǔ)“扔掉它,重新開(kāi)始”。

像所有開(kāi)發(fā)人員一樣,我們也落入了這個(gè)陷阱。只是讀一遍我們的凌亂的代碼就足夠讓我們下決心考慮從頭重寫(xiě)了。

在一系列的會(huì)議之后,即使CTO對(duì)重寫(xiě)代碼有抵觸(他是對(duì)的),他最終還是被說(shuō)服了,我們決定從頭重寫(xiě)代碼。

然而,重寫(xiě)代碼的決定并沒(méi)有持續(xù)太久…

那是一個(gè)周末,星期日,我邊喝早茶邊讀一些推送文章。就像我的推送知道該向我展示什么一樣,我讀到了那篇最著名的關(guān)于重寫(xiě)代碼的文章,就是Joel Spolsky寫(xiě)的Netscape 的代碼重寫(xiě)故事(https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/)。

讀完那篇文章后,我立馬分享給了AntiMalware開(kāi)發(fā)團(tuán)隊(duì),包括CTO。

然后我們開(kāi)始了新的討論。

本來(lái)說(shuō)服CTO作出代碼重寫(xiě)的決定就已經(jīng)很難了。他在讀完那篇文章后馬上改變了主意,他決定中止代碼重寫(xiě)。這讓其他團(tuán)隊(duì)成員生氣了,他們沖我大喊大叫:

“你為什么給他看那篇文章?我們都已經(jīng)說(shuō)服他了。這個(gè)產(chǎn)品必須從頭重寫(xiě),這是唯一的解決方案?!?/p>

我們的第一次重寫(xiě)代碼的嘗試到此結(jié)束了。關(guān)于這個(gè)話題的討論也終止了。我們的CTO相信我們可以管理好這個(gè)糟糕的代碼,并有能力在它之上發(fā)布新版本,直到嚴(yán)酷的現(xiàn)實(shí)擊倒我們?yōu)橹埂?/p>

一年沒(méi)有任何更新…

真的,這不是玩笑。真的一年沒(méi)有更新了!

“為什么沒(méi)有更新?“

“自上次更新到現(xiàn)在已經(jīng)有好幾個(gè)月過(guò)去了?!?/p>

每天,我們都得面對(duì)這些來(lái)自用戶的負(fù)面評(píng)論。作為一家小公司,我們需要管理的產(chǎn)品太多了,而且,我們又進(jìn)入了企業(yè)市場(chǎng),這些加在一起,使得我們陷入了這樣的困境。

把所有這些結(jié)合起來(lái),你就會(huì)得出這樣的結(jié)論:我們忘記了我們的用戶。

回想一下,我們不想發(fā)布新的版本,因?yàn)槲覀儾幌胧ビ脩簟?/p>

但事實(shí)應(yīng)該是相反的:如果我們不發(fā)布新的更新,我們肯定會(huì)失去用戶,而我們已經(jīng)一年半沒(méi)有給他們?nèi)魏涡掳姹玖恕?/p>

在被現(xiàn)實(shí)打了一巴掌之后,我們決定回頭。對(duì)我們來(lái)說(shuō),除了重寫(xiě)代碼別無(wú)它途。我們做到了。

當(dāng)前

“2018年12月17日,星期一,21:40。測(cè)試的電子郵件準(zhǔn)備好了,即將發(fā)送給我們的內(nèi)部測(cè)試組?!?/p>

經(jīng)過(guò)12個(gè)月筋疲力盡的工作,代碼重寫(xiě)終于完工。我們準(zhǔn)備了第一個(gè)測(cè)試版本說(shuō)明,就像上次這個(gè)產(chǎn)品面市的第一天一樣。

我們又回來(lái)了…

這個(gè)產(chǎn)品的重寫(xiě)版本仍處于測(cè)試階段。測(cè)試已經(jīng)快一個(gè)月了。我們正在修復(fù)錯(cuò)誤,傾聽(tīng)用戶的意見(jiàn),審查用戶反饋……一切就像4年前一樣……

但是在這12個(gè)漫長(zhǎng)的月中,我們錯(cuò)過(guò)了什么呢?如果不是重寫(xiě),我們會(huì)做出什么新產(chǎn)品?!

許多問(wèn)題可以在這里提出來(lái)。但我知道我們只有重寫(xiě)一條路,我們看不到任何其他的解決方案。

如果你也落入了這個(gè)陷阱,開(kāi)始思考“我是否應(yīng)該從頭開(kāi)始重寫(xiě)代碼”,那么在開(kāi)始代碼重寫(xiě)的第一步之前,就考慮自己提問(wèn)下面的問(wèn)題,每個(gè)開(kāi)發(fā)人員都應(yīng)該問(wèn)問(wèn)自己:

你準(zhǔn)備好拋棄關(guān)于舊代碼的所有知識(shí)了嗎?

這個(gè)問(wèn)題很重要!請(qǐng)誠(chéng)實(shí)地回答:你真的準(zhǔn)備好拋棄所有的知識(shí),所有收集到的錯(cuò)誤和修復(fù),年復(fù)一年的編碼結(jié)果嗎?拋棄舊代碼并從頭開(kāi)始,真的是你所期望的嗎?當(dāng)你從這個(gè)角度來(lái)審視代碼重寫(xiě)的決定,你會(huì)發(fā)覺(jué)很痛苦,不是嗎?所有那些試圖修補(bǔ)bug的不眠之夜都會(huì)在你眼前閃過(guò)。相信我,因?yàn)槲矣星猩眢w會(huì)。

你必須和很多用戶交談才能找到導(dǎo)致你的軟件不能正常工作的問(wèn)題所在,然后你要在你的軟件中定位這個(gè)錯(cuò)誤,重現(xiàn)這個(gè)問(wèn)題,然后找到解決方法,然后……等等。

你能保證你會(huì)做的比第一次更好嗎?

這點(diǎn)很重要:當(dāng)你從頭開(kāi)始的時(shí)候,沒(méi)有人能保證你會(huì)比第一次做的更好。

因?yàn)槟氵x擇拋棄關(guān)于這個(gè)軟件的所有知識(shí)和已經(jīng)收集的錯(cuò)誤和修復(fù),所以同樣的錯(cuò)誤很可能再次出現(xiàn)在你的新代碼里。

可能代碼重寫(xiě)團(tuán)隊(duì)已經(jīng)不是第一個(gè)版本的開(kāi)發(fā)團(tuán)隊(duì)。所以你實(shí)際上沒(méi)有“更多的經(jīng)驗(yàn)”。你會(huì)犯下舊版本中的大部分的的錯(cuò)誤,并帶來(lái)一些新錯(cuò)誤,而這些新錯(cuò)誤在舊版本中并不存在。

如果你沒(méi)有很好地計(jì)劃重寫(xiě)工作,你可能面臨新版本比原始版本更糟的風(fēng)險(xiǎn)。然而,既然作出了重寫(xiě)的決定,你就要承擔(dān)這個(gè)風(fēng)險(xiǎn),這個(gè)風(fēng)險(xiǎn)可能導(dǎo)致你失去你的客戶。

你準(zhǔn)備好將幾個(gè)月/幾年的時(shí)間優(yōu)勢(shì)拱手送給你的競(jìng)爭(zhēng)對(duì)手嗎?

你知道需要多少時(shí)間來(lái)重寫(xiě)你的軟件嗎?

代碼重寫(xiě)牽扯到大量的精力、計(jì)劃和準(zhǔn)備工作。你必須把每項(xiàng)任務(wù)計(jì)劃好,然而一個(gè)接一個(gè)地沖刺。你必須確切地知道完成這個(gè)痛苦的過(guò)程的最后期限。沒(méi)人知道你會(huì)不會(huì)錯(cuò)過(guò)這個(gè)最后期限。有很大的可能你不能準(zhǔn)時(shí)完成這個(gè)過(guò)程。

你不得不在數(shù)月或數(shù)年時(shí)間內(nèi)只能交付舊版本給用戶,這將置你于極其危險(xiǎn)的境地。你完全無(wú)法進(jìn)行任何戰(zhàn)略改變或?qū)κ袌?chǎng)所需的新功能作出反應(yīng),因?yàn)槟銢](méi)有任何新代碼可以交付。

你的客戶可能會(huì)拋棄你,因?yàn)槟愠瞬粩嗟靥峁┮怀刹蛔兊嘏f版本外,無(wú)法給他們?nèi)魏涡碌臇|西。

這些你都考慮到了嗎?

從代碼重寫(xiě)中我們學(xué)到了什么?

從頭開(kāi)始重寫(xiě)一個(gè)系統(tǒng),本質(zhì)上就是承認(rèn)作為一個(gè)設(shè)計(jì)師的失敗。它其實(shí)是在聲明,“我們未能設(shè)計(jì)一個(gè)可維護(hù)的系統(tǒng),因此必須重新從頭開(kāi)始?!?/p>

——摘自 Max Kanat-Alexander的Code Simplicity

像其他設(shè)計(jì)師一樣,我們承認(rèn)我們未能設(shè)計(jì)好我們的軟件,我們從這個(gè)精疲力盡的過(guò)程中學(xué)到了很多東西。在這里,我分享一些我們從中獲得的經(jīng)驗(yàn)教訓(xùn)。

代碼重寫(xiě)是開(kāi)發(fā)人員的一種錯(cuò)覺(jué),大多數(shù)情況下它不是解決方案。

當(dāng)你的代碼遇到問(wèn)題時(shí),準(zhǔn)確地診斷問(wèn)題很重要。像每個(gè)開(kāi)發(fā)人員一樣,你最初的想法不應(yīng)該是代碼重寫(xiě)。代碼重寫(xiě)只是一種錯(cuò)覺(jué)。因?yàn)槟阍陂喿x別人的代碼的時(shí)候,你會(huì)認(rèn)為如果你從頭重寫(xiě)代碼,你能做得更好。在這種情況下,請(qǐng)始終牢記那個(gè)重要的,基本的編程法則。

在決定重寫(xiě)代碼前,考慮代碼重構(gòu)

有針對(duì)性的重寫(xiě)對(duì)于處理代碼庫(kù)中最嚴(yán)重的錯(cuò)誤很有用。如果可以限制范圍并解決大部分問(wèn)題,就不要進(jìn)行整體重寫(xiě)。例如,軟件的加載速度非常慢。但這只影響到項(xiàng)目的一小部分。通過(guò)小心地移動(dòng)代碼、重構(gòu)和更改接口,這個(gè)問(wèn)題可以一次性解決。你不必重寫(xiě)所有代碼。

代碼重寫(xiě)是一條比預(yù)期耗時(shí)更長(zhǎng)、更困難、更容易失敗的路。

告訴大家一個(gè)開(kāi)發(fā)人員通常在錯(cuò)過(guò)最后期限后才意識(shí)到的事實(shí):一切都比想象的要花更長(zhǎng)的時(shí)間。代碼重寫(xiě)成本的估計(jì)通常很悲觀,然而實(shí)際的成本幾乎總是比你想象的更高,花費(fèi)的時(shí)間也更長(zhǎng)。因?yàn)榭偸菚?huì)有想不到的復(fù)雜問(wèn)題要解決,這些都會(huì)使重寫(xiě)過(guò)程變得更加困難和痛苦。最后,你很可能不得不接受失敗的結(jié)果。

確保重寫(xiě)后的產(chǎn)品能夠更好地解決用戶的問(wèn)題,至少相同,不能接受更差。

重寫(xiě)對(duì)用戶沒(méi)有直接的影響/好處。因?yàn)橛脩舨魂P(guān)心代碼,他們只想解決自己的問(wèn)題,僅此而已。在用戶看來(lái),能夠解決他們問(wèn)題的產(chǎn)品就是好產(chǎn)品。否則,他們不會(huì)用它。用戶不關(guān)心你的代碼重寫(xiě)決定,所以重寫(xiě)后版本必須至少和舊版本一樣有效地解決他們的問(wèn)題。

保持對(duì)現(xiàn)有產(chǎn)品的維護(hù)和支持。

在我們的案例中,我們有一年的時(shí)間沒(méi)有向用戶提供任何軟件更新。這對(duì)于我們今天生活的世界來(lái)說(shuō)是太長(zhǎng)了。盡管我們的產(chǎn)品依然足夠優(yōu)秀,但是沒(méi)有更新用戶肯定會(huì)抱怨。當(dāng)程序員重寫(xiě)代碼時(shí),永遠(yuǎn)不要停止維護(hù)當(dāng)前正在使用的系統(tǒng)。在重寫(xiě)過(guò)程中,舊的代碼仍然需要維護(hù),小的更新和錯(cuò)誤修復(fù)需要及時(shí)提供給用戶。否則,你將面臨失去用戶的風(fēng)險(xiǎn)。

讓用戶盡快參與設(shè)計(jì)過(guò)程

確保定期向用戶展示最新進(jìn)展,以便他們能夠幫助你捕獲最嚴(yán)重的錯(cuò)誤。盡快與用戶見(jiàn)面是很重要的。他們的反饋將幫助您根據(jù)他們的需求設(shè)計(jì)新產(chǎn)品。不要實(shí)現(xiàn)任何不必要的功能,這將避免你的代碼庫(kù)過(guò)于復(fù)雜化。

保持產(chǎn)品團(tuán)隊(duì)同步步調(diào)一致

一個(gè)產(chǎn)品團(tuán)隊(duì)不僅僅包括編程隊(duì)伍,營(yíng)銷、支持、編程、設(shè)計(jì)……所有團(tuán)隊(duì)需要協(xié)力工作。通過(guò)定期匯報(bào)重寫(xiě)進(jìn)展情況來(lái)確保整個(gè)團(tuán)隊(duì)步調(diào)一致。

在我們的案例中,我們遇到了很多這樣的問(wèn)題。例如,營(yíng)銷團(tuán)隊(duì)準(zhǔn)備產(chǎn)品測(cè)試活動(dòng)時(shí),他們必須準(zhǔn)確了解產(chǎn)品方面的情況,以便讓客戶為即將到來(lái)的產(chǎn)品改變做好準(zhǔn)備。但是,有時(shí)我們?cè)跊](méi)有通知他們的情況下做了一些更改。這害得他們必須從頭開(kāi)始準(zhǔn)備他們的測(cè)試活動(dòng)。記住:不要浪費(fèi)任何人的時(shí)間。

不要對(duì)產(chǎn)品作重大更改。

了解你的產(chǎn)品的弱項(xiàng)和強(qiáng)項(xiàng),這一點(diǎn)很重要。切記不要改變產(chǎn)品的強(qiáng)項(xiàng),也即用戶喜愛(ài)的方面。如果用戶對(duì)用戶界面滿意,不要對(duì)用戶界面作大改動(dòng)。只做最小的更改和小的用戶體驗(yàn)改進(jìn)。當(dāng)您用重寫(xiě)后的版本替換現(xiàn)有版本時(shí),確保你的用戶不會(huì)被新的巨大變化所困擾。有許多情況用戶放棄了新版本,因?yàn)樗麄冋也坏揭郧鞍姹咎峁┑南嗤墓δ堋2灰屚瑯拥氖虑榘l(fā)生在你身上。

不要讓你的產(chǎn)品只依賴于一個(gè)開(kāi)發(fā)者

在我們的案例中,CTO是負(fù)責(zé)開(kāi)發(fā)我們軟件的首席開(kāi)發(fā)人員。由于他的立場(chǎng),我們的產(chǎn)品開(kāi)發(fā)進(jìn)展緩慢。即使是很小的變化也需要幾個(gè)星期,有時(shí)甚至幾個(gè)月。我想表達(dá)的關(guān)鍵點(diǎn)是保持一直更新,永遠(yuǎn)不要停止。

版本遷移/更換要循序漸進(jìn)。

當(dāng)您確認(rèn)新版本已經(jīng)準(zhǔn)備好,開(kāi)始用新版本替換舊版本時(shí)。要一步一步,循序漸進(jìn)。

首先,從一個(gè)小型的內(nèi)部測(cè)試組開(kāi)始,將您的產(chǎn)品發(fā)送到該組。收集他們的反饋和崩潰報(bào)告,修復(fù)錯(cuò)誤,迭代新版本,然后重復(fù)這個(gè)過(guò)程,直到你確認(rèn)你的產(chǎn)品已經(jīng)準(zhǔn)備好公開(kāi)測(cè)試。

進(jìn)入公開(kāi)測(cè)試后,用戶的反饋是你最期待的。你的第一個(gè)目標(biāo)應(yīng)該是確保您的產(chǎn)品能夠解決用戶的問(wèn)題。當(dāng)你確認(rèn)新版本提供的功能與舊版本相同或者更好時(shí),就可以進(jìn)行更換了。這時(shí)候開(kāi)始為新用戶發(fā)布新版本,并將現(xiàn)有用戶遷移到新版本。

以上這些都是我從代碼重寫(xiě)過(guò)程中吸取的關(guān)鍵經(jīng)驗(yàn)教訓(xùn)。代碼重寫(xiě)幾乎永遠(yuǎn)都不應(yīng)該是解決方案,重構(gòu)才是更好的選擇。強(qiáng)烈建議采用代碼重構(gòu)循序漸進(jìn)解決問(wèn)題。這樣做的風(fēng)險(xiǎn)更低,客戶也更滿意。

什么時(shí)候重寫(xiě)代碼是合適的選擇

然而,有時(shí)候重寫(xiě)代碼也是合適的解決方案。下面我我列出了重寫(xiě)代碼的幾種情形:

切換到另一種語(yǔ)言或平臺(tái):

當(dāng)一種語(yǔ)言變得如此古老,導(dǎo)致你很難找到開(kāi)發(fā)人員,或者必須花大價(jià)錢才能找到時(shí)。

現(xiàn)有的代碼庫(kù)變得不可維護(hù)(像我們的情形):

如何確認(rèn)你的代碼變得不可維護(hù)呢?這個(gè)很難,但是如果你發(fā)現(xiàn)即使是很小的更改也很難實(shí)現(xiàn),或者新的更新比正常需要花費(fèi)的時(shí)間多得多,或者任何新的更改都會(huì)影響到軟件的其他部分并導(dǎo)致新的錯(cuò)誤,那么你可以確認(rèn)你的代碼變得不可維護(hù)了。

有足夠的資源可以同時(shí)維護(hù)現(xiàn)有系統(tǒng)和設(shè)計(jì)新系統(tǒng):

重寫(xiě)代碼的時(shí)候,永遠(yuǎn)不要停止維護(hù)當(dāng)前正在使用的系統(tǒng)。只要系統(tǒng)在使用中,必須始終對(duì)其提供維護(hù)。記住,你的個(gè)人注意力也是一種必須考慮的資源,如果你打算同時(shí)為新系統(tǒng)和舊系統(tǒng)做設(shè)計(jì)工作,你要考慮是否每天有足夠的時(shí)間。

開(kāi)發(fā)人員變成了軟件開(kāi)發(fā)的瓶頸(像我們的情形):

這不應(yīng)該出現(xiàn)在重寫(xiě)代碼的原因列表中。因?yàn)槟憧梢噪S時(shí)在團(tuán)隊(duì)中調(diào)配開(kāi)發(fā)人員,也可以雇傭新的開(kāi)發(fā)人員來(lái)解決瓶頸問(wèn)題。

然而,就像我們的情形一樣,有時(shí)你可能需要將它作為代碼重寫(xiě)的一個(gè)原因。因?yàn)槲覀兊能浖褂玫氖桥f技術(shù),而CTO是唯一負(fù)責(zé)開(kāi)發(fā)它的人。我們很難找到一個(gè)新的開(kāi)發(fā)人員,因?yàn)檫@個(gè)平臺(tái)年代太久。即使我們能找到一個(gè)新人,對(duì)我們來(lái)說(shuō)也太昂貴。因此。我還是把它作為代碼重寫(xiě)的情形之一,列在這里。

軟件的年齡太長(zhǎng)(我說(shuō)的是10-20年或更長(zhǎng)時(shí)間):

隨著時(shí)間的推移,一個(gè)軟件的代碼會(huì)變得越來(lái)越凌亂,維護(hù)也會(huì)變得越來(lái)越昂貴。這是因?yàn)闉榱丝焖偻瞥鲂迯?fù)補(bǔ)丁,初始架構(gòu)有時(shí)會(huì)被犧牲掉。而且,懂得舊技術(shù)的開(kāi)發(fā)人員越來(lái)越少,人員成本也越來(lái)越高。同時(shí),很難找到適合舊的應(yīng)用程序運(yùn)行的硬件、操作系統(tǒng)和框架。此外,隨著業(yè)務(wù)的發(fā)展,舊的系統(tǒng)很可能無(wú)法滿足新的業(yè)務(wù)需求。

所以,你必須在舊系統(tǒng)高昂的維護(hù)成本,新系統(tǒng)的潛在好處,以及從頭重寫(xiě)的成本之間作一個(gè)權(quán)衡。

如果你的情形符合上述一點(diǎn)或多點(diǎn),代碼重寫(xiě)可能是你能接受的選項(xiàng)。否則,正確的做法是通過(guò)一系列簡(jiǎn)單的步驟改進(jìn)系統(tǒng)的設(shè)計(jì),在不重寫(xiě)代碼的情況下處理解決現(xiàn)有系統(tǒng)的復(fù)雜性。

從頭重寫(xiě)代碼可能是你犯的最大錯(cuò)誤,但同樣地,不重寫(xiě)代碼也可能導(dǎo)致相同的結(jié)果。我的建議是優(yōu)先考慮重構(gòu)而不是重寫(xiě)。

有些開(kāi)發(fā)人員堅(jiān)信所有系統(tǒng)最終都必須重寫(xiě)。記住這并非總是對(duì)的。設(shè)計(jì)一個(gè)不需要拋棄的系統(tǒng)是可能的。總有軟件設(shè)計(jì)師會(huì)告訴你,“無(wú)論如何,總有一天我們會(huì)丟掉所有的東西”。但是,如果軟件是從一開(kāi)始就設(shè)計(jì)得很好,而且一直有很好的維護(hù),為什么它會(huì)被拋棄呢?

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    5152

    瀏覽量

    89210
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70718
  • 程序員
    +關(guān)注

    關(guān)注

    4

    文章

    954

    瀏覽量

    30408

原文標(biāo)題:十年程序員的告誡:千萬(wàn)不要重寫(xiě)代碼!

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    代碼與傳統(tǒng)開(kāi)發(fā)的區(qū)別 低代碼與無(wú)代碼開(kāi)發(fā)的區(qū)別

    的工具和圖形界面來(lái)縮短開(kāi)發(fā)時(shí)間和降低技術(shù)門檻。以下是對(duì)低代碼開(kāi)發(fā)與傳統(tǒng)開(kāi)發(fā)的詳細(xì)對(duì)比: 適用人群 傳統(tǒng)開(kāi)發(fā) :主要適用于有經(jīng)驗(yàn)、有基礎(chǔ)的程序員,他們可以利用各種編碼語(yǔ)言進(jìn)行應(yīng)用程序的創(chuàng)建。傳統(tǒng)開(kāi)發(fā)需要深厚的編程功底
    的頭像 發(fā)表于 01-31 10:48 ?616次閱讀

    阿里云升級(jí)通義靈碼AI程序員,全面上線

    和JetBrains IDEs兩大主流開(kāi)發(fā)環(huán)境,這意味著開(kāi)發(fā)者可以在自己熟悉的開(kāi)發(fā)平臺(tái)上,無(wú)縫接入并使用這款A(yù)I工具。 除了支持主流開(kāi)發(fā)環(huán)境外,通義靈碼AI程序員還引入了多項(xiàng)新特性,如多文件代碼修改和上下文感知等。這些特性使得AI能夠更好地理解開(kāi)發(fā)者的意圖和需
    的頭像 發(fā)表于 01-09 11:16 ?712次閱讀

    TMS320C6000程序員指南

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000程序員指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-24 17:19 ?0次下載
    TMS320C6000<b class='flag-5'>程序員</b>指南

    TMS320C55x DSP CPU程序員參考補(bǔ)充

    電子發(fā)燒友網(wǎng)站提供《TMS320C55x DSP CPU程序員參考補(bǔ)充.pdf》資料免費(fèi)下載
    發(fā)表于 12-21 11:36 ?3次下載
    TMS320C55x DSP CPU<b class='flag-5'>程序員</b>參考補(bǔ)充

    睿創(chuàng)微納五&amp;十年功勛員工頒獎(jiǎng)大會(huì)圓滿舉行

    12月11日,睿創(chuàng)微納五&十年功勛員工頒獎(jiǎng)大會(huì)在煙臺(tái)園區(qū)圓滿舉行,公司董事長(zhǎng)帶領(lǐng)核心管理團(tuán)隊(duì)為5、10功勛員工頒發(fā)紀(jì)念銀幣和金幣。?? 百余名員工獲頒紀(jì)念銀幣,以表彰他們五
    的頭像 發(fā)表于 12-12 10:35 ?783次閱讀

    UCD3138A64/UCD3138128程序員手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《UCD3138A64/UCD3138128程序員手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 12-09 14:42 ?0次下載
    UCD3138A64/UCD3138128<b class='flag-5'>程序員</b>手冊(cè)

    機(jī)械革命發(fā)布CODE AI程序員

    近日,英特爾新質(zhì)生產(chǎn)力技術(shù)生態(tài)大會(huì)在成都舉行,機(jī)械革命作為重要參展商帶來(lái)了多款明星產(chǎn)品引爆全場(chǎng)!其中更是在AI PC軟件生態(tài)產(chǎn)品發(fā)布分論壇上,Intel、智譜、機(jī)械革命三方聯(lián)合發(fā)布了專為程序員設(shè)計(jì)的CODE AI程序員本,成為本次大會(huì)的一大亮點(diǎn)。
    的頭像 發(fā)表于 11-30 10:34 ?1102次閱讀

    Java代碼之美,從遵循樣式規(guī)范開(kāi)始

    作者:京東零售 劉仲偉 在軟件開(kāi)發(fā)的世界里,代碼不僅是程序的基石,更是程序員交流的通用語(yǔ)言。而Java,作為一門廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用的編程語(yǔ)言,其代碼的可讀性和一致性對(duì)于項(xiàng)目的長(zhǎng)期維護(hù)
    的頭像 發(fā)表于 11-27 11:42 ?575次閱讀
    Java<b class='flag-5'>代碼</b>之美,從遵循樣式規(guī)范開(kāi)始

    Linux驅(qū)動(dòng)程序程序員指南

    電子發(fā)燒友網(wǎng)站提供《Linux驅(qū)動(dòng)程序程序員指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-22 15:53 ?0次下載
    Linux驅(qū)動(dòng)<b class='flag-5'>程序</b><b class='flag-5'>程序員</b>指南

    AI編程工具會(huì)不會(huì)搶程序員飯碗

    AI編程工具可輔助編程,減少手動(dòng)編碼,提升效率,對(duì)程序員有積極影響也有挑戰(zhàn)。程序員需深化技能、拓寬知識(shí)應(yīng)對(duì)。長(zhǎng)遠(yuǎn)看,AI與人類程序員將共生共榮。
    的頭像 發(fā)表于 11-08 10:17 ?528次閱讀

    第五屆長(zhǎng)沙·中國(guó)1024程序員節(jié)開(kāi)幕

    據(jù)官方媒體報(bào)道,10月24日;? 第五屆長(zhǎng)沙·中國(guó)1024程序員節(jié)在湖南湘江新區(qū)開(kāi)幕;本次中國(guó)1024程序員節(jié)以“智能應(yīng)用新生態(tài)”為主題。設(shè)置有岳麓對(duì)話、技術(shù)英雄會(huì)、主題峰會(huì)及賽事、展覽等活動(dòng),一場(chǎng)
    的頭像 發(fā)表于 10-25 15:42 ?494次閱讀

    沃達(dá)豐與谷歌深化十年戰(zhàn)略合作

    沃達(dá)豐近日宣布,其與全球科技巨頭谷歌的戰(zhàn)略合作伙伴關(guān)系得到了進(jìn)一步深化。這一為期十年的協(xié)議,總價(jià)值超過(guò)10億美元,旨在將谷歌最新推出的生成式人工智能支持的設(shè)備引入歐洲和非洲市場(chǎng),為沃達(dá)豐的廣大客戶提供更為先進(jìn)和智能的服務(wù)體驗(yàn)。
    的頭像 發(fā)表于 10-09 16:22 ?529次閱讀

    十年預(yù)言:Chiplet的使命

    未來(lái)十年內(nèi)芯片算力提升的核心動(dòng)力。 議題一: 算力困局如何突圍? 韓銀和研究: 現(xiàn)有的高性能計(jì)算架構(gòu)正遭遇算力瓶頸。目前全球頂級(jí)的高性能計(jì)算系統(tǒng),由美國(guó)橡樹(shù)嶺國(guó)家實(shí)驗(yàn)室基于HPE Cray EX235a架構(gòu)研發(fā)的超級(jí)計(jì)算機(jī)Frontier,其算
    的頭像 發(fā)表于 08-27 11:09 ?802次閱讀
    <b class='flag-5'>十年</b>預(yù)言:Chiplet的使命

    BOE京東方與聯(lián)合國(guó)教科文組織UNESCO簽訂合作協(xié)議 成為首個(gè)支持聯(lián)合國(guó)“科學(xué)十年”的中國(guó)科技企業(yè)

    法國(guó)時(shí)間7月25日,BOE(京東方)與聯(lián)合國(guó)教科文組織(UNESCO)在法國(guó)巴黎總部基于《2024—2033科學(xué)促進(jìn)可持續(xù)發(fā)展國(guó)際十年》決議(簡(jiǎn)稱“科學(xué)十年”)簽訂為期三的合作伙伴
    的頭像 發(fā)表于 07-26 13:04 ?602次閱讀
    BOE京東方與聯(lián)合國(guó)教科文組織UNESCO簽訂合作協(xié)議 成為首個(gè)支持聯(lián)合國(guó)“科學(xué)<b class='flag-5'>十年</b>”的中國(guó)科技企業(yè)

    京東上萬(wàn)程序員都AI用它!

    對(duì)大模型生成代碼進(jìn)行智能修復(fù),為程序員開(kāi)啟代碼漏洞修復(fù)的“自動(dòng)駕駛”模式,不但減少人工接入、提高工作效率,更為企業(yè)抵御內(nèi)外部各種攻擊構(gòu)建起一道堅(jiān)固的安全屏障,確保業(yè)務(wù)的連續(xù)性和穩(wěn)定性。 JoyCoder是京東云自主研發(fā)的一款輔助
    的頭像 發(fā)表于 07-17 16:29 ?491次閱讀
    京東上萬(wàn)<b class='flag-5'>程序員</b>都AI用它!