高效編程的11條規(guī)則
這絕不是詳盡無(wú)遺的清單,而是我在IT工作了數(shù)年之后的主觀排名。 希望您發(fā)現(xiàn)其中一些有用的。
1. 童子軍規(guī)則
"一定要讓營(yíng)地的清潔劑比您發(fā)現(xiàn)的要干凈"-這是一個(gè)很好的生活準(zhǔn)則。 當(dāng)您靠近營(yíng)地時(shí),即使不是由您自己造成的,也應(yīng)使其清潔。 這是偵察兵的規(guī)則之一。 編程同樣適用。 正如羅伯特·C·馬丁(Robert C. Martin)所說(shuō):"讓代碼比發(fā)現(xiàn)的要好"。 如果我們發(fā)現(xiàn)別人寫的一些難以閱讀的應(yīng)用程序,并且花了一些時(shí)間來(lái)理解,那就讓它至少好一點(diǎn)。 如果它不在我們正在處理的任務(wù)范圍之內(nèi),則可以始終創(chuàng)建一個(gè)新的小型技術(shù)任務(wù),對(duì)其進(jìn)行詳細(xì)描述并將其帶入下一個(gè)沖刺。
此規(guī)則的簡(jiǎn)約版本更像是在公共廁所中唱歌。 我們至少應(yīng)該至少不惡化它所處的條件。我們必須記住,有些人有一天會(huì)接管我們開發(fā)的那部分應(yīng)用程序,并嘗試對(duì)其進(jìn)行修改。 讓我們不要讓生活更艱難。
2. 考慮問(wèn)題,而不僅僅是解決方案
軟件開發(fā)人員確實(shí)非常擅長(zhǎng)實(shí)施解決方案。 我們了解語(yǔ)言,模式,庫(kù),框架,并了解如何使用它們。 問(wèn)題在于,從業(yè)務(wù)的角度來(lái)看,我們經(jīng)常做的事情沒有任何意義。 您正在開發(fā)的某些功能可能與企業(yè)所有者不知道的現(xiàn)有功能重復(fù)。 有些可能沒有經(jīng)過(guò)深思熟慮,將永遠(yuǎn)無(wú)法發(fā)布到下一個(gè)版本,或者根本沒有用戶會(huì)使用它們。 那是浪費(fèi)時(shí)間,金錢和挫敗感的巨大浪費(fèi)。 很多人都不想問(wèn)開發(fā)人員他們的意見,只是假設(shè)他們的工作就是交付功能。 沒有商量。 僅技術(shù)工作。
開發(fā)人員每天都在使用該應(yīng)用程序。 他們知道每個(gè)功能,即使沒有人使用它。 有時(shí),從業(yè)務(wù)角度看似乎容易完成的任務(wù)需要花費(fèi)數(shù)月的開發(fā)時(shí)間。 有些似乎幾乎不可能的工作要花幾天時(shí)間。 原因是將要實(shí)施一項(xiàng)功能的人員與提出該功能的人員之間缺乏溝通。 兩者之間存在巨大差異:
- 為用戶的購(gòu)物車創(chuàng)建永久存儲(chǔ)
- 用戶應(yīng)該能夠保存他們的購(gòu)物車,并在移動(dòng)和Web應(yīng)用程序上使用它
第一個(gè)很簡(jiǎn)單。 無(wú)話可問(wèn)。 第二個(gè)要難一些,因?yàn)樗鼓伎纪评?,而您將成為提出給定問(wèn)題的解決方案的人。 關(guān)于細(xì)節(jié),功能要求,質(zhì)量屬性和其他方面,會(huì)有很多問(wèn)題。 由于您現(xiàn)在不僅是執(zhí)行者,因此解決方案將更好地解決。
3. 考慮總擁有成本
有時(shí)會(huì)偷工減料,以后跳過(guò)測(cè)試,留下臨時(shí)解決方案并承諾稍后進(jìn)行糾正,這是非常誘人的。 在大多數(shù)情況下,如果它不會(huì)破裂,您將永遠(yuǎn)不會(huì)。 將有一個(gè)新任務(wù),優(yōu)先級(jí),要實(shí)現(xiàn)的功能和要解決的問(wèn)題。 您將遇到的問(wèn)題是這樣的應(yīng)用程序可能會(huì)損壞。 而且,將很難修復(fù)。
功能的總擁有成本是從開發(fā)開始到部署,維護(hù)再到終止所花費(fèi)的金錢和精力的總和。 如果我們?cè)陂_發(fā)過(guò)程中采用捷徑,那將是最便宜的部分。 您可能發(fā)布的速度更快,但是維護(hù)會(huì)很麻煩,用戶會(huì)感到不滿意,并且總的來(lái)說(shuō),所有東西都比它應(yīng)該的貴。
4. 使用SOLID
在編程中,有很多很棒的規(guī)則以首字母縮略詞形式出現(xiàn):DRY,KISS,YAGNI,SOLID等。 SOLID是一組規(guī)則,可以幫助使代碼更整潔并避免常見的陷阱。
在將代碼推送到存儲(chǔ)庫(kù)之前,這可能是一個(gè)很棒的清單。 該課程是否支持"單一責(zé)任原則"? 可以用同一層次結(jié)構(gòu)中的任何其他類替代該類(是否滿足LSP)? 這將有助于過(guò)濾掉許多未來(lái)問(wèn)題的來(lái)源。 理解并有意識(shí)地運(yùn)用每條規(guī)則背后的原因,將使您成為一名更好的程序員,并提高代碼審查的質(zhì)量。
5. 使用設(shè)計(jì)模式
在大多數(shù)情況下,您不是第一個(gè)嘗試解決您面臨的問(wèn)題或?qū)崿F(xiàn)具有類似要求的功能的人。 已經(jīng)有成千上萬(wàn)的CRM,CMS,銀行系統(tǒng),聊天室,在線商店,市場(chǎng)以及人們能想到的基本上任何可能的應(yīng)用程序類型。 您正在開發(fā)的系統(tǒng)可能是市場(chǎng)上最好的,或者具有其他人所沒有的某些極其先進(jìn)和獨(dú)特的功能。 不過(guò),大多數(shù)工作在某種程度上都是參考性的。 其他人可能會(huì)嘗試以多種不同的方式來(lái)做到這一點(diǎn),甚至描述整個(gè)過(guò)程。 它可以為您省去很多麻煩,并為您提供更好的解決方案。
四人幫有一本很棒的書,介紹了一些可用于解決常見問(wèn)題的可重復(fù)模式。 它寫于1994年,但那些仍然有效和有用。 在軟件中,那是古老的時(shí)代,但是現(xiàn)在我們?cè)诰帉懘a時(shí)面臨的問(wèn)題并沒有太大不同。 從那以后,出現(xiàn)了許多新的設(shè)計(jì)模式。 了解他們可以使您的工作輕松得多。
所有設(shè)計(jì)都是重新設(shè)計(jì)。 向他人學(xué)習(xí)
6. 最小化復(fù)雜度
從本質(zhì)上講,軟件開發(fā)是一項(xiàng)復(fù)雜的任務(wù)。 不要使其變得不必要的復(fù)雜。 有時(shí)通過(guò)在函數(shù)中引入一些額外的" if"或"循環(huán)"來(lái)實(shí)現(xiàn)一些業(yè)務(wù)規(guī)則非常誘人。 開發(fā)將更快,但是代碼將變得更暗,添加新功能只會(huì)使其變得更加復(fù)雜。 如果出現(xiàn)問(wèn)題,將更難找出原因。
有一個(gè)偉大而又非常簡(jiǎn)單的度量標(biāo)準(zhǔn),其秘密名稱為" Cyclomatic Complexity"。 它是在70年代推出的,但仍然非常有用。 此度量標(biāo)準(zhǔn)衡量代碼執(zhí)行的多種方式。 每個(gè)條件語(yǔ)句和循環(huán)都將得分加+1。 分?jǐn)?shù)越小越好。 當(dāng)我們分析一種方法時(shí),分?jǐn)?shù)在范圍內(nèi):
- 0-10:代碼結(jié)構(gòu)合理,不應(yīng)引起意外問(wèn)題
- 10–20:代碼非常復(fù)雜,并且有很多潛在的執(zhí)行路徑可供測(cè)試。 重構(gòu)候選人
- 20–50:代碼非常復(fù)雜,應(yīng)進(jìn)行重構(gòu)
- 50歲以上:必須進(jìn)行重構(gòu)
可讀性比性能更重要。 該聲明有一些限制,但從長(zhǎng)遠(yuǎn)來(lái)看,可讀性基本上是有回報(bào)的。 您可以使用更少的錯(cuò)誤來(lái)更改代碼。 微觀優(yōu)化可能很容易使您的代碼變得一團(tuán)糟,并且不會(huì)給用戶帶來(lái)太多價(jià)值。
7. 不要一個(gè)人做
聽起來(lái)可能違反直覺,但是編程是一種社交活動(dòng)。 隱藏在地下室黑暗中的程序員時(shí)代已經(jīng)結(jié)束。 分享專業(yè)知識(shí)和經(jīng)驗(yàn)變得越來(lái)越重要。 在最壞的情況下,您要與之交談的人將成為您的橡皮鴨,但很可能您會(huì)收到一些有價(jià)值的反饋。 有人可能會(huì)發(fā)現(xiàn)您根本沒有考慮的解決方案中的問(wèn)題。 從不同的角度看待是一個(gè)很好的工具,并且非常容易獲得。
任何人都不應(yīng)對(duì)已部署的代碼負(fù)責(zé)。 提供新功能是團(tuán)隊(duì)而非個(gè)人的工作。 代碼審查,配對(duì)編程,拉取請(qǐng)求是一種工具,可以承擔(dān)一個(gè)人的責(zé)任,并將其移交給具有最佳跨職能技能的一群人。 對(duì)于可能影響整個(gè)公司業(yè)績(jī)的重要功能,開發(fā)人員的責(zé)任實(shí)在太大了。 這種情況非常不健康,絕不應(yīng)該發(fā)生。
8. 測(cè)試是必須的
盡早發(fā)現(xiàn)錯(cuò)誤非常重要,可以節(jié)省大量的工作量和客戶的憤怒電話。 盡早發(fā)現(xiàn)問(wèn)題使他們更容易解決。 在開發(fā)特定應(yīng)用程序時(shí),我們能夠最好地記住所有細(xì)節(jié)和邏輯。 我們記得做出特定決定的所有理由以及如何調(diào)試每個(gè)應(yīng)用程序。 修復(fù)錯(cuò)誤的成本會(huì)隨著時(shí)間呈指數(shù)增長(zhǎng)。

9. 學(xué)習(xí)英語(yǔ)
共享知識(shí)一直是軟件社區(qū)的基礎(chǔ)之一。 大多數(shù)信息是用英語(yǔ)編寫的,并且易于訪問(wèn)。 目前,它是軟件世界中最流行的語(yǔ)言。 如果您不會(huì)用英語(yǔ)讀寫,您將會(huì)遇到很多困難,并失去很多機(jī)會(huì)。 而且,幾乎每種語(yǔ)言的語(yǔ)法默認(rèn)情況下都是用英語(yǔ)書寫的。
用英語(yǔ)寫注釋和名稱也是一個(gè)好習(xí)慣。 它使代碼更整潔,并且與語(yǔ)法更加一致。 如果我們要與他人(尤其是來(lái)自不同國(guó)家/地區(qū)的人)共享代碼,那么基本上沒有比英語(yǔ)更好的方法了。
10. 多任務(wù)使你變得愚蠢
人們根本無(wú)法一次做好多件事情。 軟件開發(fā)需要使用抽象概念,并且通常需要構(gòu)建非常復(fù)雜的思維模型。 如果您分心或開始從事其他工作,那么您將失去一切,必須從頭開始。 此外,有多項(xiàng)研究證明多任務(wù)處理對(duì)性能,生產(chǎn)率和智商有負(fù)面影響。

我曾經(jīng)在軟件公司參加過(guò)一次培訓(xùn),介紹了一種非常有用的實(shí)踐。 如果您沒有任何預(yù)定的會(huì)議或電話,則可以自由播放"西紅柿"。 規(guī)則非常簡(jiǎn)單-您無(wú)需與任何人交談。 如果有人問(wèn)您任何問(wèn)題,您將用一個(gè)單詞回答:"西紅柿"。 因此,您表明自己正在工作之中,不想被打擾。 人們處于"西紅柿模式"時(shí),他們還會(huì)在日歷中顯示選定的時(shí)間。 完全"蕃茄"化并不總是一件好事,但這是一種改善性能的有趣方式。
11. 少做多好
更少的代碼和更好的維護(hù)基礎(chǔ)架構(gòu)。 有很多人喜歡在他們的應(yīng)用程序,模塊,服務(wù)器,節(jié)點(diǎn),pod,微服務(wù)或任何其他東西中吹噓大量的代碼行。 應(yīng)用程序中的每一行代碼都有可能具有最高的質(zhì)量,并且恰好位于正確的位置。 但這是非常罕見的情況。 如果您可以使用較少的資源來(lái)完成相同的工作,則應(yīng)該這樣做。 質(zhì)量是目標(biāo),而不是數(shù)量。