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