2010-01-10 23 views
5

最近,我繼續在工作中「增強」業務關鍵項目。該代碼在過去五年中一直在努力並經過許多人的努力。顧問和不再在公司工作的全職員工已經對這種非常敏感且過於敏感的應用程序進行了修補。我們中的大多數不得不處理遺留代碼或這種類型的項目......其成爲部分開發商的......但給予開發人員任何關於增強和重構業務關鍵應用程序任務的建議?

有零單位和零次系統測試。邏輯在存儲過程,視圖(是的,我說過視圖)和代碼之間是相互混合的(有時候是無緣由的)。文檔?是的,沒錯。 我很害怕。是的,即使是最小的「調整」或重構也是非常神聖的。一個小小的不幸事件,將會對我的僱主造成重大的收入損失和潛在的法律問題。

那麼,有什麼建議嗎?我首先想到的是從現有的代碼開始編寫斷言/單元測試。但是,這隻能到目前爲止,因爲存儲過程中嵌入了大量邏輯。 (我知道它有可能測試存儲過程,但是與單元測試源代碼邏輯相比,歷史上它更困難)。 另一種或額外的方法是比較應用程序執行功能之前和之後的數據庫狀態,更改一些代碼,然後執行數據庫狀態比較。

+0

你應該做的第一件事,就是談判加薪!認真:在開始改變任何事情之前編寫測試。 – 2010-01-10 02:57:01

+2

找到另一份工作;)認真地說,從經驗來看,如果(特別是如果)老闆不知道編碼需要什麼,這通常是一種災難。 「不要拍攝維護者」應該是口頭禪,但是從現在開始顯然任何不好的事情都將是你的錯。明確表示你對任何可能出現的法律暗示都不承擔責任,並且在清楚瞭解代碼庫(也是通過測試) – 2010-01-10 03:21:07

+0

之前,技術上什麼都不做,代碼的大小是什麼?除了你以外,還有多少人會參與其中? – 2010-01-10 03:26:22

回答

3

我剛剛重寫了數千行企業文件系統中最複雜的子系統,使其成爲多線程,因此所有這些都來自經驗。如果重寫是合理的(它如果重寫正在做顯著提升能力,或者如果現有的代碼是在投入更多的改進的方式來),然後這裏有指針:

  1. 您需要首先要對自己的能力有信心做到這一點。只有在您有足夠的相關技術經驗時纔會這樣。

  2. 溝通,溝通,溝通。讓所有涉及到的利益相關者都知道,這是一團糟,這是有風險的,這不可能匆匆完成,這需要一次一個地完成零食 - 攻擊一個區域。

  3. 理解系統裏面。記錄每一個細微差別,詭計和黑客。記錄整體設計。詢問任何老前輩關於存在任何你無法證明的代碼的歷史原因。這些是你不想踩的地雷 - 你可能會認爲那些代碼是無用的,然後在擺脫它們之後會後悔。

  4. 單元測試。通過任何已存在的測試套件來處理系統,否則首先編寫現有代碼的測試(如果它們不存在)。在重寫 - 斷言,日誌記錄,控制檯打印(您應該有能力打開和關閉它們以及指定不同級別的輸出,即控制詳細程度)時,可以隨時調試代碼。這是我的經驗必須的,在重寫過程中有很大的幫助。

  5. 通過代碼時,列出所有需要做的事情 - 需要找出的事情,需要編寫測試的東西,需要提問的事情,提醒您的提示如何重構一段代碼,任何會影響你重寫的東西......你不能忘記任何東西!我使用Outlook任務執行此操作(只要確保您使用的任何內容始終位於您的面前 - 這是我一坐下桌面即可打開的第一個應用程序)。如果我被打斷,我會寫下我一直在想的任何事情,並在回到任務後提示要繼續到哪裏繼續。

  6. 儘量避免黑客在你的重寫(這是你重寫它的原因之一)。想想你遇到的棘手問題。與其他人討論他們並反彈你的想法反對他們(沒有什麼比這更好),並且提出了一些乾淨的解決方案。看看你輸入待辦事項列表中的所有任務 - 對現有設計做一張10,000英尺的圖片,然後決定新的重寫的樣子(模塊,子模塊,它們如何組合在一起等)。

  7. 解決任何其他問題之前的最棘手的問題。這樣可以避免在隧道盡頭附近遇到難以解決的問題,並且避免您後退任何步驟。當然,你需要知道最棘手的問題是什麼 - 再一次地,在進入現有代碼的過程中,最好先記錄一切。

+0

感謝您花時間回覆。感謝您的建議。 – 2010-01-12 13:45:36

2
  1. 得到一個非常明確的要求。

  2. 請確保您有隱含的要求,以及明確的 - 即它具有哪些程序一起工作,以及如何。

  3. 寫如何,目前正在使用的所有場景和使用情況。

  4. 寫了很多單元測試。

  5. 寫了很多的集成測試,以測試它與工作現有程序的程序的集成。

  6. 談話大家誰使用的程序,以瞭解更多隱含的要求。

  7. 測試,測試,移動到生產前測試的變化。

  8. CYA :)

+1

感謝您花時間回覆。感謝您的建議。 – 2010-01-12 13:47:41

1

問問你自己:什麼是你想達到什麼目的?你的任務是什麼?你有多少時間?成功的衡量標準是什麼?那裏有什麼風險?你如何緩解和處理它們?

除非你知道你想要達到什麼,否則不要觸摸任何東西。

該代碼可能是「壞」,但這是什麼意思?代碼工作正確嗎?因此,如果您重寫代碼的方式如此,那麼您將花費大量時間重寫一些引入錯誤的代碼,以便代碼執行相同的操作?爲了什麼目的?

你可以做的最簡單的事情是記錄系統的功能。我並不是說寫任何人都不會讀的令人頭腦麻木的Word文檔。我的意思是在關鍵功能上編寫測試,必要時重構代碼以允許編寫這些測試。

+0

+1提供了一些很好的建議 - 例如你想達到什麼目的? – 2010-01-10 03:04:50

1

你說你害怕觸摸代碼,因爲法律,收入損失,並且沒有文檔。那麼你是否理解這些代碼?你應該做的第一件事是記錄它,並且在你考慮重構之前確保你理解它。一旦你完成了這些工作,並確定了問題領域,請按照最小變化以最大收益順序列出重構建議清單,並逐步進行攻擊。在以下情況下,重構具有更多的意義:代碼的預期使用壽命將很長,新功能將被添加,錯誤修復的數量也很多。至於測試數據庫狀態 - 我最近在一個項目中工作,那正是我們成功所做的。

+0

有項目期限限制要考慮。 – 2010-02-01 00:56:25

2

兩件事情,超越@ Sudhanshu的大名單(和,在一定程度上,與他的#不同意8):

首先,要知道,未經測試的代碼是bug的代碼 - 你開始什麼幾乎肯定不能正確工作,除了「像未修改的代碼一樣工作」之外的任何「正確」定義。也就是說,準備在系統中發現意想不到的行爲,向系統中的專家詢問這種行爲,並讓他們得出結論,它不是按照它應該的方式工作。準備他們它 - 警告他們沒有測試或其他文件,沒有理由認爲它的工作方式,他們認爲它的工作方式。

下一個:Refactor The Low-Hanging Fruit放鬆一下,慢慢來,非常小心。注意代碼中的一些簡單的重複 - 比如說 - 用任何包含重複的方法測試地獄,然後消除它。泡沫,沖洗,重複。在進行更改之前,不要爲所有內容編寫測試,而是要爲所做的任何更改編寫測試。這樣,它在每個階段都能保持可釋放,並且您不斷增加價值,不斷改進代碼庫。

我說「兩件事」,但我想我會添加第三個:管理期望值。讓你的客戶知道你是如何害怕這項任務的;讓他們知道他們得到的是多麼糟糕。讓他們知道進展緩慢,讓他們知道你會告訴他們進展情況(當然,這樣做)。您的客戶可能會認爲他/她只是要求「稍微修復一下」 - 功能的確可能確實會發生一些變化 - 但這並不意味着它不會花太多時間和工作。你明白這一點;你的客戶也需要。

1

是否有可能將數據庫和非數據庫部分分離,以便數據庫管理員能夠應對存儲過程和數據庫本身的挑戰,從而使您能夠在系統的其他部分工作?這也假定有一位DBA可以加強並接受應用程序的這一部分。

如果這是不可能的,那麼我會建議看看代碼庫有多大,以及是否有可能獲得一些幫助,因此它不是全部在你身上。雖然這可以被看作是側面責任,但重要的是,事情不應該只在一個人的手中,通常他們可以隨時消失。

祝你好運!

+0

對不起,我現在戴多個帽子。沒有官方DBA。 – 2010-02-26 15:26:14

相關問題