工程化思想總結

前言:本人和Jack兩人創立Wonder科技兩年已久,雖然公司還沒註冊,但咱們的項目已經開發到1.2版本,因爲種種緣由項目中止了開發。Jack開始了寫書的道路,而我,也面臨了找工做的事情,在找工做以前,我想先把這兩年學習的東西進行總結和覆盤,如若能幫助你們,也算是作了件好事。

先給你們介紹下咱們的項目,以及咱們如何使用工程化思想進行項目重寫和重構。

咱們開發的是Web端3D WebGL引擎和在線編輯器,其中Jack主要負責引擎,我主要負責3D編輯器以及公司官網、論壇、託管平臺等系統開發。在這期間我也熟悉引擎並開發了引擎中的自由相機功能,以及集成到編輯器中使用,爲此,我想總結下這兩年來跟隨Jack學習到的工程化思想。

1、中大型項目的根基:測試驅動開發

剛接觸TDD的時候我想你們確定也和我同樣迷茫,到底花費那麼多時間寫測試有沒有必要,尤爲是前端開發同窗,不少公司不要求你寫測試,因此大環境下前端程序員基本不會寫測試。我先列舉自動化測試的優勢:

  • 下降成本:程序員以自動化測試捕捉到bug,成爲一個測試用例,就把這個bug固定住,之後有任何重構讓這個bug重現都能報錯,這樣咱們不須要測試團隊
  • 減小時間:只須要寫一遍測試就能夠一直複用,效率確定比人工高
  • 正確性:只要測試代碼覆蓋越多的產品代碼,就能保證產品代碼的正確性
  • 代碼複用性、可擴展性:當項目發展到必定量級,沒有自動化測試支撐的項目,很難進行代碼維護和重構
  • 測試可讀性:良好的測試也能夠當作文檔方便閱讀
  • 增長信心:幫助咱們增長對軟件的信心,也讓用戶更放心使用咱們的產品

咱們的編輯器測試覆蓋率達到87%,覆蓋了全部編輯器與引擎交互的業務邏輯代碼,在咱們項目迭代過程當中,我也愈來愈感覺到自動化測試的重要性。此外,測試驅動開發還有一個優點就是,咱們在進行需求設計的時候,以先寫測試的形式進行開發,在這個開發過程當中,咱們從用戶角度分析這個需求,進而能夠幫助咱們完善本身的代碼設計,在編程過程當中,又有測試保證代碼的正確性。

因此在編寫3D引擎或者Web富應用(如釘釘,工具類網站)的時候,我以爲公司有必要考慮進行自動化測試,否則項目發展起來可能會出現沒法迭代的後果。

2、契約式設計:增長代碼的健壯性

何爲契約式設計?

契約式設計(DbC)是一種設計計算機軟件的方法。這種方法描述了,軟件設計者應該爲軟件組件定義正式的、準確的、可驗證的接口規範,它擴展了抽象數據類型對於先驗條件、後驗條件和不變性的通常定義。這些規範稱爲「契約」,它是一個比喻,相似於商業契約/合同的條件和職責。

咱們內部開發的時候,每次完成一個功能,都會進行代碼檢查,Jack也會根據本身以往的經驗進行重構,在重構過程當中我也掌握到契約式設計的好處和必要性。因爲咱們使用的函數式編程範式,函數是基本單位,因此放大了契約式設計的優點,因此咱們爲不少特定函數寫契約,使用先驗條件和後驗條件來保證函數的健壯性。

先驗條件: 保證API的輸入是咱們指望的輸入,好比咱們設計一個數組操做API,那咱們須要保證參數爲一個數組,這時候咱們寫先驗條件,保證參數類型爲數組,再進行操做,若是不是則拋出錯誤。

後驗條件: 保證API的輸出是咱們指望的輸出,好比某個特定API,須要輸出數據不爲空,這時候咱們寫後驗條件,指望他的返回值不爲空。

在線上運行時咱們須要保證錯誤定位,根據咱們的產品上線經驗來看,大多數報錯都來自於好的契約設計,讓咱們能快速定位到問題的位置,因此我以爲在咱們設計API的時候可使用到契約式設計,來保證API的健壯性。

3、團隊規範

團隊內部規範定義是一個重要的事情,能保證一個團隊的產出就像一我的完成的同樣,也使得團隊成員之間可以無縫銜接完成工做,也沒必要擔憂成員變更等問題。下面我介紹一下咱們團隊的規範。

1.git提交規範
咱們使用cz-customizable庫以及規範的CZ提交規範

2.代碼規範

代碼規範主要使用項目負責人的編程規範,或者使用成熟團隊的編程規範,執行主要使用代碼審覈的方式把新人的編程習慣規範下來,每次功能完成之後都花時間進行代碼審覈尤其重要,第一保證新人的工做質量,第二保證新人的編程規範。

4、自動化工具

我一直是相信人是會犯錯的,但機器不會,因此咱們須要把團隊常常重複手動執行的工做交給機器來作,大公司是專門有內部工具團隊來作這個事情,咱們兩我的的話固然也是咱們本身寫的自動化工具。

之前在看程序員分級的文章裏提到一句話,拋開工具的使用,程序員與程序員之間的差距並非很大,而對新工具的使用,能培養程序員一套新的思惟方式,進而促使他們更新本身的思惟。

1.Vim操做命令

在我認識Jack的時候,當時還沒一塊兒合做,Jack在後期給個人指導是學習Vim和TypeScript,而我在三個月的Vim學習過程當中放棄過無數次,但次日又再次撿起來,終於可以造成肌肉記憶,今後感覺到Vim給我帶來的編程快感,而我也從一直手動重複作事情,進階到使用工具快速完成的思惟,之前寫代碼使用鍵盤搭配鼠標,移動光標慢,致使編程速度慢。在使用Vim之後純鍵盤操做,在編程時常常感覺到本身很厲害,經常自我陶醉,這也是編程的樂趣之一。

2.Emacs

網上常常有人討論Vim和Emacs孰好孰壞的問題,我使用Emacs主要使用Emacs-org進行TODO管理,依然使用的vim操做命令,還須要學習Emacs的基礎命令,在記錄筆記和TODO的時候,真心感受好用。

3.chrome插件

由於咱們編輯器主要運行在chrome上,因此使用好的chrome插件能夠幫助咱們在瀏覽器上進行操做。
我以爲最好的是Vimium插件,在瀏覽器上使用vim命令,進行操做,大多數時候都不須要鼠標就能流暢使用瀏覽器。
還有其餘的都是私人插件,根據我的喜愛進行選擇,在這我就很少介紹了。

4.自動化部署

把本地項目推送到遠程服務器時,寫工具實現自動化項目部署,把項目發佈可以保證正確和簡便。

5.CI測試檢查

項目發佈新版本,推送到遠程服務器,先自動運行測試CI檢查,保證全部測試經過再提交。

6.自動化發佈

項目發佈新版本,自動化更新版本號,執行發佈流程。

結束語: 在結束本身兩年的創業生涯其實仍是挺捨不得,多情自古傷離別,不過咱們每一個人都有本身的生活要過,我和Jack亦師亦友,感謝Jack多年的教導和關愛。在本科畢業第三年,我從Wonder科技畢業了,之後的路,依然天高任鳥飛。

相關文章
相關標籤/搜索