今天的這篇博文,我不談及具體的編程技術(shù),只想從這段時(shí)間的學(xué)習(xí)以及寫代碼的過程中,分享一下自己的編程體會(huì)。
上周呢,項(xiàng)目中碰到了一個(gè)新的任務(wù),要接入一個(gè)第三方外設(shè)廠商的藍(lán)?牙設(shè)備,對(duì)方公司提供了一個(gè)sdk。其實(shí)接入一個(gè)sdk這個(gè)小事情呢,每個(gè)從業(yè)者都會(huì)碰到,合理的選用第三方的sdk服務(wù)能大大縮短我們的開發(fā)時(shí)間,讓我們把目光都放到自己的核心業(yè)務(wù)上去。而碰巧這個(gè)sdk是對(duì)方公司新寫出來的,于是,本著懷疑的態(tài)度,我開始了對(duì)這個(gè)sdk包的接入工作。
由于這個(gè)sdk包是新版,為了預(yù)防后面的升級(jí),為了松耦合,我在這個(gè)第三方庫(kù)上加了一層完整的封裝。仔細(xì)的整理好項(xiàng)目的需求,封裝了一層適用于項(xiàng)目的API接口,并且提供給團(tuán)隊(duì)的小伙伴使用。而既然是要提供給團(tuán)隊(duì)的小伙伴使用的API,我在編寫代碼的過程中慎之又慎,單元測(cè)試覆蓋率基本達(dá)到了95%以上。很早以前我有一篇博文,是專門講TDD模式和一款Kiwi的測(cè)試框架,其實(shí)那個(gè)階段的我,更多的是停留在對(duì)那款單元測(cè)試的框架使用和摸索上,并沒有極大程度的重視TDD的思想。而在又重讀《Clean Code》這本書之后,單元測(cè)試的這根弦又在我腦子里繃緊了。
于是在這次的編碼過程中,沒有經(jīng)過單元測(cè)試的代碼,堅(jiān)決不能放在生產(chǎn)環(huán)境里成了我堅(jiān)持的原則,每一行代碼都必須跑過,在各種條件下測(cè)試過,才會(huì)成為放心的代碼,才能在之后放心的重構(gòu)。不然小伙伴調(diào)用API的時(shí)候如果產(chǎn)生了一堆bug,你讓我這張臉往哪擱。在這樣的實(shí)踐之下,我逐漸嘗到了測(cè)試驅(qū)動(dòng)開發(fā)這個(gè)思想的甜頭,之前我還有接入其他設(shè)備的經(jīng)驗(yàn),但是當(dāng)時(shí)趕工期,缺乏系統(tǒng)的單元測(cè)試,使得上線后bug不斷,有時(shí)候debug時(shí)定位都要花費(fèi)一些功夫,但是當(dāng)你的每行代碼都跑過單元測(cè)試時(shí),你會(huì)對(duì)你的代碼很有信心,并且能梳理的邏輯更清楚。況且,你要進(jìn)行單元測(cè)試,那么以最小單元模塊為單位的代碼塊或者函數(shù),也必然是一段短小的代碼,符合短函數(shù)的要求,最近苛刻的要求自己絕對(duì)不寫超過20行的代碼。只為函數(shù)的單一職責(zé)和邏輯清晰。
通過近期補(bǔ)充自己的數(shù)據(jù)結(jié)構(gòu)和算法知識(shí),我在敲代碼的過程中,對(duì)這個(gè)方面,也多了一層考慮。從一些細(xì)節(jié)方面來思考怎么把代碼寫的更好,除了表層的代碼風(fēng)格,在組織數(shù)據(jù)時(shí),考慮是否有合適的數(shù)據(jù)結(jié)構(gòu)類型可以使用,并且哪怕小到一個(gè)排序算法,或者查找算法,也會(huì)想怎么寫才能更有效率,平衡時(shí)間復(fù)雜度和空間復(fù)雜度的關(guān)系。這些意識(shí)都是之前所不具備的,所以感覺到最近自己在編程方面通過學(xué)習(xí)還是有一些提升的。而同時(shí)也很后悔自己對(duì)于這方面知識(shí)的學(xué)習(xí)來的太晚,回顧以前寫的代碼,還是生產(chǎn)了不小量的臟代碼。檢索一組規(guī)律數(shù)據(jù),使用從頭遍歷這樣時(shí)間復(fù)雜度底下的方式,實(shí)在不應(yīng)該。
其他的一些編碼細(xì)節(jié)也慢慢注意了起來,比如命名的更合理規(guī)范明確,比如函數(shù)在類里的擺放位置,一切其實(shí)都是為了一個(gè)事情,就是代碼的可讀性。寫出來的代碼20%的時(shí)間在開發(fā),80%的時(shí)間在維護(hù),可讀性是非常重要的一件事情,而最近不斷培養(yǎng)的也正是這個(gè)意識(shí),只希望寫出能讓人讀的舒服的代碼。僅此而已。
近期敲得代碼比較雜,寫過前端三件套,HTML+CSS+JavaScript,并且系統(tǒng)的學(xué)習(xí)了Vue框架,也用了stylus這個(gè)css預(yù)處理器寫過css,算法數(shù)據(jù)結(jié)構(gòu)用Java寫,后端的處理是php,框架使用了Laravel,iOS端Swift Objective-C混寫,慢慢的有種感受就是,其實(shí)用什么框架用什么語(yǔ)言真的無所謂,早先時(shí)候,自己還是太過于追求框架,有時(shí)候?qū)W習(xí)的路線反而是不正確是,是要去深刻的理解一門語(yǔ)言,以及這個(gè)語(yǔ)言主要解決問題的場(chǎng)景,而非如何使用一個(gè)趁手的框架去完成任務(wù),輪子是永遠(yuǎn)造不完的,舊的框架以后一定會(huì)被新的取代,而語(yǔ)言特性這種小細(xì)節(jié),是需要去細(xì)細(xì)體會(huì),花時(shí)間琢磨的。
今天隨便說說的一些體會(huì),也只是為了寫出更好的代碼,僅此而已。