***本文來自於我從2014年來一直在豆瓣更新的碼農日記,可是被刪了。。隻能躲到這裏了。以下是正文
(智商90以上人群勿看)我決定寫一篇日誌來記錄一下自己在碼農之路這條不歸路上的心得體會,之所以寫下來,一個是總結一下自己的思路,二是總結自己學過的知識,三是吐槽,四是可能會幫到一些和我一樣腦殘智力在90以下的人是怎麽進階的,五就是作為勵誌的一種方法吧。(在網上看到任何自稱學渣的人都沒有我水平爛,所以算是網上第一篇針對真·弱b的成長之路,如果我以後有幸成功,就可以造福後人了吧)
————————————首先是吐槽——————————————————————
首先我覺得智力低下如我這等蠢人,智力90以下肥貓一樣的人,根本就不應該幹這一行,因為經驗的影響雖然確實有,但是你會驚奇發現大牛的進步速度遠遠指數級的超過你,最後把你碾成渣。但是更令你絕望的是,你原來眼中的大牛在其他人眼中其實就是個傻逼,人外有人,井外有天。所以我就經常在一畝三分地裏看到各種大神在討論我根本看不懂的東西,最後深深的自卑。人家眼中各種基礎中的基礎我花一天都想不出來。而且這些大神說實話根本還遠遠不算大神啊!
話說我成為了一個學渣其實這根本不怪我自己,我覺得我應該算是一個學弱,之所以稱之為弱,是因為我在大學期間已經很辛苦努力地學習了,真是刷夜刷的我腎虛,苦逼的經曆我至今仍然曆曆在目,根本不堪回首。但是我之所以成為學弱,根本不在於我,而在於sb的大學教育(當然你可以找到我身邊各種學的好的人,但是他們智力比我高,他們就算學什麽都應該比我厲害),還有sb學校的課程設置。首先我tm傻逼的選了一個通信工程作為專業,首先通信這方麵可以鑽研的東西太jb多了,隨便拿一門課你tm就可以幹一輩子就是一個職業,你說我是苦刷dsp呢,我還是苦刷模擬電路呢,我還是苦刷單片機呢,我還是苦刷微波光通信呢,我還是苦刷電磁場理論呢,通信原理還要不要刷?這尼瑪比都是什麽玩意啊,之間沒聯係啊!你學好了這一個成為了神,其他的你也是個掛科的貨!還tm有毛鄧三軍事理論四門課!幾本書加起來一腦袋那麽厚!閉卷得背下來!背完了有個jb用,最後抵得上敲幾行代碼麽?
通信尼瑪學的東西太散了,根本就是把我當螺絲釘來培養,最後我東一榔頭西一棒子的辛辛苦苦學完了以後,下學期馬上肯定得忘,我一個大一學生大二學生,我知道學這sb玩意有什麽用麽,不學到博士有用麽!?根本沒有人給我一個人生規劃,我一個sb大一學生我知道剛上大一,我應該是苦刷c語言,還是廣交朋友,還是辛苦學生會跑龍套,還是苦刷英語,還是苦刷數字電路啊,還是刷java啊?!
所以貫穿我大學期間我一直在想的事情就是,他媽我這個專業到底有沒有一個“內功學科”啊?所謂內功學科,就是像金庸小說裏所說得,練好了內功以後,所有武功都得心應手,喬峰用一套太祖長拳就可以打遍武林群雄。練好了內力,草木飛石皆可傷人,觀察力,反應力,感悟力都會大幅上升,這就好像是九陰真經裏的武學總綱一樣。有一個目標,實實在在的,你去苦刷你就牛逼。天下武學唯快不破,你可以去練習快。健身你可以苦練核心,金融你可以苦學k線,會計你可以考CPA,計算機你可以學算法,美術你可以天天素描,主持你可以天天練聲,都是內功學科,你好好練了,你整個專業都會提升,你以後肯定成功能掙錢。我tm通信專業我到底該學啥啊?通信工程沒有內功課!
其他學校sb的課程設置拖累了我我就不說了,直接耽誤我四年,我一個90以下智力的,能跟110的比麽!他們大一就明白以後當碼農天天刷C語言,其他科目水的一b,毛鄧三全都掛,可是人家現在去蘋果了呀,年薪一百萬人民幣呢。我其他科分數超過他們有個毛用!
——————————————————吐槽以後繼續補充,sb大學永遠吐槽不完——————
以下所有編程能力的境界都用遊戲--黃金英雄壇說--的武功境界來表示,我覺得非常貼切
——————————————不堪一擊——————————————————————
首先大學期間我是連200行代碼都沒寫過,所有編程都是女朋友寫的,所以不考慮。真正讓我開始能夠開始讓我真正正視coding的是在研究生期間上的computer vision課,sb老師和sb助教留那麽多作業差點逼死我,每周刷夜3天,每天睡4個小時,學校裏那麽多開放美麗的日本妹子我都沒空泡,真是sb遺憾一輩子的事情。當時是用matlab做各種計算機視覺的filter,大作業是一個人臉識別,matlab是scripting語言,嚴格不算編程,但是也得敲鍵盤,但是當時我是一點編程還是不會,菜的一b,怎麽辦呢,還好我記得大學一個同學的畢業設計做的是這個,我就借過來,各種參考,不過那個是C++寫的我愣是一點沒看懂,還好它有個論文講思路的,我就各種穀歌,把上麵需要的東西都在csdn上幸好找到了各種寫好的模塊,我就挨句抄一下,然後在matlab的console裏麵試一下看是什麽效果是幹什麽的,然後加到我自己到文件裏,一句一句,就這樣三個大模塊,我就挨個抄啊抄,然後有時候對裏麵對if else,for什麽的,改一下變量名字、循環次數什麽的,最後勉強活了下來。
完成這個程序以後,我就對for loop,if else有了一個基本的認識。同時各種自己寫的bug,得各種改,也對軟件完成的基本流程有了一個基本認識。但是你讓我自己寫個什麽基本的東西,我還是不會寫。但是這個課讓我對敲代碼對恐懼心理這堵厚厚的牆,似乎有了一個小小的蟻穴。
——————————————毫不足慮————————————————————————
在那之後又上了一個DSP的課,大作業需要寫一個filter,那是什麽都沒得抄,啥都不會怎麽整啊,還好最後在老外同學一組的幫助下,他寫框架,我寫if else細節,完成了。還有一個什麽project來的,我還是根本不會啊,太菜了,還好靠著同學跟學長要了一份去年的,我們一堆人抄啊改啊的,終於也算過關了。所以這個時候我的編程能力,就是說給我一個很簡單的程序,我能勉強去看,也不一定看懂,我就隻能一句一句放到console裏去實驗是幹什麽的,達到我的目的我就抄到我的代碼裏,然後最後把變量名字改了,免得老師發現是抄的。這個階段對敲代碼還是那麽恐懼
——————————————不足掛齒————————————————————————
又過了兩個學期,在##(以前都是用公司名,決定還是屏蔽了)實習的時候我才算是終於開竅了(2014年11月20日我是認為我當時開竅了。當然我的“開竅”對於大牛的開竅不值一提了),當時是做C#software developer,當時對於編程我還是一直有恐懼感。提一嘴當時的麵試,由於自己的水平太次了,我麵試了16次,被連續拒絕了15次,我當時我都不想活了。最終第16次的時候,##給了我offer,而且其中這15次麵試難度之容易,跟一畝三分地真是沒法比,我當時看了裏麵的各種麵經,我連題目都看不懂,更別說想答案了,我這15次實習麵試,難度真是超級低了,但是我還是真不會啊!
為什麽第16次麵試得到offer了呢?你可以說是老天眷顧,也可以說是狗屎運,也可以說是大公司對於實習生根本不在乎,能喘氣就行,可是##也有另外兩個組麵過我我都跪了啊。是這樣的,當時麵試我的是一個中國人和一個阿拉伯人,麵試就問了我什麽是java裏的多態,polymophsim,我事先在網上查了這個詞因為前麵都問我好幾次了,然後就過了!(這麵試是不是太簡單了!)事後實習的時候我才知道,原來這個老中,原來80年代的時候是個高中老師!他輔導報誌願!他知道我們大學!我們大學當年高考分數堪比清華北大,然後他出國了,現在還以為我們學校還那麽牛逼,於是他覺得我會很好,於是就要我了!而且他也是半路出家的程序員,他也就比我強一點,他也啥都不會(我至今對這個國人大哥非常感恩)!那個阿拉伯的後來我去的時候直接被裁了因為他太水了!你說我當時多幸運。
在##實習,真是能學好多東西,庫裏麵各種看不懂的代碼,老印的編程能力特強。我剛到第三周,我的老印manager就打算幹脆給我一個contractor offer,我都高興壞了他腦子肯定有問題(過了幾年以後才琢磨出來他是為了辦公室政治鬥爭的需要,你招的人多,你的leadership影響力越大)。但他說讓我給他編一個程序,他不招不會coding的人,編什麽我自己想,隻要有用。我當時壓力超大,就跟組裏另一個老印研究我編什麽,他就給了我好幾個選擇,我都沒聽懂,但是有一個是編一個windows後台軟件,每天自動定時去刪我們網盤裏的log,好幾十個g的他們自己手動刪不過來(這就是一個普通大學課裏大作業的難度啊)。然後我就趕緊周五晚上回家趕緊琢磨怎麽用visual studio,然後百度找看看有沒有類似的,因為我連基本的C#語法都不會,結果真在網上找到一個十幾行的!!我就當天晚上以那個為框架,填充上肉,刷了一夜刷出來了!!然後我周六給manager發過去了!然後就是談offer,結果發現我是coop學生,簽不了offer,隻好作罷了。當時第一版的程序收到了組裏老印的嘲笑,bug倒是沒有,但是及其簡陋,各種爛,各種細節都沒處理,碰上大堆大堆的文件就癱瘓。所以老印他給我充當了一個產品經理的角色,我就各種按需求改,第二版加上了各種功能。後來又有了第三版,跟第一版真是天壤之別,我也對產品經理,程序員的角色有了直觀的感受。
這個過程一共四個月中,我對C#好感提升無限提升,我覺得裏麵各種寫好的函數,直接調用各種強大好不好,寫代碼真是享受,各種windows功能我都能實現!對於編程的恐懼終於一掃而空!!!原來編程好像也不難嘛(是C#)。自信心也提升了好多。在這個階段我終於能用最簡單的C#語言編程了,我可以實現各種功能,隻要我去穀歌一下怎麽用。現在的能力就是對於IDE不熟,語言不熟,但是寫程序還是一點算法不會,碰到大程序什麽的肯定死。而且讀別人代碼的能力超弱,讓我改別人程序的一個bug要了親命了。美國公司的實習麵試估計還是一個通過不了。
——————————————初學乍練——————————————————————
##實習結束以後,大公司光環的照耀下,正好在師兄的內推下,找到了現在這個正在擴張的組做測試,所以麵試時候一點技術麵沒有,就是看我的態度人生觀人品什麽的,不出意外拿到了offer。從此我就做起來萬年測試了。這個期間也寫一些代碼,但是全是把你熟悉的寫好的函數按你想達到的測試順序放到你自己的函數裏,所以一點編碼能力不需要,全看你對寫好的這些函數熟悉不熟悉。但是呢,現在有了充足的時間,穩定的生活,也讓我終於能夠有一個閉關的時間,充分的苦練內功。這種大塊的連貫時間,我決定利用好,目標是從半路出家的碼農成為一個真正的算法程序員。在這個期間,一畝三分地一點沒停各種看帖,終於看明白了裏麵說的半路出家程序員應該怎麽學習的帖子,以後決定照著做。
首先我上udacity看了裏麵的introduction to cs的免費公開課,(真恐怖現在居然收費了!)發現python居然比C#更簡單!感慨大學時候如果學python我現在是不是都很牛逼了。prententiously覺得講的東西很基礎自己全都懂,作業努力思考也能做出來,所以就全都快進著看的。
然後我就決定我以後不走C/C++的路,因為太難了我肯定學不會的,所以我就決定以後走java的路線了。java和C#語法好像啊,而且各種庫都是寫好的,就業好像也比較廣,一畝三分地裏的帖子也是那麽寫的,於是我就開始重新看head first java這本書(最好別看中文的,翻譯的很爛還有很多錯誤)。
話說這本書我一直隨身帶著,大學畢業我以後還帶到了加拿大,幾次搬家都沒扔。大學時候學過一遍,但是真是看不懂聽不懂project不會做,全是ex搞定的。現在重新看一遍以後驚為天人,居然各種看懂了!全歸功於##實習C#經曆,語法太像了,很多用法和特性都在##數據庫裏看過,這種感覺太爽了!各種不懂全都現在ber一下懂了!白天上班,晚上學英語,睡前才能找時間看上十幾頁。看了大概2個月,現在基本重新“複習”完這本書了。不過後麵的兩百頁我就又讀不懂了,因為沒有相關經驗我完全不知道它在說什麽。同時自己買了一本SQL的介紹性書籍,叫做A Manga Guide to SQL,是一本關於SQL的漫畫,給自己這個半路出家的掃掃盲。這個階段基本上還是代碼量不到1000行,但是對於一個語言的基本特性有了一個深入的了解。也對自己的未來有了一個規劃。但是麵試還是過不了的。
——————————————勉勉強強————————————————————————
這個階段終於明白了原來cs的核心內功學科就是算法!買了兩本書,一本是Data Structures and Algorithms in Java,推薦買二手和盜版,第二本就是一畝三分地版主推的,不說了對我這個智力的沒用。上了大家都推薦的
Berkeley CS61b:http://www.cs.berkeley.edu/~jrs/61b/.(現在已經換老師了,youtube上還能找到老老師的課)
現在剛開始聽這個課,發現老師講的超級好,不愧是世界頂級名校的老師,真是太清晰太明了了,跟我大學時候上的java課完全不能比,看來我沒學好可能還真是怪老師了。這你媽一節課就能把所有重要概念直接印在你腦子裏掃盲成功了,我大學時候上了半學期大概也就是cs61b一節課的內容,而且我聽得雲山霧繞的。特別有意思的一點是,這個課的老師還在頁麵上特別感謝了四個中國同學,他們組成了一個叫做“超威藍貓”的team,每次想起來我就感覺好好笑啊,於是我趕緊上b站擼了兩集超威藍貓。樓下的帥哥回複我說多看開源,這個真心是個喪心病狂的建議,但是還是特別正確。所以現在這個時候就得注冊一個github賬號了,首先你得有一台mac。為什麽我說mac呢,因為windows上設置環境變量的恐怖記憶我還有啊,大二整整一下午我在學校機房裏,試了整整一排機器才調好,我當時死的心都有了。現在的mac都自動帶的調好了啊!需要強調的是,這門課的作業和lab超多,不過一定要紮紮實實的全都自己做了啊!很痛苦,但是學完以後進步超大。
——————————————初窺門徑————————————————————————
智力太低,完全沒法跟那些轉專業的一個月突擊搞定FLG offer的那種牛人比。我就是一個智商90以下的腦殘,所以還是慢慢來。學cs61b的時候,我就看那本教科書,發現好多東西咋都看不懂,深深懷疑人生。
這裏有個我的心得體會,就是給大腦足夠的休息時間。有的時候你感覺一個東西怎麽都理解不了的時候,就休息兩天,兩天之後再看的時候就會發現突然能看懂了,哪怕這兩天啥都沒想。我覺得是因為新的東西沒有在大腦裏建立足夠的回路,神經元什麽的,所以思考起來很困難,畢竟智力低ram不夠用。當過了幾天起碼建立了一點神經元以後,再去思考,有了神經元物理的支持,就能容易一些。
還有就是有時候東西你剛學,很難壓力特大,你不需要怎麽去拚命理解。你首先大概稍微理解一下,這樣大腦就會睡覺的時候慢慢的建立一些神經元去儲存這些知識。這個時候你是不理解的,但是等到建立好了以後,下周你又回來看一下這個問題,你看起來就會輕鬆好多,到時候就會想到當時根本沒琢磨過的問題,這樣大腦就再在這個神經元旁邊建另一個節點,大腦會幫你把他們聯係起來,就像一個鏈表一樣。最後關於一個知識點的神經元越來越多,你就越來越強了。所以最重要的事情就是先建立第一個神經點,所以說入門就很重要了,入門的時候別追求那麽難的,先上路了再說。我也真是慚愧,hash table看完第一遍以後,休息了整整一個月以後才漸漸明白到底意思,建立了第一個節點,之後就感覺好懂多了。
我也終於知道了以前為什麽我上大學的時候編程學的欲仙欲死了,原因就是tm老師教太爛。老師的教材選擇上有問題,講解有問題,導致了學習曲線陡峭的一逼。聰明學生直接碾壓了陡峭的曲線,我這種sb一下在山腳跪下了。近半年來遇到陡峭的學習曲線好幾次,但是我也終於總結出來了經驗,編程這個東西雖然難,雖然陡,但是我們可以繞路走。方法就是多看幾本參考書。這個就相當於你修煉九陽神功,直接給你你也看不懂啊,上麵的經脈全是不通的,一點內力沒有,怎麽遊走奇經八脈呢?所以方法是先找本簡單的基本內功看一眼,學學術語,得點氣感再說,然後看看全真心法少林心法,最後九陽神功的曲線對你來說就沒有那麽陡峭了。
學完cs61b,他的project我覺得不需要做,對我這種智力的人來說太花時間,而且白天上班沒精力,所以直接跳過。學完了以後教課書也看完了,我有一種身體裏有東西在萌發的感覺。其實我覺得最最最有用的東西就是單鏈表和雙鏈表,其他所有所有的東西都是鏈表的進化體而已。入門最重要的就是鏈表,一旦建立了這個思維,其他的都簡單了好多。整個數據結構書,我覺得就是一本鏈表使用手冊。我就又把head first java看了一遍,感覺體會又深了一些。我也是速度很慢的人,這個時間花了我半年左右。真丟人啊,但是感覺到自己慢慢進步,還是挺有成就感的,起碼原來我這個EE行業的就沒學過鏈表呢。
——————————————初出茅廬————————————————————————
這個時候我聽網上的人說,就可以開始刷題了,至於咋刷,我一點頭緒沒有,說起來挺可笑的,就是去刷啊。但是怎麽進這個門檻,就是一層窗戶紙我就咋都捅不破,智力低就是別人說“你就xxxx”,我就是聽不懂。我看了好多帖子,很多人說可以去刷那本最簡單的Programming Interview Exposed,我就買了本讀完之後真是雲裏霧裏,根本不知道他在講什麽,試著去背所有的題和答案也完全不知道問題問的是什麽,東西也不係統,聯係不上。我都灰心死了,他們說簡單的都這麽難,那leetcode我不是要被弄死?(事實證明,上完cs61b,直接上leetcode,扯別的一點用沒有,因為他知識點係統)
後來幸運的是我的一個同學他帶著我捅破了這個窗戶紙,也沒啥,就是帶我注冊了leetcode的賬戶,然後給我展示了寫一道最簡單的題,讓我終於明白了什麽叫做刷題。於是我就按照tag來刷,array的全來一遍,鏈表的tag,樹的tag,bit運算的tag。每個tag裏從簡單的開始做。裏麵array的我覺得是最難的了,因為這個時候啥都不懂,腦子也根本不會思考。大概一道easy難度的8行代碼左右的題得做一晚。。。我就先看題,完全沒思路,然後挨個討論區裏java的都看一遍,幾種高票思路全都好好琢磨一遍,然後把它整理到我的github上。每天晚上兩道題雷打不動,白天上班有時候微微琢磨琢磨。就這樣堅持了整整4個月,每刷完1個tag就看一遍我的github這個tag的題複習一下,不然完全沒印象記不住。腦子笨一定要多複習啊!(我同事1個月就特麽刷了我半年的量我都服氣死了),終於把簡單和中等都刷完了,截止當時是240題。這個時候腦子清楚太多了。然後又花了1個半月又刷了一遍這230題。然後又刷了一個月複習一遍。這第三遍的時候,就基本上腦子會思考了,也可以能夠多種思維想問題了。值得一提的是,在刷完了第一遍的時候,你可以去網上找一個CMU08722的刷題神課,隻有課件而已。說是神課,是因為他把數據結構總結的特別通順連貫,有一種拔火罐刮痧的感覺。
然後這個時候重新掏出Programming Interview Exposed還有cracking code interview一看,真的是秒殺,2-5小時一個章節。兩周就搞定了兩本書,有種九陽神功練完以後看乾坤大挪移瞬間練成的感覺。但是如果你反著練的話,後刷leetcode的話,就相當於苦練乾坤大挪移最後內力不足氣血攻心而死了。
因為刷完了leetcode還有cracking code interview,(PIE我覺得沒用),我也成功的實現了第一次跳槽。我真心真心覺得我大學的時候怎麽沒有leetcode!真的是太好了,我真的感覺到了一個內功學科的好處,我就可以苦練苦練內功,最後飛花走石都能傷人了。刷完以後你會感覺做碼農的話,沒有任何東西能夠難倒你了。同時你對java的各種結構各種語法都手到擒來了,寫小程序啥的沒有任何問題了。
這個時候用金庸小說打個比方,你已經相當於跟著馬鈺在山頂練了兩年全真心法的郭靖一樣,內力練得很紮實,耳清目明,對身體各條經脈(map,queue,tree)和各種穴位(8種primitive)都熟悉了,每條經脈中的內力搬運(bfs,dfs,dp,binary search)都能做到,你現在就有了修煉上乘武功的基礎。由於你練的是無屬性兼容性特別強的道家玄門正宗心法,可塑性非常強,不管是以後去搞蛤蟆功(cloud), 還是先天功(AI)都可以,所以這個時候華山五絕這種高人(如FAANG公司,bat),看到你就會特別喜歡和欣賞,會收你做入門弟子,你的內力根基越紮實,被納入門下的幾率就越大。所以我建議這個階段,要內力遊走365處穴道,運轉3個周天才行(刷365道題,刷3遍)。
——————————————略知一二————————————————————————
可是萬一這一年內你沒有成功入了五絕的門,你就相當於失了元陽,破了童身(應屆校招),基本上與絕頂武學無緣了。這個時候你就得苦逼自己闖蕩江湖了,相當於剛走出大漠的郭靖,連沙通天門下(不知名小公司)的黃河四鬼(野雞麵試官)都能虐你,嫌棄你這個掃堂腿(reflection)都不會,小擒拿手(servlet)都tm不知道,真垃圾,你也配是馬鈺道長教出來的?!(你個211畢業的居然連怎麽寫個輪播圖都不知道?!)。因為你雖然有紮實的內力基礎,但是這些low人他們不care啊!以上都是我的親身心酸經曆。
為什麽說是心酸經曆呢?上文不是說我已經順利地跳槽了麽?是這樣的,這個時候我終於從一個通信行業的公司,徹底跳槽到了軟件公司。但是我原來是做測試的,現在還是做測試,不過是從通信那套改成了軟件行業這套。這個公司比較小但是是個nasdaq上市公司裏的該領域龍頭,其實還是很棒的。但是做QA呢,每天都是在東一榔頭西一棒子,客戶讓幹啥你就幹啥,經理讓你幹啥你就幹啥。我覺得在小公司裏做developer的話,真的會學到超級多東西。不過作為測試,真的是有點災難,每天都是在各種雜事,各種緊張的deadline,除了一點selenium啥都學不到。
現在幹了不到一年呢,我就準備再次跳槽了,這次我決定了,我需要徹底的從qa轉成開發,要徹底投身互聯網!我決定用下班時間,3個月時間,係統的學習一下碼農開發的知識。可是有好多好多東西要學啊怎麽辦,我發現網上人也是各種瞎jb說,特別是在知乎上看到人們說的自學教程,太多人說了你不知道聽誰的,雖然說有用,但是效率實在太低了。比如說本來一晚上可以差不多入門的東西,沒人帶的話,我隻能自己去看書,最後迷失在知識的海洋裏,花半個月達到1晚上的效果,而且白天上班都很累了好麽。比如說從最基礎的html學起,人們說:哦你就去看head first html吧。這根本就是不著調,絕絕對對的事倍功半好麽!
現在我是什麽個情況呢,就是跟剛出大漠的郭靖一模一樣!空有一身還湊合的內力底子,但是招式完全不會(大學老師垃圾的跟江南7怪似的,根本沒教會我啥),所以逢人就被虐。而且我的智力也跟郭靖一樣,特別低隻有90,學習東西速度特別慢,領悟力和舉一反三的能力特別差。反正這個階段學習非常苦悶,就是在瞎學,效率很低。我覺得這一階段的最最難的地方,就是找對學習路線,沒有學習路線,根本不可能入行。
——————————————普普通通————————————————————————
幸好我這個時候我偶然得到了一個至寶!就是一套黑馬培訓班的視頻!它是個90天訓練集中營,都是那種中專廠工的學生上的,難度不高,適合我這種智力,所以聽起來感覺特別順暢!全棧的java培訓課,啥都能學到,特別好!關鍵隻要按照老師講的進度學,就能通往羅馬!其實不是說黑馬培訓的老師講特別好,其實其他培訓班的也不錯看其他的視頻也行,有的是。所以我這裏不是廣告,我是想描述我這個智力的,我這個水平的人該怎麽學習。於是為了上完這套課加上現有測試工作學不到知識,我就裸辭了,決定死磕完這套視頻。
首先你不一定需要精通前端,但是你現在的目標是Java EE Developer,你未來是應該先入門後端,然後進階全棧的,前端你起碼要知道,你才能明白到底後端是咋回事。而且前端的技術特別多,眼花繚亂的,你把這些東西都粗略的擼一遍,你的簡曆上就能寫一大堆亂七八糟的,看起來賊炫!過HR那關會容易很多!按照以下順序來食用效果最佳:
HTML:前端的起源,宇宙的奇點,一切從它開始。對於一個刷過leetcode的人來說,實在是簡單到發指。學會就是一天的事情!千萬別被前端的人胡扯嚇到!前端沒有任何可怕的東西,沒有任何門檻!就是個熟練工種!(除非他發展成了全棧)不過這裏我不建議一天搞完,因為我這個智力一天學會的東西我記不住。。。別看任何書,太浪費時間了,不值得。
a. 首先花一天到三天完成這套視頻(願意上別家的課也無所謂),免費的,
http://yun.itheima.com/course/183.html
b. 完成這套寓教於樂的遊戲化html教程,最後還給你個證書。他可以ipad手機都可以
https://www.sololearn.com/Course/HTML/
c. 擼一遍W3School的html課程(中文的是W3CSchool,但推薦英文版,畢竟我在加拿大混,不知道那些專屬名詞怎麽說怎麽在麵試中跟人愉快地聊天?),
https://www.w3schools.com/html/
CSS:HTML進階,讓html更好看,相當於學完從1數到20以後的10以內加法。對於一個刷過leetcode的人來說,實在是簡單到發指。學會就是一天的事情!連黑馬這種給三本廠弟講課的都隻用了半天而已。當然了,學會是一天的事,但是能做好前端,css就是一個非常吃經驗的讓你調色調版型到吐血的東西。我是走java路線,所以不需要精通,知道些基本的已經足夠足夠。
a. 去黑馬官網找一套css的課程(你如果有整套培訓班的課程,這是第二天的課,但是我是搞的盜版的,我不想去壞人家生意,畢竟得到了人家的免費知識了已經心懷愧疚)
b. 完成寓教於樂的遊戲化html教程,最後還給個證書,他可以ipad手機都可以
https://www.sololearn.com/Course/CSS/
c. 去W3School擼一遍css的東西 https://www.w3schools.com/css/
JavaScript:讓html出現動態效果,相當於學完從1數到20以後的10以內減法。對於一個刷過leetcode的人來說,實在是簡單到發指。學會就是一天的事情!(但是當然了,現在JS出了ES6甚至ES7,衍生出來了React/Redux/Angular/Node/Vue/等等等等的巨複雜的東西,讓前端能變成全棧,js出了很多神奇的用法,可jb難了!沒有五六個月入不了門!)我這裏是java路線,所以隻需要掌握ES5。爭取一天到三天搞定!
還是老三樣,a黑馬或者其他家的1天視頻 bSoloLearn拿個證書 cW3School擼一遍
JQuery: JavaScript的進階省事版,相當於網絡玄幻小說裏別人發個火球風刃術還需要念兩秒魔咒,你學了JQ以後直接瞬發風刃火球了,幹死他們。
賊簡單(當然我是指達到入門水平,我要搞java,這些都是了解就行),還是老三樣,1到3天搞定,a黑馬或者其他家的1天視頻 bSoloLearn拿個證書 cW3School擼一遍
BootStrap:前端的集大成者,這是一套模板,以前吭哧吭哧做半個月的網頁,現在隻需要選一套模板,好看,行,導入,ok,做完了!
賊簡單(當然我是指達到入門水平,我要搞java,這些都是了解就行),還是老三樣,1到3天搞定,a黑馬或者其他家的1天視頻 bSoloLearn拿個證書 cW3School擼一遍
到了這裏,前端的課告一段落,你可以已經是“麵向簡曆編程”了,簡曆上多了一堆唬人的詞了。後麵等你找到工作自己沒事閑著的時候,可以研究一下JSP(老技術,賊簡單,就是個熟練工),Vue/React/Angular,前端的大框架,真正的博大精深的練幾十年的全家桶級別的東西,但是我現在就是想找個後端工作,我沒這個精力學會他們
終於開始期待已久的後端的床戲了:
MySQL:這個是最起碼的東西,在武功境界還是“初學乍練”的時候,就已經掌握了基本的語法知識。這裏呢,需要起碼掌握“多表”的知識,說白了也是很簡單的東西,如何建立個1對多的表,如何建立個多對多的表。半天時間可以搞定,當然熟練問題得在以後工作中逐漸磨煉。
JDBC:相當於Java後端Developer的紮馬步,根基中的根基,不能再更重要了,一切從這裏開始。需要MySQL先學完才行。簡單說來,就是程序員們懶,本來寫java代碼寫的好好的,突然讓他們切換到別的環境裏,特別不爽,而且MySQL的語法經常記不住,況且SQL還有好幾家競爭,語法還不一樣,賊煩。所以JDBC就是用Java代碼,實現SQL那套增刪改查的東西。
所以花個3天時間,a黑馬那套一天的速成視頻,b網上找個博客或者類似w3school這種非視頻網站,照著擼一遍
Servlet:後端的入門築基心法,後端的萬物起源,一切噩夢都是從這裏開始,不學這個,根本不懂框架是幹啥的;不學這個,你也不知道Java EE到底是幹啥的。很慚愧我也是智力低,學了一周半最後學的半生不熟的,就是懂了到底後端咋回事,熟練是一點不敢說的。首先要掌握Tomcat軟件的用法,大概半天。然後就是各種熟悉這個軟件。
這個要學好久,學法:黑馬或者找個其他的視頻吧,看非視頻的網站是肯定學不會的。這個得看著視頻,一步一步照著老師講的親自去敲一遍,試一遍,不然這裏非常博大精深,前麵不自己動手敲,後麵就徹底跟不上了。隻有掌握了Servlet,你才能去理解框架。
還有一個網站還不錯,難度不高,可以看完一些視頻以後看一看,當做複習用
https://www.javatpoint.com/servlet-tutorial
之後建議學習兩個武功:
hibernate,相當於古墓派的天羅地網掌,江湖上很流行的武功入門大路貨,有一點輸出威力,但是最主要的練習了你的輕功,讓你輕身提縱,爬牆越房(增刪改查sql數據庫)的速度提升了,而且連帶著你也順手複習或學習了底層的jdbc和mysql。這裏也可以學習其他的DAO層框架,主要是看你當地流行什麽,我這裏就流行用hibernate。好像國內很多公司也用batis,mybatis,Spring Data JPA之類的,其實學習哪個都可以,主要是找個教學視頻多的,或者說是你能看懂的教學視頻,任意一個都行。隻要學會了一個,其他的都能觸類旁通,他們的目的都是一樣的,隻是用法有些許不同,就相當於一個蛙泳,一個狗刨一樣,都是遊泳,一個是蛙式遊法,一個是狗式遊法。
這裏我很推薦黑馬老師的一個免費課程,這個老師講課極其清晰:上完要花3天的時間。之前感覺這玩意好恐怖好難啊,所有公司麵試都要,到底是啥,麵對未知的東西很恐懼。上完課以後發現窩草原來就是這麽個破玩意啊
http://yun.itheima.com/course/203.html
Spring,也是江湖上的大路貨,相當於絕情穀的陰陽倒亂刃法,它把class之間的關係都顛倒了,本來刀是刀劍是劍,現在class之間都靠互相注入,又有一堆aspect之類的新名詞,不倫不類的概念,弄得刀不是刀,劍不是劍的,讓敵人眼花繚亂,一看好像特別屌!其實對你這個有內力基礎的來說一點都不難!根本不需要畏懼!就是靠熟練,耍兩把武器別把自己輪著而已!
這裏還是很推薦這個老師的Spring課,和hibernate是一個老師,講的非常清晰,上完要花4天的時間
http://yun.itheima.com/course/215.html
學完了Spring以後,讓你知道了怎麽把體內的內力能夠運轉出體外,而且Spring是拿著兵器的,這是套刀法,有了殺傷力你才能行走江湖,所以這個是必學的!
學完了陰陽倒亂刃法之後,可以學習進階的丐幫-奇門三才刀(Spring MVC,MVC對應天地人三才,三才生五行,五行生萬物,編出一切互聯網,所以是個挺精深的刀法),田伯光快刀-狂風刀法(Spring boot,快速開發省去繁瑣的Spring配置)。學過程中把遇到不會的東西都查查,掃盲一下,基本上就把java ee東西學會了,剩下的就是熟練問題。但是其實一切東西的熟練問題自己在家都很難搞定,這個不靠上班是很難練習的。Spring這套東西發展了這麽多年,實在是太多東西了。所以這裏我是看了好多好多的博客,相當於別人的武學心得,才逐漸的讓自己理解了一些。
這個時候才終於有能力看開源項目了,也有必要去看一套Spring基礎上的開源項目了,研究他們的後端是怎麽寫的。我是看了一個Spring Boot + Spring Data JPA的項目,我就從它的Rest API -> Service -> Repository -> DTO -> Domain -> Mapper -> MySQL這個線,一點一點捋的,比如有30個API,擼了這麽三十遍以後,對後端怎麽搞,有了一點點概念。至於熟練,是以後工作中的事情了。
這個階段花了我full time每天從早到晚整整4個月時間,這套東西隻是了解還是半生不熟的,沒啥自信,Java EE也就達到了個實習生的水平。
——————————————平平常常————————————————————————
搞定了上麵這套以後,我終於靠著花裏胡哨的Spring招式,還有紮實的leetcode內力,找到了一個在加拿大還算有點名但北美沒名的三流公司Java Developer工作!我這個肥貓智力的人,終於花了幾年功夫,從通信工程 -> ECE 碩士 -> 通信行業測試 -> 軟件行業測試 -> 互聯網開發,終於走通這條線了!笨鳥慢慢吞吞的達到了本科聰明的同學剛畢業的水平,落後了我的同學們5年!不過我堅信以後會苦盡甘來的!
這個時候,開始爭取成為一個越來越強的Java Developer!
有一本神書,或者說一門神課,對於cs專業的同學們肯定都看過或者上過,就是Design Pattern。美國的公司在麵完算法以後,很喜歡聊天聊這個東西。當然了,對於很多30天生物專業轉cs還搞定穀歌offer的大神們來說,就是一本廁所讀物,讀一天就扔一邊去了根本不用細說。我本科學到的通信工程啊沒上過這個課!!而且在武功低兩個境界-“略知一二”以前的時候,我這個90的弱智還真是看不懂啊!
為什麽這個階段能看懂了呢,因為在上一境界-“普普通通”的時候,會接觸到各種框架,其中就有比如spring聲明的class都會是默認singleton。還有什麽proxy pattern,factory pattern之類的。逐漸的好像有了點領悟,但是具體咋回事真不懂,人家一說我啞口無言,但是起碼聽著耳熟了,沒那麽恐懼了。也就是我一直強調的入門了,腦子裏有第一個神經元了!
這個階段終於有能力看懂這本書了《Head First Design Pattern》。HFDP這本書我早就有了,原來我是真看不懂就扔到了一邊,現在我是邊讀邊不斷的“哦”,“原來如此!”,“soga!”,“妙啊!”,有種欲罷不能的快感,真是高屋建瓴啊!原來之前說的一堆各種模式,是這麽回事!現在能看懂了!
此時此刻的感覺,就相當於令狐衝在思過崖剛剛學會了五嶽5個門派的劍法,但是都是囫圇吞棗,亂七八糟的,隻知劍招,不知道這招劍法為什麽要這樣使,什麽時候使用華山的有鳳來儀,什麽時候該使用衡山的回風落雁,怎麽把劍法使得更有效率。這時風清揚突然出現!掏出了一本Head First Design Pattern獨孤九劍!就像一條細繩一樣,把腦中散亂的珍珠,給串成了一串又一串。告訴你什麽情況使用破劍式(singleton),什麽時候使用破鞭式(factory),什麽時候使用破刀式(proxy),什麽時候使用破箭式(Observer)等等,真是高屋建瓴。你以後看到用劍的就知道它的破綻可以這麽出招,下次看到用刀的就知道怎麽出招應對,人家都給你總結好了!學完設計模式,令狐衝一下子從30招就被田伯光虐了,變成了能打敗田伯光了!OOP能力一下提高一倍!
當然了我智商就90以下我沒令狐衝這麽聰明,這本書隻能讓我入門,以後獨孤九劍想要用的好,必須經常和人切磋武藝(多看別人的code)才能越來越熟練,熟能生巧。ps:這本書一定要盡量看英語原版啊!因為漢語翻譯的真是太垃圾了,翻譯完了還是人話嗎?這本書我每天地鐵上看3個小時,花了3周看完的。
——————————————平淡無奇————————————————————————
這個時候我就做了很多研究,想要在java的造詣上更上一層,於是打算看完以下的幾本書
Core Java Volume I, Java核心技術,卷1:
如果往好聽了說,那就是“雞肋”,如果難聽了,那就是“垃圾”,而且是垃圾中的垃圾,非常sb的一本書。看1000頁的破書純粹是浪費時間。
剛學java的人,會被這書裏東一錘子西一棒子的講法繞的不知所雲,看完以後根本沒學會咋編程。反而學會了java的人,看這本書就是隨手一翻,根本學不到東西,因為講的東西都特別淺還特別偏,隨便穀歌百度個博客都比它講的好。
有人說它羅列了這麽多沒用的東西,可以當個工具書,字典書。我覺得它根本不配當工具書,人家譚浩強的c語言寫的再爛,但是裏麵例子多啊,照著寫啊可以起碼學會個for循環吧。而且人家譚浩強的書裏大把大把的表格啊之類的可以用來查字典呀,比如一個變量前麵一個*,**,***,****都是啥意思。你這裏麵啥都沒有呀!
我非常非常痛恨這本書,因為我發現我垃圾的大學老師就是這麽教我java 和C的!怪不得我一直沒學會。這本書其實真正的用法是給大學裏沒有進社會當過實際碼農的sb留校老師用來寫ppt用的!!每一節都可以直接複製粘貼當ppt!裏麵大量的文字描述還有瑣碎知識點可以用來考試!期末考試題我都給你想好了:第一題:請列舉reflection的4個優點。期末考試劃重點,你就背誦默寫吧。至於你背完了反射的4個優點以後會不會編程?那sb老師可不管,反正學校的教學大綱達到了。第二題:寫出ArrayList的常用method以及用途,每個2分,本題一共10分。老師:哈哈這回我不是讓你背誦了吧,理解的人都會懂。尼瑪我理解了我也寫不出來呀,我們都是IDE自動彈出來的呀!學生學的時候,又隻能硬背了,至於背完以後ArrayList會不會用,肯定還是不會。
這書怎麽腦殘法呢,打個比方吧,相當於大家都是用一門《笑傲江湖》的語言來編程,這本書經常沒事寫一些犄角旮旯的東西湊頁數,
比如:if (笑傲.正派.五嶽.衡山.劉正風.get徒弟().contains(“向大年”) ) 輸出(向大年.toString()) 。這種知識點非常生僻,程序難度又非常弱智,然後忽悠了半頁向大年為啥叫這個名字的曆史讓你根本不知道它到底在說什麽。如果我是會編程的人了,我平時都是用“令狐衝”這個library的,誰平時編程會用到“向大年”這個800年沒人用的library。或者我是個菜鳥,你一頓呼啦啦的這麽多亂七八糟的人名都是啥呀,到底咋寫程序呀,我都懵逼了。所以新手老手看這個書都學不到東西。
最可氣的大量篇幅跟c++對比,有用的java的內容篇幅就更少了。這本書我是在地鐵上每天3小時,每天200頁,看了1周半看完的,因為有時候地鐵沒座。
Thinking in Java:
花多少篇幅寫這本書都不嫌多。這本書把java的學習上升到了一個哲學的高度。從根本上闡述了為什麽OOP有別於其他的語言。
所謂朝聞“道”,夕死可矣。OOP就是傳說中的“道”,OOP生太極,太極生兩儀,兩儀生四象,直到生萬物。OOP就是那個萬物起源,最根本的Object,萬物皆由Object衍生而來,所以才能Object oop = new 萬物(),整個世界都是一種多態。
過去我們一直在勇猛精進,學了一堆亂七八糟的東西。看似法力愈發高強,實際上我們一直忽略了學"道",夯實自己的道基,一直是修小術不修大道。長久以後,就會造成自己道基不穩,心魔入侵,走入邪途。所謂的“道基不穩”有些抽象,其實是你學了太多東西,沒有一門自己的根本語言,根深蒂固地用以統合自己所有的知識,抽離出其中最根本的最有用的萬變不離其宗的東西,成為一棵牢固的大樹,形成自己的<核心競爭力>。讀完這本書,其實並不能提高你編碼的速度,但是它為以後的進階,提供了指引的方向。這本書就相當於九陰真經的總綱,雖然講的都是天之道玄而又玄的道理,沒有具體武功。可是沒讀過的周芷若和讀過的古墓傳人黃衫女,同樣是練九陰白骨爪,前者練的鬼氣森森,後者像是仙女下凡,對招起來後者完勝。
又好比慕容博和蕭遠山,苦練幾十年少林72新技術新輪子,雖然都成了大高手,其實他們都是在反複刷同級別的東西。眼中隻有殺人技,卻對掃地僧偷偷放在他們秘籍前的Thinking in Java視而不見。殊不知在編程中,我們大多數人常常抱著一顆“功利心”去學東西,少有人天賦異凜從小就喜歡這行的。所以我們就需要這本經書,化解我們心中的“功利”與“戾氣”,靜下心來,化浮躁為喜好,真正的喜歡上編程,破除碼農之路上的<知見障>,走上大神之路。
這本書我覺得在這個階段看非常好,讀起來非常舒服,流暢。有的東西雖然很簡單,但是作者從一個你意想不到的角度去描述,讓你加深理解。我個人覺得起碼起碼需要掌握了MVC思想以後才能看的懂這本書,最好是讀過了Head First Design Pattern以後食用效果更佳,不然會非常晦澀。當然了智力高的人(那種大一就看算法導論的也不知道是裝逼還是牛逼的人)隨時都能看。但是我這個人上大學時候被陡峭的學習曲線深深地傷害過,所以我特別喜歡厚積薄發,平緩的進階。打個比方,同樣是練九陰真經,根基極深的王重陽讀了一夜九陰真經就徹底學通了,武功極高的黃藥師聽老婆阿衡背誦一遍以後就能武功大進,編程大神洪七公和一燈大師武功盡失(C++大神轉Java)學了一年就能重回巔峰,可是梅超風這種根基不深底子不厚的,強行練了5年把眼睛都tm練瞎了! 這本書有機會我還會2刷以至於3刷的。
Effective Java:
如果說Java是一本博大精深,可以練一輩子的九陽神功,那麽HeadFirstJava就是武當九陽功,由新手張君寶悟出,適合新手,占一個“純”字,把java最純的特性講給你讓你入門。Thinking In Java就是少林九陽功,由已經是大高手的無色禪師悟出,占一個“高”字,把Java最精深奧妙的特性講給你,起點就高。那麽Effective Java就是峨眉九陽功,由武林世家出身的郭襄悟出來,其從小對各種武學都耳濡目染,橫向一對比,把Java的優缺點都爛熟於心,占一個“博”字。
這本書其實應該有一個接地氣的中文名,比如《老程序員不會告訴你的78條道理》,《住戶驗房時必須檢查的78件事》,《震驚!好文必看!78條讓你震驚的編程禁忌》這麽一看書名,你就大概理解這本書講的是什麽了。這本書確實用處非凡,不過我感覺它的主要用處是在於別人給你code review各種挑刺時,你覺得你個sb你懂個屁啊,於是從書裏拿出來一條糊他臉上:書上就這麽寫的!
我個人覺得這本書不是很適合我,或者說是不適合現階段水平還低的我。因為作者是個大神中的大神,各種參與設計java,設計google的底層框架,業界混了太多年,是個和郭襄一模一樣的人,對刀槍棍棒都耳濡目染,這是他的畢生感悟。我讀了一遍感覺共鳴感非常低。我打算再過幾個境界以後重讀這本書。但這本書絕對是必看的。
——————————————粗懂皮毛————————————————————————
回歸現實世界,之前說過了,破了童身,無緣五絕的人,就不指望能去重陽宮這種好地方了,既能學武,又能學道,老師都是江湖上赫赫有名的高手,一不小心學成先天功那就是直奔先天高手去了,下山混江湖(創業)的時候人人尊稱一聲“道長”,混江湖的時候還有各種師兄師弟搭把手。親戚一問你在哪工作你可以自豪的說:我在重陽宮上班!(哪怕你在裏麵隻負責燒火)
沒辦法,誰讓我智力低呢。淪落江湖的我,終於被一家三流鏢局雇了,做一個全職趟子手(junior developer)。每天就是跟著老鏢師(senior developer)押鏢(寫業務代碼)。剛開始走鏢的時候負責一些小活兒,比如喊路讓行人借過。再後來解決幾個小毛賊(簡單的ticket)。得些江湖經驗,比如走鏢的時候要記得吃飯銀針驗毒(看log研究bug原因),放對兒的時候小心被對方的石灰迷了眼睛(正確理解ticket讓幹啥,別幹了幾天發現跑偏了),等等江湖大俠們碰不到的事情。
日子就這麽過去,進階道路現在看起來,應該是
趟子手(junior) -> 鏢師 (senior) -> 鏢頭 (team lead) -> 總鏢頭(department lead / CTO)-> 地區瓢把子 (開源社區或者這個領域有一定名氣) -> 總瓢把子 (業界赫赫有名)
這個時候終於算是入行了,至於以後如何進階成為碼農中的最強者,我發現此時其實有兩條路。碼農其實很像火影忍者,要想成為影,隱隱有兩種碼道(忍道):
一種是三代火影和大蛇丸似的,力求學會天下各種忍術(技術),一看到新語言新技術就撲上去玩一玩,不斷去嚐試新的忍術,研究新的禁術(造輪子),今天新出了scala試一試,明天玩一玩go,大後天研究研究swift,最後成為忍術博士。火遁·火龍彈 + 土遁·土龍彈,兩個B級忍術合一,能成為S級忍術。你掌握的技術多了,了解的領域廣了,土遁+風遁+火遁 = 無敵的塵遁。
一種是鳴人和佐助似的,忍術不要求學會多麽多,而是把僅會的幾種忍術練到極致。查克拉質變練到極致,再形變練到極致,兩個都極致了以後再二合一。比如鳴人,螺旋丸 -> 大玉螺旋丸 -> 超大玉螺旋丸;風遁·螺旋丸 -> 風遁·螺旋手裏劍; 最後二合一,超強的風遁·超大玉螺旋手裏劍。比如佐助,千鳥 -> 千鳥流 ;千鳥千本 -> 千鳥刃 -> 千鳥銳槍 ;最後二合一,雷遁極致:麒麟。
我覺得我這個人對於新技術新語言興趣不大,不喜歡沒事造輪子,配置個新環境就要死要活的。所以我的碼道,應該是第二種,將我現在會的Java領域的研究的更加深入,達到Java遁的極致。
——————————————半生不熟————————————————————————
漂流了這麽多公司了,我領悟出3條在加拿大當碼農的職場至理,算是我的畢生心得體會了。這3條至理是三個大方向,是根基中的根基,我覺得就跟牛頓三定律一樣,看起來就幾句話,但是可以延伸出無窮無盡的東西,具體如何延伸,就是見仁見智的東西了,放到網上供後人參考:
1.沒有任何問題是解決不了的。
不管是什麽技術難題,溝通不足,沒有資料,水平不行,這些東西統統都是可以被解決的。隻要給足夠的資源/重視/時間,全都不是問題。
我自己是這麽實踐這條的:我碰到一個東西被難住了,纏住了,千萬別著急上火,因為最後肯定能解決。碼農本就苦逼,你再急,到時候禿頂了咋辦,過勞死了老婆孩子咋辦。碰到難題,馬上第一時間跟你的經理反應,到時候他會給你建議/幫助/別人幫忙/資源/時間,別怕找人幫忙搶了你的功勞,或者別怕找經理要資源影響你的業績,其實你不吭聲,到截止了你耽誤了事才是影響你的評價的。最好是你跟祥林嫂似的見到個人就一頓吐槽我碰到一個老難老難的問題了,人家可能碰巧一句話可以給你解惑(你賺了),或者人家感覺窩草我也不知道啊你居然能碰到這種難題,他會感覺你挺厲害的(你賺了)。然後最後解決了以後,你匯報情況的時候你可以一頓狂吹你解決了什麽問題(你賺了)。次數多了,人們就會形成“你這個人是個專門能解決大難題的大牛”的錯覺(你賺了)。
2.想升職就要爆刷存在感。
這條是我和各種無恥烙印們一起學習工作了10年時間學到的。
首先我在上研究生期間有一個關係很好的小印,這貨的臉皮之厚讓我瞠目結舌,比如他背著我抄了我的作業,助教也沒發現,給我90分,給他60分(助教也是個sb),他不服,就去找助教:“我作業是照他抄的,一模一樣,憑啥他90,我才60啊”。我和助教都被他的邏輯還有他抄作業還不知道哪裏來的自信驚呆了,後來跟更震驚的是助教給他也90分了。從那以後我就隱約發現其實在加拿大(不確定美國是不是這樣),我們周圍日常能見到的所有老外都是sb,不sb的都去當ceo了,我們日常是看不到這種正常人的,sb對於sb行為而做出的sb反應,我們正常中國人是預判不出來的。以上這句話是前提。
小印每天上課都經常問老師一些特別sb的問題,我和有些國人同學每次聽到都狂翻白眼,心想這都是啥sb問題還用問麽。結果傻眼的是,老師們(不止一個老師)都可開心回答他的問題了,感覺他的提問搔到了癢處,感覺他特別積極思考,後來各種給他高分。其實不止老外或者烙印這樣,在中國讀小學的時候,我們肯定都見過這種人,上課總是積極舉手發言,下課就黏著老師問問題刷親密值。老師讓朗讀課文和詩朗誦,丫總是特別積極,念的那個搖頭晃腦聲情並茂的,我們都快吐了,老師卻把丫當個寶!所以說(在加拿大)中國人很難升職,因為語言不行,文化上也不適應,為啥?因為我們從小在文化上就鄙視這種事兒b,進入職場我們必須變成這種狂刷存在感的事兒b才行!(參考下麵說的曹雲金相聲)
至於怎麽狂刷存在感,我陸續從烙印身上學到幾條具體的方法,比如
a.sprint開會時候多說,不能隻說一句:我昨天幹了啥ticket,今天要幹啥ticket。而是應該說:我昨天做某個ticket,它是個什麽問題,為啥很難解決,我跟誰討論研究了一下,後來和xx部門的誰誰開了個會,發現它其實是個什麽的問題,於是用了xx和yy方法才解決,我又跟QA的xx研究了一下怎麽測試,這個東西大概什麽時候能deployed to production,到時候就帶給我們什麽好處。這樣你其實沒幹啥也好像幹了很多。起碼不會出現你實際上幹了很多,別人卻以為你幹了很少的情況。(這條方法入職的前3個月別用或者是悠著點用,省的把你的expectation bar提升太高了)
b.狂群發消息。幹了點什麽破事,盡量讓所有人知道。和第一條道理我說的一樣,跟祥林嫂一樣,見到人就吐槽你在幹啥東西,可難了blablabla。然後每出點成績,狂在你們比如slack之類的群,或者群發郵件,說幹了啥了。早請示晚匯報那套撿起來,各種群發update進度。讓領導們都知道有你這麽一個人,而且這個東西是你負責的。以後有相關事情,領導都馬上能想到你了。(至於什麽時候群發,取決於公司,如果你們提倡加班,你就留著郵件周末發。如果你們提倡ownership,你就大半夜群發你解決了bug)
c.狂總結和群發你們組事情的update。這個其實算是烙印搶別人credit的損招,是方法b的無恥版。比如你正吭哧吭哧改bug呢沒空跟人交流,他群發了一個總結,說我們(用We就把你的功勞搶走了)找到了什麽方法可以解決問題,正在改,大概什麽時候能完成,QA已經了解了這件事,會在什麽時候deploy。然後隔一段時間一個update,狂@領導。其實大領導根本不care你們到底咋改的或者你們到底誰幹的或者你幹的怎麽辛苦,大領導喜歡的就是手下們把東西搞好了,別給他找麻煩,他不想從下麵聽到逆耳的聲音。這時候發總結的人讓他了解到事情的過程應該會很順利,把他的氣捋順了,他開心了,感覺這個發總結的人不錯,記住他了,根本不知道辛苦改bug的人是你!這個就是北美文化裏的所謂leadership!方法c其實是一個manager的本職工作,但不是所有人都喜歡這麽做,就會被喜歡這麽做的人鑽了空子。方法c如果是經理以外的人做就非常無恥,我們可以做也可以不做,但是方法b你必須做,定時更新你自己的東西省的別人用方法c搶你credit。(參考下麵資源3的網文)
要想把這條道理深深地刻在骨子裏,建議時刻重溫以下3個資源
a.曹雲金的從藝10周年相聲<成長的煩惱>裏麵那個總“老師老師”的班長
b.新東方年會吐槽視頻瘋傳:<累死累活幹不過寫PPT的>
c.一篇網文:<我工作10年 沒拚過剛畢業的美國女孩>
3.沒有什麽東西是不能拖延的。
沒有什麽事是真的十萬火急的。不是你開的公司,沒有什麽事情是急到明天完不成就能死的。
我經曆過一個事讓我刻骨銘心。在之前那個公司時候,組裏雇了一個senior dev,結果他的出活兒水平連實習生都沒有,那個慢啊。雇他的原因就是因為組裏突然接到了一個大客戶的feature,大訂單有3M USD,時間非常緊急。大家都急的不行,天天996,可是他本身出活兒就慢,還天天一點都不急。所以到了交貨那天他才幹了三分之一。大家以為我們都完蛋了,結果跟客戶死氣白咧的一頓談,客戶又允許延期倆月,才好歹完成了。(換位思考:因為客戶也著急但是他們也沒辦法了,跟你們已經耗了半年了,你還要兩個月延期,如果他再找別的公司去,還要起碼等半年,不確定別的公司會不會也延期,事情隻會變得更糟。客戶已經被你們深度套牢了,不想割肉止損就隻能接受你們延期倆月)
自從這件事以後,我就有了一個標杆,就是隻有高於3M usd價值的活兒,才能讓我像之前那麽忙活,不然根本不值得為一個事忙。公司的截止日期不合理,是客戶代表的職責沒做好,不代表最後一環的碼農必須按不合理的方式去996。公司要首先保證做好的是把合同談的靠譜了,再給碼農們。如果一個公司連這點事情都搞不定,待下去也沒意思是不是。合同再大,錢也不給你,你跟著著急啥。當然了,起碼樣子上,我要擺出端正的態度來,起碼假裝我很重視,像之前那個慢悠悠的同事,合同結束了就被裁了。在這件事裏真正真正重要的,也是稀缺的能力,就是leadership,也就是協調各部門,協調客戶關係,協調各種資源的能力,你如果能跟產品經理,測試部門,領導們,business部門把事情安排的妥妥的,順利的把時間談好,預期好,東西做好,經理的職位肯定就是你的。在這一點上,我還差的好遠,我需要好好的學習。
**有一本神書,建議所有senior的程序員都好好研讀,Robert Martin大神的The Clean Coder,注意不是他寫另一個clean code,是兩本書。這本書先從一名產品經理的視角,描述怎麽去壓榨老實人程序員,催他們幹活,但是對其他部門卻跪舔的心得。然後詳細闡述了程序員應該怎麽和產品經理撕逼,以及怎麽跟不懂技術的領導踢皮球拖延時間的話術。讀完以後就會發現真的沒有什麽事情是不能拖延的,哪怕作者拚了老命才完成的十萬火急沃爾瑪大訂單,對方一個中層經理輕描淡寫一句話就說這個產品無所謂啊又拖延了一年之後取消了。有的時候領導的一根鼻毛大的小事,層層壓下來到了程序員老實人手裏,就已經變成了周末加班不睡不休的天大P0重擔,所以程序員一定要學會怎麽保護自己,把事情合理的頂回去!
要清晰認識到:產品經理這個職業就是地主買來的鞭子,雇來的狗腿子,抽打著我們佃戶碼農們背著犁辛苦幹活的,同時還要擔心自己是不是犁地不夠快,耽誤了插秧,不然地主來年不雇自己了。醒醒這再發展下去就是斯德哥爾摩症啦!如果一個公司不光有PM產品經理,還有TPM項目經理,這個地主絕對是更黑心的了。你細想,一個地主家地太多擔心種不完,多出來的錢不是去多雇幾個佃戶幹活,卻是用來雇狗腿子抽佃戶快點幹活,所謂的“優化項目進度”。我曾經和一個資深項目經理討論我應該怎麽跟他estimate一個ticket要用幾個story,因為我總是擔心寫短了我完成不了,寫多了怕人戳脊梁骨說我偷懶,怕被人鄙視我速度慢。英語翻譯過來他回答說: “我其實都看不懂你ticket裏說的哢哢一頓操作到底是啥,反正你就寫分析的時候,多寫點寫複雜點。然後我就複製粘貼給領導了,領導更看不懂。一旦領導確定這個deadline了以後,你就千萬不能改了。你到時候要完不成,我tm就得跟領導尷尬賠笑臉解釋為啥沒按時完成。所以你別讓我難做,我就不會讓你難做,你一開始就寫長點。”所以盡量一個ticket在分配給你的時候,你就一定要誇大他的難度,多申請點時間給自己。你才能遊刃有餘的完成活兒的同時,有充足的時間吃透相關技術,做demo,和領導開會邀功等等事情。
——————————————登堂入室———————————————————
由於從小我的智力很低,我腦子裏本能的有一個智商測試雷達,跟人交流一下大概就能判斷出這個人的智力比我高還是比我還低。轉成dev後漸漸的在邊陲的福威鏢局裏幹了1年趟子手(後半年被提拔成了普通鏢師),雖然自己幹的不是頂尖優秀,有不少人比我強,但是我沒有發現很多人在智力上碾壓我90的智力。有的人就是經驗比我豐富一些,押鏢業務比我熟練些而已,並沒有指數級的碾壓。有那麽幾個能碾壓我的,都是鶴立雞群的成為總鏢頭director了。
我意識到,我在三流的公司能中不溜,也就是說我是有能力去二流公司裏墊底的。於是我打定了我要去更好的公司的念頭,想去更廣闊的地方去長長見識,那樣的話,我就隻能去中原武林闖一闖!
這時候我就需要好好準備一下System Design了,這個美國公司要考的能力。之前我一直在練習寫code的能力,練得都是局限在一個method裏,一個class裏,在一個package裏,頂天了在一個project裏,但從來沒有練習過或者著眼過這個project是怎麽部署的,怎麽架構的,怎麽運營的。
其實用武功不太好形容,我發現用足球來比喻比較恰當。之前我們都是一直在努力成為一個好的球員,天天練習的都是球技,比如怎麽盤球,怎麽帶球,怎麽射門準,怎麽過人,或者說練習的都是怎麽自己單獨一個人對球的控製更好。可是我從來沒有從全局打配合的角度去思考過。你想被一個俱樂部錄取,雖然你腳上功夫不錯(寫代碼),可是你連什麽是“越位”(fail-over)都不太清楚,就算進了俱樂部,還能不能和其他人愉快的交流了?一個不知道後衛球員怎麽思考的中場不是好門將。
System Design其實就是訓練讓我怎麽從一個足球教練的角度不再是一個球員的角度,去全盤思考一場球是怎麽踢的。首先有很多基礎知識起碼要知道,比如強進攻能力(Strong Consistency, CP)的433陣型還是均衡(AP)的442陣型的配置,他們的優缺點,你要根據他們的優缺點做好trade off。你要了解怎麽讓前鋒跑得快(CDN for faster static resource),提高中場的傳球(Load Balancing)能力,加強後衛的防守(Master-Slave Replication)能力,提高守門員體質(Database Sharding),手長的傻大個門將(SQL)還是靈活的矮個子門將(NoSQL)選哪一個,球員們打好提前量配合(caching)等等。學會了基礎知識以後,你再去俱樂部麵試,人家給你一個白板,寫吧,設計一個皇家馬德裏的陣型(how to design uber),你就不再一頭霧水了。
學完了基礎知識以後,我覺得剩下的其實都是忽悠能力和想象能力。我的練習方法就是拿個草紙,在上麵不停的瞎畫,有一個github repo叫做system design primer上麵有很多例子,把上麵的那些球員組合,看一遍,自己畫一遍,看一遍再自己畫一遍,如果中間出現了什麽不一樣的,說明理解出現了問題,研究明白以後就再畫一遍。默寫多了,就成為自己的東西了。係統設計現在經過碼農們前仆後繼的總結,現在就是簡單的三步:1 Primer 2 Grokking 3 Data Incentive的書。完成1能找到工作,完成2能找到好工作,完成3能找到頂級工作。
我就又開始了刷題之旅,在痛苦和迷茫中有了一些感悟,一點拙見,如有高人異見,還請指點。
作為一個碼農上班族,似乎天總是降障礙於我這種普通智力的人,空乏我身行,拂亂我所為。我覺得這終究脫離不開修身,修心,修性三個方麵的磨煉。如果能熬過磨難,就應該會成功吧。
修身:於碼農而言,則為時刻保持饑餓,時刻保持謙卑,不停地去學習新知識,從而提高自己的專業能力和技能水平;作為一個先天智力特別缺陷的人,我們肯定在修身上就照很多厲害的人差上很大的一截,但也不能任其越差越多下去。陽明心學裏的“知行合一”隻是修身最入門的方法,難的是能長期保持知行合一的狀態。所謂知行合一,按我的通俗理解,即你知道這個道理是對的,你就應該去做;你知道這個道理是錯的,就不應該去做;你“知”道的道理要和你的“行”為保持一致。
你如果覺得打遊戲浪費時間是錯的,但是你還去打,荒廢了工作,這就是知行不合一。如果你覺得打遊戲是對的,於是你天天去打,最後打出來一個冠軍名堂出來,這就是知行合一。你覺得打遊戲是對的,但每天到了網吧反而去泡妞,也是知行不合一。知行合一是最簡單的也是最容易去做的有為法。若能長期保持身形意融為一體,不讓自己的精氣神外泄,就能達到佛家所說的佛身無漏,清淨圓滿的狀態。
所謂身、形、意合一,即你有打遊戲的天賦,提高自己打遊戲的水平(身),你天天去打遊戲,辭職去打(形),你喜歡打遊戲,不斷發掘自己對遊戲的熱愛(意)。所謂精氣神外泄,即不受外界幹擾:比如你媽天天在旁邊嘮叨耽誤你時間,你老婆天天作,或者白天要去送外賣夜裏還要幹保安,隻能在疲勞狀態下抽空去練習,這樣根本離清淨無漏狀態十萬八千裏,如何能成功呢。於我個人這階段而言,我知道刷題才是對的;每天都要刷題;要讓自己覺得刷題是個樂趣;不要迷戀於小說遊戲電影抖音導致外泄精氣神;如此知行合一下去,才有成功的希望。
修心:傳聞很多高人,往往遠離俗世,這樣就能脫離紅塵雜念,畢竟不是所有人都能紅塵煉心的。“心在紅塵中,片葉不沾身”是很難的。比如柳生宗嚴,去瀑布下修行冥想,在艱苦環境下,堅韌卓拔,意識到自己心靈的陰暗角落,斬殺心魔,從而突破自我。在磨練中,提高自己的心靈力量,鼓足勇氣。用慧劍,斬去三屍,即斬殺煩惱,斬殺焦慮,斬殺恐懼,達到身如菩提樹,心如明鏡台的狀態。從而人生積極樂觀,心靈澄澈,充滿正能量。
於碼農的日常角度來說,在麵臨自己認為很難的任務前,不要有畏懼感,要勇於突破自己的心理安全區,接下來這個難活兒。不喜歡在眾人前演講,就要有意識的去接一些演講。不喜歡和人社交,就要鼓起勇氣,每天多去和不同的同事去聊聊天。
於我個人這階段而言,刷題就是個修身與修心斬三屍的過程。刷題中碰到難題好可怕,克服恐懼,要戰勝畏難心理,哪怕是抄也要咬著牙抄下來。不要豔羨他人,不要去想自己的同學們早都特別成功了,克服焦慮,做好自己就可以了。不要懷疑自己,認為自己做不好,自己比別人差智力低,克服煩惱;每天回家好累,要忍著堅持下去,克服懶惰,找個圖書館安安靜靜思考。要能常人所不能,忍常人所不能忍。堅持久了,哪怕比不上大牛,比起渾渾噩噩的普通人,也綽綽有餘了。
修性:(我的修行程度還不高,對修性的理解並不深刻)修心和修性本來就互相交叉,是相似的概念可是卻有細微的不同,“明心見性”說的就是,你了解了你的內心,才能一窺自己的本性。天天下班去看電影,擼串,打麻將,擼啊擼,沉迷於五色六迷之中,很容易迷失了自我,不知道自己喜歡什麽,不知道自己存在的意義。
<金剛經>裏說:一切有為法,如夢幻泡影,如露亦如電。這句話其實可以無窮無盡的引申,拋去唯心主義的宗教理論,從我個人生活的理解是:很多聲色犬馬,其實就是如朝露閃電一般匆匆而來,匆匆而去,並不會留下任何價值,都是虛幻的。隻有自己,才是自己能把握的,才是真實的。所以很多東西如果並不屬於自己,其實都是鏡花水月,就並不值得去追求。比如你喜歡擼串,天天一頓吃,最後幾年過去了,花了錢買了很多不健康,自己成了一個油膩的中年胖子,倒不如自己開個串店,那個才是你自己的。你喜歡女神,女神並不喜歡你,也不要糾結,隨緣即可,如果太過著相,反而於人於己都隻是帶來煩惱和痛苦。你包養了個小三又有何用,小三最後也都是幻影,自己的美滿家庭才是真正屬於自己的。
人到中年,越來越對<道德經>裏說“夫唯不爭,故天下莫能與之爭”這句話有感觸,覺得有無窮的道理。 壁立千仞,無欲則剛,如果有了欲望,反而就有了弱點。有了弱點,就很容易失敗。一旦對結果有了期待,如果達不到結果,就會失落。期待越強烈,反差就越大,失落就越大,本性反而被貪、嗔、癡所汙染。就和炒股一樣,非常想發財->買很多的股票->期待發大財->賠錢->想翻本->加大投入-> 虧更多的錢。如果一開始就知道投資肯定有賺有賠的心態,去投資而不去投機,抱著理財而不是發財的心態,就不會落入這種死循環裏,反而成功率會更高。或者比如總蠅營狗苟的非要去和人競爭經理的職位,大家都知道你在爭,爭不過人家就丟大人了,惱羞成怒,隻能一走了之,可是如果一開始就保持平和的心態,不去算計這個和那個,和同事們都保持良好的關係,經營出來個圈子在後麵挺著你,自己的水平又足夠,如此這樣,到時候經理不是你的又是誰的呢,還需要去硬爭麽?又或者於我個人而言,特別特別想和其他成功的同學相比,感覺自己特別失敗,自己就會特別失落和煩惱,又何必呢。我隻要好好的修持,自然會有出頭的一天,如果出不了頭,保持現狀也不是很差是不是。
如果能保持不悲不喜、不驕不躁,任憑風雲變幻,我自不動如山,其徐如林,心靈空明澄澈,保持真我和自我,就不會失敗。
總而言之,修身是有為法,有跡可循,修心和修性屬於無為法,隻能靠自己領悟,在這方麵,我的領悟還非常淺薄,還需繼續。有些人為啥智力很高,最後高考還沒有別人好,工作也不一定好,事業也沒人順利,就是因為雖然修身很厲害,但是心性修為差太多。隻有三者綜合得分高的,最後才能成為大牛和大神。所以我這種普通人,也要三個方麵齊頭並進,三元歸一。其實於各行各業,打工與當老板,也無外乎修身修心修性這三條,就如人飲水,需要各人各自品味了。
——————————————略有小成————————————————————————
上個階段花了我整整一年的時間。感覺真是學到了好多東西,進步非常大。尤其是在後期的時候,越學越感覺到在福威鏢局裏武功得不到進步了,能學到的都屬於鏢局的業務經驗,維護現有業務的維護經驗以及在鏢局裏的撕逼能力,非常無趣。感覺同事們也都是渾渾噩噩的江湖莽漢,沒有高手,注意力都不在打磨內力,而是在多學一些招式套路上,特別喜歡花架子。可最好的招式也頂多就是總鏢頭特別推崇的辟邪劍法(GraphQL)。妙是妙矣,可沒有葵花心法,威力也就止步在三流爾爾。我也越來越有一種自己不屬於這裏的感覺,非常像修仙小說裏寫的,在飛升上界之前,隱隱感覺被這方天地所不容,可是又不能全力出手幹活,因為會被此界的濁氣汙染了內息。
最後在各種偷摸的請假和麵試中,我得到了少林寺的錄取!相比之前的鏢局,能進入少林寺,我也算是名副其實地達到“略有小成”境界了!而且不是那個和在福威鏢局一起在福建邊陲的莆田少林分部,而是在中原武林的少林寺總部!
不過雖然說“天下武功出少林”。雖說少林還是底蘊深厚,也能保證弟子們基本生活,下山也能受到江湖人士的必要尊重,但現在早已不是天龍八部時代了,少林也早已不是那個一言就廢掉丐幫幫主的武林泰鬥了。當然了,我原來的鏢局,比起少林俗家下屬的龍門鏢局都不如。能進少林,也算是一個很大的進步了。隻是我一直練的是道家心法,要被迫狠心轉成佛門心法,不知道會不會兼容。尤其少林是方外之地,與世隔絕,用的東西都是老和尚們內部開發的輪子,不太利於再投別派。少林又戒律森嚴,不知道我的未來將何去何從,是福是禍。
——————————————已有小成—————————————————————
進了少林以後,最強烈的感受就是不愧是佛教聖地,天竺和尚真多啊!尤其現在的方丈-達摩,就是天竺人,非常有手腕,佛法精湛,將少林打理的蒸蒸日上。不過這些天竺和尚們跟我之前接觸的倒是不一樣,他們都非常友好和勤奮,又饞又懶偷奸耍滑的很少,對我的幫助非常大。我覺得可能是因為天竺人已經當家做主拿下方丈位置了,國人群體又已經非常非常小了,已經不是天竺的鬥爭目標了,反而天竺們的目標是從西夷人那裏搶蛋糕。所以雖然升職成經理這種好事輪不到,但是平時在這種氛圍下,天竺僧人們都非常友善。(當然了,不能因為任何人表麵友善就輕易相信別人。呆了半年我就經曆了一例我們組為了搶credit,非要瞞著另外一個天竺組偷偷造重複的已有輪子,還要無恥的跟那個組要權限,理由是要開發另外一個不相關的東西。他們連自己人都騙)
再有的感受就是,少林的輩分真多啊,分為:慧、智、覺,了、本,寂、圓、玄、空、虛,等起碼10個輩分!新畢業生都是“虛”字輩的。我混江湖了這麽久,開始才分我一個“空”字輩的offer我是覺得有點可惜的。可是我進來才發現連沒有輩分的小沙彌(intern)都特別強,虛字輩我打起來就非常吃力了。有的師兄們已經在寺裏20年了還是“空”字輩。我也發現少林這裏特別多的和尚們掛單掛好幾十年不跳槽,特別忠誠。
我一開始是跟著高我兩輩的“圓”字輩的一個師叔祖混,姑且叫他“圓真和尚”吧。圓真在寺裏已經20年了。圓真叔祖佛法也是極為精湛,尤其是口吐蓮花的技能,可以連續講經三天三夜(開會時候可以不大喘氣的狂侃3小時)。後來我開會多了,發現凡是“圓”字輩以上的人,基本都有非常強的講經技能。比如說給你一個ticket,改一行URL,他們能連講一個小時這個東西的意義和各種context。還有就是老和尚們的辯經能力特別強。辯經就是天竺傳來的佛教特色,藏傳佛教還保留著這個傳統,即大家坐一圈,針對經書(design doc)上的一點展開激烈的辯論。對方一頓扯,你不可以被繞暈,還必須迅速從中提取出需要辯論的點,迅速捋順思路給予還擊。我經常開會幾分鍾以後就基本跟不上節奏了,而且常常開會一小時連話都插不進去。在少林想要升職,真的是需要提高講經辯經的能力,難啊!
以前在鏢局大家走鏢的時候,都是組成一個圓圈,一起保護一台笨重的大鏢車,一旦某個鏢師失手(有bug)或者麵對的敵人太多(traffic spike),這種monolithic的鏢車就麵臨很大的危險。在少林我們下山化緣的時候,都是組成十八銅人陣(distrubuted system),每個人隻負責自己那份齋飯,這樣哪怕一個microservice銅人被擊倒了,並不太影響其他銅人的陣法運行。 但是我個人並不喜歡銅人陣,它對公司的運轉穩定性當然是好的,銅人就是一個螺絲釘,死了就可以換;但對於個人來說,陣法太複雜,每個銅人都需要練習自己獨特的步法,習慣了一個位置以後就很難轉換到另一個位置,如同盲人摸象一樣,每個人就了解自己摸的那個部位,很難掌握big picture。而且十八個銅人各司其職,兩個銅人之間很難互相比較,對於比較努力的人,很難鶴立雞群,有的人得到的活兒就好,有的人的活兒就又苦又累。本來努努力就可以成為整個project的go-to-person,但是現在即使努力也就是成為兩三個service的go-to-person。
在少林沒人用Spring刀法,都是用拳法-虎鶴雙形。剛換了技術棧的我特別不適應,完全不明白怎麽回事,前幾個月特別緊張。還好虎鶴雙形並不是什麽高深的武功,慢慢地適應了下來。突然有一天我領悟到其實陰陽倒亂刃法的陰陽概念,就對應著虎鶴雙形裏的虎鶴,虎的剛猛結合鶴的靈動,虎的威猛結合鶴的優雅,各種framework竟然如此相通!軟件開發就像一個太極圖,前後端一陰一陽,前端多變靈動,後端沉穩厚重,API就是中間那條交界融合陰陽。所謂後端,無外乎就是接口的定義而已,不論執行層叫做什麽,不管數據層什麽語法,內中剛柔並濟(數據model和展示model並存),生死幻滅(Object inject dispose),加上層層Filtering和一個Auth驗證(闖入太極圖中黑圓領域裏的白點),此時後端於我,再沒有秘密可言了!
其實如果有人喜歡業餘搞開源多見過幾個framework的話,應該比我更早領悟。到了這個境界我唯一有點怵的地方就是DB設計,畢竟一個組弄完一次就不會再碰了,不是建組時候進入更不會接觸到。經驗太少,希望找到機遇能在這方麵有所突破。
——————————————鶴立雞群 —————————————————————
時光緩緩流淌,我一直在苦苦思考未來的我應該如何走出自己的職業道路。為了更好的職業發展,是應該不停的刷題看DDIA跳槽升級,還是辛苦幹活兒在同一個公司爬梯子升級?一旦換公司,你之前的一切名聲,信譽,領域知識,都會受損嚴重,甚至要徹底重頭來過了。就像我這次的跳槽一樣,在上一個公司什麽都懂又怎麽樣,隻是domain knowledge多一些而已,一旦挪窩了,換了新技術棧,新工具,新環境,新商業模型,一切重來,我和一個懂的多點的intern(越好的公司intern就越強)有什麽區別?如果倆人同樣起點,就是純拚智力,人家比你聰明比你能加班就是比你代碼寫的多,到時候你一個senior尷尬不尷尬?可是要是呆在同一個公司,就要苦熬資曆,麵臨工資倒掛,努力工作都不一定能得到晉升。我又根本沒有那一學就會,一會就精的聰慧,畢竟我這麽低的智力,到了少林,已經堪堪快墊底了啊,我的智商就注定了我在技術上已經快要到達我的知見障了!哪怕換個組都傷的很!所以我苦苦思索,程序員職場中的恒常不變的“道”到底是什麽?到底什麽才是可以移植的能力?對於我這樣的普通人該怎麽辦啊啊啊?
後來我讀小說中得到了第一部分啟發,小說裏一般都有金仙和大羅金仙。何為金仙?金仙是這個世界的混元聖人,在本世界中稱雄,萬劫不磨,與天地同壽。但是出了本世界,來到本宇宙中,凶威就大大下降了,若是去了其它規則衝突的異宇宙,也就和普通的仙人差不多,因為天地規則變了,所以金仙是世界位格!但大羅金仙不同,大羅是通用位格,被一切時空、宇宙承認,一證永證!不論在任何世界,任何宇宙,同樣都有巔峰實力!大羅金仙的修煉,在於遊曆諸多宇宙的過程中,將自身領悟的規則不斷剔除,取其精華,去其糟粕,不斷整合自身,留下最為本質、最為純粹的規則之力。所以這裏的“規則之力”就是我一直苦苦找尋的碼農之道!
第二部分是回想到了天龍八部,其中給我印象很深的一幕就是,虛竹哪怕武功高強堪比CTO,也要被罰去菜園挑水劈柴,report to無良菜園管事(緣根),天天被職場PUA,髒活累活都得幹,credit卻全被菜頭搶了。菜頭可是管著三四十人,威風的很呢。如果沒有鳩摩智打過來,菜頭的職場影響力在方丈眼裏絕對完爆武功高的虛竹。而且菜頭的技能非常transferable,哪怕少林寺倒閉了,拍拍屁股也可以去大相國寺繼續麵試當菜頭!幹的好的話還可以升職到飯頭,院主,監寺,督寺,甚至是小廟的方丈呢。
第三部分是有一天我碰巧和一個失聯多年的同學重逢,他的智商大概是正常人,比我高一些,但是他的情商太低太低了。平日裏都是別人用關愛智障的眼神看我,幾天來居然換成了我用關愛病人的眼神看他,這給了我巨大的啟發!哎我的智商雖然低於普通人,但是我的情商稍微高一點點,是普通人的水平啊!我應該揚長避短!(雖然我的長也不是很長) 。
一個大組織,比如丐幫,一定會有傳功長老的track和執法長老的track。傳功長老要武功最高,技術最強,帶著組員在技術上進步,屬於tech lead。而執法長老就是要負責規章製度,請假晉升,招人裁人的people manager。所以綜合考慮起來,我最後決定我的路線就是做people manager,而不是tech lead。
既然目標已經定下來了,我決定自創出一套屬於我自己的心法口訣,結合技術與非技術,尤其著重於鍛煉我的嘴炮能力。自創武功的過程中,人就會主動思考並且主動去尋找書籍資料,去探索自己以前不知道的東西。主動學習比被動學習更有效率,瓶頸就更容易被突破,小說裏都是這麽寫的!
打算用餘生完善我這部碼農版本的<道家秘傳·九字真言>: 臨、兵、鬥、者、皆、陣、列、前、行。正文隻收錄“鬥”字訣,其他的放在外篇,本來一開始收錄的是"臨"字訣,但我感覺其他都是小術,唯有內心的強大才是真正的強大, 修心才是根本法門。
鬥字訣:鬥誌,勇敢,sense of ownership。有的時候隻想躺平,不想努力,不想奮鬥,覺得實在堅持不下去了,做什麽都沒用。所以矢誌不移的決心和意誌,保持鬥誌是攀上頂峰的必要條件。不過可惜的是,這世上沒有人會給我鬥誌,我能靠的就隻有我自己,所以要培養自我激勵能力。我發現,自我激勵可以分為正麵激勵和負麵激勵,要發現自己的激勵點,沒事就按一按心裏的這個按鈕,給自己上一上發條。(我並沒有找到心理學界的相關研究來支持我的觀點,所以應該是我首創的)
正麵激勵:重溫鄭伊健的電影<中華英雄>,最後無情的吳鎮宇最終敗在華英雄的手上,是因為他漠視愛,他殺了妻兒,自毀雙目,就是為了追求更高的武功,已達到無情無義的絕情劍法的頂峰(一個熱愛技術而完全忽視家庭的geek確實可以很強)。而華英雄,將對妻兒壓抑在心底的思念變成力量,我要為我的兒子,為我所愛的人打敗你,我要為他們活下去。這種就是正麵激勵。當你為了家人而戰,為了家人而變得更強,這時你就有了更強的力量。這就是你贏了的價值。有的人正麵激勵就有動力,比如喜歡技術,或者想為家人改善生活,或者為了純粹認可公司的價值而努力。這都是正麵情緒產生的激勵。
負麵激勵:其實很多人都是被負麵情緒激勵的,隻是自己不知道。最典型的想法就是那句,“當初你對我愛答不理,以後我讓你高攀不起”,幻想自己發達了,狠狠拿錢抽在以前看不起自己的人臉上。舉個貼近生活的例子,比如說在親戚微信群裏,你的北大表哥侃侃而談一些你一聽就覺得錯的東西,你不服氣反駁但是周圍的親戚紛紛稱讚他卻說你不懂事。人們都有慕強心理,強的人放屁都是道理,弱的人有道理也是放屁。原因是你不夠強,想要得到人們的認同,你必須要變強,到時候就可以狠狠打臉他們(往好聽說就是想得到人們的認可)。仔細想一下,其實火影忍者裏的鳴人就是這麽想的。而且鳴人他每次戰鬥前,都要先回憶一遍從小別人不認可,孤零零坐在秋千上的場景,來激發自己的鬥誌。我發現我就是一個很容易被負麵情緒激勵的人,負麵情緒最能激起我的鬥誌。所以我找到最能激勵自己的點:“你看上學時候你最討厭的誰誰誰,現在混的比你好多了”,每次一想,半夜睡著了我都要一拍大腿然後起床使勁工作。
斬除負麵情緒:上麵說的不論正麵還是負麵激勵,他們都是把你往前方拖著走的。但是很多時候人會產生很多負麵情緒,比如很多時候會想,為什麽公司這麽摳,為什麽同事這麽蠢和壞,為什麽代碼庫這麽屎等等,一旦負麵情緒大於激勵,你就會被拖著往後麵走。我之前在修心篇斬三屍那裏有些涉及,但那是屬於宏觀方向,至於如何保持對微觀工作本身的熱情,我偶然從一位禪師那裏得到了啟迪。禪師說:
單純掃地不會累,掃著掃著起一個念頭,“我已經掃了好久了”,馬上就累了;“掃了好久了,還沒有人來替我”,馬上就起煩惱了;“沒人替我不說,旁邊有人看熱鬧也不管”,好,煩惱就加倍;“我覺得他們都是別有用心的,故意這樣看我笑話的”,好,煩惱就生了一大堆兒孫。是因為掃地的緣故麽?不是的。是因為那個念頭的緣故。誰讓我們煩惱?莫名其妙生氣的煩惱。如果隻是單純的掃地,開心地掃地,什麽都不要想,這是一種享受。
從今起,我將我的修心流派命名為:不動洗心流。何為洗心?洗滌心靈,道心不淨,吾洗之。有生必有滅,無生則無滅,不執著於生滅,心淨不起念。 何為不動?人生在世如身處荊棘之中,心不動,則人不動,如心動,則人妄動,傷其身痛其骨,於是體會到世間諸般痛苦。所以內心的強大才是真正的強大,內心安寧才有真正的喜樂。
——————————————駕輕就熟 待續—————————————————————
隨著世間的修士越來越多,汲取更多的天地靈氣,卻不知反哺天地,正應了那句“天生萬物以養人,人無一物以報天”。天地間的靈氣和資源越來越少,終於我們進入了一個天人五衰的末法時代(碼農開始供過於求)。天地不仁,以萬物為芻狗,天發殺機,移星易宿,竟是無人能逃!因果糾纏之下,我們修士,都要被迫完過一場殺劫(裁員),以殺止殺,以力證道。若渡過殺劫,可再享一千二百年逍遙;若渡不過殺劫,則身化灰灰,身死道消。
“一生懸命”,就是我們碼農這輩子最好的寫照。不過我已經把這個詞改變了原有意思,變成:“我們(可憐)的一生,命都是懸著的”。我們不停地被各種時間線timeline, 死亡線deadline懸著脖子,腳下無依無靠就是個小板凳,隨時可能被這些線勒死了。哪怕從微觀層麵不斷披荊斬棘、如履薄冰完成了各種任務,但是宏觀上卻躲不過人老珠黃,被公司卸磨殺驢而最終命懸一線。眾生皆苦啊,這種苦無法被人理解,無從對人言說,沒有一個人可以幫助自己。人唯自渡欸,要努力打破天地這個大囚籠,獲得大解脫,大自在!
——————————————青出於藍 待續—————————————————————
——————————————融會貫通 待續—————————————————————
附錄:
現在我的境界還是太低,不過我隱約覺得未來會有一些境界,不知道有生之年我能不能達到這幾個境界。
人鍵合一: 當你對於你的項目還有所用的技術棧tech stack有相當的了解以後,可能突然有一天福至心靈,達到一種莫名的神而明之的沉浸狀態。那時候你就是鍵盤,鍵盤就是你,人鍵合一。你的心中隻有鍵,指哪打哪,想到什麽思路就能瞬間碼出來。達到這種狀態以後,一天你碼的代碼量能達到平時一周的量。但是需要消耗大量真氣,解除狀態以後能累吐血,第二天精神狀態很差。
凝練鍵意:達到一定的武道境界,逐漸形成自己的風格,在對敵(編程)時,亦無所謂招法,出手即是招,亦無須經過大腦的思維,而是“不期然而然,莫知之而至”的本能反應。此時返璞歸真,最簡潔的代碼往往是最有效的,不需要經過大腦思考,就能寫出讓人驚歎的代碼。和小說中的拳意,劍意一個道理。
祭煉一件本命法寶:熔煉自己畢生所得,化而為一,寫一個自己的項目 personal project。這個項目和你血脈相連,你對它的了解就像自己的手一樣。把它放入紫府中,時時用自己的本命真元溫養和淬煉,最後無堅不摧,最終成為一件大名鼎鼎的法寶,以至於碼農界一聊起來法寶排行,你的能占一席之地。就和尤雨溪煉的Vue.js, Linus煉的Git一樣。
萬法歸一:對於這個境界的碼農來說,什麽語言,什麽技術都無所謂了,都是一樣的東西。飛花摘葉皆可傷人,草木竹石均可為劍。什麽batis啊,mybatis啊,什麽spring啊,什麽react angular啊,什麽php啊,什麽python啊,都無所謂,都可殺人。
打通任督二脈,後天返先天:終於回歸了編程的本源,從此不再是單純地為了碼代碼而碼了,而是為了實現自己的理想而碼,為了實現一門事業而碼。就像餓了麽,滴滴打車,比特幣這種項目,編程變得純粹,是為了改變世界。有的人被後天濁氣汙染,不打通任督二脈沒法返本歸元,回到編程的最初意義。我就有一個同學達到了這個境界,在FAANG幾年以後悟出了一門先天神通,搞出了一個business。或者有的人天生娘胎裏就留下了一縷先天真氣,於是在沒達到這境界的時候,就能搞project。大家都在學校的時候經常看到一些大牛,上網找一些技術,拚吧拚吧就拚成了個東西(大牛不需要深入懂這個技術,技術隻是實現他想法的東西,能用即可),然後創業去了。
天人合一:已經站在已經計算機界的巔峰,太牛逼了已經要上天了。他們已經窺得了造物的奧妙,宇宙的真理,比如計算機之父伊曼,AI之父圖靈,信息論之父香農,互聯網之父蒂姆·伯納斯。他們修煉的已經是規則之力,隨手打出一拳,都是法則和真理。
破碎虛空:可能天人合一境界以後,天降劫雷劈大神們,大神們渡了雷劫之後,就破碎虛空了。這個就應該是最終的境界了。這個境界隻是一個傳說。
外篇·碼農版九字真言
https://blog.wenxuecity.com/myblog/79604/202203/25838.html
=========================比較好的別人帖子===============
其實很多人學編程都會遇到困難,我覺得其中一個根本原因是他們沒搞明白學編程到底是學什麽。
編程不是一種知識,而是一門手藝。
我們從小到大的學習都是學習知識,流程一般是課前看書預習,上課聽講,下課做作業,然後複習考試。但是學手藝可不是這麽學的。
我們先拿遊泳舉例,遊泳不是知識,而是技能,也可以算門手藝吧。
需要預習嗎?需要上課聽講嗎?不需要,因為兩歲小孩都能學會遊泳,他們連話都不太會說呢,怎麽可能聽課預習呢。遊泳是通過在水裏的練習,教練手把手地傳授動作,一點一點提高熟練度學會的。
我們再來看看彈琴,學鋼琴一定要有鋼琴,音樂基礎知識也是老師在練琴間隙傳授的,並且一定會結合練習,另外練琴時間是很重要的,必須保證一定的練習量,有些理想遠大的琴童練琴時間可以用慘無人道喪心病狂來形容。
千萬別把編程看作知識,計算機科學是知識,但是編程是手藝。
既然是手藝就要用學手藝的思路去學習。
以動手練習為主,看書學習為輔,甚至極端點,初學的時候除了看必要的文檔都可以不看書,等有了一定編程基礎後再去看書,看完書立刻動手編程去驗證書上的理論知識。
練習一定要循序漸進,把手藝分解成幾個簡單的動作,反複練習直到熟練,然後再把基本動作組合起來練習直到熟練。拿C語言舉例,比如從認真寫好一個Hello world開始,然後去熟悉 if for while 等基本關鍵字,然後熟悉字符串操作,內存操作,練習查找 排序 二叉樹等基本算法數據結構,然後學習一個小型Framework。。。。
找個師傅,手藝的一大特點就是自學是很慢的,而且容易走彎路,而有人手把手教要快得多,手藝有很多細節,實際操作經驗,需要去體會感受的東西,這些細節書上基本不會有。
堅持做大量的練習,以代碼行數為例,每年50000行左右是比較一般的練習量,有毅力的話可以挑戰10萬行。(有人說代碼行數不代表什麽,行數多不見得程序就對,寫得好的程序代碼很少blablabla,滾,去跟朗朗說去,告訴他其實不用練那麽長時間琴。)
回憶下自己當年是怎麽學會騎自行車,學會遊泳,學會打籃球的,按照那個思路去學編程,而不是用你學大學課程的思路去學編程。
記住,編程是手藝,不是知識。
最後再強調下,對編程能力本質最好的比喻就是彈琴。但是有了編程能力還不能算優秀的程序員,優秀的程序員是作曲家,他們不僅能想出優美的旋律,並且能彈奏出來,就像優秀的程序員不僅能想出優美的算法架構,而且能把它變成可執行代碼。你很難想像作曲的人不會任何樂器。
很多人的問題是想當作曲家卻不肯下功夫去練琴。
共勉。