最近我遇到了(le)一位以前公司的(de)同事。他(tā)提到了(le)數年前我在那個(gè)公司曾經開發過的(de)項目。他(tā)說這(zhè)個(gè)項目現在已經變成了(le)“職業殺手”。基本上,任何接觸過這(zhè)個(gè) “職業殺手”項目的(de)人(rén)最終都會離開這(zhè)個(gè)公司。如果公司想讓名下(xià)的(de)程序員(yuán)人(rén)數>0,唯一的(de)辦法就是花數月(yuè)時(shí)間完全重構這(zhè)個(gè)系統。
對(duì)于這(zhè)事我有兩點要說。首先,在我離開這(zhè)個(gè)公司前,這(zhè)個(gè)系統的(de)單元測試覆蓋率已經達到了(le)85%,所以,不要責備我。第二,這(zhè)麽大(dà)規模的(de)重構?肯定會出問題。
每 一個(gè)系統裏都至少有一個(gè)成爲人(rén)民公敵、讓所有人(rén)害怕的(de)組件。它承載了(le)太多(duō)的(de)任務,它擁有太多(duō)狀态,太多(duō)的(de)其它組件調用(yòng)它。當時(shí)間到了(le)償還(hái)技術債務的(de)時(shí)候, 人(rén)人(rén)都會把目光(guāng)投向這(zhè)個(gè)組件。然而,如果你對(duì)這(zhè)個(gè)組件隻有一個(gè)不全面的(de)理(lǐ)解,你放下(xià)所有工作來(lái)完全重構它,那你成功的(de)幾率會很小。這(zhè)個(gè)組件,就就它表現出 來(lái)的(de)令人(rén)恐怖的(de)程度和(hé)複雜(zá)相比,它的(de)實際情況會比你想象更複雜(zá),更恐怖。
你認爲這(zhè)個(gè)組件是如何發展成這(zhè)樣一個(gè)不幸的(de)狀态的(de)?是因爲公司雇用(yòng) 了(le)一個(gè)笨蛋,讓他(tā)肆無忌憚的(de)往系統裏增加複雜(zá)度?或是因爲這(zhè)個(gè)組件最初設計的(de)太抽象,由于多(duō)年來(lái)需求的(de)變更,它的(de)責任範圍不斷的(de)擴大(dà)?(出于個(gè)人(rén)的(de)自尊, 我甯願相信這(zhè)個(gè)“職業殺手”屬于後者)。十有八九,這(zhè)個(gè)組件變成如今這(zhè)個(gè)恐怖的(de)狀态,都有由“聰明(míng)人(rén)”的(de)一些“好意”造成的(de)。如果你決定做(zuò)一次大(dà)的(de)重構, 你實際是欠下(xià)了(le)另一筆技術債務留給後人(rén)。
爲了(le)能真正的(de)徹底償還(hái)這(zhè)筆債務,你需要去分(fēn)解這(zhè)個(gè)系統的(de)複雜(zá)度。你需要花時(shí)間尋找所有調用(yòng)這(zhè)個(gè)組件 的(de)客戶端。你需要花時(shí)間跟你的(de)同事交流,了(le)解這(zhè)個(gè)這(zhè)個(gè)組件的(de)曆史和(hé)它是如何被使用(yòng)的(de)。你需要簡化(huà)這(zhè)個(gè)組件的(de)周邊環境,看看它是如何運作的(de)。每周,你都需要 花更多(duō)的(de)時(shí)間來(lái)更清楚的(de)了(le)解這(zhè)個(gè)組件的(de)業務。隻要有足夠長(cháng)的(de)時(shí)間跨度,你最終能理(lǐ)清所有複雜(zá)的(de)問題。
從實際方法上說,這(zhè)個(gè)問題應該怎麽辦?與其現在花3個(gè)整月(yuè)的(de)時(shí)間做(zuò)一次完全的(de)重構,不如先用(yòng)一個(gè)季度的(de)時(shí)間做(zuò)清理(lǐ)工作。最後還(hái)是要重寫,但有了(le)3個(gè)月(yuè)的(de)計劃準備,你有了(le)時(shí)間去分(fēn)析和(hé)設計。你有了(le)時(shí)間來(lái)理(lǐ)清業務。