天天看點

轉載—左耳朵耗子《程式員如何把控自己的職業》程式員如何把控自己的職業

程式員如何把控自己的職業

這篇文章的主要内容主要是我今年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這樣的東西,是以,能完成的東西或品質都一般。

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

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

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

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

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

認識自己

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

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

  • 特長。首先你要找得到自己特長。你要認識自己的特長,找到自己的天賦,找到你在DNA裡比别人強的東西,就拿你的DNA跟别人競争就好了。是以你要找到自己可以幹成的事,找到别人找你請教的事,你身邊人找你請教就是說明你有特長。這是找到自己特長非常非常重要,揚長避短。
  • 興趣。如果你沒有找到自己特長,就找自己有興趣有熱情的東西。什麼叫興趣?興趣是再難再累都不會放棄的事。如果你遇到困難就會放棄不叫興趣,那叫葉公好龍。不怕困難,癡迷其中,就算你沒有特長,有了這種特質,你也是頭部的人才。

    方法。如果你沒有特長,沒有興趣和熱情就要學方法。這種方法就是要有時間觀念,要會做計劃,要懂統籌、規劃對于做過的事情,犯過的錯誤多總結,舉一反三,喜歡自己找答案,自己探究因果關系,這是一些方法,自己總結一些套路。

  • 勤奮。如果你沒有特長,沒有興趣,也沒有方法,你還能做的事就是勤奮,勤奮注定會讓你成為一個比較勞累的人,也是很有可能被淘汰的人随着你的年紀越來越大,你的勤奮也會越來越不值錢。因為年輕人會比你更勤奮,比你更勤奮、比你鬥志更強,比你能力更強,比你要錢更少的人會出現。勤奮最不值錢,但是隻要你勤奮至少能夠自食其力。

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

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

打好基礎

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

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

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

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

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

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

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

學習效率

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

轉載—左耳朵耗子《程式員如何把控自己的職業》程式員如何把控自己的職業

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

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

小結

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

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