當(dāng)我完善幾年前的一個(gè)老項(xiàng)目時(shí),我做了哪些改進(jìn)
最近幾個(gè)月利用業(yè)余時(shí)間完成了一個(gè)項(xiàng)目。這個(gè)項(xiàng)目其實(shí)是2008年我在前公司做的一個(gè)web項(xiàng)目。后來客戶想要對(duì)項(xiàng)目做升級(jí),牽扯到一些功能的變動(dòng)及界面的修改。由于當(dāng)時(shí)整個(gè)項(xiàng)目的架構(gòu)和主要編碼都是我做的,所以前公司老總喊我來接這個(gè)項(xiàng)目,使用業(yè)余時(shí)間完成。我考慮了一下答應(yīng)了。為了掙點(diǎn)錢養(yǎng)家就拼點(diǎn)唄。
幾個(gè)月前在接這個(gè)活前,我曾寫過一篇文章如果讓我完善幾年前的一個(gè)項(xiàng)目,我會(huì)做哪些改進(jìn)?。主要從工程實(shí)踐的角度講述了我將進(jìn)行那些改進(jìn)。
經(jīng)過幾個(gè)月的辛苦開發(fā),終于完成了這次的功能升級(jí),拿到了報(bào)酬。針對(duì)這種遺留系統(tǒng),我來談?wù)勎揖唧w都進(jìn)行了那些改動(dòng)。
1. 不用動(dòng)的地方盡量不動(dòng)。由于代碼是08年我作為實(shí)習(xí)生寫的,那代碼自然慘不忍睹,有些地方寫的非常累贅。經(jīng)過幾年打磨的我對(duì)代碼質(zhì)量要求已經(jīng)上升了很多個(gè)層次,看到這些爛代碼不禁忍不住要重構(gòu)。但是我忍住了,因?yàn)檫@是個(gè)遺留系統(tǒng),當(dāng)時(shí)就沒有寫單元測(cè)試,所以重構(gòu)過程肯定風(fēng)險(xiǎn)較大。另外工期只能用業(yè)余時(shí)間,要以新需求為主,只改開發(fā)新需求時(shí)需要碰的那些代碼。
2. 使用github作為代碼托管服務(wù)。即使是一個(gè)人開發(fā),也需要使用源代碼管理工具,這樣做起來自己心里才有底。而github自己用了好幾年了,非常好用,而且自己買了github的會(huì)員。所以這次把代碼以私有倉(cāng)庫(kù)的方式放在上面。隨時(shí)寫,隨時(shí)提交,比自己搭建源代碼服務(wù)器方便的多。
3. 引入bootstrap框架作為前端框架。這次升級(jí)一個(gè)重要任務(wù)是對(duì)前端進(jìn)行優(yōu)化,使其能兼容多個(gè)瀏覽器。08年的時(shí)候大家都在用IE6,IE7,IE8都很少有人用。過了這么多年網(wǎng)站早都不能兼容現(xiàn)代瀏覽器了,而且屏幕分辨率適配也很差勁。作為一個(gè)前端菜鳥,我只花了一點(diǎn)時(shí)間學(xué)習(xí)了bootstrap,就快速把它引入到了我的項(xiàng)目中。我基本上把以前的css、js代碼都刪除了,使用bootstrap輕輕松松的就把這個(gè)老站改成了一個(gè)兼容多個(gè)瀏覽器,多種屏幕尺寸的網(wǎng)站。
4. 升級(jí).net中使用的各種組件。這個(gè)網(wǎng)站使用的是WebForm框架,版本為2.0。我發(fā)現(xiàn)在現(xiàn)代瀏覽器下WebForm組件生成的前端HTML,CSS及JavaScript存在大量不兼容的問題。網(wǎng)站頁(yè)面變得很不穩(wěn)定。當(dāng)升級(jí)到4.0平臺(tái)后,問題得到大大改善。另外我還使用了AjaxControllToolKit組件,發(fā)現(xiàn)在某些瀏覽器下(比如360瀏覽器)頁(yè)面局部刷新不了。所以我也一并升級(jí)到了最新的15.3版本。雖然把各種組件都升級(jí)了,還存在一些JavaScript問題,比如日歷選擇框無法正常顯示與選擇。我采用的方法就是拋棄掉舊的JS代碼,尋求成熟的JS框架來替代。比如使用bootstrap-datepicker組件來實(shí)現(xiàn)日歷框的選取。
5. 采用最新的Visual studio編輯器。微軟終于想通了,與其讓我們天朝成天用盜版的Visual Studio,不如直接開放一個(gè)社區(qū)版出來。我下載了Visual Studio 2013社區(qū)版,并給其裝上了ReSharper組件。由于ReSharper是收費(fèi)的,但是有差不多1個(gè)月的試用期。之前一直使用Intellij開發(fā)工具做開發(fā),能在Visual Studio 2013中使用它也是覺得很爽。
6. 引入了package管理工具,使用Nuget來安裝、管理各種項(xiàng)目依賴。使用過程中我發(fā)現(xiàn)Nuget沒有Java平臺(tái)下的Maven或Gradle強(qiáng)大。很多依賴都不是最新版本,管理理念也不太一樣。不過聊勝于無吧。像bootstrap等前端組件以及ajaxcontrolToolkit等后端組件我都是通過Nuget來管理的。
7. 使用事務(wù)機(jī)制處理系統(tǒng)中的核心邏輯。這個(gè)系統(tǒng)是一個(gè)編碼管理系統(tǒng),主要處理炸藥、雷管編碼的整個(gè)流通過程。系統(tǒng)有的時(shí)候會(huì)出現(xiàn)重復(fù)編碼的情況,比如一發(fā)雷管的編碼同時(shí)存在于庫(kù)存中和消耗庫(kù)中。這是由于雷管從在庫(kù)狀態(tài)轉(zhuǎn)換為消耗狀態(tài)時(shí)出了問題,并沒有在庫(kù)存中刪除該編碼。這次升級(jí)我把類似的邏輯都用事務(wù)來處理,一旦發(fā)生異常就會(huì)整體回滾,不會(huì)造成臟數(shù)據(jù)的情況。
其實(shí)我還想引入的幾個(gè)點(diǎn)由于種種原因都沒有完成。
1. 沒有添加單元測(cè)試。本來想給Vistual Studio 2013添加單元測(cè)試框架,奈何花了幾個(gè)小時(shí)都沒整好。另外工程目錄方面也需要進(jìn)行一定的調(diào)整來引入測(cè)試項(xiàng)目,整了一次沒搞定后也不了了之。由于這次升級(jí)80%功能是前端頁(yè)面的改進(jìn),涉及后端代碼修改的不多,所以沒有單元測(cè)試的情況下修改已有代碼還是比較有信心的。
2. 沒有引入持續(xù)集成。還是時(shí)間成本的原因。畢竟這個(gè)活都是使用業(yè)余時(shí)間完成的,搭建C#棧的CI估計(jì)要花上好幾天,所以最后并未實(shí)現(xiàn)。
3. 自動(dòng)化部署。之前對(duì).NET下的網(wǎng)站的部署都是手動(dòng)的,將編譯生成后的文件復(fù)制到服務(wù)器上,暫停IIS,重載文件,重新啟動(dòng)IIS。其實(shí)這些都是可以自動(dòng)化完成的,自己沒花時(shí)間研究,所以也未實(shí)現(xiàn)。
4. 使用成熟的log框架給系統(tǒng)關(guān)鍵邏輯打上log。這個(gè)純粹是自己懶,不想做。因?yàn)榧觢og方便自己以后排查錯(cuò)誤,對(duì)客戶來說沒有任何影響,自己就懶得弄了。
5. 沒有引入自動(dòng)化測(cè)試。還是時(shí)間成本的原因,編寫web的自動(dòng)化測(cè)試太花時(shí)間了,所以只能舍棄。