天天看點

「一定要看」:程式員如何把控自己的職業 世界發展趨勢人才需求Google評分卡認識自己打好基礎學習效率小結

本文目錄:

世界發展趨勢

人才需求

Google評分卡

認識自己

打好基礎

學習效率

小結

這篇文章的主要内容主要是我今年3月份在騰訊做的直播,主要是想讓一些技術人員對世界有一個大體的認識,并且在這個認識下能夠有一個好的方法成就自己。而不是在一臉蒙圈的狀态下随波逐流,而日益迷茫和焦慮。直播完後,騰訊方面把我的直播形成文字的形式發了出來,我覺得我可以再做一個精編版。是以,有了這篇文章,希望對大家有幫助。

對我來說,在我二十多年的工作經曆來看,期間經曆了很多技術的更新換代,整個技術模式、業務模式也是一直變來變去,我們這群老程式員成長中所經曆的技術比今天的程式員玩的還更雜更多。我羅列一下我學過的,而且還被淘汰掉的技術,大家先感受一下。

- MIS應用開發:FoxPro,PowerBuilder,Delphi
- OA:Lotus Notes,VBScripts- 微軟:ODBC/ADO,COM/DCOM,MFC/ATL,J++- 伺服器:AIX,HP-UX,SCO Unix- Web:CGI,ISAPI,SOAP
- RPC:CICS,Tuxedo
- J2EE:Websphere,Weblogic- DB:Sybase,Informix
           

我想說的是,無論過去還是今天,我們這些前浪和你們後浪所面對的技術的挑戰和對技術的焦慮感是相似的,我們那個時候不但玩996,還玩封閉開發(就是一周隻能回家一天)。當然,唯一好的東西,就是比起今天的程式員來說,我們那個年代沒有像微信、微網誌、知乎,抖音這些巨大消耗你人生的東西,是以,我們的工作、生活和成長都有很效率,不會被打斷、喜歡看書、Google還沒有被封……當然,那時代沒有StackOverlow和Github這樣的東西,是以,能完成的東西或品質都一般。

當然,這裡并不是想做一個比較,隻是想讓大家了解一下兩代程式員間的一些問題各有千秋,大同小異。在整個成長過程中,其實有很多東西是相通的,基本上來說,就是下面的三件事:

第一,如果想要把控技術,應對這個世界的一些變化,需要大緻知道這個世界的一些規律和發展趨勢,另外還得認識自己,自己到底适合做什麼?在這個趨勢和規律下屬于自己的發揮領域到底是什麼?這是我們每個人都需要了解的。

第二,打牢基礎,以不變應萬變,不管世界怎樣變化,我都能很快适應它。基礎的重要程度對于你能夠飛多高是相當有影響的,懂原理的人比不懂原理的人能做出來的事情或是能解決的問題完全是兩個層級的。

第三,提升成長的效率,因為現在社會的節奏實在太快了,比二十年前快得太多,技術層出不窮,是以我們的成長也要更有效率。效率并不單指的快,效率是怎麼樣更有效,是有用功除以總功(參看《加班與效率》),怎麼學到更有效的東西,或者怎麼更有效學習,是我們需要掌握的另一關鍵。

下面是我這多年來的一些認識,希望對你有幫助。

世界發展趨勢

我個人經曆的資訊化革命應該分成三個階段:

  • 1990年代到2000年,這個時代MB時代,是雅虎、新浪、搜狐、網易門戶網站的時代,這個時代就是ISP/ICP網際網路提供商,把一些資訊數字化,然後釋出到網絡上。
  • 2000年到2010年,這個時代叫GB時代,或是叫多媒體或UGC時代,上網開始變得普遍了,每個人手裡的數位裝置開始變得多了起來,可以上傳照片,可以上傳視訊,甚至可以在網上做社交。
  • 2010年到2020年,這個時代叫TB時代,這過去的十年是移動網際網路時代,移動網際網路隻需要手機線上,不需要依靠電腦。因為手機随時線上,是以個人的各種各樣的資料始終在被收集,隻要使用者上網就會産生資料,是以人的行為最終也被數字化了。

所有的硬體和軟體都是跟着需要處理的資料而演進的,我們需要更大的帶寬,更大的硬碟,更多的處理器……大到一定時候就隻能進入分布式化的技術架構了,再大,資料中心也頂不住了,就會要引入更為分布式的邊緣計算了。

另一方面,從業務上來看,我們可以看到整個世界就在不斷地進行數字化,因為,隻要數字化了,就可以進行複制傳播和計算,隻要可以進行計算了,就可以進行數學模組化,就可以自動化,隻要可以自動化了就可以規模化,隻要可能規模化了,就可以改變整個行業。人類的近代史的大趨勢基本上都是在解決能源和自動化的事,源源不斷的能源是讓機器不知疲倦的前提條件,用機器代替牲口,代替人類進行工作是規模化的前提條件。

是以,技術的演進規律基本是自動化加規模化,進而降低成本,提升效率。這就是為什麼世界變得越來越快,人類都快跟不上節奏的原因,主要是整個社會不斷被機器、資料所驅動。

人才需求

在這個過程中,需要什麼樣的人?下面是我的一些認識:

  • 技工,在機器和自動化面前,肯定是需要能夠操作機器的技術勞工了,這類人是有技術的勞動力。在程式設計的圈子裡俗稱“碼農”,他們并不是真正的工程師,他們隻是電腦程式的操作員,是以,随着技術門檻的下降或是技術形式的變更他可能就會變得越來越不值錢,直到被淘汰掉。
  • 特種工,這種人是必須了解原理和解決難題的一類人,他們是解決比較難的、特定的一些技術問題。當一種技術被淘汰,他并不容易被淘汰,因為他懂原理,原理就是解決問題的能力,是解決問題的套路和方法。
  • 工程師,不但是使用技術,還可以把活兒做好,他們認為代碼更多的時間是在維護,這些人使用各種各樣的手段和各種技術,精益求精地持續不斷地提高代碼的易讀性、擴充性、可維護性和重用性,這個過程似乎永無止境。對于這些有“潔癖”,有“工匠精神”,有“修養”的技術人員,我們稱他們為工程師。這種人做事又穩又快,而且可以做出很多稱手的工具和方法論。
  • 再往上是設計師和架構人員,這些人主要是開發一些工具,架構,模式,提升軟體開發和維護效率,同時也提升使用者體驗,和提升穩定性、性能、代碼重用等,總的來說就是為了降本增效。這類人的工作降低了技術得到門檻,他們把技術門檻降低了以後,就可以把這個技術普及開來,就可以由廣大勞工、技工、特殊勞工使用了。
  • 還有一類人是經理,經理主要是組織團隊、完成項目、創造利潤。這類人中,即有身先士卒的leader,也有高高在上的boss,但無論怎麼樣,這些人隻不過是為了讓一個公司或是一個團隊更好組織在一起的“粘合劑”,這類人隻有在大公司中才會變成更有價值。

這就是我總結的世界需要哪些人才,我們了解這些東西以後大概就明白我們現在所處的位置有什麼樣的問題,我們應該去什麼樣的地方。

Google評分卡

接下來,我們再來看看Google的SRE的自我評分卡:

0 – 對于相關的技術領域還不熟悉

1 – 可以讀懂這個領域的基礎知識

2 – 可以實作一些小的改動,清楚基本的原理,并能夠在簡單的指導下自己找到更多的細節。

3 – 基本精通這個技術領域,完全不需要别人的幫助

4 – 對這個技術領域非常的熟悉和舒适,可以應對和完成所有的日常工作。

對于軟體領域 – 有能力開發中等規模的程式,能夠熟練和掌握并使用所有的語言特性,而不是需要翻書,并且能夠找到所有的冷知識。

對于系統領域 – 掌握網絡和系統管理的很多基礎知識,并能夠掌握一些核心知識以運維一個小型的網絡系統,包括恢複、調試和能解決一些不常見的故障。

5 – 對于該技術領域有非常底層的了解和深入的技能。

6 – 能夠從零開發大規模的程式和系統,掌握底層和内在原理,能夠設計和部署大規模的分布式系統架構

7 – 了解并能利用進階技術,以及相關的内在原理,并可以從根本上自動化大量的系統管理和運維工作。

8 – 對于一些邊角和晦澀的技術、協定和系統工作原理有很深入的了解和經驗。能夠設計,部署并負責非常關鍵以及規模很大的基礎設施,并能夠建構相應的自動化設施

9 – 能夠在該技術領域出一本經典的書。并和标準委員會的人一起工作制定相關的技術标準和方法。

10 – 在該領域寫過一本書,被業内尊為專家,并是該技術的發明人。

SRE需要自評如下這些技術或技能。

– 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前需要候選人對自己的各種技術進行自評,也算是一種技術人員的等級的度量尺,其把技術的能分成11個等級,我用顔色把其它成四大層級,希望這個評分卡能夠給你一個能力提升的參考标準。

認識自己

認識了世界是怎麼發展的,也知道技術人員的種類和層級,那麼還要了解一下自己,因為如果不了解自己,那麼你也無法找到自己的路和适合自己的地方。

我覺得,一個人要認識自己就需要認識自己的特長、興趣、熱情、擅長等,下面是一個認識自己的标準方法:

  • 特長。首先你要找得到自己特長。你要認識自己的特長,找到自己的天賦,找到你在DNA裡比别人強的東西,就拿你的DNA跟别人競争就好了。是以你要找到自己可以幹成的事,找到别人找你請教的事,你身邊人找你請教就是說明你有特長。這是找到自己特長非常非常重要,揚長避短。
  • 興趣。如果你沒有找到自己特長,就找自己有興趣有熱情的東西。什麼叫興趣?興趣是再難再累都不會放棄的事。如果你遇到困難就會放棄不叫興趣,那叫葉公好龍。不怕困難,癡迷其中,就算你沒有特長,有了這種特質,你也是頭部的人才。
  • 方法。如果你沒有特長,沒有興趣和熱情就要學方法。這種方法就是要有時間觀念,要會做計劃,要懂統籌、規劃對于做過的事情,犯過的錯誤多總結,舉一反三,喜歡自己找答案,自己探究因果關系,這是一些方法,自己總結一些套路。
  • 勤奮。如果你沒有特長,沒有興趣,也沒有方法,你還能做的事就是勤奮,勤奮注定會讓你成為一個比較勞累的人,也是很有可能被淘汰的人随着你的年紀越來越大,你的勤奮也會越來越不值錢。因為年輕人會比你更勤奮,比你更勤奮、比你鬥志更強,比你能力更強,比你要錢更少的人會出現。勤奮最不值錢,但是隻要你勤奮至少能夠自食其力。

以上就是為了應對未來技術變化,作為個人必須要從特長、興趣、方法一層一層篩選挖掘,如果沒有這些你就要努力和勤奮。就隻能接受“福報”了。

從我個人而言,我不算是特别聰明的人,但自認為對技術還是比較感興趣的,難的我不怕。有很多比較難啃的技術,聰明點的人啃一個月就懂了,我不行,我可能啃半年。但是沒有關系,知識都是死的,隻要不怕困難總有一天會懂的。最可怕是畏難,為自己找借口,這樣就不太好了。

打好基礎

最前面提到我學的各式各樣的被淘汰的技術,會讓你感覺很迷茫,或是迷失。但前面也提到了“谷歌評分卡”,在這個評分卡中,我們看到了許多基礎原理方面的内容,其實要應對未來的變化,很重要的一點就是無招勝有招,以不變應萬變。

變化都是表面的東西,内在的東西其實并沒有太多的變化。理論層面上變得不多,反而形式上的東西今天一個花樣,明天一個花樣,是以如果要去應對這種變化,就一定要打牢自己的基礎,提升内功修養。比如像程式設計的一些方式和套路,修飾模式原理本質,解耦,提升代碼的重用度等。提升代碼重用度必須解耦,要跟現實解耦,提升抽象,這些都是一些技術基礎。無論用什麼語言,都是這麼做的。

打牢基礎就可以突破瓶頸,不打牢基礎沒有辦法突破瓶頸。在技術世界不要覺得量變會造成質變,這是不可能的。技術這個東西就像搞建築砌磚頭,砌磚頭砌的再多也不可能讓你能成為一個架構師的,因為你不懂原理,不懂科學方法,你就不可能成長上去的,就像學數學一樣,當你掌握了微積分這種大殺器後,你解題的能力是無所披靡,而微積分這種方式絕對不是你能“量變”出來的。

是以你必須學習基礎的理論知識,如果不學這些基礎理論知識,還要學習解題思路和方法,如果你隻學在表面,那麼當這個技術的形式有變化,就會發現以前學的都沒用了,要重頭學一遍。掌握技術基礎可以讓自己找到答案和知識,基礎是抽象和歸納,很容易形成進一步的推論。我們學的很多技術實作都逃不脫基礎原理,不管是Java,還是其他語言,隻要用TCP用的都是相同的原理,逃不出範圍,隻要抓住原理,舉一反三,時間一長了,甚至還可以自己推導答案。對于技術的基礎,我會把其它成四類:

  • 程式語言:語言的原理,類庫的實作,程式設計技術(并發、異步等),程式設計範式,設計模式……
  • 系統原理:計算機系統,作業系統,網絡協定,資料庫原理……
  • 中間件:消息隊列,緩存系統,網關代理,排程系統 ……
  • 理論知識:算法和資料結構,資料庫範式,網絡七層模型,分布式系統……

這些知識其實就是一個計算機科學專業的學生他所要學習的原理,但可惜的是,我們的一些學校教得也很糟糕,不但老師能力不足,而且放着世界上最優秀的教課書不用了,一定要自己寫一本。講也講不全,還有各種錯誤,哎……總之,如果你學習用用到的教材不行,那麼可以肯定的是你的學習效率一定是很糟糕的。這就是為什麼我們大學上完了,還是跟個傻瓜一樣,還要在工作中再重新自學。

不過,就算自學,這些基礎技術大概需要四五年的時間堆疊。我工作二十年了,這二十年來基本還是這些原理沒變,無論形式怎麼變,但是核心永遠還是這些,理論創新很難,這是以不變應萬變。

學習效率

「一定要看」:程式員如何把控自己的職業 世界發展趨勢人才需求Google評分卡認識自己打好基礎學習效率小結

談到學習效率,就需要拿出這張學習金字塔的圖來了。從圖可以看到學習方法分布兩層,一種是被動學習,也是淺度學習,聽講,閱讀,視聽,示範都是在被動學習,而與人讨論,自己動手實踐,教授給别人是主動學習。主動學習我們稱之為深度學習,如果你不能深度學習,你就不能真正學到東西。這也是你會經常有“學那麼多幹什麼,不用就忘了”,這就是淺度學習的症狀了。

下面,我給出一些我自己覺得不錯的學習經驗:

1、挑選一手知識和資訊源。對于學習方法:第一我們一定要到知識源去挑選知識,知識資訊源非常關鍵,二手資訊丢失太大了,譚浩強寫的書就丢失太多資訊了。目前計算機一手知識基本都是國外的,是以英文非常重要。我鼓勵大家一定讀第一手的資料。如果你英語有問題,至少要看翻譯過來,最好是原汁原味翻譯的,不要我了解了給你講那種,那種也是被别人嚼一遍再講給你你沒有體會,是别人帶着你,别人的體會會影響你,也許你的體會會比他更好,因為是你自己總結出來的東西,是以知識源很重要。

2、注意原理和基礎第二要注重基礎原理。雖然可以忘記這個技術,但是原理記在心裡,我可以徒手實作出來,而且通過原理可以更快學習其他類似的技術。是以原理很重要!當你學會C、C++要學Java和GO都很快。

3、使用知識圖譜一定要學會使用知識圖,把知識結構化。從一個技術關鍵點開始不斷地關聯和細化下去,比如:關于TCP協定,首先第一個要記住狀态圖,怎麼建立連接配接,怎麼斷連接配接,狀态怎麼變遷。TCP沒有連接配接,是靠狀态維護連接配接的。其次,要了解TCP怎麼保證可靠性,就是丢包以後怎麼重傳,重傳有哪些技術點。然後,重傳會讓你聯想到擁塞控制,擁塞控制到滑動視窗……。這基本就是TCP的所有東西了,找到關鍵點,然後順着這個脈絡一點點往下想,通過知識圖關聯就可以進行順藤摸瓜。我們不需要記所有知識,那些手冊的知識不需要記,你知道在哪裡能找到就可以了。你腦子裡面要有地圖,學一個東西就跟在城市生活一樣,閉上眼睛就知道地圖,A點到B點怎麼去大概方向要知道。我在北京我去廣州,廣州在南邊,我大概坐飛機還是火車要心裡有數。。

4、學會舉一反三。就是用不同方法學一個東西,比如說學TCP協定,看書是一種方法,程式設計是另外一種方法,還有用做Debug去看的,用不同方法學一個東西會讓你更加熟悉,你學一個知識的同時把周邊也學了。比如說學前端能不能把HTTP學一下,比如說長連接配接、短連接配接,包括hp1、hp2有一些不一樣的東西。

5、總結和歸納。隻有學會總結和歸納,才能形成自己的思維架構、自己的套路、自己的方法論,以後學這個東西應該怎麼學。就像學一門新的語言,不管GO語言,還是Rust語言,第一件事情就是了解記憶體是怎麼管理的,資料類型什麼樣,第二是泛型怎麼搞,第三是并發怎麼弄。還有一些抽象怎麼弄,比如說怎麼解耦,怎麼實作多态?套路這種東西隻有學的多了以後才能形成套路,如果你隻學會一門語言不會有套路,你要每年學門語言,不用學多精,你思考這個語言有什麼不一樣,為什麼這個這種有玩法,那個有那種玩法,這些東西思考多了套路方法論就出來了。比如說Windows和Linux有什麼不同,Linux和Unix又有什麼不同?隻有總結自己的架構、套路和方法,這些才永遠不會被淘汰。

6、實踐和堅持。剩下就是多做多練,多堅持,隻有實踐才會有經驗,隻有鍛煉了才能夠把自己的脂肪變沒,是以,要把知識變成技能必須練,就像國小生學會加減乘除,還是要演練,必須多做題,題目做得多了,自然掌握得好。要挑選好的知識源,注重原理技術,有一些原理的基礎的書太枯燥,但是我告訴你學習這些基礎太值得投入時間,搬磚賺幾十元不值得,因為賺的是辛苦錢,老了就賺不了,必須要賺更有能力的錢,這是學習投資。

小結

好了,該到這篇文章收尾的時候了,小結一下,如果你想更好的把握時代,提升自己,你需要知道這個時代的趨勢是什麼,需要什麼樣的人,這些人需要什麼樣的能力,這些能力是怎麼獲得的,投入到基礎知識的學習就像“基建”一樣,如果基礎不好,不能長高,學習能力也是需要适應這個快速時代的重要的基礎能力,沒有好的學習能力,很快就會掉隊被淘汰。

這些東西,是我從業二十年來的總結和體會,希望對你有用。