你為什麼選擇程式設計師這個職業?

你如世間春秋發表於2018-10-20

對於為何選擇程式設計師這份工作,各有各的答案。有的人因為喜歡程式碼的對話邏輯,有的人因為看中程式設計師的較高薪資。有人追名,有人逐利,有人為了夢想,還有人僅僅只是想做些實際的小事。你的答案,又是什麼?

寫在前面

前幾天和兩位發小聚餐,我們三個人都選擇了程式設計師作為自己的職業。初始時三個人差不多,往後的十幾年開始出現了發展偏差,現在的我們進入到了職業的重要選擇點,三個人的選擇出現了較大的偏差,幸運的是每個人都走在了適合自己的道路上,感覺應該寫一篇文章對程式設計師這份工作做一個個人理解的分享。

第一句話就問了大家為什麼從事了程式設計師這份工作,我先來談談自己的情況。我一直認為,如果勉強自己做一件不喜歡的事情,那麼很難有動力在今後的工作中繼續前進。選擇成為一名程式設計師,大概是在 16、7 歲的時候,那時候父母給我買了第一臺電腦(一臺 586 電腦),給自己的內心種下了一顆種子。IT 行業是個知識更新非常快的行業,其他行業也在發展進步,但是相對而言沒有這麼快的節奏,而我是一個喜歡嘗試新事物的人,心理承受能力也還可以,所以程式設計師貌似會是一個不錯的選擇。此外,IT 行業的機會很多,也適合我這樣的普通人家孩子,站在現在的年紀回顧過去,自己沒有選錯。

注意,今天的這篇文章,我只是對程式設計師這份工作所需要面對的問題挑選一些有意思的話題講講我的理解,並不是對程式設計師的職業規劃進行分享。本文分為入行前和入行後兩個部分,分別聊聊。

入行前

所謂入行前,其實就是指還是學生的你是否應該選擇程式設計師作為你的職業工作、如何獲得這份工作。作為一名學生,你真的要想清楚是否程式設計師這份工作適合你,因為它牽扯的個人精力實在太多,導致你不可能有太多的個人愛好。大家都知道,很多程式設計師會自嘲稱呼為碼農,目前來看,程式設計師是最容易逆襲的職業,碼農也是從收入角度最容易逆襲的工作,但同時碼農也習慣了自嘲,於是把自己描繪的異常辛苦,總覺得自己賺錢多是應該的,因為太累了。

入行前,作為學生的你們,除了正常的上課、實習之外,還可以通過一些競賽類的準備工作提升自己的技術能力,此外,一般也需要通過校招進入技術含量較高的科技公司。針對這兩點,我分別談談自己的看法。

對於 ACM 的理解

以個人的經驗,搞 ACM 的學生遇到的問題,有點類似與高中各科競賽,需要為了競爭而學習比較深層次的知識,擁有大量做題帶來的經驗,但致命的是除了頂尖高中競賽選手和頂尖大學的 ACMer 之外,其餘所有人學習的知識都不太系統,尤其是數學上的。

大多數人對數學的學習僅僅侷限於資料結構 / 離散數學,可能因為 ACM 要有數論題而學習了一點數論和組合數學的皮毛,具體就不會深入看進去了。結果,ACMer 的數學功底並沒有因為 ACM 的做題訓練而提高多少,對演算法的理解甚至可能是僅侷限於套用演算法模板,這對於未來想從事演算法研究的人來說,無論是在公司為了某個任務做優化,還是在研究機構發論文,都會存在致命的基礎短板。

ACM 除了演算法之外,帶來的間接好處是可以提高程式設計能力,但很明顯提升程式設計能力的主要途徑就是程式設計,至於寫什麼樣的程式碼、什麼語言的程式碼,區別不是很大。但不可否認,ACM 確實是一個可以鍛鍊寫程式碼能力的機會。

公平地說,ACM 依然是我接觸的大學裡所有比賽中最公平、最鍛鍊能力的。在我看來,ACM 這種準備時間長、比賽時間短、評價體系又比較客觀的競賽,應該是最鍛鍊人能力也最有說服力的。因此如果想參加比賽,ACM 應該是計算機專業的首選,但並不是說 ACM 有價值,而是 ACM 是否是最有價值的事情,應該也不是,因為 ACM 本身就是一種遊戲,它可以讓人痴迷,可以讓人形成一種容不得別人說 ACM 不好的圈子。不管怎麼說,可以肯定的是,ACM 的經歷讓學生更容易被公司相中,因為“平均水平”高一些,起碼覺得搞 ACM 的更有可能靠譜,尤其是編碼能力這種無法體現在簡歷上的實際能力。

參加校招

最近幾年讀參與了公司組織的校園招聘工作,每次去都會見到大量的學生,我喜歡和他們交流,觀察他們的一言一行,為了進一步考察他們的綜合能力和性格組成,我每次都會自己準備面試題,這些題目包括了程式設計基本概念、演算法程式設計題、作業系統、資料庫程式設計、開原始碼閱讀、垃圾回收機制、系統架構描述、實習期經歷回顧、人生過程中遇到過的挫折、對於工作氛圍的想法、未來的職業發展方向設定等。

這些問題中其實大多數都是開放式問題,一些是沒有固定的答案,另一些甚至於是完全開放式的,需要學生提出問題。我的這組題目中,可能只有程式設計基本概念這一條有固定的標準答案,演算法程式設計、資料庫程式設計都有多種回答方案,只不過每一種回答的執行效率不同,這些都屬於半開放式的技術問答。作業系統、開原始碼閱讀、垃圾回收機制、系統架構描述,這些個問題則屬於是自己出題的題目,為什麼這麼說?因為我會根據你所瞭解的知識點一點點地深究下去,一點點往下問,所以這是完全開放式的技術問答。實習期經歷回顧、人生過程中遇到過的挫折、對於工作氛圍的想法、未來的職業發展方向設定,這四個問題屬於非技術領域的完全開放問答,我之所以提出這些問題,是希望能夠更加接近學生的真實生活、內心想法,瞭解學生的過往經歷、三觀,以及周圍環境,這樣可以決定是否錄用,以及如何更好地發揮學生的能力。

我講一下自己的校招經歷。很多年前,我去參加一家德國企業的面試,總經理是位中國人,50 來歲的老博士,他讓我談談對於公司情況的瞭解情況,其實我已經做足了功課,把他們網站上的英文背出來了,我一邊背,他一邊睜大了眼睛,扶了扶眼鏡,還糾正了對於創始人德文名字的發音錯誤,然後和我說:“你有什麼要求,現在就可以提”。

除了實際的技術基礎能力以外,我覺得一名學生還需要具備做人的格局,做人不要僅限於眼前利益,不要太實際,不要只考慮自己。推薦大家擔任大公司的“校園大使”,這個工作一定要儘自己最大可能做好,積極配合 HR 小姐姐,其實過程中你也在被觀察。

這次就遇到了三位截然不同的大使,第一位非常認真,兩天時間忙上忙下,佈置會場、參與宣講會、電話聯絡學生、引導學生面試流程等等,還找了幾位好朋友過來幫忙,忙到自己沒有時間參加免於,雖然他存在不太擅長於溝通的弱點,但是我在晚上 9 點結束面試後,單獨給他留出了面試時間,並且和 HR 一起邀請他加入,他很感激地不停鞠躬。人如果能做到對幫助自己的人心懷感激,這人一定不會差。第二位,面試當天他自己也坐下來面試了,技術一般,他自己介紹是校園大使,我正在猶豫時 HR 小姐姐和我聊起了他,“這個人責任心太差,請他幫忙招呼學生,他都懶得說話,自己管自己玩手機、吃飯,請他打電話聯絡沒有來的學生問問情況,他一臉不屑,好像很看不起我們公司”,“哦,知道了,既然他看不上我麼,我們也不用給他機會了”,他就這麼錯過了一家很棒的公司。第三位,我們面試當天她給自己安排了一天的面試,露了個面後就消失了,等她的事情幹完了再跑來想面試,當然,我直接忽視了她。

入行後關於深度思考的理解

我覺得技術能力是可以培養的,而且可能可以快速培養,只要這個人具備深度思考的能力,因為知識體系的建立一定是基於思考之上的,而不會是填鴨式的。

多年來養成一種習慣,或者說不得不養成這樣的習慣,就是在夜深人靜的時候,靜靜地思考一天來的經歷。白天,大部分時間是在異常忙亂中度過,沒有時間思考。夜色下來,一切歸於寧靜,望著窗外閃爍的路燈,可以靜靜地思考自己和世界,思考在自己從事的工作中發生的各種各樣或大或小的事情,從中找出有意義的東西,做一點小小的思想享受。這種思考,對人是有益的。

一個人做多了自己的職業活動,如果不調整,就會變得單一。思想也慢慢定向,沒有開放式的思維方式,所以要在緊張的大腦和肢體活動之餘,發現思維的新空間。作為一名軟體工程師,我的大部分時間都用在了這個領域,我也發現,生活上的幾乎所有細節也可以被放在這個領域裡找到對應點或面,此外,程式設計師也需要從產品、運營方面思考技術,這樣才能不斷開闊自己的思考方式。我之所以願意把這些思想“沉澱”積累起來,不是因為它們有特別的價值,而是因為它們是在寧靜的外界和寧靜的內心狀態下形成的,寧靜致遠,對於擁有技術願景的程式設計師來說,這是一個值得追求的境界。

對於工作時間的理解

時間是很值錢的,這種事情很多時候必須是上完學開始工作了才能理解。一個原因是對絕大多數學生來說,工作之後的空閒時間會變少,那麼原來業餘生活裡快感度比較低的事情就不做了,這是因為你的時間可以換來收入,而收入可以用來在空閒時間換取更爽的快感,那麼你的選擇空間也就更多了。上學的時候,空閒的時間太多,以至於連寫東西吐槽、在網上跟人互噴,都能排上日程。

我在一篇描述自我管理方式的文章裡不小心說出了自己每天的工作時間(這裡說的工作時間,其實也是學習時間,對於程式設計師來說,所有工作時間都是可以用來學習的,就看你會不會找方法),10-12 個小時,引起了讀者的一波評論,我可以肯定的回答,確實是這樣的。作為一名程式設計師,我認為你每週的工作時間應該保持在 60-65 個小時,因為我們這個行業的技術更新速度實在太快了,我認識的所有厲害的大牛都是這麼熬過來的,沒有人可以用很短的時間學會別人花費很長時間學會的技術。當然,每週的工作時間最好能夠控制在 75-80 個小時以內,畢竟一個人的睡眠是需要保證的,也需要有一些陪伴家人的時間、個人娛樂時間。

關於公司的選擇

我們發小三人,畢業後走上了不同的道路。一位一直在小型公司作為主力程式設計師,雖然也去過大公司,但是受不了那裡的管理方式,最終選擇了走上自己創業的道路,開了工作室。一位進了軍工行業的研究所,一干 15 年,已經習慣了固定節奏的開發模式,雖然收入不能和外面的企業比,但是也挺舒服的,準備幹到退休。一位在幾家大公司幹,工作的公司規模越來越大,他也習慣了按照研發流程和技術管理方法論工作,雖然每天需要面對的是激烈的內部和外部競爭環境、技術變更、產品驅動壓力,但是也已經習慣了壓力,繼續著自己的道路。人各有志,也各有各的優劣勢,找到屬於自己的那一個點,盡力放大吧。

如果你希望自己在某一個或幾個領域成為資深碼農,你應該選擇有技術並且有業務的大公司。技術層面,既要有技術積累,也要有高水平的同事。業務層面,要讓業務對基礎架構有足夠的挑戰性。其實當前滿足後者的公司比前者多得多,畢竟讓大多數網際網路公司所做的事情來說,技術都不是決定性的,提前對技術做過於超前的儲備大概率會浪費。反過來,假設一個公司有技術積累又有高水平的員工,一旦業務上不去高水平員工肯定會跑,最終只剩下哪些當年技術比較不錯的技術人員,長期來看技術早晚要落後。這些原因導致業界很多公司存在業務發展非常快而技術跟不上的情況,去這樣的公司也一樣有挑戰,但做的工作未必系統,而且同事的能力也不見得有保障。

怎麼看技術人員話語權不高

一位朋友原先是做分散式資料庫的,最近跳槽去了一家做無人車的公司,和他聊了一下,瞭解他的看法。做無人車和軟體基礎設施相比,最大的區別是做軟體基礎設施的技術人員,尤其是搞資料庫開發的程式設計師,很多時候解決的是技術的門檻問題。我們認為資料庫的一切問題歸納為本質上是“可用”的問題,對業務來說能扛住壓力不丟資料不超時,並且各種功能都支援,這就是“可用”,至於在高併發情況下依然“可用”,那就是“高可用”。一旦把技術問題轉化為“可用”的問題,就會讓技術變成一個門檻,達不到的話業務受影響,達到後業務做得好或是壞,其實和技術的關係就不那麼大了。這也是很多公司技術人員話語權不高的原因。

關於為什麼去做高難度的技術

例如像 BAT、華為、小米這樣的大公司,對軟體基礎設施的門檻要求還是比較高的,所以這個工作還是比較有技術含量的,尤其是比大多數實現業務邏輯、專案經理需求的工作有技術含量。就我前面提到的這位朋友的情況而言,無人車有更大的吸引力,因為它更難,難到我們並不確定什麼時候才能真正做出來。表面上看它也是一個門檻—一個“可用”的無人駕駛技術,但因為難度足夠大,所以有挑戰性,必須不斷地改善技術,做全球範圍內還沒有做出來的技術。搞資料庫時處理的一些問題可能是其他公司已經解決的,並非“人類”都還沒有解決的問題。很多時候需要和其他公司交流,互相借鑑經驗,或者看看 Google 這樣的領航者是怎麼做的。

而做無人車因為這個領域很新,也都沒做成熟,不存在誰跟隨誰的問題,甚至嚴格來說並不存在領航者。到了一定程度後,自己取得的里程碑可能就是行業的里程碑了。無人駕駛是剛需,誰做出來誰賺大錢。相對應的,有些創業專案是解決了不存在的需求,有些專案是解決了存在的需求但不怎麼賺錢。無人車是存在的需求,市場規模很大的需求,技術含量很高的需求。無人車並不是今年才有的,但在這個行當的人也不算太多。這個時候去做,雖然不算什麼行業先驅,但是也親身經歷了行業比較初期的發展了。當然無人車本質上也是個大資料的行業,必然還會涉及到資料的儲存、計算等等,這不就更棒了嘛。

另外,這個世界的進步,尤其是科技進步一定是需要聰明人去推動的,聰明人集中的地方進步就會快。冷戰的時候搞軍備競爭、太空競爭,政府大規模投錢搞,自然聰明人集中從而發展迅速。冷戰結束後政府投入下降,這個領域的進步就小了,因為聰明人往華爾街跑了,後來又往矽谷跑。我一直以來的觀點就是,聰明人和美女總是會集中在有錢和有資源的地方。哪個公司聰明人或者美女多,就說明哪個公司的待遇好並且人們認為這個公司有前途。因為聰明和漂亮都是面試加分項,因而他們能拿到更好的 Offer,能把這些人吸引來的公司必然是提供了好 Offer 的公司。

關於技術人員的上升通道

為什麼說技術人員的上升通道侷限比較大?曾經聽移動的一位總經理說過,所有的高層管理者都需要一個抓手,也就是管理基點,他是不會放手這個基點的,例如運營、產品、業務邏輯,或是技術。PM 出生的管理者還是會繼續考慮產品,運營出身的管理者還是要考慮運營,但技術出身的管理者到了一定級別不見得還要考慮技術,特別是技術細節。這樣的人時間久了就做不回碼農了,可能連一線的技術經理都做不了了。大公司高階別的碼農就算不寫程式碼至少知道最新技術的發展方向並且實際設計和運用加和人扯淡,出去還是能當個同級別架構師。小公司 CTO 很容易既不寫程式碼又不瞭解大方向,出去只能找人接盤接著當 CTO,還可能被覺得沒水平。

關於跟進最新技術的重要性

工作上一定要跟進最新技術的發展動向,某種程度上這和炒股差不多,看好業績的話提前埋伏進場。比如若干年前剛有安卓 ios 的時候,很多人還在塞班上開發,但眼光好的第一時間就轉行到了安卓、ios,因為先佔了坑在最稀缺的時候搶佔了先機,跟早畢業的道理一樣,可能比你晚兩年轉行的人處處佔了先機,差距越來越大。當然也有可能賭輸了,例如 Windows 程式設計。

每一次業界的革命,都會讓一些公司落寞而讓另一些公司崛起,碼農也一樣,每一次技術換代也都會讓一些碼農沒落而讓另一些碼農崛起。在技術換代面前,之前的工作經驗不至於一文不值,但也大打折扣。另外,正因為技術不斷換代,學的快的才比單純年輕的有優勢,如果技術完全停滯,幹五年左右技術就不再成長,那麼畢業五年後還當基層碼農的失業風險就越來越大,這也是某通訊大廠被傳聞的所謂“35 歲裁員”的寫實,聽說 35 歲主要針對的就是這些基層碼農,45 歲針對的是基層碼農和技術一線管理者。不斷地盼望著(如果能力夠強也可以自己創造)新技術的出現,並且自己保持著不亞於年輕人的學習能力,自然就降低了高齡失業風險。

至於做管理,也是一種出路,因為在管理的經驗積累上很難有天花板的說法,十年管理經驗可能有很大一部分確實是後五年積累的,而不像寫程式碼,但是也要考慮做管理和技術脫節的問題,得保證這個公司不要你了,你的管理經驗是能用在其他公司的。作為技術管理者實際上也還是要掌握最先的技術並且能用於自身業務,比如你說你懂大資料、高併發訪問的架構設計,但前公司的產品 TPS 只有幾百,你覺得你的技術有實踐過嗎?只能強調自己管多少人的話,可能不是網際網路公司技術出身管理者的出路。

寫在最後

作為一名程式設計師,你需要保持三種感覺,飢餓感、疲勞感和孤獨感,學習的目的是因為想要學習,學習的過程是很單調的,經常需要獨自搜尋網上的資料,獨自前進,學習時間長了會很累。做技術的人容易仰望星空,但是仰望星空前需要做好腳踏實地,掌握好基礎技術、動手能力強、三觀正、具有較強的為人處事能力,這四點是一切可持續發展的基礎。僅以此文獻給在路上的我們三人,也紀念我們的青蔥歲月,進入職業生涯的中期,我們仍需負重前行。


相關文章