不要偷懶,也不要耍機靈
總是希望能夠把自己經歷過的一些事分享出來,把走過的彎路告訴後邊的人。有些痛苦和迷茫,你自己回過頭來覺得很珍貴,其實只是你自己不願意承認那些苦都白受了而已。
先說下我自己。小時候,我有嚴重的小兒多動症,後來考進了「985」。畢業後先去了一家國企科研單位,後來去了一家世界500強的公司,一直幹到現在。
我從大學開始接觸程式設計,到現在正好是十年,中間斷過,後來又繼續從事程式設計工作。
做任何事情,最關鍵的是先入門,從事程式設計工作也是一樣,那麼做程式設計到底到了哪個地步才算入門呢?所謂的入門,是你進了一家公司,然後開始給人家幹活,並且能夠提供合格的交付件,這就算入門了。我的目的是在你一行程式碼還沒寫的時候,給你一些建議。
不管在任何企業,厲害的人應該是主動地幫企業改進流程,給企業降低成本,提高效率,當然要實現這個目標非常難。最高的境界就是你改進了流程,企業終於不需要你了,把你開了,當然這是開玩笑的話。任何能做到提高整體效率、降低成本的人,都是企業的寶貴資產,做程式設計師也一樣。因為我是做程式設計師的,所以,我就寫寫如何做程式。我想我寫程式的心得,不管從事什麼職業和行業,都會有價值的。
我們分成幾個話題來討論:
一、做程式設計師如何入門
如果你一行程式碼都沒寫過就想當程式設計師,我覺得你勇氣可嘉,不過也可以試試,其實思路是一樣的,就是使勁地敲程式碼。你可以搞個編譯工具,找一本程式的入門書。學習c語言可以選擇譚浩強的書,學習java可以選《瘋狂java講義》,千萬別碰什麼《java程式設計思想》之類,寫程式碼不需要思想。你可以把上邊的每一個例子都敲一遍,然後執行一遍,千萬不要偷懶,也不要耍機靈,一個例子都別落下,而且必須是全部執行通過了。當你把一本書上的例子和習題全部執行完了,這本程式設計書30%的知識就是你自己的了。
然後,你需要繼續敲程式碼,不要去做那種複雜的演算法題,先把基本的東西做熟練,直到你翻開任何一頁,給你指一下,你不看人家原來寫的是什麼,直接把那段程式碼自己敲出來,這本書就是你的了。如果做到這一步,這門語言的道路上,你已經行走了50%了。
然後,你需要繼續敲程式碼,找點稍微複雜點的演算法題,但是別找太複雜的。如果你的資質和我一樣平庸,就先多找些習題,千萬別搞大躍進,一道一道地做,至於定什麼具體目標,大概如下:
1.菜鳥級的程式設計師,累計敲了一萬行的程式碼,能夠不看書編碼了;
2.能夠給公司幹活的程式設計師,累計敲了五萬行的程式碼,但是寫程式碼的速度比較慢,除錯的時候也比較慢;
3.老手級的程式設計師,累計寫了五十萬行的程式碼,寫起程式碼瘋了似的,半天就可以寫兩千行,五遍以內執行通過的人。
你可能覺得我在亂說,其實並不是。比如,怎麼篩選出優秀的飛行員呢?就是要看這個駕駛員安全駕駛了一千個小時還是一萬個小時。
跑步圈討論今年的訓練水平,就按照跑了多少公里衡量。程式設計師編碼也是有硬指標的,硬指標達不到,你就沒辦法建立那種神經元之間的硬連結,也就沒法做到收放自如。不要迷茫,不要鬱悶,還沒寫夠五萬行,你找不到如何編碼的感覺是正常的,就像你初中之前寫出來的作文跟智障寫的似的。多練,總錯不了。
我大學老師和我一樣,都是平常人,但是他成就很高,他像一個布林什維克一樣要求自己。他每天寫程式碼,寫文章,每天工作十二個小時,每天也跑步一個小時。他說其實編碼和寫文章這倆事是一回事,你得不斷地寫,才會有感覺,才不會出錯。你寫得少,沒法下筆成章,寫出來的東西別人讀起來困難,你自己的想法也傳達不出去。不信的話,你自己試試,寫一段話或者一篇文字。如果好幾年不寫,你就能感受到再寫東西有多彆扭。
編碼也一樣,當你達不到累計編碼五萬行這個硬指標的時候,你是難以做得嫻熟的。當你進了公司,上司讓你寫個程式,實現個小功能,你立刻就虛了。就跟讓你寫一篇小短文似的,根本傳達不出來你想表達的。但是如果你像我這樣笨鳥多練,最起碼可以寫出很長的有價值的文字。
最後聊一句關於編碼的語言。有人問,我是先學c語言呢還是java呢?還是python?我推薦java,因為java應用範圍廣,學了它以後容易找工作,先學了java,以後轉寫android或者python也容易。那學習c語言呢?我不太推薦c語言,因為用得比較少。
至於演算法結構,我不太建議學。因為當你進了公司,基本上你這輩子都不用自己實現一個雙連結串列。如果你說你要去個高階公司,要去寫庫函式,那就需要你自己去專研或者請教更厲害的人。
二、關於數學
有人問,我數學不好,能當碼農嗎?這個我思考了很久,我認為是沒問題的。但不確定,萬一是我自己的認識有侷限呢。後來我給阿里巴巴、騰訊、百度的小夥伴都打了電話諮詢了下,答案果不其然,總結起來一句話:除非你做演算法相關的,否則學很高深的數學沒太大用,月薪三萬以下的編碼工作,初中數學水平就夠了。
三、關於年齡
我被問得最多的問題是,我今年××歲了,還可以改行做程式設計師嗎?說實話,我認識不少三十五歲以上改行當碼農的,這個行業門檻低,前途也不錯,你要是不確定自己適不適合,按照我之前寫的,看看自己能不能寫完第一個階段的一萬行程式碼。如果你寫完了,看看能不能寫到五萬行,如果能寫到,你確實適合搞這個。這些需要多長時間完成?事實上你要是合適的話,很快就完成了;不合適的話,估計這輩子都達不到,寫幾行就忘記這回事了。
不要把你的想當然作為選擇的依據
很多人高考後不知道選擇什麼專業,其實選擇專業真的是一門很大的學問。我認為人們首先需要糾正的是對經濟學和管理學的誤解,很多人以為學經濟就能學到如何賺錢,或者以為學了管理學就能當領導。根據我多年以來的經驗,好像沒有發現用人單位打廣告,上邊寫著「聘請經濟學專業畢業生,待遇優厚」或者「高薪聘請領導」。
很多人學了經濟學和管理學,很大可能去當了中介。並不是說做中介不好,我認識一些中介,比我年輕五六歲,賺得跟我差不多,但是一般情況下氣質形象俱佳才行。
現在一般正兒八經的公司選拔幹部的規則都和華為選用人才的標準一樣,也就是韓非在《韓非子·顯學》裡說的「宰相必起於州部,猛將必發於卒伍」,從基層員工裡選領導,以後企業用空降兵的情況會越來越少。
很多人偏愛金融學專業,他們認為學了金融學就能夠非常有前途,其實金融學專業沒有大家想象的那麼有前途。這個領域我很熟,因為我身邊有一堆金融從業者,和他們熟識是因為同樣喜歡歷史。
金融領域的薪資收益存在明顯的「頭部效應」,也就是頭部的1%拿走了整個領域幾乎所有的錢。更讓人難以理解的是,金融行業的收益模式和很多人想象的完全不同,一些人以為金融數學好非常重要——通過數學模型來分析經濟,通過炒股或者其他操作來盈利。事實上是你想多了,這可能是影視劇誤導了你。絕大部分金融領域的高手依賴的是關係網、筆桿子、嘴皮子。這個讓人很費解,不過事實確實是這樣的。
我認識幾個在金融行業做得不錯的,他們都是文筆了得,能夠下筆千言。當然,他們最大的本事是能籌到錢,認識很多人,而且他們也不是學金融學的。
我不建議你學金融專業的另外一個原因是,金融專業的留學生太多,因為這些年英國把接受中國留學生當成gdp的重要組成部分,去英國留學很容易,去了之後絕大部分都是選擇金融專業。
我也不建議你學歷史,因為喜歡歷史是一回事,學歷史又是一回事,畢業後很難找到有前景的工作。
我重點來說說計算機專業,因為我最瞭解這個行業。
首先,做碼農肯定是可以的。在計算機行業,只要細心、認真,天分不高的人也能達到很高的水平,收益也很好。將來計算機行業的人才需求肯定是海量的,這是因為:程式碼不是寫出來就完事了,海量程式碼對應的是海量的維護人員、整合人員。另外,計算機行業普遍潛規則較少,行業相對自由一些,沒有什麼官僚氣,高水平的人,只要脾氣別太臭,一般很難被埋沒。
其次,當碼農的學習途徑非常多。如果將來當碼農,不一定要學軟體工程,學習計算機、通訊專業都可以。我不建議報考軟體學院,因為這個學院的學費非常高。如果本科不是重點大學,可以將來考研究生的時候重新努力一把,平時學好英語,上名校的機率還是挺大的
我在很多文章裡反覆強調過,當碼農最重要的不是天賦,也不是數學,月薪三萬以下的碼農只需要初中數學水平,最重要的是獲得「語感」。
一個人如果想做碼農,他只要在大學的時候多寫多練——從大學一年級就開始攢程式碼的數量,如果他能堅持四年,會遠遠超過其他同學的編碼能力,畢業的時候能把面試官嚇一跳。
我去過很多高校招生。在面試這些學編碼的同學的時候,我發現,80%的學生整個大學程式碼量不超過兩千。只好招聘了這些人以後重新培訓他們。
最後,碼農界的工資差距非常大。基層的複製貼上碼農每月可能也就能夠溫飽的水平,但是能做效能最佳化和架構的碼農,月薪五萬以上很普遍,倒不是多難,是需求很大,造成供不應求。將來選擇職業時候要選艱苦、有挑戰性的那種專案,去攻山頭,長期收益特別大。
技術才是硬通貨
每年高考後,很多人面臨選大學專業的難題,很多讀者建議我寫一篇如何選擇專業的文章——一部分人是因為自己要上大學了,一部分人是自己的侄子和親戚要選專業上大學,他們不甘心坐在旁邊說一些無關痛癢的話,想給自己的家人、親戚一些專業的建議。