上大一時有個同學這么跟我說:
哥們,我都想好了,下面我列了個單子就學下去了: C, C++, C#, Java, J++, J#, javascript, PHP, HTML, css, python, Visual Basic,Win32的匯編,……,你覺得怎么樣。
我和周圍小伙伴簡直都驚呆了,我連寫Hello World都不太利索啊,這人簡直太厲害了。
然而幾年以后我看到莊子說了這么一句話:
以有限的生命去追隨無限的東西,吃棗藥丸!
醍醐灌頂。
知識技能是無窮無盡的,這就好像全國各地的小吃攤一樣,只要你肯投入,吃到死也吃不完。這個道理相信所有人都懂。但為啥一到自己要學的時候就想這也學那也學,學到最后貌似還是沒把事情辦成?
學習是有成本的
老一輩總是這么教導,”學好數(shù)理化,走遍天下都不怕“。又或者,總是覺得“藝多不壓身”,多學點總是沒壞處。大道理還算對,但是有個關鍵點估計大部分人都不怎么考慮——學習的投入成本。
學習的投入是驚人的,尤其是極度改變思維方式的學習。一個普通人到熟知微積分、非歐幾何,可能需要巨大的時間和資源來扭轉(zhuǎn)自己的腦子,使其變成總是習慣用絕對的邏輯思考;學習藝術設計就完全反過來,腦筋要為感覺讓路,感覺說high就得high;而學習計算機就更加奇葩——一邊得照顧著機器,得精確、嚴謹,而另外一邊得就讓人爽,用戶使用流暢,數(shù)據(jù)看起來符合心理預期。
你說說這個得多難學。
學習成本很大的一塊是時間。
孔子這樣說過:
學習了卻不過腦子,就會犯二;而成天瞎想?yún)s不學習,就會掛科!
深以為然。
時間都被學習擠占了,就沒有功夫思考了。思考什么呢?比如
學習的產(chǎn)出是有限的
即便學到了,任何知識技能都只能在特定條件下才能發(fā)揮作用。舉個例子,你計算機再棒,把你扔一個沒電的村子里,你學的東西有啥用?嗯,有點極端,再說幾個靠譜點的例子:
- 學了REST和圍繞REST的一坨工具,卻發(fā)現(xiàn)業(yè)務中壓根就不是正常的CRUD,也不好定義那個“資源”
- 學了Hadoop,Spark,F(xiàn)link,想做數(shù)據(jù)分析,結果發(fā)現(xiàn)公司里就兩臺機器,幾百萬行數(shù)據(jù)
- 學了高大炫酷的微軟技術,想寫個界面卻發(fā)現(xiàn)世界已經(jīng)被移動終端占領了,是app、Web和微信的天下
- 搞明白了操作系統(tǒng)調(diào)度的種種細節(jié),其大部分企業(yè)用不著這門手藝,需要這門手藝的不招你
- ……
所以,我在讀個書之前,會讀摘要和推薦文字,就是要以最小的代價弄明白這個東西對我有用沒用。永遠不要用“炫酷”來給自己要學的東西排序。性價比才是第一位的。
有人可能會問,“我會的東西不懂,就得多學打好基礎”。我是贊同的。在這個階段,還談不上能夠計較得失的時候。但是,這個階段,最重要的不是“多學”,而是“巧學”,因為——
要學的東西可能會縮水
這一點在IT圈尤其明顯。IT圈猶如江湖,各大門派紛爭不休。各家都要推廣自己的技術、產(chǎn)品、規(guī)范、框架、標準、文化。圍繞這些形成了所謂的技術圈,以及帶來的巨大的市場。
但是切記,巨頭們爭他們的,我們過我們的。沒有皇帝命莫操皇帝心。爭斗中有成功者(如H5),有失敗者(如Flash)。而成功的也不一定能長時間挺下去(比如IE)。
我經(jīng)歷了經(jīng)歷了Win32 API, MFC, COM, ATL, 幾代.Net的歷程,最后連我自己都煩了,因為學的東西還沒用到就過時了。剛學會Swift,新版本一發(fā)布就不兼容,得重學;還沒來得及開發(fā)一個賺錢的App,大家開始都投入到了微信小程序的開發(fā)……真心趕不上節(jié)奏。
既然學什么都不穩(wěn)固,那么就學兩類東西:
- 馬上能上手用起來的
- 可能長久有效的東西,可以跟一輩子的
前者大家都懂,自己的工作需求被老板扔過來,怎么做的快、靈活、高效就怎么來。如果技術有得選,選擇容易學、概念清楚簡單、不過于裝的技術。這也是為什么很多業(yè)務場景腳本語言(比如python和js)和松散的約定(比如html)更吃香的地方——學了用,用完了就完了,不糾結。
而對于第二類
什么東西學的不吃虧
無數(shù)的牛人在不斷的踩坑中總結了大量的經(jīng)驗。有些經(jīng)驗是超越了技術的自然規(guī)律——即,不管技術怎么變,抽象如何增加,也無法徹底隱藏/抽象的東西。了解它們,基本上就可以吃透大部分的技術出現(xiàn)的動機和工作原理;
- 存儲 - 即數(shù)據(jù)寫入/查詢。不管干什么,總是要把數(shù)據(jù)用某種格式存到某個地方。不同存法有快有慢,有的便于寫,有的便于查。有的在磁盤上工作的好,有的更利于SSD。以此為中心有數(shù)據(jù)結構、文件系統(tǒng)、B樹、LSM、Cache、SQL、索引等主題。
- 任務調(diào)度 - 人類之所以能站在生物鏈的頂端,是因為人能夠組織起來協(xié)調(diào)完成任務。計算機干活也類似,那么怎么調(diào)度幾個核心協(xié)同工作是很重要的內(nèi)容。圍繞這個主題,有了進程、線程、協(xié)程、事件觸發(fā)、并行/并發(fā)等內(nèi)容。
- 分布式的一致 - 即A和B是兩個分離的東西,A告訴B一件事,那么如何保證A說的和B聽到的就是一摸一樣。如果保證不了,又怎么做取舍。這個是現(xiàn)代分布式系統(tǒng)立足的基礎。圍繞這個問題衍生了網(wǎng)絡、通訊協(xié)議和一致性協(xié)議等等。如果你接觸的東西和分布式有關(比如Web,移動),那么必須非常細致的理解怎么做能達到一個什么樣的一致。
- 狀態(tài)機 - 計算機的經(jīng)典思考方式。編程語言編譯需要、網(wǎng)絡通訊需要、甚至是常規(guī)業(yè)務也大量需要(比如一個人先答題,答了題才能拿券,拿了券下單才能優(yōu)惠,優(yōu)惠發(fā)生了才能發(fā)通知——一組狀態(tài)切換)。
- 安全 - 計算機天然的狀態(tài)是開放的。所有的約束都是在開放的基礎上追加上去的。那么在一個系統(tǒng)中一條數(shù)據(jù)是怎么在可接受的代價內(nèi)無法輕易被惡意第三方獲取/篡改?基于這個中心,有對稱/非對稱加密,SSL協(xié)議,加Salt,Token編碼,ACL管理,CSRF,注入等話題。
而這些,在后續(xù)的文章里,都會按照主題分期討論。
那什么是不那么有價值的東西呢?對比一下SQL和JPA,前者非常有價值。而后者卻相對不那么有用。SQL存在了數(shù)十年,成為這個星球上主流存儲的訪問語言,幾乎涵蓋了各種你能想得到的場景;而后者僅僅是一種編程語言下的一個框架下的一種特定用法,業(yè)務稍一復雜就無法解決問題。如果真要在二者之間分配時間,我猜應該是9:1。
結論
其實,學習是一門投資。而對待投資,就要
- 算計投入產(chǎn)出
- 不要被別人牽著鼻子走,學能用得上的
- 找到有長期價值的學習目標。
最后記得,不要忘記莊孫兩位老夫子的話,用有限的生命去思考那些最有價值的東西吧。
PS
那個大一的哥們怎么樣了?他之后回了老家做了小生意,有車有房,去了老婆,生了娃,還辦了個廠。生活滋潤幸福美滿,真人生贏家。至于這個語言,那個語言什么,不提也罷。