技術人如何修煉內功(高級篇)
技術人為何要修煉好內功
記得在大學里學習思想政治課中有一條原理是“科學技術是第一生產力”,可見科學技術對于人類的發展有多么的重要,從人類開始制作工具、種植農作物、發明造紙術、發明火藥等,在歷史的長河中,無一不是科學技術在推動著人類的發展,到了現代的工業革命、計算機革命,再到網絡互聯、區塊鏈和人工智能,科學技術不斷的把人類帶入新時代,可見沒有科學技術就沒有我們人類現在的發展。
在我們飛速發展的IT時代,科學技術更是人類發展的源動力,對于我們IT人,技術是我們做事兒的核動力,沒有了技術我們很難體現我們的個人價值,但是,在做好技術、用好技術的同時,我們不能忽略我們是社會人,在大千社會中我們除了創造價值,我們還需要體現創造的價值,推廣我們的成果和產出,保護我們的價值,讓更多人接受我們的技術價值。從另一方面講,技術是推動我們前行的動力,但是我們前行的方向也至關重要,我們必須保證前行方向的正確性,否則我們就會走錯路走彎路,因此,我們在掌握好技術的同時,我們需要修煉好內功,起航之前我們要設定合適的目標,否則就更容易在茫茫大海中偏離方向。
2017年8月6日,筆者在趣直播組織的百人規模的2017技術人成長交流會上分享了關于《技術人如何修煉內功》的主題,會后有好多小伙伴與筆者探討技術、架構、人生、生活、工作和思想等,筆者決定將更多的內容納入《技術人如何修煉內功》這篇文章,幫助更多的小伙伴在專研技術的同時,也多抬頭看看是否偏離了自己既定的方向,或者抬頭看看是否走了彎路而捷徑就在身邊,總結成一句話就是:低頭干活,抬頭走路。
計算機基礎知識的修煉
我們在大學里計算機專業都會系統化的學習計算機等相關技術,但是這些技術通常會被IT行業從業者忽略掉,尤其在互聯網行業,我發現很多學經濟的、學語言的小伙伴也過來從事IT行業,有些做的還不錯,這是因為互聯網處在風口,機會多,這些小伙伴即使對計算機原理一無所知但是有其他的才能,也能找到適合自己的位置,但是我還是推薦小伙伴們,既然做IT行業,就一定要有技術功底和內功,不要憑空的構建空中花園,這樣地基不穩,也難以支撐你一直走下去。
對于基礎的計算機知識,最重要的兩個方向就是操作系統和網絡、算法和數據結構。
操作系統和網絡
互聯網里面最大的應用場景就是高并發、高可用、高性能的線上服務,做這類系統實際上考驗的是我們對操作系統和網絡的理解,任何一個系統最后都是運行在操作系統之上的,也都是運行在網絡之上的,包括分布式系統,所以,對于操作系統和網絡本身一定要有較深的造詣,尤其對于高并發和高性能,如果對操作系統原理一無所知,基本很難理解到什么是并發和鎖,很難理解到高性能用什么指標來衡量,以及怎么實現高并發、高可用和高性能。
對于操作系統,我們必須了解CPU的多核體系結構、內存分頁和緩存技術、磁盤IO的優略和網卡IO的情況,并且要理解計算機的工作原理,并且會根據這些指標粗略評估服務能夠輸出的性能。
對于網絡,必須理解理論上定義的7層模型,了解TCP/IP的三次握手,另外由于我們在分布式服務架構中多數使用應用層的HTTP協議,我們需要對HTTP協議理解的很深刻。
算法和數據結構
應用層面的小伙伴們可能對算法和數據結構的應用比較少,即使有應用也比較簡單,但是算法能力代表了一個人的邏輯思維和思考能力,能把各種基礎算法理解的人智商都不會低,能夠把程序寫好的人邏輯思維一定很強,另外,我一般面試小伙伴的時候,我都會考察一下小伙伴會不會高級算法,例如:遞歸、剪枝、貪婪、動態規劃,仔細想一下就會知道,會動態規劃的人,他不是勤奮的就是聰明的,無論哪一樣,你都有錄取他的沖動。
互聯網技術的修煉
在互聯網公司里,一共有3個大的方向:線上高并發服務方向、大數據方向、專家方向。
線上高并發服務方向
線上高并發服務方向是個強需求,想象一下無論你開發哪類應用和網站,線上服務都是必須的,有了服務才有了功能,才有了產品,因此筆者也主要從事互聯網后臺高并發服務的設計與實現。解決高并發服務其實并沒有那么難,這些年高并發服務的技術棧也已經沒有了門檻,只要可以投入足夠的成本,構建可伸縮的服務不是問題,達到多大的TPS也都不是問題,核心思想就是"分而治之,大而化下,小而化了。
無論是使用緩存抗讀、使用消息隊列抗寫、數據庫分庫分表、緩存分片、應用層伸縮、減少競爭、7層負載均衡、三四層負載均衡等、CDN、DNS輪訓等等,這一切的一切都是"分而治之"的思
想。
分而治之并不是一個新概念,周朝的周天子實施分封制,冊封自己的親戚為諸侯,受封的諸侯能夠有效地管理地方,為周王提供貢賦等經濟來源,戰時為周王提供軍隊,聽從周王調遣。周朝繁榮昌盛了幾百上千年,但是,受封諸侯隨著自身實力的增強壯大,對抗周王、不聽從周王調遣的情況越來越嚴重,導致周朝王室衰落,最終崩潰瓦解,這和我們分布式服務一樣,當系統的功能變多了,通過拆分可以化解復雜的系統為多個微小的職責單一的微服務,各個微服務完全自治,通過互相通信協調共同完成一個大任務,然后,不一致的問題就出現了,這也是一個亟待解決的問題。
另外,互聯網的項目注重非功能質量,我把這些主要的非功能質量成為六脈神劍:一致性保證、高性能、高可用、可伸縮、可擴展、安全性,每個主體就是一個方法論,每個方法論就想楊過手中的玄鐵重劍,大家可以參考《分布式服務架構:原理、設計與實戰》一書。
學技術得學它的內功,內功就是基礎,不要一味的去追求高大上的技術,而是要尋根究底,撥開現象看本質。記得一個小伙伴在【云時代架構】技術社群里提出一個問題,問題顯得非常的骨干:“如何實現10ms延遲的內存計算”,這個問題聽起來確實很高大上,首先有內存計算,然后還有10ms的延遲,聽起來可是一個高手提出的問題,但是仔細想一下,這里的內存計算其實是直接陷入了方法,10ms是目標,但是沒有詳細說明什么樣的場景下,有什么樣的數據,數據的特點是什么,怎么分布的,要從數據中如何分析,使用什么規則找到什么樣的結果,因此,對這類問題的討論通常是無效的,大家各抒己見,有人說用spark實現,有人說用storm實現,實際上在問題沒有明確之前,使用什么技術都難以回答這類問題,想一下分布式系統中,機房一個來回的網絡通信都需要幾個毫秒,不從系統和網絡的基礎上評估,又如何能解決好這類問題呢?
大數據方向
大數據是最近比較火的方向,大小公司都在使用大數據技術,大公司使用大數據分析從眾多數據中分析出來業務模型,得出有價值的結果,來幫助企業制定市場和銷售策略,中小公司多數使用大數據出報表和做風控等。
所有的大數據技術的根基都來自Mapreduce、Gfs和Bigtable這三篇論文,推薦大家閱讀一下以下論文:谷歌大數據的三駕馬車
理解了這些基礎技術原理,再去學習hadoop、hbase、storm、spark、cassandra、mangodb、es等都不是問題。
專家方向
還有一個比較大的方向,就是專家方向,例如:DBA、性能專家、安全專家、區塊鏈專家、人工智能AI專家等。
面試官眼里的優秀技術候選人
作為一個面試官,這兩年內筆者面試了無數的候選人,筆者通常通過知識的廣度、深度和高度三個維度來衡量一個候選人。
對于知識的廣度就是天馬行空的聊技術,或者簡歷寫什么主題就聊什么主題,主要看候選人做過哪些工作、使用過哪些工具、解決過哪些問題、會哪些計算機語言等。
對于知識的深度我會讓候選人自己選擇主題,然后深入探討,有的候選人會一時不知道如何挖掘自己的深度,那么筆者就會挑幾個關鍵點,例如:GC、索引、鎖、并發等深入探討。建議每個候選人都要挑選幾個主題深入學習和探索,并總結落地,象征著進行技術科研的能力。
高度就看這個人的思維模式,會不會換位思考,能不能把握大的方向,是否從生產力和產出的角度來看待技術的價值。
另外,在選擇人才的過程中,有人想選擇絕對忠誠的人,不過,絕對忠誠是個偽命題,與其要求人家忠誠還不如滿足人家的需求,人家才會給你好好干活。
做事的內功
做事兒是需要有能力的這話不假,但是有了能力,我們也要保證做事兒的方向的正確性,南轅北轍的方法實在是不可取,即使再努力也無法達到目標。
目標、原則、方法、結果
這里我要給大家介紹的是一個做事兒的方法論,這個方法論包括:目標、原則、方法、結果。
做事兒要先制定目標,只有目標明確了,后面做的事情才是有意義的,其次就是要有原則,建立自己的底線,也要為事情建立底線,底線是說什么事兒不可以做、什么事兒不能做。
為了實現目標,可以有很多不同的方法,我們要選擇最適合的,而不是最高大上的,在實現目標的時候,要有明確的計劃,要懂得項目管理,懂得時間管理和目標管理。
任何的事情最終都會有一個產出和結果,要檢查最終的結果是否與最初的目標對應,如果沒對應到一開始設立的目標,就說明偏離目標,需要反思自己在這過程中存在的問題和不足。
慎用我以為
經常聽見小伙伴們會說:“我以為,我認為”,尤其我聽見有些講師在臺上講的時候,也會說這類不確定的詞匯,這是非常不可取的,這些主觀的詞匯基本不能描述一個客觀的事實,建議換成這些表達,我們推薦做什么,必須做什么,禁止做什么。
高效溝通
在生產實踐中,我發現了小伙伴在溝通過程中,會出現3種異常的情況:
- 兩個人溝通完畢后,A認為B應該懂了,但是B確實沒懂。
- 兩個人溝通完畢后,A認為B懂了,B也認為自己懂了,但是A和B的想法不一致。
- 兩個人溝通完畢后,A認為B懂了,B也說自己懂了,但是B內心里面其實沒懂。
無論哪種情況,都會影響溝通的效率,我們應該盡量用常識溝通,溝通完確認是否對方理解了,不能假設對方理解了,也不能假設自己理解了,必須達成共識后,才算溝通完畢。
另外一方面,假如兩個人討論一個事情,假如兩個人達成共識有多個,一部分達成了共識,一部分沒有達成共識,例如:討論項目有10個,只有1個沒有達成共識,其他9個都達成了共識,這時候就需要分開來看,達成共識的可以開始計劃和實現,未達成共識的可以繼續尋找解決方案,不能因為一個事兒沒有達成共識,就認為所有的事兒都沒有達成共識。
那么對于一個人來講,什么是善于溝通呢,善于溝通并不是侃侃而談,也不是非常會來事就是會溝通和交流,而是要能站在別人的角度考慮事情,具有同理心,了解對方的目的和期待,才能更容易的做有效的溝通。
解決有效的問題
無論我們是在定義產品還是定義一個品類,我們都需要找到當前的痛點,從痛點出發才能改變現狀,推動世界進步。因此,無論我們是做一個創新還是完成一個目標,其實我們都是在解決一個問題,筆者最近發現很多小伙伴在解決一些無效的問題,或者解決一些不存在的問題,還有些不知道在解決什么問題,這都是非常不可取的,因此,小伙伴們在解決問題的時候,一定先把問題了解清楚,了解了來龍去脈再去針對問題提出有效的解決方案,千萬不要一上來就直接陷入細節和方法,那樣就會以偏概全,斷章取義,就會不知道問題是什么,或者解決無效的問題,做無效的溝通。
國際上有一個著名的解決問題的方法論叫KT,大家感興趣的可以參考:The problem solving methodology of Kepner-Tregoe
解決問題的時候切記不要用一個錯誤掩蓋另外一個錯誤,要尋求方法徹底解決問題,而不要把問題遺留下來,久而久之遺留的問題多了,量變導致質變,就會發生大問題,電影《深海浩劫》里講述了石油公司為了趕進度和工期,不按照既定流程和規范進行生產作業,對已經發現的問題視而不見,最終導致了海上油井爆炸,釀成了多人死亡的嚴重事故。
任務分配
我一直認為每個人都是一個管理者,沒有下屬的小伙伴需要管理自己的時間、資源、情緒和項目,有下屬的小伙伴還要管理下屬小伙伴的目標、方法和結果,因此,任何人都需要有管理的技能。
這里我要提醒讀者的是,管理者分配任務一定要聚焦、具體、明確。如果是給下屬分配任務,一定要邊界清晰,不要一個任務分給了2個責任人,2個責任人就等于沒有責任人,這和一個和尚有水喝、兩個和尚抬水喝、三個和尚沒水喝的典故如出一轍。
做人的內功
人分為平庸的人、聰明的人和智慧的人,平庸的人會多次的掉入同樣的坑里,聰明的人是掉進坑里后下次就會避免,智慧的人聽別人講述掉坑里的故事自己就能繞過坑,大家都要做智慧的人,學習前人分享的干貨。
別人對你的印象其實離不開兩個因素,靠譜和有腦子??孔V就是要讓人對你產生信任感,有腦子就是靈活、不做作、做事有條理。
其次就是膽大、心細、樂觀,做人一定要敢于去嘗試,也要樂觀,所謂福禍相依,無論發生什么事都要樂觀,一個事情過去了1天、一個月、一年,回頭再去看事情的重要程度和后果是不一樣的,有可能從壞變好,也有可能從好變壞。
如果遇到一些坎坷,尤其是在工作中,不用糾結、不用懊惱也不用沮喪,要么忍、要么狠、要么滾,從這三條路中選一條就好了,因為也沒有別的辦法可走。
有一種人很善于思考,會剖開現象看本質,還有個一種人是自己不會思考,但是你告訴他思考,他就會沿著你說的想法來思考,這種也很不錯,我們都要爭當做善于思考的人,因為思考才有創新,才能使人進步。
另外,每個人生活的背景不同、環境不同,每個人的成長軌跡也不同,因此,人不要去與別人攀比,要給自己制定一個明確的進步計劃,與之前的自己比進步就足夠了,當然也不能失去進步的動力。
最后,要早結婚,早生小孩,早買房,因為早結婚早生小孩就會早買房,早買房大家都懂的。
點擊《技術人如何修煉內功(高級篇)》閱讀原文。
【本文為51CTO專欄作者“李艷鵬”的原創稿件,轉載可通過作者簡書號(李艷鵬)或51CTO專欄獲取聯系】