關于為何選擇程序員這份工作,各有各的答案。有的人因為喜歡代碼的對話邏輯,有的人因為看中程序員的較高薪資。有人追名,有人逐利,有人為了夢想,還有人僅僅只是想做些實際的小事。你的答案,又是什么?
寫在前面
前幾天和兩位發(fā)小聚餐,我們?nèi)齻€人都選擇了程序員作為自己的職業(yè)。初始時三個人差不多,往后的十幾年開始出現(xiàn)了發(fā)展偏差,現(xiàn)在的我們進入到了職業(yè)的重要選擇點,三個人的選擇出現(xiàn)了較大的偏差,幸運的是每個人都走在了適合自己的道路上,感覺應該寫一篇文章對程序員這份工作做一個個人理解的分享。
第一句話就問了大家為什么從事了程序員這份工作,我先來談談自己的情況。我一直認為,如果勉強自己做一件不喜歡的事情,那么很難有動力在今后的工作中繼續(xù)前進。選擇成為一名程序員,大概是在 16、7 歲的時候,那時候父母給我買了第一臺電腦(一臺 586 電腦),給自己的內(nèi)心種下了一顆種子。IT 行業(yè)是個知識更新非??斓男袠I(yè),其他行業(yè)也在發(fā)展進步,但是相對而言沒有這么快的節(jié)奏,而我是一個喜歡嘗試新事物的人,心理承受能力也還可以,所以程序員貌似會是一個不錯的選擇。此外,IT 行業(yè)的機會很多,也適合我這樣的普通人家孩子,站在現(xiàn)在的年紀回顧過去,自己沒有選錯。
注意,今天的這篇文章,我只是對程序員這份工作所需要面對的問題挑選一些有意思的話題講講我的理解,并不是對程序員的職業(yè)規(guī)劃進行分享。本文分為入行前和入行后兩個部分,分別聊聊。
入行前
所謂入行前,其實就是指還是學生的你是否應該選擇程序員作為你的職業(yè)工作、如何獲得這份工作。作為一名學生,你真的要想清楚是否程序員這份工作適合你,因為它牽扯的個人精力實在太多,導致你不可能有太多的個人愛好。大家都知道,很多程序員會自嘲稱呼為碼農(nóng),目前來看,程序員是最容易逆襲的職業(yè),碼農(nóng)也是從收入角度最容易逆襲的工作,但同時碼農(nóng)也習慣了自嘲,于是把自己描繪的異常辛苦,總覺得自己賺錢多是應該的,因為太累了。
入行前,作為學生的你們,除了正常的上課、實習之外,還可以通過一些競賽類的準備工作提升自己的技術能力,此外,一般也需要通過校招進入技術含量較高的科技公司。針對這兩點,我分別談談自己的看法。
對于 ACM 的理解
以個人的經(jīng)驗,搞 ACM 的學生遇到的問題,有點類似與高中各科競賽,需要為了競爭而學習比較深層次的知識,擁有大量做題帶來的經(jīng)驗,但致命的是除了頂尖高中競賽選手和頂尖大學的 ACMer 之外,其余所有人學習的知識都不太系統(tǒng),尤其是數(shù)學上的。
大多數(shù)人對數(shù)學的學習僅僅局限于數(shù)據(jù)結(jié)構(gòu) / 離散數(shù)學,可能因為 ACM 要有數(shù)論題而學習了一點數(shù)論和組合數(shù)學的皮毛,具體就不會深入看進去了。結(jié)果,ACMer 的數(shù)學功底并沒有因為 ACM 的做題訓練而提高多少,對算法的理解甚至可能是僅局限于套用算法模板,這對于未來想從事算法研究的人來說,無論是在公司為了某個任務做優(yōu)化,還是在研究機構(gòu)發(fā)論文,都會存在致命的基礎短板。
ACM 除了算法之外,帶來的間接好處是可以提高編程能力,但很明顯提升編程能力的主要途徑就是編程,至于寫什么樣的代碼、什么語言的代碼,區(qū)別不是很大。但不可否認,ACM 確實是一個可以鍛煉寫代碼能力的機會。
公平地說,ACM 依然是我接觸的大學里所有比賽中最公平、最鍛煉能力的。在我看來,ACM 這種準備時間長、比賽時間短、評價體系又比較客觀的競賽,應該是最鍛煉人能力也最有說服力的。因此如果想?yún)⒓颖荣?,ACM 應該是計算機專業(yè)的首選,但并不是說 ACM 有價值,而是 ACM 是否是最有價值的事情,應該也不是,因為 ACM 本身就是一種游戲,它可以讓人癡迷,可以讓人形成一種容不得別人說 ACM 不好的圈子。不管怎么說,可以肯定的是,ACM 的經(jīng)歷讓學生更容易被公司相中,因為“平均水平”高一些,起碼覺得搞 ACM 的更有可能靠譜,尤其是編碼能力這種無法體現(xiàn)在簡歷上的實際能力。
參加校招
最近幾年讀參與了公司組織的校園招聘工作,每次去都會見到大量的學生,我喜歡和他們交流,觀察他們的一言一行,為了進一步考察他們的綜合能力和性格組成,我每次都會自己準備面試題,這些題目包括了編程基本概念、算法編程題、操作系統(tǒng)、數(shù)據(jù)庫編程、開源代碼閱讀、垃圾回收機制、系統(tǒng)架構(gòu)描述、實習期經(jīng)歷回顧、人生過程中遇到過的挫折、對于工作氛圍的想法、未來的職業(yè)發(fā)展方向設定等。
這些問題中其實大多數(shù)都是開放式問題,一些是沒有固定的答案,另一些甚至于是完全開放式的,需要學生提出問題。我的這組題目中,可能只有編程基本概念這一條有固定的標準答案,算法編程、數(shù)據(jù)庫編程都有多種回答方案,只不過每一種回答的運行效率不同,這些都屬于半開放式的技術問答。操作系統(tǒng)、開源代碼閱讀、垃圾回收機制、系統(tǒng)架構(gòu)描述,這些個問題則屬于是自己出題的題目,為什么這么說?因為我會根據(jù)你所了解的知識點一點點地深究下去,一點點往下問,所以這是完全開放式的技術問答。實習期經(jīng)歷回顧、人生過程中遇到過的挫折、對于工作氛圍的想法、未來的職業(yè)發(fā)展方向設定,這四個問題屬于非技術領域的完全開放問答,我之所以提出這些問題,是希望能夠更加接近學生的真實生活、內(nèi)心想法,了解學生的過往經(jīng)歷、三觀,以及周圍環(huán)境,這樣可以決定是否錄用,以及如何更好地發(fā)揮學生的能力。
我講一下自己的校招經(jīng)歷。很多年前,我去參加一家德國企業(yè)的面試,總經(jīng)理是位中國人,50 來歲的老博士,他讓我談談對于公司情況的了解情況,其實我已經(jīng)做足了功課,把他們網(wǎng)站上的英文背出來了,我一邊背,他一邊睜大了眼睛,扶了扶眼鏡,還糾正了對于創(chuàng)始人德文名字的發(fā)音錯誤,然后和我說:“你有什么要求,現(xiàn)在就可以提”。
除了實際的技術基礎能力以外,我覺得一名學生還需要具備做人的格局,做人不要僅限于眼前利益,不要太實際,不要只考慮自己。推薦大家擔任大公司的“校園大使”,這個工作一定要盡自己最大可能做好,積極配合 HR 小姐姐,其實過程中你也在被觀察。
這次就遇到了三位截然不同的大使,第一位非常認真,兩天時間忙上忙下,布置會場、參與宣講會、電話聯(lián)系學生、引導學生面試流程等等,還找了幾位好朋友過來幫忙,忙到自己沒有時間參加免于,雖然他存在不太擅長于溝通的弱點,但是我在晚上 9 點結(jié)束面試后,單獨給他留出了面試時間,并且和 HR 一起邀請他加入,他很感激地不停鞠躬。人如果能做到對幫助自己的人心懷感激,這人一定不會差。第二位,面試當天他自己也坐下來面試了,技術一般,他自己介紹是校園大使,我正在猶豫時 HR 小姐姐和我聊起了他,“這個人責任心太差,請他幫忙招呼學生,他都懶得說話,自己管自己玩手機、吃飯,請他打電話聯(lián)系沒有來的學生問問情況,他一臉不屑,好像很看不起我們公司”,“哦,知道了,既然他看不上我么,我們也不用給他機會了”,他就這么錯過了一家很棒的公司。第三位,我們面試當天她給自己安排了一天的面試,露了個面后就消失了,等她的事情干完了再跑來想面試,當然,我直接忽視了她。
入行后
關于深度思考的理解
我覺得技術能力是可以培養(yǎng)的,而且可能可以快速培養(yǎng),只要這個人具備深度思考的能力,因為知識體系的建立一定是基于思考之上的,而不會是填鴨式的。
多年來養(yǎng)成一種習慣,或者說不得不養(yǎng)成這樣的習慣,就是在夜深人靜的時候,靜靜地思考一天來的經(jīng)歷。白天,大部分時間是在異常忙亂中度過,沒有時間思考。夜色下來,一切歸于寧靜,望著窗外閃爍的路燈,可以靜靜地思考自己和世界,思考在自己從事的工作中發(fā)生的各種各樣或大或小的事情,從中找出有意義的東西,做一點小小的思想享受。這種思考,對人是有益的。
一個人做多了自己的職業(yè)活動,如果不調(diào)整,就會變得單一。思想也慢慢定向,沒有開放式的思維方式,所以要在緊張的大腦和肢體活動之余,發(fā)現(xiàn)思維的新空間。作為一名軟件工程師,我的大部分時間都用在了這個領域,我也發(fā)現(xiàn),生活上的幾乎所有細節(jié)也可以被放在這個領域里找到對應點或面,此外,程序員也需要從產(chǎn)品、運營方面思考技術,這樣才能不斷開闊自己的思考方式。我之所以愿意把這些思想“沉淀”積累起來,不是因為它們有特別的價值,而是因為它們是在寧靜的外界和寧靜的內(nèi)心狀態(tài)下形成的,寧靜致遠,對于擁有技術愿景的程序員來說,這是一個值得追求的境界。
對于工作時間的理解時間是很值錢的,這種事情很多時候必須是上完學開始工作了才能理解。一個原因是對絕大多數(shù)學生來說,工作之后的空閑時間會變少,那么原來業(yè)余生活里快感度比較低的事情就不做了,這是因為你的時間可以換來收入,而收入可以用來在空閑時間換取更爽的快感,那么你的選擇空間也就更多了。上學的時候,空閑的時間太多,以至于連寫東西吐槽、在網(wǎng)上跟人互噴,都能排上日程。
我在一篇描述自我管理方式的文章里不小心說出了自己每天的工作時間(這里說的工作時間,其實也是學習時間,對于程序員來說,所有工作時間都是可以用來學習的,就看你會不會找方法),10-12 個小時,引起了讀者的一波評論,我可以肯定的回答,確實是這樣的。作為一名程序員,我認為你每周的工作時間應該保持在 60-65 個小時,因為我們這個行業(yè)的技術更新速度實在太快了,我認識的所有厲害的大牛都是這么熬過來的,沒有人可以用很短的時間學會別人花費很長時間學會的技術。當然,每周的工作時間最好能夠控制在 75-80 個小時以內(nèi),畢竟一個人的睡眠是需要保證的,也需要有一些陪伴家人的時間、個人娛樂時間。
關于公司的選擇
我們發(fā)小三人,畢業(yè)后走上了不同的道路。一位一直在小型公司作為主力程序員,雖然也去過大公司,但是受不了那里的管理方式,最終選擇了走上自己創(chuàng)業(yè)的道路,開了工作室。一位進了軍工行業(yè)的研究所,一干 15 年,已經(jīng)習慣了固定節(jié)奏的開發(fā)模式,雖然收入不能和外面的企業(yè)比,但是也挺舒服的,準備干到退休。一位在幾家大公司干,工作的公司規(guī)模越來越大,他也習慣了按照研發(fā)流程和技術管理方法論工作,雖然每天需要面對的是激烈的內(nèi)部和外部競爭環(huán)境、技術變更、產(chǎn)品驅(qū)動壓力,但是也已經(jīng)習慣了壓力,繼續(xù)著自己的道路。人各有志,也各有各的優(yōu)劣勢,找到屬于自己的那一個點,盡力放大吧。
如果你希望自己在某一個或幾個領域成為資深碼農(nóng),你應該選擇有技術并且有業(yè)務的大公司。技術層面,既要有技術積累,也要有高水平的同事。業(yè)務層面,要讓業(yè)務對基礎架構(gòu)有足夠的挑戰(zhàn)性。其實當前滿足后者的公司比前者多得多,畢竟讓大多數(shù)互聯(lián)網(wǎng)公司所做的事情來說,技術都不是決定性的,提前對技術做過于超前的儲備大概率會浪費。反過來,假設一個公司有技術積累又有高水平的員工,一旦業(yè)務上不去高水平員工肯定會跑,最終只剩下哪些當年技術比較不錯的技術人員,長期來看技術早晚要落后。這些原因?qū)е聵I(yè)界很多公司存在業(yè)務發(fā)展非常快而技術跟不上的情況,去這樣的公司也一樣有挑戰(zhàn),但做的工作未必系統(tǒng),而且同事的能力也不見得有保障。
怎么看技術人員話語權不高
一位朋友原先是做分布式數(shù)據(jù)庫的,最近跳槽去了一家做無人車的公司,和他聊了一下,了解他的看法。做無人車和軟件基礎設施相比,最大的區(qū)別是做軟件基礎設施的技術人員,尤其是搞數(shù)據(jù)庫開發(fā)的程序員,很多時候解決的是技術的門檻問題。我們認為數(shù)據(jù)庫的一切問題歸納為本質(zhì)上是“可用”的問題,對業(yè)務來說能扛住壓力不丟數(shù)據(jù)不超時,并且各種功能都支持,這就是“可用”,至于在高并發(fā)情況下依然“可用”,那就是“高可用”。一旦把技術問題轉(zhuǎn)化為“可用”的問題,就會讓技術變成一個門檻,達不到的話業(yè)務受影響,達到后業(yè)務做得好或是壞,其實和技術的關系就不那么大了。這也是很多公司技術人員話語權不高的原因。
關于為什么去做高難度的技術
例如像 BAT、華為、小米這樣的大公司,對軟件基礎設施的門檻要求還是比較高的,所以這個工作還是比較有技術含量的,尤其是比大多數(shù)實現(xiàn)業(yè)務邏輯、項目經(jīng)理需求的工作有技術含量。就我前面提到的這位朋友的情況而言,無人車有更大的吸引力,因為它更難,難到我們并不確定什么時候才能真正做出來。表面上看它也是一個門檻—一個“可用”的無人駕駛技術,但因為難度足夠大,所以有挑戰(zhàn)性,必須不斷地改善技術,做全球范圍內(nèi)還沒有做出來的技術。搞數(shù)據(jù)庫時處理的一些問題可能是其他公司已經(jīng)解決的,并非“人類”都還沒有解決的問題。很多時候需要和其他公司交流,互相借鑒經(jīng)驗,或者看看 Google 這樣的領航者是怎么做的。
而做無人車因為這個領域很新,也都沒做成熟,不存在誰跟隨誰的問題,甚至嚴格來說并不存在領航者。到了一定程度后,自己取得的里程碑可能就是行業(yè)的里程碑了。無人駕駛是剛需,誰做出來誰賺大錢。相對應的,有些創(chuàng)業(yè)項目是解決了不存在的需求,有些項目是解決了存在的需求但不怎么賺錢。無人車是存在的需求,市場規(guī)模很大的需求,技術含量很高的需求。無人車并不是今年才有的,但在這個行當?shù)娜艘膊凰闾唷_@個時候去做,雖然不算什么行業(yè)先驅(qū),但是也親身經(jīng)歷了行業(yè)比較初期的發(fā)展了。當然無人車本質(zhì)上也是個大數(shù)據(jù)的行業(yè),必然還會涉及到數(shù)據(jù)的存儲、計算等等,這不就更棒了嘛。
另外,這個世界的進步,尤其是科技進步一定是需要聰明人去推動的,聰明人集中的地方進步就會快。冷戰(zhàn)的時候搞軍備競爭、太空競爭,政府大規(guī)模投錢搞,自然聰明人集中從而發(fā)展迅速。冷戰(zhàn)結(jié)束后政府投入下降,這個領域的進步就小了,因為聰明人往華爾街跑了,后來又往硅谷跑。我一直以來的觀點就是,聰明人和美女總是會集中在有錢和有資源的地方。哪個公司聰明人或者美女多,就說明哪個公司的待遇好并且人們認為這個公司有前途。因為聰明和漂亮都是面試加分項,因而他們能拿到更好的 Offer,能把這些人吸引來的公司必然是提供了好 Offer 的公司。
關于技術人員的上升通道
為什么說技術人員的上升通道局限比較大?曾經(jīng)聽移動的一位總經(jīng)理說過,所有的高層管理者都需要一個抓手,也就是管理基點,他是不會放手這個基點的,例如運營、產(chǎn)品、業(yè)務邏輯,或是技術。PM 出生的管理者還是會繼續(xù)考慮產(chǎn)品,運營出身的管理者還是要考慮運營,但技術出身的管理者到了一定級別不見得還要考慮技術,特別是技術細節(jié)。這樣的人時間久了就做不回碼農(nóng)了,可能連一線的技術經(jīng)理都做不了了。大公司高級別的碼農(nóng)就算不寫代碼至少知道最新技術的發(fā)展方向并且實際設計和運用加和人扯淡,出去還是能當個同級別架構(gòu)師。小公司 CTO 很容易既不寫代碼又不了解大方向,出去只能找人接盤接著當 CTO,還可能被覺得沒水平。
關于跟進最新技術的重要性
工作上一定要跟進最新技術的發(fā)展動向,某種程度上這和炒股差不多,看好業(yè)績的話提前埋伏進場。比如若干年前剛有安卓 ios 的時候,很多人還在塞班上開發(fā),但眼光好的第一時間就轉(zhuǎn)行到了安卓、ios,因為先占了坑在最稀缺的時候搶占了先機,跟早畢業(yè)的道理一樣,可能比你晚兩年轉(zhuǎn)行的人處處占了先機,差距越來越大。當然也有可能賭輸了,例如 Windows 編程。
每一次業(yè)界的革命,都會讓一些公司落寞而讓另一些公司崛起,碼農(nóng)也一樣,每一次技術換代也都會讓一些碼農(nóng)沒落而讓另一些碼農(nóng)崛起。在技術換代面前,之前的工作經(jīng)驗不至于一文不值,但也大打折扣。另外,正因為技術不斷換代,學的快的才比單純年輕的有優(yōu)勢,如果技術完全停滯,干五年左右技術就不再成長,那么畢業(yè)五年后還當基層碼農(nóng)的失業(yè)風險就越來越大,這也是某通信大廠被傳聞的所謂“35 歲裁員”的寫實,聽說 35 歲主要針對的就是這些基層碼農(nóng),45 歲針對的是基層碼農(nóng)和技術一線管理者。不斷地盼望著(如果能力夠強也可以自己創(chuàng)造)新技術的出現(xiàn),并且自己保持著不亞于年輕人的學習能力,自然就降低了高齡失業(yè)風險。
至于做管理,也是一種出路,因為在管理的經(jīng)驗積累上很難有天花板的說法,十年管理經(jīng)驗可能有很大一部分確實是后五年積累的,而不像寫代碼,但是也要考慮做管理和技術脫節(jié)的問題,得保證這個公司不要你了,你的管理經(jīng)驗是能用在其他公司的。作為技術管理者實際上也還是要掌握最先的技術并且能用于自身業(yè)務,比如你說你懂大數(shù)據(jù)、高并發(fā)訪問的架構(gòu)設計,但前公司的產(chǎn)品 TPS 只有幾百,你覺得你的技術有實踐過嗎?只能強調(diào)自己管多少人的話,可能不是互聯(lián)網(wǎng)公司技術出身管理者的出路。
寫在最后
作為一名程序員,你需要保持三種感覺,饑餓感、疲勞感和孤獨感,學習的目的是因為想要學習,學習的過程是很單調(diào)的,經(jīng)常需要獨自搜索網(wǎng)上的資料,獨自前進,學習時間長了會很累。做技術的人容易仰望星空,但是仰望星空前需要做好腳踏實地,掌握好基礎技術、動手能力強、三觀正、具有較強的為人處事能力,這四點是一切可持續(xù)發(fā)展的基礎。僅以此文獻給在路上的我們?nèi)?,也紀念我們的青蔥歲月,進入職業(yè)生涯的中期,我們?nèi)孕柝撝厍靶小?/p>