敬畏,是人類對待事物的一種態(tài)度。
在我們的一生中,會(huì)敬畏人道,會(huì)敬畏法律,會(huì)敬畏生命,會(huì)敬畏自然。有了敬畏之心,人與人之間才能和諧相處;有了敬畏之心,我們才懂得遵紀(jì)守法,維護(hù)秩序;有了敬畏之心,面對自然蒼生,我們才能泰然處之。
曾國藩說:心存敬畏之心,才能行有所止
曾國藩,是我國近代史上著名的政治家,理學(xué)家。面對 敬,畏,之心,他曾說過,“敬則無驕氣,無怠惰之氣”,“畏天命,畏人言,畏君父”。一路走來,他一生都秉持著堅(jiān)守原則,堅(jiān)持底線,對人謙遜平和,遇事謹(jǐn)慎從容的人生觀,價(jià)值觀,走向人生的成功,迎來人生的巔峰。
程維說:對上線滴滴順風(fēng)車保持敬畏心
2018年9月5日,隨著順風(fēng)車事件的發(fā)酵,滴滴配合相關(guān)部門調(diào)查。程維表示,滴滴運(yùn)營如此大規(guī)模的移動(dòng)出行業(yè)務(wù),缺乏經(jīng)驗(yàn)和參照,沒有足夠的敬畏之心、警惕之心,喪失了安全紅線和底線的意識,社交出行的引入也偏離了綠色共享出行的初心。
自此,滴滴痛定思痛,關(guān)停相關(guān)業(yè)務(wù),并馬上開始了全方位的內(nèi)部反思與業(yè)務(wù)改造,并把“all in 安全”作為滴滴未來的核心戰(zhàn)略。
2019年11月20日,經(jīng)過兩年的蟄伏,滴滴順風(fēng)車再次揚(yáng)帆起航。程維說,我們懷著敬畏之心再次出發(fā),希望能為用戶的出行提供更多選擇,也承擔(dān)更多的社會(huì)責(zé)任,努力提升安全,把好的事情真正做好。
時(shí)至今日,滴滴不斷突破自我,不但在護(hù)城河領(lǐng)域再填花小豬業(yè)務(wù),而且在“社區(qū)生鮮”這樣的互聯(lián)網(wǎng)風(fēng)口取得了不俗的成績。滴滴,煥然一新。
由于缺乏對業(yè)務(wù)的敬畏之心,滴滴從如日中天到隕落神壇。由于重拾對業(yè)務(wù)的敬畏之心,滴滴從一蹶不振到東山再起。
我說:對服務(wù)上線,要存敬畏之心
作為個(gè)人而言,我們作為互聯(lián)網(wǎng)開發(fā)一線的普通員工,既比不上曾伯涵這樣的人之龍鳳,也沒機(jī)會(huì)經(jīng)歷滴滴之于will這樣的大落大起。但同樣作為個(gè)人,我們一樣擁有自己的工作,自己的事業(yè),乃至具體到一個(gè)一個(gè)的服務(wù),面對我們所負(fù)責(zé)的這些,我們也需要和那些先賢,那些社會(huì)精英一樣,擁有一顆敬畏之心。
沒有敬畏之心,我們寫代碼隨意,上線隨便,bug頻出,服務(wù)不穩(wěn)。產(chǎn)品質(zhì)量不高,沒有用戶粘性,用戶不滿,反饋頻仍,而我們又反過來需要對自己的過失買單,一邊要寫著寫不完的需求,一邊還要查著查不完的bug,反反復(fù)復(fù),終而復(fù)始。。。
我們希望活得快樂,我們希望能夠工作的從容,活得從容,哪怕我們只是一個(gè)又一個(gè)小小的碼農(nóng)。所以,我們要精于我們的工作,要對我們的服務(wù)負(fù)責(zé),要從對服務(wù),對服務(wù)上線懷有敬畏之心做起。
服務(wù)上線方法
前不久有幸聽過滴滴順風(fēng)車的穩(wěn)定性分享,作為滴滴內(nèi)部唯一一個(gè)經(jīng)歷過生死的項(xiàng)目,我相信其對自己的穩(wěn)定性總結(jié)最為透徹。所以以此為借鑒,分別從上線前,上線中,上線后三個(gè)角度總結(jié)下我認(rèn)為應(yīng)該做到的事情。
上線前
開發(fā)階段
技術(shù)選型:在技術(shù)選型前尤其慎重,不可敷衍了事,因?yàn)橐粋€(gè)不經(jīng)意的選擇,可能會(huì)造成后期幾倍甚至幾十倍的問題排查解決成本。比如,當(dāng)你需要對一個(gè)高頻調(diào)用進(jìn)行解耦削峰的時(shí)候,你選擇了redis隊(duì)列,而不是用的成熟的MQ,看似沒有問題,但是在實(shí)際生產(chǎn)過程中,redis作為緩存,并不保證數(shù)據(jù)的可靠性,所以放到redis隊(duì)列中的消息時(shí)常會(huì)丟失,而你又無從查起。
代碼風(fēng)格:在正常的開發(fā)過程中,往往我們最經(jīng)常做的最重要的但往往可能也是我們最不能夠引起我們注意
地方,就是我們無時(shí)無刻不在寫的手下的一行行代碼。一套質(zhì)量好的代碼,往往不需要寫任何注釋也能讓大家看懂它能體現(xiàn)出來的思路。作為我們所踩著的巨人,前人們已經(jīng)在寫代碼過程中為我們總結(jié)了一套又一套的方法與思想:23種設(shè)計(jì)思想,設(shè)計(jì)思想六大原則等等,甚至有公司內(nèi)部專門總結(jié)的開發(fā)手冊。但是真正考驗(yàn)的,還是我們寫代碼的時(shí)候是否用心,是否一遍又一遍的咀嚼代碼的合理性。只有合理的代碼,才是它存在的理由。不過雖然這么說,我想我自己也沒有達(dá)到這種水平,但是開發(fā)工作本身,就是一種給自己不斷精進(jìn)自我的機(jī)會(huì),它像務(wù)農(nóng),像蓋樓,像釣魚,像修行。。。
前瞻性故障處理:有人說,故障處理屬于穩(wěn)定性建設(shè),不是特別應(yīng)該提前考慮。但是如果在開發(fā)階段就能夠盡可能的將隱患考慮進(jìn)去,這種有效的前瞻性處理,也不失為有意義的。那什么叫故障處理呢?比如有降級,限流,切流等。早做準(zhǔn)備的人,也會(huì)更早脫穎而出,就比如之前upm突然宕機(jī),不能提供服務(wù),一個(gè)基于前瞻性的增加緩存的降級手段,便使得整個(gè)部門扛過了這次事件,繼續(xù)為用戶服務(wù)。
測試階段
rd測試:在此,將開發(fā)自測也作為了測試階段的一部分,當(dāng)然,如果將這個(gè)操作放到研發(fā)階段也覺得并無不當(dāng)。在這個(gè)階段,理想情況下,我們需要為我們寫的每一個(gè)接口做到單元測試,且測試用例要完善,做這個(gè)事情,其實(shí)不難,難的是是否真正的懷著敬畏之心把這個(gè)事情一直做下去。往往,人最大的敵人就是自己。
Qa測試:當(dāng)rd測試完,理論上就可以把開發(fā)分支的代碼合到測試分支,發(fā)布測試環(huán)境了。在測試環(huán)境,qa需要按著需求評審用例將每個(gè)場景都測試完整,而作為rd,個(gè)人的習(xí)慣是全程坐在qa身邊,以期望在測試過程中第一時(shí)間為Qa同學(xué)提供幫助,盡可能快速走完qa測試流程,當(dāng)然在有些公司,條件不允許,只能等著qa給反饋了。
全鏈路壓測:全鏈路壓測是指基于實(shí)際的生產(chǎn)業(yè)務(wù)場景、系統(tǒng)環(huán)境,模擬海量的用戶請求和數(shù)據(jù)對整個(gè)業(yè)務(wù)鏈進(jìn)行壓力測試,并持續(xù)調(diào)優(yōu)的過程。當(dāng)然執(zhí)行全鏈路壓測之前,要考慮好兩個(gè)方面的事情,1,場景是否有必要做壓測,比如如果業(yè)務(wù)的挑戰(zhàn)性不在數(shù)據(jù)量而是邏輯復(fù)雜度的話,那可能消耗過多人力資源去進(jìn)行壓測就不是一個(gè)明智之選;2,數(shù)據(jù)模型重建,此又涉及數(shù)據(jù)可用性,數(shù)據(jù)脫敏,數(shù)據(jù)隔離等因素,這些因素不考慮且準(zhǔn)備清楚的話,不但不能模擬線上場景,且有可能污染到線上數(shù)據(jù)。
監(jiān)控添加
odin監(jiān)控:工欲善其事,必先利其器,如果線上在跑的服務(wù),沒有任何監(jiān)控手段,就好像山間放著幾萬匹馬,如果沒有牧馬人一樣,那結(jié)果肯定是可想而知。所以我們在上線之前,一定要把相關(guān)接口關(guān)鍵指標(biāo)的監(jiān)控及報(bào)警加好,一旦出了問題也能第一時(shí)間感知到作出響應(yīng)動(dòng)作。
上線中
CR
上線的第一個(gè)動(dòng)作,肯定是將代碼合并到線上,但在合代碼之前,需要經(jīng)過部門內(nèi)同學(xué)的cr,cr有如下幾個(gè)作用,1,提前發(fā)現(xiàn)bug,bug有兩種,一種是實(shí)現(xiàn)上的技術(shù)bug,一種是對需求沒有吃透的流程bug,但是無論哪種bug,通過cr,內(nèi)部同學(xué)都極有可能提供幫助把問題發(fā)現(xiàn)并解決;2,統(tǒng)一代碼規(guī)范,一個(gè)服務(wù)可能會(huì)有好多同事同時(shí)參與開發(fā),這時(shí),一個(gè)良好的代碼規(guī)范就很重要了,而代碼規(guī)范的保持,尤其是對于新接觸服務(wù)的成員來講,就成為了挑戰(zhàn),這時(shí)候cr代碼可以提供一個(gè)機(jī)會(huì),讓其他成員把新成員的代碼風(fēng)格給統(tǒng)一起來;總之一次代碼cr,就是一次頭腦風(fēng)暴,這樣只會(huì)讓我們的代碼越來越好。
回滾方案
經(jīng)過了若干前置步驟后,如果線上代碼還是有問題,那就不得不回滾代碼了,而傳統(tǒng)的回滾方案,就是借助平臺(tái)工具,將部署的代碼完全回滾到上一版本,快速解決問題。但是有的時(shí)候,這種快速解決問題的方案,卻并不見得那么快速,回滾一套部署,往往需要幾分鐘甚至十幾分鐘的時(shí)間,回滾時(shí)間多快,就意味著線上越少損失服務(wù)能力,所以,除了依賴平臺(tái)本身,我們還應(yīng)該想一下自己能做些什么,舉個(gè)例子,當(dāng)我們修改部分邏輯時(shí),可以提前設(shè)置一個(gè)開關(guān),默認(rèn)使用新邏輯,打開則使用原有邏輯,這樣在上線初期,如果確實(shí)因?yàn)樾逻壿嫴粔蚪褜?dǎo)致bug出現(xiàn),則可以通過開關(guān)轉(zhuǎn)換,瞬時(shí)更改邏輯,使服務(wù)對用戶的提供能力更穩(wěn)定。
灰度階段
上線操作,灰度階段是不可省的,灰度是指上線操作先進(jìn)行一個(gè)小范圍的嘗試工作,然后再慢慢放量,直到這個(gè)全新的功能覆蓋到所有的系統(tǒng)用戶,也就是說在新功能上線的黑白之間有一個(gè)灰,所以這種方法也通常被稱為灰度?;叶仁且环N過渡,如果新版本有問題,這樣不至于影響到所有用戶,而線上監(jiān)控卻能夠及時(shí)發(fā)現(xiàn)問題,快速回滾,避免問題擴(kuò)大化,所以,灰度階段,作為rd,我們更要小心謹(jǐn)慎,灰度階段要適當(dāng)長一些,比如一個(gè)小時(shí)到半天時(shí)間,盡可能讓所有問題在此階段暴露出來,讓我們更從容處理問題。
全量階段
在這個(gè)階段,還是要注意監(jiān)控各個(gè)指標(biāo),雖然經(jīng)過灰度的驗(yàn)證,bug出現(xiàn)的概率比較低了,但是我們依然要謹(jǐn)慎,因?yàn)槟Ч硖幱诩?xì)節(jié)之中,我們并沒有完全把握我們的代碼會(huì)在什么時(shí)候出現(xiàn)問題。
上線后
上線后,我們需要一些必要的操作作為依據(jù),證明上線的代碼是沒問題的。第一是接口調(diào)用測試,有的時(shí)候,測試環(huán)境的接口沒有問題不代表線上的也沒有問題,所以我們必須自己親自調(diào)用一下去驗(yàn)證,畢竟眼見才為實(shí);第二是持續(xù)觀察監(jiān)控,既要觀察服務(wù)的整體服務(wù)能力有無下降,也要觀察服務(wù)的各項(xiàng)基本指標(biāo)比如內(nèi)存,線程數(shù)等有無異常,因?yàn)樵S多時(shí)候,這種問題的出現(xiàn)并不是那么及時(shí)的反應(yīng)在報(bào)警上,需要我們細(xì)心觀察;第三則是注意回滾,當(dāng)我們觀察監(jiān)控或發(fā)現(xiàn)接口調(diào)用確實(shí)有問題的時(shí)候,我們要時(shí)刻注意回滾,甚至當(dāng)我們沒有發(fā)現(xiàn)任何異常,但是當(dāng)問題大面積反饋的時(shí)間和我們上線時(shí)間高度重合的時(shí)候,我們也要及時(shí)進(jìn)行代碼回滾,因?yàn)槲覀冊诟聵I(yè)務(wù)邏輯的時(shí)候,一些隱藏的關(guān)聯(lián)問題我們是很難察覺到的,因此及時(shí)回滾尤為重要,以至于公司內(nèi)部將代碼回滾作為解決問題的第一標(biāo)準(zhǔn)操作。
綜上,在服務(wù)上線的每一個(gè)階段,我們都應(yīng)該懷著敬畏之心,如履薄冰之念,一顆紅心,兩手準(zhǔn)備,時(shí)刻要自信的寫著自己的代碼,也同時(shí)要謹(jǐn)慎的為自己可能造成的損失去設(shè)計(jì)補(bǔ)償方案,如此,也許方案并不完美,但是懷著一顆敬畏之心,你肯定不會(huì)走錯(cuò)。畢竟心存敬畏,才能行有所止。