技術(shù)人的內(nèi)功修煉,究竟修的是啥?
今天我給大家分享的主題是技術(shù)人如何修煉好內(nèi)功,包括技術(shù)的內(nèi)功,也包括我們做人做事的內(nèi)功。
開發(fā)者要學(xué)習(xí)高并發(fā)服務(wù)、大數(shù)據(jù)、操作系統(tǒng)、算法和數(shù)據(jù)結(jié)構(gòu);學(xué)技術(shù)得學(xué)它的內(nèi)功,內(nèi)功就是基礎(chǔ)。
所以對于操作系統(tǒng),我們一定了解它的 CPU、內(nèi)存、磁盤 IO 和網(wǎng)絡(luò) IO,并且據(jù)此粗略評估服務(wù)的性能。
應(yīng)用層面的小伙伴們可能對算法和數(shù)據(jù)結(jié)構(gòu)的應(yīng)用比較少,也比較簡單,但是它代表了一個人的邏輯思維和思考能力。
在互聯(lián)網(wǎng)公司,高并發(fā)服務(wù)和大數(shù)據(jù)是兩大方向:
- 解決高并發(fā)主要使用的是分而治之的思想,但是也會產(chǎn)生一致性的問題。
- 大數(shù)據(jù)是近年來比較火的方向,所有的根基都來自 Mapreduce、Gfs 和 Bigtable 這三篇論文,推薦大家閱讀。
分布式的服務(wù)架構(gòu)
我們總體看一下分布式的服務(wù)架構(gòu)的目標(biāo),主要包含六個方面:
- 高可用
- 高性能
- 可伸縮性
- 可擴(kuò)展性
- 安全性
- 一致性
我們一個個來說這六個目標(biāo),它們是怎么實現(xiàn)的?這六個目標(biāo),第一個就是可用性,在一般的公司我們都會用 4 個 9,或者 5 個 9 來衡量。
我們的易寶支付可以達(dá)到 4 個 9,那 4 個 9 是怎么實現(xiàn)的呢?這個原因有很多,我們得從影響可用性的原因來分析。
例如我們統(tǒng)計了一下去年影響可用性的主要原因包括什么?主要包括我們上線變更的時候,會影響我們 40%,50% 的可用性。
針對這個情況,我們就增加了架構(gòu)評審和設(shè)計評審,還有技術(shù)評審等等。
我們把可用性這一塊的窟窿堵住了,可用性就可以提高上來,那下一個最重要的就是性能。
大家常說性能的優(yōu)化,但是性能的優(yōu)化用什么方法來保證呢?在我們分布式服務(wù)架構(gòu)里邊,最重要的就是一個分而治之的思想。
我們通過分而治之的思想提高整個系統(tǒng)的吞吐量,由于分而治之,它會導(dǎo)致一些問題,這個問題就是一致性問題。
那么,我們怎么解決這個一致性問題呢?這是我們最困難的事,也是最有挑戰(zhàn)的事。
第三個就是可伸縮性,它是我們互聯(lián)網(wǎng)項目中最重要的一個特性,為什么說它是最重要的呢?
因為垂直擴(kuò)展這個性價比已經(jīng)變得很低了,所以我們都去采用水平擴(kuò)展,包含應(yīng)用層和數(shù)據(jù)庫層,還有緩存等等。
例如數(shù)據(jù)庫的分庫分表,緩存的分片,還有消息隊列的消峰,我們都是為了讓這個系統(tǒng)能夠水平伸縮起來,然后提高它的性能。
下一個特性就是安全性,安全性是大家常說的,包含系統(tǒng)安全性,寫代碼的安全性,數(shù)據(jù)庫的安全性,還有前端外部的安全性。
但是總結(jié)起來,安全性有五個目標(biāo):
- 防泄漏
- 防竄改
- 防抵賴
- 防偷窺
- 防止中間人攻擊
所有安全性最后的目標(biāo)只有這五個,那這五個目標(biāo)是怎么實現(xiàn)呢?
這就涉及到現(xiàn)在密碼學(xué)上的幾個技術(shù)的點:
- 加密
- 簽名
- 使用 HTTPS 的雙向認(rèn)證通道,防止中間人攻擊
有了這些辦法,我們剛才所說的那五個目標(biāo),都可以達(dá)到。安全性也并沒有那么復(fù)雜,當(dāng)然具體的打法和方式還是很多的。
提到可擴(kuò)展性,大家肯定覺得可擴(kuò)展性和可伸縮性是同一個概念,但實際上這兩個概念是不一樣的。
可擴(kuò)展性指這個系統(tǒng)的可修改性,將來能夠進(jìn)行比較快速的功能迭代,然后快速去滿足新的市場需求,我們以前常說的可插拔,屬于可擴(kuò)展性,但并不是可伸縮性。
最后一個就是一致性,一致性是我們實施服務(wù)化或者微服務(wù)化以后,造成一個大的問題,我們都需要去保證。
我剛才介紹了一些分布式服務(wù)架構(gòu)的分享內(nèi)容,但實際上我們很難在 20 分鐘內(nèi)講的比較透徹。
我推薦三本書,第一本書就是京東開濤寫的《億級流量網(wǎng)站架構(gòu)核心技術(shù)》,這本書更偏向于高并發(fā)和高可用前端系統(tǒng)的一個架構(gòu)分析、設(shè)計和方法還有實踐。
第二本就是我和楊老師共同著的,《分布式服務(wù)架構(gòu)原理設(shè)計與實戰(zhàn)》,這本書包含了微服務(wù)化,一致性,可用性,還有大數(shù)據(jù)日志系統(tǒng)的建設(shè),以及調(diào)用鏈系統(tǒng)建設(shè),會包含一些 APM 的核心功能,再加上我們線上進(jìn)行技術(shù)攻關(guān)和進(jìn)行線上應(yīng)急的一些經(jīng)驗總結(jié),以及最后的容器化還有持續(xù)集成等主題,所以這些主題總體來講更偏向于方法論和實戰(zhàn),還有一些案例。
最后一本書就是李智慧老師寫的《大型網(wǎng)站技術(shù)架構(gòu)核心原理與案例分析》,這本書應(yīng)該有好多年了,但是這本書講的原理還有概念都非常的核心,非常的重要,推薦大家也讀一下。
技術(shù)人如何修煉技術(shù)的內(nèi)功
如何綜合評估一個人的技術(shù)能力
如何去修煉技術(shù)的內(nèi)功?如果我們作為面試官,我們?nèi)ッ嬖囈粋€候選人,我們會從哪些方面全面評估這個人的技術(shù)能力?
我會根據(jù)三個層面來評估一個候選人,包括技術(shù)知識的廣度、技術(shù)知識的深度,還有技術(shù)知識的高度。
對于廣度指的是什么呢?指的是這個人做過什么事情?學(xué)習(xí)過多少的知識?用過多少語言?熟練使用多少工具等等,主要是他的知識面和經(jīng)驗。
什么是技術(shù)的深度呢?技術(shù)的深度就是期望每個人在某一方面一定是有造詣的,什么是造詣呢?
就比如說在 Java 上,你一定要了解 GC 的原理,你能夠通過調(diào)節(jié) GC 來提高它的性能,或者是你懂得我們 RDBMS 數(shù)據(jù)庫的索引原理等等。
并且能把這個原理應(yīng)用到你的生產(chǎn)實踐中,你一定要有幾個主題或幾個方面是非常深入了解和學(xué)習(xí)過的。
最后就是一個高度,高度這個是我這兩年才認(rèn)識到的,以前我只是拿廣度跟深度來看別人和自己,現(xiàn)在又增加了一個高度。
高度是什么呢?就是你學(xué)這個技術(shù)有什么目的?這個技術(shù)能達(dá)到什么樣的生產(chǎn)?這個技術(shù)是不是現(xiàn)在技術(shù)的一個前沿,還是說已經(jīng)淘汰好多年的一門技術(shù)?
所以說,我們一定要站在很高的高度來看這些東西,學(xué)了是不是有用的?將來是不是有用的?假如將來十年有用,那么將來二十年是不是有用的呢?
所以我們一定要修煉這個內(nèi)功,因為內(nèi)功是永遠(yuǎn)不變的,就算將來你可能過十年,二十年,這個內(nèi)功還是一樣的。
如何修煉技術(shù)的內(nèi)功
我們?nèi)绾稳バ逕掃@個內(nèi)功?有幾個方面需要我們掌握?
今天我給大家分享四個方面:
- 高并發(fā)服務(wù)
- 大數(shù)據(jù)
- 操作系統(tǒng)
- 算法與數(shù)據(jù)結(jié)構(gòu)
我們先看下面兩個主題,那就是操作系統(tǒng),算法和數(shù)據(jù)結(jié)構(gòu)。
先說操作系統(tǒng),我們現(xiàn)在看各種新技術(shù),還有我們用的各種技術(shù),都跟我們操作系統(tǒng)有關(guān),我們發(fā)現(xiàn)新技術(shù)、新原理的很多東西在這個操作系統(tǒng)的一些核心原理上是能找到縮影的。
舉一個非常小的例子,比如大家說的微服務(wù),是不是覺得微服務(wù)現(xiàn)在很火很新?但實際上在操作系統(tǒng)中是有微服務(wù)的。
第一,它的內(nèi)核是微內(nèi)核;第二,想一下命令和管道,在實現(xiàn)一個復(fù)雜的日志搜索,我們一個命令接一個管道,再接一個命令和一個管道,每個命令都在完成自己它想做的事,有清晰的輸入和輸出,然后和其他的命令去配合著使用。
上面這個例子完全就是一個微服務(wù)的思想,所以我說學(xué)技術(shù)得學(xué)它的內(nèi)功,內(nèi)功就是我們這些基礎(chǔ)一定要掌握的很扎實。
所以對于操作系統(tǒng)來講,我們一定要理解到它的 CPU,內(nèi)存,磁盤還有網(wǎng)卡的 IO 等等這些原理。
并且能夠根據(jù)這些資源去評估你服務(wù)的吞吐量和 TPS 響應(yīng)時間等等,這個評估指的是粗略評估,就是評估是沒有精確評估的。
然后我們看一下算法跟數(shù)據(jù)結(jié)構(gòu),對于我們應(yīng)用層的小伙伴們,我們很少在應(yīng)用層直接去使用到它,就算使用也非常的簡單。
但是算法和數(shù)據(jù)結(jié)構(gòu)象征著我們一個人的邏輯思維和思考能力,所以對這個東西也要掌握一些或者是要熟悉一些。
最后,要學(xué)習(xí)一個高級算法,比如說動態(tài)規(guī)劃,貪婪,還有剪枝,遞歸等等,那為什么要學(xué)高級算法呢?
假設(shè)大家每一位都是面試官,如果來了一個面試的小伙伴,小伙伴說我會動態(tài)規(guī)劃,隨便一個都可以寫出來。
那他要不就是勤奮的,要不就是非常聰明的,所以如果你會這個,一般都是會打動這個面試官的。
然后我們再看上邊的兩個主題,第一個是高并發(fā)服務(wù),第二個是大數(shù)據(jù)。
在互聯(lián)網(wǎng)公司里邊主要有兩個方向,一個就是高并發(fā)的服務(wù),一個就是大數(shù)據(jù),那高并發(fā)的服務(wù)的核心思想就是分而治之,就是我們單體系統(tǒng)架構(gòu)。
不是它的性能不能提高,是它在垂直擴(kuò)展過程中,它的性價比非常低,非常貴。
所以我們都用伸縮,采用分而治之的思想,但是分而治之以后產(chǎn)生的問題,就是一致性的問題,因為分開了,他們的協(xié)調(diào)一定會有問題。
大數(shù)據(jù)這些年特別火,但是大數(shù)據(jù)所有核心思想都來自于谷歌的三大論文,包括 Mapreduce,Gfs,Bigtable,所有的大數(shù)據(jù)根基都來自于這三個論文。
技術(shù)人如何修煉做事的內(nèi)功
目標(biāo)方法論
我要跟大家分享的主要是目標(biāo)方法論,主要包含幾個關(guān)鍵元素:目標(biāo)原則方法和結(jié)果。
目標(biāo)方法論來自于我們易寶支付的文化,但稍微有一點點變化,為什么說這個方法論非常重要呢?
因為我這兩年在面試和評審的時候,發(fā)現(xiàn)一些小伙伴在做一些事情,但是他們并不知道做這個事情能解決什么問題?
還有一些小伙伴,他知道是解決什么問題,但是這個問題根本就不需要解決,所以說做任何事情之前,一定要樹立一個正確的目標(biāo)。
如果這個目標(biāo)是抽象的,一定要把它分解成一些可衡量的目標(biāo),只有目標(biāo)正確了,我們后邊做的事情才是有意義的。
接下來就是原則,原則是什么呢?就是我為了實現(xiàn)這個目標(biāo)不能做的事情,這個是底線,就算是生活中我們也有很多的原則。
接下來就是方法,我們要實現(xiàn)一個目標(biāo),有各種各樣的方法,那么這些方法我們要去權(quán)衡他們的利弊、權(quán)衡他們的成本、權(quán)衡他們達(dá)成的效果。
我們一定要找到一個最合適的方法,而不是找到一個最高大上的方法。
我也見過很多技術(shù)方案,是拿很多高大上的技術(shù),最終解決了一個很低端的問題,這種事情性價比很低。
所以一定要選擇最適合的方法,例如做架構(gòu),要做最適合的架構(gòu),要回歸架構(gòu)的簡潔之美,不要所有的事情都拿一些高大上的技術(shù)招式來應(yīng)付這個結(jié)構(gòu)。
最后一個就是產(chǎn)出和結(jié)果,任何一個事情最后都會看它的產(chǎn)出和結(jié)果,這個產(chǎn)出和結(jié)果和目標(biāo)是相對應(yīng)的。
如果你這個產(chǎn)出結(jié)果跟目標(biāo)不是對應(yīng)的,那這個事情就是白做了或者是偏離了,也可能有一些副作用,作用有好有壞,但是沒有滿足我們的初衷。
做人四原則
這一塊可能跟我們技術(shù)內(nèi)功不太一致,但這是我和身邊的一些小伙伴們總結(jié)下來的生活和做事的經(jīng)驗,分享給大家,希望能夠起到一定的效果。
大家千萬不要覺得這四個原則內(nèi)容比較少,當(dāng)你詳細(xì)的去理解,可能等時間久了,慢慢就理解到了。下面我們一個個來看,為什么我說它非常重要?
第一個就是靠譜,有腦子。衡量一個人或者別人對你的印象,跑不出這兩個因素,就是靠譜,有腦子,什么是靠譜呢?
靠譜就是別人一想起你,就會覺得有一種信賴感,他覺得這個人行。那什么是有腦子呢?就是比較靈活,不做作,做事情總是有門路,這個就叫有腦子。
第二個就是膽大心細(xì),樂觀。我們做事情一定要膽大,敢于去嘗試,然后我們一定要樂觀,為什么要樂觀呢?
福禍?zhǔn)窍嗤ǖ模懈?赡芫陀械湥械溇陀懈?。有句古語,福兮禍所伏,禍兮福所倚,就是無論發(fā)生什么事情,大家一定要樂觀,可能一件壞事,等你過了一個月看仍然可能是一件壞事。
但是過了兩個月或者兩年或者十年你再來看,這個事有可能是好事,所以一定要樂觀。
第三個就是要么忍,要么狠,要么滾。這句話在什么時候適用呢?大家如果真的碰上一些坎坷了,尤其是在工作上碰到一些坎坷,不用糾結(jié),不用懊惱,也不用沮喪,這三條路中挑一個就可以了,往前走,因為糾結(jié)也沒用。
最后一個就是要善于交流。大家聽起來好像是侃侃而談的人就是善于交流,比較圓滑的人善于交流,但是實際上這個并不是善于交流,那什么是善于交流呢?
第一,你要善于思考,你要善于站在別人的角度來看待你自己,你也要善于站在別人的角度看他自己,這個才叫善于交流,這樣你跟別人才能有交流。
就拿現(xiàn)在一個心理學(xué)非常流行的話來說,叫同理心,說白了就是你要能站在別人的角度來看事。
但是我剛才說的比這個要求更高,就是你站在別人的角度,不但能看他自己,你還要能看你自己,所以這個才叫善于交流。