摸爬滾打20年,總結出來的職場箴言!
對我來說,在我二十多年的工作經歷來看,期間經歷了很多技術的更新換代,整個技術模式、業務模式也是一直變來變去,我們這群老程序員成長中所經歷的技術比今天的程序員玩的還更雜更多。
圖片來自 Pexels
我羅列一下我學過的,而且還被淘汰掉的技術,大家先感受一下:
- - 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 用的都是相同的原理,逃不出范圍,只要抓住原理,舉一反三,時間一長了,甚至還可以自己推導答案。
對于技術的基礎,我會把它分成四類:
- 程序語言:語言的原理,類庫的實現,編程技術(并發、異步等),編程范式,設計模式……
- 系統原理:計算機系統,操作系統,網絡協議,數據庫原理……
- 中間件:消息隊列,緩存系統,網關代理,調度系統 ……
- 理論知識:算法和數據結構,數據庫范式,網絡七屋模型,分布式系統……
這些知識其實就是一個計算機科學專業的學生他所要學習的原理,但可惜的是,我們的一些學校教得也很糟糕,不但老師能力不足,而且放著世界上最優秀的教課書不用了,一定要自己寫一本。
講也講不全,還有各種錯誤,總之,如果你學習用用到的教材不行,那么可以肯定的是你的學習效率一定是很糟糕的。
這就是為什么我們大學上完了,還是跟個傻瓜一樣,還要在工作中再重新自學。不過,就算自學,這些基礎技術大概需要四五年的時間堆疊。
我工作二十年了,這二十年來基本還是這些原理沒變,無論形式怎么變,但是核心永遠還是這些,理論創新很難,這是以不變應萬變。
學習效率
談到學習效率,就需要拿出這張學習金字塔的圖來了。
從圖可以看到學習方法分布兩層,一種是被動學習,也是淺度學習,聽講,閱讀,視聽,演示都是在被動學習,而與人討論,自己動手實踐,教授給別人是主動學習。
主動學習我們稱之為深度學習,如果你不能深度學習,你就不能真正學到東西。這也是你會經常有“學那么多干什么,不用就忘了”,這就是淺度學習的癥狀了。
下面,我給出一些我自己覺得不錯的學習經驗:
①挑選一手知識和信息源
對于學習方法:第一我們一定要到知識源去挑選知識,知識信息源非常關鍵,二手信息丟失太大了,譚浩強寫的書就丟失太多信息了。
目前計算機一手知識基本都是國外的,所以英文非常重要。我鼓勵大家一定讀第一手的資料。
如果你英語有問題,至少要看翻譯過來,最好是原汁原味翻譯的,不要我理解了給你講那種,那種也是被別人嚼一遍再講給你你沒有體會,是別人帶著你,別人的體會會影響你,也許你的體會會比他更好,因為是你自己總結出來的東西,所以知識源很重要。
②注意原理和基礎
雖然可以忘記這個技術,但是原理記在心里,我可以徒手實現出來,而且通過原理可以更快學習其他類似的技術。所以原理很重要!當你學會 C、C++ 要學 Java 和 GO 都很快。
③使用知識圖譜一定要學會使用知識圖,把知識結構化
從一個技術關鍵點開始不斷地關聯和細化下去,比如:關于 TCP 協議,首先第一個要記住狀態圖,怎么建立連接,怎么斷連接,狀態怎么變遷。
TCP 沒有連接,是靠狀態維護連接的。其次,要了解 TCP 怎么保證可靠性,就是丟包以后怎么重傳,重傳有哪些技術點。然后,重傳會讓你聯想到擁塞控制,擁塞控制到滑動窗口。
這基本就是 TCP 的所有東西了,找到關鍵點,然后順著這個脈絡一點點往下想,通過知識圖關聯就可以進行順藤摸瓜。
我們不需要記所有知識,那些手冊的知識不需要記,你知道在哪里能找到就可以了。
你腦子里面要有地圖,學一個東西就跟在城市生活一樣,閉上眼睛就知道地圖,A 點到 B 點怎么去大概方向要知道。我在北京我去廣州,廣州在南邊,我大概坐飛機還是火車要心里有數。。
④學會舉一反三
就是用不同方法學一個東西,比如說學 TCP 協議,看書是一種方法,編程是另外一種方法,還有用做 Debug 去看的,用不同方法學一個東西會讓你更加熟悉,你學一個知識的同時把周邊也學了。
比如說學前端能不能把 HTTP 學一下,比如說長連接、短連接,包括 hp1、hp2 有一些不一樣的東西。
⑤總結和歸納
只有學會總結和歸納,才能形成自己的思維框架、自己的套路、自己的方法論,以后學這個東西應該怎么學。
就像學一門新的語言,不管 GO 語言,還是 Rust 語言,第一件事情就是了解內存是怎么管理的,數據類型什么樣,第二是泛型怎么搞,第三是并發怎么弄。
還有一些抽象怎么弄,比如說怎么解耦,怎么實現多態?套路這種東西只有學的多了以后才能形成套路。
如果你只學會一門語言不會有套路,你要每年學門語言,不用學多精,你思考這個語言有什么不一樣,為什么這個這種有玩法,那個有那種玩法,這些東西思考多了套路方法論就出來了。
比如說 Windows 和 Linux 有什么不同,Linux 和 Unix 又有什么不同?只有總結自己的框架、套路和方法,這些才永遠不會被淘汰。
⑥實踐和堅持
剩下就是多做多練,多堅持,只有實踐才會有經驗,只有鍛煉了才能夠把自己的脂肪變沒,所以,要把知識變成技能必須練,就像小學生學會加減乘除,還是要演練,必須多做題,題目做得多了,自然掌握得好。
要挑選好的知識源,注重原理技術,有一些原理的基礎的書太枯燥,但是我告訴你學習這些基礎太值得投入時間,搬磚賺幾十元不值得,因為賺的是辛苦錢,老了就賺不了,必須要賺更有能力的錢,這是學習投資。
小結
如果你想更好的把握時代,提升自己,你需要知道這個時代的趨勢是什么,需要什么樣的人,這些人需要什么樣的能力,這些能力是怎么獲得的。
投入到基礎知識的學習就像“基建”一樣,如果基礎不好,不能長高,學習能力也是需要適應這個快速時代的重要的基礎能力,沒有好的學習能力,很快就會掉隊被淘汰。
這些東西,是我從業二十年來的總結和體會,希望對你有用。
作者:陳皓(左耳朵耗子)
簡介:20 年軟件開發相關工作經驗,10 年以上項目和團隊管理經驗。擅長底層技術架構,團隊建設,軟件工程,軟件研發咨詢,以及全球軟件團隊協作管理。對高性能,高可用性,分布式,高并發,以及大規模數據處理系統有一些經驗和心得。喜歡關注底層技術平臺和互聯網行業應用。技術擅長 C/C++/Java 和 Unix/Linux/Windows。曾于 Amazon 中國任研發經理,負責電子商務全球化業務(全球開店)和全球庫存預測系統的研發。曾在阿里巴巴北京研發中心、商家業務部曾任資深專家一職,負責電商云平臺、開放平臺,云監控和電商多媒體平臺。曾在阿里巴巴核心系統專家組從事阿里核心系統和阿里云 ECS 相關的虛擬化平臺的開發工作。現在創業中,MegaEase 創始人,致力于為企業的高并發高可用架構提供一整套的技術解決方案和產品。
編輯:陶家龍
出處:https://coolshell.cn/articles/20977.html