數(shù)字一是一個(gè)不一般的數(shù),它首先是自然數(shù)序列的開(kāi)始,它是道家『道生一,一生二,二生三,三生萬(wàn)物』中『道』,它是『一心一意』的專注,也是很多人『一生一世』的追求。
在技術(shù)控嚴(yán)重,很多情況下,數(shù)字一的印象最為深刻:如果能把事情一次性做好,那就是非常高效愉悅的事情。
有一個(gè)『美女下屬要求加薪,老板竟然這樣讓他啞口無(wú)言』故事。“一家客戶準(zhǔn)備到公司來(lái)考察產(chǎn)品狀況,你聯(lián)系一下他們,問(wèn)問(wèn)何時(shí)過(guò)來(lái)。”老板對(duì)要求加薪的美女下屬說(shuō)。一刻鐘后,她回到老板辦公室。“聯(lián)系到了嗎?”老板問(wèn)。“聯(lián)系到了,他們說(shuō)可能下周過(guò)來(lái)。” “具體是下周幾?”老板問(wèn)。“這個(gè)我沒(méi)細(xì)問(wèn)。”“他們一行多少人。”“啊!您沒(méi)問(wèn)我這個(gè)啊!”“那他們是坐火車還是飛機(jī)?”“這個(gè)您也沒(méi)叫我問(wèn)呀!”。
而另一個(gè)秘書(shū)的回答是:“他們是乘下周五下午3點(diǎn)的飛機(jī),大約晚上6點(diǎn)鐘到,他們一行5人,由采購(gòu)部王經(jīng)理帶隊(duì),我跟他們說(shuō)了,我公司會(huì)派人到機(jī)場(chǎng)迎接。另外,他們計(jì)劃考察兩天時(shí)間,具體行程到了以后雙方再商榷。為了方便工作,我建議把他們安置在附近的國(guó)際酒店,如果您同意,房間明天我就提前預(yù)訂。還有,下周天氣預(yù)報(bào)有雨,我會(huì)隨時(shí)和他們保持聯(lián)系,一旦情況有變,我將隨時(shí)向您匯報(bào)。”
這個(gè)故事我們不從別的角度去詮釋,單從『一次性把事情做好』的角度上來(lái)看,第一位要求加薪的秘書(shū)的沒(méi)有一次性把事情做好,所以效率低下,所以老板不滿意,所以加薪難。
對(duì)于IT技術(shù)而言,能不能只需要一次請(qǐng)求就能完成業(yè)務(wù)呢?能不能只需要一次數(shù)據(jù)庫(kù)操作就能完成業(yè)務(wù)數(shù)據(jù)更新呢?能不能只需要一次API調(diào)用就能拿到所需全部數(shù)據(jù)呢?能不能只要一次就把代碼寫(xiě)對(duì)呢?
下面,我們就從幾個(gè)案例來(lái)看看『1』是多么的高效率。
一、高效的頁(yè)面顯示順序調(diào)整過(guò)程
這個(gè)頁(yè)面的業(yè)務(wù)要求是,可以用鼠標(biāo)拖動(dòng)來(lái)調(diào)整顯示頁(yè)的順序。我們的小伙伴又是怎么實(shí)現(xiàn)的呢?大概瞅了一眼代碼,每一頁(yè)都有一個(gè)順序號(hào),拖動(dòng)后,后臺(tái)將所有的相關(guān)記錄全部更新一次調(diào)整后的顯示順序號(hào)。這個(gè)實(shí)現(xiàn)方案初看能搞定,但是要從前端傳輸所有頁(yè)的調(diào)整后新順序號(hào),要更新數(shù)據(jù)庫(kù)里面多條記錄。
能不能簡(jiǎn)單點(diǎn)呢,只調(diào)整被拖動(dòng)頁(yè)的順序號(hào),只更新被拖動(dòng)頁(yè)的一條數(shù)據(jù)庫(kù)記錄呢?開(kāi)動(dòng)腦筋很容易就想到,我們只要不拘泥于自然數(shù)字的編號(hào)就行了。比如原始順序是1 2 3 4 5 6,我們拖動(dòng)第5頁(yè)到1與2之間,只要把第5頁(yè)的順序號(hào)調(diào)整為1.5即可,也就是調(diào)整后的順序是1 1.5 2 3 4 6。
一下子,我們從頁(yè)面?zhèn)鬟f數(shù)據(jù)簡(jiǎn)單了,只需要傳遞一條數(shù)據(jù)即可。數(shù)據(jù)庫(kù)操作也簡(jiǎn)單了,只需要更新一條記錄即可。
二、高效的充值卡銷售過(guò)程
這個(gè)充值卡銷售的業(yè)務(wù)大概實(shí)現(xiàn)流程是,從數(shù)據(jù)庫(kù)充值卡表中,查詢出100元面值的可用狀態(tài)的記錄,嘗試鎖定,然后在付款完成后,修改其狀態(tài)為已銷售。問(wèn)題在哪里呢?從業(yè)務(wù)上來(lái)說(shuō),月初月末,會(huì)有大量并發(fā)購(gòu)買充值卡的業(yè)務(wù);從技術(shù)上來(lái)說(shuō),從充值卡表中進(jìn)行查詢的檢索條件是面值100元和狀態(tài)可用,這兩個(gè)檢索條件對(duì)于上萬(wàn)條記錄的充值卡表數(shù)據(jù)來(lái)說(shuō)沒(méi)有很好的分散性,又不容易走主鍵或者索引,因此查詢效率非常地下。即使在查詢效率還能忍受的情況下,大量并發(fā)又容易導(dǎo)致選卡沖突,需要重新隨機(jī)查詢選卡,所以處理邏輯就在『隨機(jī)查詢可用狀態(tài)的充值卡記錄』(一條好復(fù)雜的SQL一般人還真看不懂)->『嘗試鎖定』->『修改狀態(tài)為已銷售』的流程中耗費(fèi)大量的時(shí)間和精力,數(shù)據(jù)庫(kù)也經(jīng)常在并發(fā)量大的時(shí)候被折騰的『夠嗆』。
如果換一種思路,能不能一次搞定這種充值卡銷售呢,不需要查詢,不需要嘗試鎖定,直接挑出一張可售狀態(tài)的充值卡,直接一步到位『修改其狀態(tài)為已銷售』呢?(注意,前方高能)。其實(shí),細(xì)細(xì)想來(lái),還是有辦法的,我們?yōu)槌渲悼ū斫ㄒ粋€(gè)自然順序的唯一索引,然后銷售的時(shí)候,直接取下一個(gè)增1的索引號(hào),然后直接去用這個(gè)索引號(hào)取拿卡,搞定。銷售流程實(shí)現(xiàn)簡(jiǎn)單了,SQL也好寫(xiě)了(唯一索引更新),數(shù)據(jù)庫(kù)也嗨皮了。更多關(guān)于取了卡最終未付款等的細(xì)節(jié)問(wèn)題,留待讀者自己思索,或者來(lái)與我交流。
三、HTTP優(yōu)化的未來(lái):一個(gè)文件
前端性能黃金法則中的第1條就是『減少HTTP請(qǐng)求』,就是說(shuō)盡量把外鏈腳本和樣式表進(jìn)行合并會(huì)減少HTTP請(qǐng)求,以節(jié)省客戶端和服務(wù)器之間的通訊次數(shù)來(lái)加快頁(yè)面打開(kāi)速度。對(duì)于這種減少HTTP請(qǐng)求數(shù)量的極致追求,就是一個(gè)全量的HTML文件,就真的只要一次請(qǐng)求就搞定,所有的CSS/JS/IMAGE全部放在一個(gè)文件中來(lái)。
四、干凈代碼中的『只做一件事』
我們?cè)凇捍a整潔之道』中,反復(fù)強(qiáng)調(diào)『只做一件事情』,函數(shù)只做一件事情,類也只做一件事情。做的事越多,代碼就會(huì)越冗長(zhǎng),越難以理解,越被人被將來(lái)的自己罵X。整潔的代碼只做好一件事,不要重復(fù)代碼。
這個(gè)『一件事』在SOLID設(shè)計(jì)原則中,又稱為『?jiǎn)我宦氊?zé)原則』。但是何為『一件事』呢,簡(jiǎn)單說(shuō)來(lái),就是你能不能一句話說(shuō)清楚,這個(gè)函數(shù)/類是干什么的,沒(méi)有『并且』,沒(méi)有『或者』。如果還是覺(jué)得抽象的話,建議去看看『代碼整潔之道』這本書(shū)。
上面的幾個(gè)例子,都充分體現(xiàn)了,一次性把事情做好,是多么高效多么愉快。日常生活中,希望跑一次醫(yī)院就把病看好,只要在一個(gè)柜臺(tái)就能把事情辦完,只要一張卡就可以刷遍公交地鐵出租等。在我們技術(shù)控眼里,追求極致追求高效的時(shí)候,也是需要經(jīng)常想想,是不是可以一次性把事情做好。或許這也是牛B與專業(yè)的區(qū)別,牛B能把事情做出來(lái),雖然要多弄幾次,但是專業(yè)卻是可以把事情一次性就做好。
作者簡(jiǎn)介:
黃進(jìn)兵,亞信科技架構(gòu)師,從事10余年移動(dòng)通訊計(jì)費(fèi)軟件和電信運(yùn)營(yíng)商電子商務(wù)系統(tǒng)架構(gòu)。擅長(zhǎng)互聯(lián)網(wǎng)業(yè)務(wù)和技術(shù)架構(gòu),云端架構(gòu)等相關(guān)技術(shù)架構(gòu)方案。