這篇文章的主要內(nèi)容主要是我今年 3 月份在騰訊做的直播,主要是想讓一些技術(shù)人員對世界有一個大體的認(rèn)識,并且在這個認(rèn)識下能夠有一個好的方法成就自己。而不是在一臉蒙圈的狀態(tài)下隨波逐流,而日益迷茫和焦慮。直播完后,騰訊方面把我的直播形成文字的形式發(fā)了出來,我覺得我可以再做一個精編版。所以,有了這篇文章,希望對大家有幫助。
對我來說,在我二十多年的工作經(jīng)歷來看,期間經(jīng)歷了很多技術(shù)的更新?lián)Q代,整個技術(shù)模式、業(yè)務(wù)模式也是一直變來變?nèi)ィ覀冞@群老程序員成長中所經(jīng)歷的技術(shù)比今天的程序員玩的還更雜更多。我羅列一下我學(xué)過的,而且還被淘汰掉的技術(shù),大家先感受一下。
- MIS 應(yīng)用開發(fā):FoxPro,PowerBuilder,Delphi
- OA:Lotus Notes,VBScripts
- 微軟:ODBC/ADO,COM/DCOM,MFC/ATL,J++
- 服務(wù)器:AIX,HP-UX,SCO Unix
- Web:CGI,ISAPI,SOAP
- RPC:CICS,Tuxedo
- J2EE:Websphere,Weblogic
- DB:Sybase,Informix
我想說的是,無論過去還是今天,我們這些前浪和你們后浪所面對的技術(shù)的挑戰(zhàn)和對技術(shù)的焦慮感是相似的,我們那個時候不但玩 996,還玩封閉開發(fā)(就是一周只能回家一天)。當(dāng)然,唯一好的東西,就是比起今天的程序員來說,我們那個年代沒有像微信、微博、知乎,抖音這些巨大消耗你人生的東西,所以,我們的工作、生活和成長都有很效率,不會被打斷、喜歡看書、Google 還沒有被封……當(dāng)然,那時代沒有 StackOverlow 和 Github 這樣的東西,所以,能完成的東西或質(zhì)量都一般。
當(dāng)然,這里并不是想做一個比較,只是想讓大家了解一下兩代程序員間的一些問題各有千秋,大同小異。在整個成長過程中,其實有很多東西是相通的,其本上來說,就是下面的三件事——
第一,如果想要把控技術(shù),應(yīng)對這個世界的一些變化,需要大致知道這個世界的一些規(guī)律和發(fā)展趨勢,另外還得認(rèn)識自己,自己到底適合做什么?在這個趨勢和規(guī)律下屬于自己的發(fā)揮領(lǐng)域到底是什么?這是我們每個人都需要了解的。
第二,打牢基礎(chǔ),以不變應(yīng)萬變,不管世界怎樣變化,我都能很快適應(yīng)它。基礎(chǔ)的重要程度對于你能夠飛多高是相當(dāng)有影響的,懂原理的人比不懂原理的人能做出來的事情或是能解決的問題完全是兩個層級的。
第三,提升成長的效率,因為現(xiàn)在社會的節(jié)奏實在太快了,比二十年前快得太多,技術(shù)層出不窮,所以我們的成長也要更有效率。效率并不單指的快,效率是怎么樣更有效,是有用功除以總功(參看《加班與效率》),怎么學(xué)到更有效的東西,或者怎么更有效學(xué)習(xí),是我們需要掌握的另一關(guān)鍵。
下面是我這多年來的一些認(rèn)識,希望對你有幫助。
世界發(fā)展趨勢
我個人經(jīng)歷的信息化革命應(yīng)該分成三個階段:
1990 年代到 2000 年,這個時代 MB 時代,是雅虎、新浪、搜狐、網(wǎng)易門戶網(wǎng)站的時代,這個時代就是 ISP/ICP 互聯(lián)網(wǎng)提供商,把一些資訊數(shù)字化,然后發(fā)布到網(wǎng)絡(luò)上。
2000 年到 2010 年,這個時代叫 GB 時代,或是叫多媒體或 UGC 時代,上網(wǎng)開始變得普遍了,每個人手里的數(shù)碼設(shè)備開始變得多了起來,可以上傳照片,可以上傳視頻,甚至可以在網(wǎng)上做社交。
2010 年到 2020 年,這個時代叫 TB 時代,這過去的十年是移動互聯(lián)網(wǎng)時代,移動互聯(lián)網(wǎng)只需要手機(jī)在線,不需要依靠電腦。因為手機(jī)隨時在線,所以個人的各種各樣的數(shù)據(jù)始終在被收集,只要用戶上網(wǎng)就會產(chǎn)生數(shù)據(jù),所以人的行為最終也被數(shù)字化了。
所有的硬件和軟件都是跟著需要處理的數(shù)據(jù)而演進(jìn)的,我們需要更大的帶寬,更大的硬盤,更多的處理器……大到一定時候就只能進(jìn)入分布式化的技術(shù)架構(gòu)了,再大,數(shù)據(jù)中心也頂不住了,就會要引入更為分布式的邊緣計算了。
另一方面,從業(yè)務(wù)上來看,我們可以看到整個世界就在不斷地進(jìn)行數(shù)字化,因為,只要數(shù)字化了,就可以進(jìn)行復(fù)制傳播和計算,只要可以進(jìn)行計算了,就可以進(jìn)行數(shù)學(xué)建模,就可以自動化,只要可以自動化了就可以規(guī)模化,只要可能規(guī)模化了,就可以改變整個行業(yè)。人類的近代史的大趨勢基本上都是在解決能源和自動化的事,源源不斷的能源是讓機(jī)器不知疲倦的前提條件,用機(jī)器代替牲口,代替人類進(jìn)行工作是規(guī)模化的前提條件。
所以,技術(shù)的演進(jìn)規(guī)律基本是自動化加規(guī)模化,從而降低成本,提升效率。這就是為什么世界變得越來越快,人類都快跟不上節(jié)奏的原因,主要是整個社會不斷被機(jī)器、數(shù)據(jù)所驅(qū)動。
人才需求
在這個過程中,需要什么樣的人?下面是我的一些認(rèn)識——
技工,在機(jī)器和自動化面前,肯定是需要能夠操作機(jī)器的技術(shù)工人了,這類人是有技術(shù)的勞動力。在編程的圈子里俗稱“碼農(nóng)”,他們并不是真正的工程師,他們只是電腦程序的操作員,所以,隨著技術(shù)門檻的下降或是技術(shù)形式的變更他可能就會變得越來越不值錢,直到被淘汰掉。
特種工,這種人是必須了解原理和解決難題的一類人,他們是解決比較難的、特定的一些技術(shù)問題。當(dāng)一種技術(shù)被淘汰,他并不容易被淘汰,因為他懂原理,原理就是解決問題的能力,是解決問題的套路和方法。
工程師,不但是使用技術(shù),還可以把活兒做好,他們認(rèn)為代碼更多的時間是在維護(hù),這些人使用各種各樣的手段和各種技術(shù),精益求精地持續(xù)不斷地提高代碼的易讀性、擴(kuò)展性、可維護(hù)性和重用性,這個過程似乎永無止境。對于這些有“潔癖”,有“工匠精神”,有“修養(yǎng)”的技術(shù)人員,我們稱他們?yōu)楣こ處煛_@種人做事又穩(wěn)又快,而且可以做出很多稱手的工具和方法論。
再往上是設(shè)計師和架構(gòu)人員,這些人主要是開發(fā)一些工具,框架,模式,提升軟件開發(fā)和維護(hù)效率,同時也提升用戶體驗,和提升穩(wěn)定性、性能、代碼重用等,總的來說就是為了降本增效。這類人的工作降低了技術(shù)得到門檻,他們把技術(shù)門檻降低了以后,就可以把這個技術(shù)普及開來,就可以由廣大勞工、技工、特殊工人使用了。
還有一類人是經(jīng)理,經(jīng)理主要是組織團(tuán)隊、完成項目、創(chuàng)造利潤。這類人中,即有身先士卒的 leader,也有高高在上的 boss,但無論怎么樣,這些人只不過是為了讓一個公司或是一個團(tuán)隊更好組織在一起的“粘合劑”,這類人只有在大公司中才會變成更有價值。
這就是我總結(jié)的世界需要哪些人才,我們了解這些東西以后大概就明白我們現(xiàn)在所處的位置有什么樣的問題,我們應(yīng)該去什么樣的地方。
Google 評分卡
接下來,我們再來看看 Google 的 SRE 的自我評分卡:
0 – 對于相關(guān)的技術(shù)領(lǐng)域還不熟悉
1 – 可以讀懂這個領(lǐng)域的基礎(chǔ)知識
2 – 可以實現(xiàn)一些小的改動,清楚基本的原理,并能夠在簡單的指導(dǎo)下自己找到更多的細(xì)節(jié)。
3 – 基本精通這個技術(shù)領(lǐng)域,完全不需要別人的幫助
4 – 對這個技術(shù)領(lǐng)域非常的熟悉和舒適,可以應(yīng)對和完成所有的日常工作。
對于軟件領(lǐng)域 – 有能力開發(fā)中等規(guī)模的程序,能夠熟練和掌握并使用所有的語言特性,而不是需要翻書,并且能夠找到所有的冷知識。
對于系統(tǒng)領(lǐng)域 – 掌握網(wǎng)絡(luò)和系統(tǒng)管理的很多基礎(chǔ)知識,并能夠掌握一些內(nèi)核知識以運維一個小型的網(wǎng)絡(luò)系統(tǒng),包括恢復(fù)、調(diào)試和能解決一些不常見的故障。
5 – 對于該技術(shù)領(lǐng)域有非常底層的了解和深入的技能。
6 – 能夠從零開發(fā)大規(guī)模的程序和系統(tǒng),掌握底層和內(nèi)在原理,能夠設(shè)計和部署大規(guī)模的分布式系統(tǒng)架構(gòu)
7 – 理解并能利用高級技術(shù),以及相關(guān)的內(nèi)在原理,并可以從根本上自動化大量的系統(tǒng)管理和運維工作。
8 – 對于一些邊角和晦澀的技術(shù)、協(xié)議和系統(tǒng)工作原理有很深入的理解和經(jīng)驗。能夠設(shè)計,部署并負(fù)責(zé)非常關(guān)鍵以及規(guī)模很大的基礎(chǔ)設(shè)施,并能夠構(gòu)建相應(yīng)的自動化設(shè)施
9 – 能夠在該技術(shù)領(lǐng)域出一本經(jīng)典的書。并和標(biāo)準(zhǔn)委員會的人一起工作制定相關(guān)的技術(shù)標(biāo)準(zhǔn)和方法。
10 – 在該領(lǐng)域?qū)戇^一本書,被業(yè)內(nèi)尊為專家,并是該技術(shù)的發(fā)明人。
SRE 需要自評如下這些技術(shù)或技能。
– TCP/IP Networking (OSI stack, DNS etc)
– Unix/Linux internals
– Unix/Linux Systems administration
– Algorithms and Data Structures
– C/C++
– Python
– Java
– Perl
– Go
– Shell Scripting (sh, Bash, ksh, csh)
– SQL and/or Database Admin
– Scripting language of your choice (not already mentioned) _____________
– People Management
– Project Management
這個評分卡是面試 Google 前需要候選人對自己的各種技術(shù)進(jìn)行自評,也算是一種技術(shù)人員的等級的度量尺,其把技術(shù)的能分成 11 個等級,我用顏色把其它成四大層級,希望這個評份卡能夠給你一個能力提升的參考標(biāo)準(zhǔn)。
認(rèn)識自己
認(rèn)識了世界是怎么發(fā)展的,也知道技術(shù)人員的種類和層級,那么還要了解一下自己,因為如果不了解自己,那么你也無法找到自己的路和適合自己的地方。
我覺得,一個人要認(rèn)識自己就需要認(rèn)識自己的特長、興趣、熱情、擅長等,下面是一個認(rèn)識自己的標(biāo)準(zhǔn)方法:
特長。首先你要找得到自己特長。你要認(rèn)識自己的特長,找到自己的天賦,找到你在 DNA 里比別人強的東西,就拿你的 DNA 跟別人競爭就好了。所以你要找到自己可以干成的事,找到別人找你請教的事,你身邊人找你請教就是說明你有特長。這是找到自己特長非常非常重要,揚長避短。
興趣。如果你沒有找到自己特長,就找自己有興趣有熱情的東西。什么叫興趣?興趣是再難再累都不會放棄的事。如果你遇到困難就會放棄不叫興趣,那叫葉公好龍。不怕困難,癡迷其中,就算你沒有特長,有了這種特質(zhì),你也是頭部的人才。
方法。如果你沒有特長,沒有興趣和熱情就要學(xué)方法。這種方法就是要有時間觀念,要會做計劃,要懂統(tǒng)籌、規(guī)劃對于做過的事情,犯過的錯誤多總結(jié),舉一反三,喜歡自己找答案,自己探究因果關(guān)系,這是一些方法,自己總結(jié)一些套路。
勤奮。如果你沒有特長,沒有興趣,也沒有方法,你還能做的事就是勤奮,勤奮注定會讓你成為一個比較勞累的人,也是很有可能被淘汰的人隨著你的年紀(jì)越來越大,你的勤奮也會越來越不值錢。因為年輕人會比你更勤奮,比你更勤奮、比你斗志更強,比你能力更強,比你要錢更少的人會出現(xiàn)。勤奮最不值錢,但是只要你勤奮至少能夠自食其力。
以上就是為了應(yīng)對未來技術(shù)變化,作為個人必須要從特長、興趣、方法一層一層篩選挖掘,如果沒有這些你就要努力和勤奮。就只能接受“福報”了。
從我個人而言,我不算是特別聰明的人,但自認(rèn)為對技術(shù)還是比較感興趣的,難的我不怕。有很多比較難啃的技術(shù),聰明點的人啃一個月就懂了,我不行,我可能啃半年。但是沒有關(guān)系,知識都是死的,只要不怕困難總有一天會懂的。最可怕是畏難,為自己找借口,這樣就不太好了。
打好基礎(chǔ)
最前面提到我學(xué)的各式各樣的被淘汰的技術(shù),會讓你感覺很迷茫,或是迷失。但前面也提到了“谷歌評分卡”,在這個評分卡中,我們看到了許多基礎(chǔ)原理方面的內(nèi)容,其實要應(yīng)對未來的變化,很重要的一點就是無招勝有招,以不變應(yīng)萬變。
變化都是表面的東西,內(nèi)在的東西其實并沒有太多的變化。理論層面上變得不多,反而形式上的東西今天一個花樣,明天一個花樣,所以如果要去應(yīng)對這種變化,就一定要打牢自己的基礎(chǔ),提升內(nèi)功修養(yǎng)。比如像編程的一些方式和套路,修飾模式原理本質(zhì),解耦,提升代碼的重用度等。提升代碼重用度必須解耦,要跟現(xiàn)實解耦,提升抽象,這些都是一些技術(shù)基礎(chǔ)。無論用什么語言,都是這么做的。
打牢基礎(chǔ)就可以突破瓶頸,不打牢基礎(chǔ)沒有辦法突破瓶頸。在技術(shù)世界不要覺得量變會造成質(zhì)變,這是不可能的。技術(shù)這個東西就像搞建筑砌磚頭,砌磚頭砌的再多也不可能讓你能成為一個架構(gòu)師的,因為你不懂原理,不懂科學(xué)方法,你就不可能成長上去的,就像學(xué)數(shù)學(xué)一樣,當(dāng)你掌握了微積分這種大殺器后,你解題的能力是無所披靡,而微積分這種方式絕對不是你能“量變”出來的。
所以你必須學(xué)習(xí)基礎(chǔ)的理論知識,如果不學(xué)這些基礎(chǔ)理論知識,還要學(xué)習(xí)解題思路和方法,如果你只學(xué)在表面,那么當(dāng)這個技術(shù)的形式有變化,就會發(fā)現(xiàn)以前學(xué)的都沒用了,要重頭學(xué)一遍。掌握技術(shù)基礎(chǔ)可以讓自己找到答案和知識,基礎(chǔ)是抽象和歸納,很容易形成進(jìn)一步的推論。我們學(xué)的很多技術(shù)實現(xiàn)都逃不脫基礎(chǔ)原理,不管是 Java,還是其他語言,只要用 TCP 用的都是相同的原理,逃不出范圍,只要抓住原理,舉一反三,時間一長了,甚至還可以自己推導(dǎo)答案。對于技術(shù)的基礎(chǔ),我會把其它成四類:
程序語言:語言的原理,類庫的實現(xiàn),編程技術(shù)(并發(fā)、異步等),編程范式,設(shè)計模式……
系統(tǒng)原理:計算機(jī)系統(tǒng),操作系統(tǒng),網(wǎng)絡(luò)協(xié)議,數(shù)據(jù)庫原理……
中間件:消息隊列,緩存系統(tǒng),網(wǎng)關(guān)代理,調(diào)度系統(tǒng) ……
理論知識:算法和數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫范式,網(wǎng)絡(luò)七屋模型,分布式系統(tǒng)……
這些知識其實就是一個計算機(jī)科學(xué)專業(yè)的學(xué)生他所要學(xué)習(xí)的原理,但可惜的是,我們的一些學(xué)校教得也很糟糕,不但老師能力不足,而且放著世界上最優(yōu)秀的教課書不用了,一定要自己寫一本。講也講不全,還有各種錯誤,哎……總之,如果你學(xué)習(xí)用用到的教材不行,那么可以肯定的是你的學(xué)習(xí)效率一定是很糟糕的。這就是為什么我們大學(xué)上完了,還是跟個傻瓜一樣,還要在工作中再重新自學(xué)。
不過,就算自學(xué),這些基礎(chǔ)技術(shù)大概需要四五年的時間堆疊。我工作二十年了,這二十年來基本還是這些原理沒變,無論形式怎么變,但是核心永遠(yuǎn)還是這些,理論創(chuàng)新很難,這是以不變應(yīng)萬變。
學(xué)習(xí)效率
談到學(xué)習(xí)效率,就需要拿出這張學(xué)習(xí)金字塔的圖來了。從圖可以看到學(xué)習(xí)方法分布兩層,一種是被動學(xué)習(xí),也是淺度學(xué)習(xí),聽講,閱讀,視聽,演示都是在被動學(xué)習(xí),而與人討論,自己動手實踐,教授給別人是主動學(xué)習(xí)。主動學(xué)習(xí)我們稱之為深度學(xué)習(xí),如果你不能深度學(xué)習(xí),你就不能真正學(xué)到東西。這也是你會經(jīng)常有“學(xué)那么多干什么,不用就忘了”,這就是淺度學(xué)習(xí)的癥狀了。
下面,我給出一些我自己覺得不錯的學(xué)習(xí)經(jīng)驗:
1、挑選一手知識和信息源。對于學(xué)習(xí)方法:第一我們一定要到知識源去挑選知識,知識信息源非常關(guān)鍵,二手信息丟失太大了,譚浩強寫的書就丟失太多信息了。目前計算機(jī)一手知識基本都是國外的,所以英文非常重要。我鼓勵大家一定讀第一手的資料。如果你英語有問題,至少要看翻譯過來,最好是原汁原味翻譯的,不要我理解了給你講那種,那種也是被別人嚼一遍再講給你你沒有體會,是別人帶著你,別人的體會會影響你,也許你的體會會比他更好,因為是你自己總結(jié)出來的東西,所以知識源很重要。
2、注意原理和基礎(chǔ)第二要注重基礎(chǔ)原理。雖然可以忘記這個技術(shù),但是原理記在心里,我可以徒手實現(xiàn)出來,而且通過原理可以更快學(xué)習(xí)其他類似的技術(shù)。所以原理很重要!當(dāng)你學(xué)會C、C++要學(xué) Java 和 GO 都很快。
3、使用知識圖譜一定要學(xué)會使用知識圖,把知識結(jié)構(gòu)化。從一個技術(shù)關(guān)鍵點開始不斷地關(guān)聯(lián)和細(xì)化下去,比如:關(guān)于 TCP 協(xié)議,首先第一個要記住狀態(tài)圖,怎么建立連接,怎么斷連接,狀態(tài)怎么變遷。TCP 沒有連接,是靠狀態(tài)維護(hù)連接的。其次,要了解 TCP 怎么保證可靠性,就是丟包以后怎么重傳,重傳有哪些技術(shù)點。然后,重傳會讓你聯(lián)想到擁塞控制,擁塞控制到滑動窗口……。這基本就是 TCP 的所有東西了,找到關(guān)鍵點,然后順著這個脈絡(luò)一點點往下想,通過知識圖關(guān)聯(lián)就可以進(jìn)行順藤摸瓜。我們不需要記所有知識,那些手冊的知識不需要記,你知道在哪里能找到就可以了。你腦子里面要有地圖,學(xué)一個東西就跟在城市生活一樣,閉上眼睛就知道地圖,A點到B點怎么去大概方向要知道。我在北京我去廣州,廣州在南邊,我大概坐飛機(jī)還是火車要心里有數(shù)。。
4、學(xué)會舉一反三。就是用不同方法學(xué)一個東西,比如說學(xué) TCP 協(xié)議,看書是一種方法,編程是另外一種方法,還有用做 Debug 去看的,用不同方法學(xué)一個東西會讓你更加熟悉,你學(xué)一個知識的同時把周邊也學(xué)了。比如說學(xué)前端能不能把 HTTP 學(xué)一下,比如說長連接、短連接,包括 hp1、hp2 有一些不一樣的東西。
5、總結(jié)和歸納。只有學(xué)會總結(jié)和歸納,才能形成自己的思維框架、自己的套路、自己的方法論,以后學(xué)這個東西應(yīng)該怎么學(xué)。就像學(xué)一門新的語言,不管 GO 語言,還是 Rust 語言,第一件事情就是了解內(nèi)存是怎么管理的,數(shù)據(jù)類型什么樣,第二是泛型怎么搞,第三是并發(fā)怎么弄。還有一些抽象怎么弄,比如說怎么解耦,怎么實現(xiàn)多態(tài)?套路這種東西只有學(xué)的多了以后才能形成套路,如果你只學(xué)會一門語言不會有套路,你要每年學(xué)門語言,不用學(xué)多精,你思考這個語言有什么不一樣,為什么這個這種有玩法,那個有那種玩法,這些東西思考多了套路方法論就出來了。比如說 Windows 和 Linux 有什么不同,Linux 和 Unix 又有什么不同?只有總結(jié)自己的框架、套路和方法,這些才永遠(yuǎn)不會被淘汰。
6、實踐和堅持。剩下就是多做多練,多堅持,只有實踐才會有經(jīng)驗,只有鍛煉了才能夠把自己的脂肪變沒,所以,要把知識變成技能必須練,就像小學(xué)生學(xué)會加減乘除,還是要演練,必須多做題,題目做得多了,自然掌握得好。要挑選好的知識源,注重原理技術(shù),有一些原理的基礎(chǔ)的書太枯燥,但是我告訴你學(xué)習(xí)這些基礎(chǔ)太值得投入時間,搬磚賺幾十元不值得,因為賺的是辛苦錢,老了就賺不了,必須要賺更有能力的錢,這是學(xué)習(xí)投資。
小結(jié)
好了,該到這篇文章收尾的時候了,小結(jié)一下,如果你想更好的把握時代,提升自己,你需要知道這個時代的趨勢是什么,需要什么樣的人,這些人需要什么樣的能力,這些能力是怎么獲得的,投入到基礎(chǔ)知識的學(xué)習(xí)就像“基建”一樣,如果基礎(chǔ)不好,不能長高,學(xué)習(xí)能力也是需要適應(yīng)這個快速時代的重要的基礎(chǔ)能力,沒有好的學(xué)習(xí)能力,很快就會掉隊被淘汰。
這些東西,是我從業(yè)二十年來的總結(jié)和體會,希望對你有用。
-
編程
+關(guān)注
關(guān)注
88文章
3595瀏覽量
93600 -
TCP
+關(guān)注
關(guān)注
8文章
1351瀏覽量
78989 -
程序員
+關(guān)注
關(guān)注
4文章
950瀏覽量
29763
發(fā)布評論請先 登錄
相關(guān)推薦
評論