程序員大致可以分為三類:碼農(nóng)、工程師、高級工程師
- Level 1 - 碼農(nóng)
能做事,但缺乏思考,Coding只是體力活。 - Level 2 - 工程師
不盲目,懂得思考與進(jìn)步。 - Level 3 - 高級工程師
不止有足夠的思考,還具備解決復(fù)雜問題的能力。
從碼農(nóng)到工程師并不難,只要懂得不盲從、主動思考、學(xué)習(xí)、改善就可以很容易進(jìn)入工程師的行列,但是大多數(shù)就止步于工程師了,因?yàn)橐獜墓こ處煶砷L到高級工程師,需要解決復(fù)雜問題的能力。
什么是復(fù)雜問題
首先明確一點(diǎn):
解決問題 ≠ 解決復(fù)雜問題
問題 = problem
復(fù)雜問題 = ( complex + complication ) problem
complex,說明問題是復(fù)合的,是多個領(lǐng)域復(fù)合在一起組成的問題
可以是技術(shù)上的復(fù)合,比如
數(shù)據(jù)結(jié)構(gòu) + 操作系統(tǒng)原理 + 網(wǎng)絡(luò) + 分布式 => 分布式數(shù)據(jù)庫問題
也可以是非純技術(shù)的復(fù)合,比如
產(chǎn)品思維 + 溝通能力 + 架構(gòu)能力 + 代碼能力 => 將業(yè)務(wù)需求落地
complication,說明問題是復(fù)雜的,需要系統(tǒng)性思維、嚴(yán)謹(jǐn)?shù)膯栴}分析能力,抽絲剝繭才能找到問題的根源并解決。
如何具備解決復(fù)雜問題的能力
引用曾經(jīng)高級Node.js,如今的初級Ruby/Rust/Go工程師兼SRE對我說過的一句話:
未來最值錢的技能,第一個就是“解決復(fù)雜問題的能力”,
技能表上是沒有 Node.js,沒有Go,沒有MySQL,沒有Web開發(fā)的。
解決復(fù)雜問題的能力需要你有系統(tǒng)性思維,嚴(yán)謹(jǐn)?shù)姆治鰡栴}能力,溝通能力和組織管理能力。
技術(shù)變化得太快,每段時間都會有新的技術(shù)、新的工具出現(xiàn),大多數(shù)程序員都覺得疲于應(yīng)付,每當(dāng)有新的技術(shù)出現(xiàn),大多數(shù)程序員的學(xué)習(xí)路徑是這樣的:
看“Quick Start”/ 實(shí)操教程 => 跟著操作 => 好像會用了
遇到問題后卻不知道原因在哪里,如何解決,開始Google,然后一個個解決方案地嘗試,嘗試到第 Math.random().toInteger() 種的時候,終于解決問題,然后覺得自己真牛逼,又解決了一個問題。
解決問題的路徑是:
搜索解決方案 => 從里面看到別人分析的原因 => 自己不一定看懂了分析,但是先用這個方案試試再說 => 薛定諤的解決
其實(shí)這樣并沒有真的解決問題,因?yàn)樗恢涝蛟谀睦?,為什么采用這個方案,是否有其他方案,每個方案的優(yōu)劣在哪里,下次再出現(xiàn)原因類似,但表現(xiàn)不同的問題,他就又不懂得該如何解決,甚至也同樣找不到原因在哪里。
解決問題的步驟應(yīng)該是:
分析問題 => 猜想 => 驗(yàn)證猜想 => 找到原因 => 構(gòu)建解決方案 => 驗(yàn)證解決方案 => 解決
這才是一條完整的“解決問題”的路徑。
很多人在第一步就失敗了:分析問題,一頭霧水不知道從哪里下手。
要分析和解決問題首先要求你有足夠的前置知識,對這個問題所涉及到的原理有足夠的了解,分析問題是知識的反推,解決問題是知識的順推。
只要提升相關(guān)知識的掌握程度,分析與解決問題的能力就能明顯提高。
1. 基礎(chǔ)知識很重要(深)
我們所使用的任何一門技術(shù),都有一個漏斗狀的知識體系,這門技術(shù)在漏斗最上層,而它基于它下層的所有基礎(chǔ)知識構(gòu)建,每一層都是基于下層構(gòu)建,比如MySQL:

先問一個問題,數(shù)據(jù)庫一個表中,頻繁一起讀取的數(shù)據(jù),該怎么存,讀取速度比較快?
你可能說得出,要把它們主鍵相鄰存在一起,但是你可能不知道,為什么要把它們主鍵相鄰存在一起。
因?yàn)橹麈I相鄰存在一起的數(shù)據(jù)會被寫到連續(xù)的頁(Page)中,相對連續(xù)的頁,數(shù)據(jù)庫會在磁盤上盡量分配連續(xù)、鄰近的空間,可以將隨機(jī)讀變成順序讀,并且通過系統(tǒng)調(diào)用read(start, length)每次讀出一頁,每頁中包括盡量多的結(jié)果,那么需要讀取的總頁數(shù)也會降低。如果不存在一起,那么隨機(jī)讀使得硬盤無法進(jìn)行預(yù)讀優(yōu)化,如果是機(jī)械硬盤還需要增加額外的尋道時間,且需要讀取的總頁數(shù)也增加。
數(shù)據(jù)庫的一個小常識,竟然涉及到了硬件、操作系統(tǒng)、數(shù)據(jù)庫原理,你以為常識就是常識,但是其實(shí)這個常識也是被推論出來的,不懂得底層的知識,常識只能靠死記硬背,遇到更復(fù)雜的問題,就不知道如何分析了,因?yàn)榉治鍪菍訉舆f進(jìn)的,如果你只懂一層,不懂下面的層次,就沒法深入。
程序員不學(xué)基礎(chǔ)知識就像做醫(yī)生不學(xué)解剖,不是需要上手術(shù)臺的醫(yī)生才需要學(xué)習(xí)解剖,了解人體的基本構(gòu)造、各個生理組織間的協(xié)作關(guān)系是分析問題的基礎(chǔ)要求,不了解這些基礎(chǔ),根本無法進(jìn)行精確的診斷。
由于每個技術(shù)的知識體系都是漏斗狀,所以大量的頂層技術(shù)、工具都依賴著少量的、同質(zhì)化的基礎(chǔ)知識,只要學(xué)習(xí)有限的基礎(chǔ)知識,就能對大量的頂層技術(shù)觸類旁通、舉一反三,可以降低未來的學(xué)習(xí)成本與學(xué)習(xí)難度以及加深理解的深度。
2. 如何學(xué)習(xí)基礎(chǔ)知識(由廣及深)
學(xué)東西,結(jié)合應(yīng)用場景很重要。重要的話說三遍,結(jié)合應(yīng)用場景,結(jié)合應(yīng)用場景,結(jié)合應(yīng)用場景。
相對于基礎(chǔ)知識,現(xiàn)成的一些頂層技術(shù)、工具更容易讓我們有興趣去學(xué)習(xí),原因就是頂層的技術(shù)能夠馬上被我們結(jié)合到相應(yīng)的應(yīng)用場景:
學(xué)Node.js,我們知道它是可以做服務(wù)端編程的,30分鐘讓我們搭出一個服務(wù)器。
學(xué)MySQL,我們知道它是做數(shù)據(jù)存儲的,幾個SQL就滿足應(yīng)用的數(shù)據(jù)持久化。
學(xué)k8s,我們知道它是做容器編排的,能夠讓我們簡單地部署應(yīng)用集群。
但是學(xué)基礎(chǔ)知識,就無法結(jié)合相應(yīng)的應(yīng)用場景:
學(xué)計(jì)算機(jī)組成原理,我又不去裝電腦,它對于我有什么幫助?
學(xué)操作系統(tǒng)原理,我又不去開發(fā)操作系統(tǒng),也不做什么基礎(chǔ)開發(fā),它對于我有什么幫助?
學(xué)數(shù)據(jù)結(jié)構(gòu),我又不是搞算法,它對于我有什么幫助?
這樣一想,基礎(chǔ)知識真的沒有學(xué)習(xí)的動力…
所以我們應(yīng)該先挑一門自己想要了解的頂層技術(shù),先通過優(yōu)秀的資料了解這個技術(shù),把自己能學(xué)懂的先學(xué)懂,不懂的可以僅僅瀏覽,有個印象,知道哪里不懂,知道自己學(xué)不懂是因?yàn)閷κ裁磫栴}不了解。
然后總結(jié)這些自己不懂的點(diǎn),是涉及到了哪些自己不了解的前置知識,所以學(xué)不懂。我們每次可能只能往下推一層,比如學(xué)習(xí)MySQL時,只能總結(jié)出自己遺漏的前置知識是數(shù)據(jù)庫原理,而很難知道自己還應(yīng)該補(bǔ)充操作系統(tǒng)的知識,這是很正常的,學(xué)習(xí)也是層層遞進(jìn),越挖越深。當(dāng)我們開始學(xué)習(xí)數(shù)據(jù)庫原理的時候,又會在數(shù)據(jù)庫原理學(xué)習(xí)的過程中發(fā)現(xiàn)自己有遺漏的前置知識,比如操作系統(tǒng)。這樣學(xué)下來,不僅不會浪費(fèi)時間學(xué)習(xí)無用的知識,且每個基礎(chǔ)知識都是帶著問題去學(xué),帶著問題往下挖,學(xué)到對應(yīng)基礎(chǔ)知識的時候,都能馬上與上一層的應(yīng)用場景相結(jié)合,更容易理解。
尋找優(yōu)秀資料 => 能學(xué)懂的就學(xué)懂,不能學(xué)懂的瀏覽即可,記住自己迷惑的點(diǎn) => 根據(jù)自己迷惑的點(diǎn)思考是缺少哪些前置知識 => 進(jìn)入下一個循環(huán)(尋找前置知識的優(yōu)秀資料)
3. 實(shí)踐
由廣及深學(xué)習(xí)了相關(guān)基礎(chǔ)知識后,應(yīng)該只是到了理解的地步,還不算是吸收。
紙上得來終覺淺,絕知此事要躬行。
只有將理論上的理解實(shí)踐起來,試一試才知道自己的想法是否正確,在現(xiàn)實(shí)系統(tǒng)各種復(fù)雜的情況下,如何將理論與實(shí)踐結(jié)合。
第一步可以是自己試,隨便搭一個環(huán)境嘗試,但是這種情況有限制,就是這是“假”環(huán)境,過于簡單了,也缺少真實(shí)數(shù)據(jù)填充與真實(shí)應(yīng)用場景檢驗(yàn)。
現(xiàn)實(shí)工作中所面臨的問題會更加復(fù)雜也會更加豐富,能更快吸收一個知識,所以更好的方式是找到能夠運(yùn)用自己所學(xué)的平臺,進(jìn)入一家團(tuán)隊(duì)精煉、業(yè)務(wù)量大、發(fā)展速度快、重視技術(shù)的公司。(這里順便打個廣告,AfterShip符合以上所有要求,并且正在招聘各種工程師,如果有興趣,簡歷可以發(fā)到hjaurum@gmail.com)
4. 表達(dá)與溝通
一個人的既有知識、技能、信息量都非常有限,工作中我們都是與他人配合才能做好一個業(yè)務(wù)。
項(xiàng)目前期需要與產(chǎn)品經(jīng)理、業(yè)務(wù)部門討論需求、理解需求,
項(xiàng)目中期需要與同事合作分工,如果是涉及多個系統(tǒng)的業(yè)務(wù),還需要與其他技術(shù)團(tuán)隊(duì)的同事溝通技術(shù)實(shí)現(xiàn),
項(xiàng)目后期需要與SRE團(tuán)隊(duì)協(xié)作部署上線。
其中涉及到人與人之間互相的信息傳達(dá),如果不能精確或者恰當(dāng)?shù)乇磉_(dá),對方可能無法理解我們的真實(shí)意思,導(dǎo)致無效或者失真的溝通,降低工作效率甚至無法獲得預(yù)期結(jié)果。
所以鍛煉自己的表達(dá)與溝通能力,也是在間接提升工作效率,并且能夠使團(tuán)隊(duì)運(yùn)作更順利,使得同一件事有更優(yōu)的工作結(jié)果。
寫博客是鍛煉表達(dá)能力的有效途徑之一,將自己學(xué)會的東西、思考的東西以講述給他人的角度寫出來,思考怎么讓讀者理解自己要表達(dá)的意思,甚至思考怎么讓讀者更簡單地理解自己要表達(dá)的意思。剛開始寫博客可能不知道如何下筆,不知道剛怎么分配章節(jié)更合理,不知道怎么組織文章的邏輯使它更簡潔、精煉、易懂,一篇博客可能要花上十幾天才能完成,但是堅(jiān)持寫技術(shù)博客,會發(fā)現(xiàn)自己組織語言的能力也在提升,每過一年,再回頭看以前的博客,會想:“我去,這竟然是我寫的?這么爛?”,壞消息是,以前寫的博客確實(shí)挺爛的,但好消息是,你現(xiàn)在一定進(jìn)步了,所以看出了它有多爛。
讀書時學(xué)渣一枚,我的作文能力也是非常非常差,逼著自己堅(jiān)持寫一些技術(shù)博客,不止是總結(jié)所學(xué)的東西,更是提升自己的表達(dá)能力。
自己學(xué)明白一個東西是最簡單的,但怎么表達(dá)出來讓別人也聽懂,是非常非常難的,寫博客是一件雖然困難但有收獲還有成就感的事,值得堅(jiān)持,等到寫博客對我來說變得簡單的那天,我一定很牛逼了。
5. 健身
有句古話:磨刀不誤砍柴工。
還有句比較新的話:堅(jiān)持做不緊急但重要的事。
深以為然。
當(dāng)你在技能、思維等所有軟件層面都成為高級工程師的時候,還需要讓你的硬件跟上步伐。
“解決復(fù)雜問題的能力”就是說不止得有“能”,還得有“力”,身體健康非常重要,這不止是為了讓自己過得開心,對自己的家人負(fù)責(zé),更是讓自己有精力和身體資本去應(yīng)對各種壓力。
保持每2 ~ 3天健身一次,每次1 ~ 1.5小時,堅(jiān)持下去,就能保證自己在未來20年都有充足的精力和健康的身體去學(xué)習(xí)、工作、應(yīng)對壓力。
雖然健身暫時會占用你一些時間,但是它可以讓你長跑下去,如果不健身,也許你每周可以多用幾個小時工作、學(xué)習(xí),但是這只是短時間的沖刺,沖刺的人能跑的距離還是不如長跑的人,人生幾十年,是長跑不是沖刺。
寫在最后
世界上有四類事,我們放眼整個人生來看一看:
- 重要且緊急:每天份內(nèi)的工作、生存、生病了看醫(yī)生
- 重要但不緊急:學(xué)習(xí)、健身,每一件長期堅(jiān)持可以讓未來變得更好的事
- 緊急但不重要:購買生活用品、食品
- 不緊急也不重要:刷淘寶、刷劇、睡懶覺

大多數(shù)人都只做了1、3、4,很少去做2,首先他們可能不清楚什么是重要但不緊急的事,其次是因?yàn)樗麄兒茈y堅(jiān)持長期做重要但不緊急的事。
如果無法堅(jiān)持做重要但不緊急的事,生活中就有出現(xiàn)各種緊急的事讓你焦頭爛額,比如不堅(jiān)持健身,就容易生病需要請假看醫(yī)生也沒有精力做其他事,由于缺少精力,又會使得工作能力下降收入降低生活質(zhì)量降低。
堅(jiān)持做重要但不緊急的事,會讓未來穩(wěn)步上升,只著眼于重要且緊急的事,那生活中只會有越來越多重要且緊急的事需要你處理。應(yīng)該用長遠(yuǎn)、發(fā)展的眼光去規(guī)劃自己每段時間需要做的事。
磨刀不誤砍柴工,非常有道理。
(這篇只是吹吹牛的博客也花了2個晚上+2個早上,寫了6個小時,可見寫博客之艱難…)