如果讓我完善幾年前的一個專案,我會做哪些改進?

發表於2015-05-18

在08年的時候,我還沒有大學畢業,當時在一家公司實習。那時候老闆接了一個專案,是一個給中石油某下屬公司做的一個web版本的管理系統,我和一個同學硬著頭皮接下來做完了。這個系統後端用的是c#的web form,前端普通的html+css+javascript,資料庫使用的是sql server2005,部署伺服器使用的是Microsoft Server 2008。現在回顧這個系統,雖然程式碼寫的爛,架構寫的爛,但是能夠正常執行,這是偶爾有一些莫名其妙難以解決的小bug。畢竟是自己5年前的程式碼嘛,那時候自己太嫩了,好多東西都不知道,沒有多少經驗。

那如果現在要我給這個系統做功能升級,甚至重做這個系統,我會進行哪些改進那?這是個有意思的話題,如果你能真的找出很多可供改進的店出來,那麼說明這幾年來你真的在進步。

現在還真有可能會對這個系統做功能升級。我想了一下,會在一下幾個方面做出改進和調整。

1. 使用最新的Visual Studio IDE,並且裝上ReShaper外掛。現在自己已經成了一個快捷鍵控、重構控。俗話說,工欲成其事,必先利其器。好的程式設計師當然要用最好的工具了。新的Visual Studio在效率方面、智慧提示方面都有改善。ReShaper作為.net下的重構利器當然必不可少。

2. 將程式碼託管到github的私有程式碼庫中,使用git作為原始碼管理工具。以前專案中使用的是svn,使用的公司伺服器作程式碼託管,而公司伺服器不是那麼的穩定。git作為一款分散式原始碼管理工具,脫離了中央伺服器的束縛,並且擁有快速建立、切換分支,本地提交等特性,完爆svn。github作為全球最大的程式碼託管中心,方便實用,最便宜的會員7$每月,經濟實惠。

3. 給系統中的重要功能打好LOG。想當年我們想要記錄一些程式log,還要自己寫一個簡易的log類庫。現在有很多成熟的log框架可以被c#使用。試想當你的程式部署到伺服器上以後,如果沒有充足的log,那麼排查bug是多麼的困難。伺服器上又不能讓你還原現場,不能除錯,唯一能幫上忙的就是那些log了。當然打log也有很多學問,比如log等級設定,輸出設定等,這裡就不細說了。

4. 使用事務機制處理複雜邏輯。在這個系統中有很多併發操作,當時自己並不是很懂事務,使用了一些很蹩腳的方法來處理可能的資料異常。現在我會採用成熟的分散式事務機制來處理這些併發邏輯,使程式更加健壯。

5. 使用TDD,提高單元測試覆蓋率。以前的系統中沒有任何單元測試,一段簡單的程式碼都需要啟動程式手工驗證。這樣的反饋太耗時,並且不具備重複性。測試驅動開發能夠保證程式碼簡潔、正確,並且能快速得到反饋,保證測試覆蓋率。遇到遺留程式碼時,也可以先新增單元測試,建立保護網,使重構更有信心。

6. 使用webdriver進行自動化功能性測試。曾經在給客戶演示前,我改了一段程式碼,沒想到這段程式碼恰好破壞了給客戶演示的一個重要功能。如果有自動化的功能性測試那麼就可以避免這一切。自動化功能測試能增強對產品的信心,每次改動都在可控範圍之內。

7. 編寫構建指令碼,實現持續整合。即使只有一個人工作在這個專案中,也應當編寫構建指令碼,應用持續整合。這樣才能保證你的每一次提交都是安全的;並且將一些重複的工作自動化起來,可以解放你的大腦關注到更重要的地方去。

8. 自動化部署。每次部署專案到伺服器上是一個痛苦的經歷,需要手動的替換專案中的某些檔案,將檔案複製到伺服器上,終止當前伺服器服務…..哪一個環節出錯都是一個致命的打擊。手動不僅效率低,而且極易出錯。通過編寫指令碼實現自動化部署可以一勞永逸,和繁瑣的手動操作說拜拜吧。

9. 使用Nuget作為依賴項管理工具。如果你想要引用一個第三方依賴項,還需要手動從網上下載並新增到專案中的話,那你就out了。作為一個Java程式設計師,maven,gradle等構建工具已是標配,它們都提供了對依賴項的自動化管理。你只需要新增一行字串來說明你想要使用那個類庫,下載、引用就全交給管理工具來實現了。在c#世界中當然也有相應的產品,那就是Nuget,從此依賴項管理再也不是一件頭痛的事情了。

10. 多使用c#自身的特性,如LINQ,委託,函數語言程式設計等。比起不思進取的java語言,c#不知道強多少倍。java在java 8版本才正式引入Lambda,而c#的LINQ早都出來多少年了。如果在進行列表操作時,你還只使用foreach,那麼你太老土了。列表操作無非是filter,map,sort…而c#早為我們提供了一系列擴充套件方法,如Where,Select,Sort….可憐Java中只能使用Guava這種不倫不類的第三方類庫來實現相應的效果,而且遠沒有c#的原生功能漂亮。c#既然每年都會引用那麼多的特性,那麼就要學習、掌握和使用。很多人一邊使用著c#的老土語法,一邊說自己精通c#,真讓人無語。放著那麼多好特性不用,讓我們這些java程式設計師真是羨慕嫉妒恨。

11. 使用一些前端框架和JavaScript框架。對於我這種前端小白,想讓我設計出漂亮的頁面還真是力不從心。不用怕,設計者已經考慮到了前端無能者的感受,譬如bootstrap之類的前端UI框架簡直為我們而生。這些不但使用簡單,效果明顯,還自帶響應式設計,實在是前端小白的利器,實現自己精美的web站點不再是夢。JavaScript就不多說了,什麼jQuery,AngularJs,ExtJs…..各種框架類庫層出不窮,涵蓋了前端開發的方方面面。無論你是想畫圖,操作DOM元素,建立單頁應用,使用MVC架構…..在JavaScript的世界裡你總有多種選擇。想當年我為了在web頁面中展現一張統計圖,採用了使用.net在後臺實時繪製成圖片載入到前臺顯示,都是淚啊。現在好了,只需要將資料模型繫結給圖表控制元件,分分鐘搞定。

好了,就寫這麼多了。如何判斷一個程式設計師真的具有N年工作經驗,而不是1年工作經驗重複使用了N年?一個好的辦法就是和拿出一個以前的專案出來,看他都會做哪些改進。

對於工作多年的程式設計師來說,知識面、視野一定要廣,這樣才有競爭力。這靠的是平時的學習和積累,還要善於思考,如何能把手頭的事情做得更好。

相關文章