過來人經驗:程序員怎么升職加薪,迎娶白富美
我是碼農出身,工作十年,從 初級程序猿(半年) - 項目主力(一年) - 初級技術管理(一年) - 中級技術管理(兩年) - 部門管理(兩年) - 高層管理(三年) - 職業經理人,一條路走過來,關于升職,有一些自己的心得可以分享。以下大致說說從技術到管理的轉變,暫不涉及管理的進階。
Love Coding 熱愛編程
大四開始找工作的時候,我正在上一門可視化編程的課,大概就是用VC編寫出可以繪圖、簡單動畫和播放多媒體文件等各種操作的程序。基于這門課,我編寫了貪吃蛇、俄羅斯方塊等各種游戲。另外的一段編程經歷是大二時候的Java大作業,編了一個很弱的圖片管理器。實際上,這些程序都非常弱智,那時候的我算法極差,代碼規范性極差,甚至于對SDK或庫函數的掌握也極差,是個地地道道的菜鳥,但這并不妨礙我喜歡編程。我發現,當我坐在電腦前敲代碼,或者對著千瘡百孔的程序不斷調試,打斷點,加入調試代碼,單步執行查看內存變化的時候,我是樂在其中的,甚至于忘了時間。所以,面臨工作方向選擇的時候,我毫不猶豫選了coding。
于是,當07年我在缺少指導,對Linux不甚了解,對路由器也一知半解的情況下,開始開發國內廠商的第一代11N路由器的時候,傾注了大量的精力閱讀《LDD3》,搞定交換芯片驅動;大段大段的啃Linux Kernel源碼,搞定netfilter/iptables;閱讀《UNIX環境高級編程》,搞定各種同步互斥進程線程;閱讀網上的各種技術博客,包括把競爭對手的GPL代碼Down下來仔細閱讀。。。一年里加班無數,五一十一也都是在加班中度過,一年下來基本上搞定了領導交給我的艱難任務。然后又用一兩個月的時間,把產品上市后爆出來的各種Bug一一解決,最終贏回了市場口碑。
如果沒有這種熱愛,你就無法在日復一日的coding中保持專注,更不用說脫穎而出。
任何成功背后,都有不為人知的苦悶和寂寞。程序猿的苦逼之處,就在于別人高談闊論指點江山的時候,別人推杯換盞觥籌交錯的時候,別人出差南北縱橫內外的時候,別人利用工作之便撩妹泡妞啪啪啪的時候,你只有面對屏幕,把鍵盤敲的啪啪啪。如果你忍受不了這種寂寞,體會不到其中的樂趣,請盡早換行。程序猿的高潮,來自于屏幕上排版良好的指令,按照你的意志精確執行,并且分毫不差。
Know yourself 貴有自知之明,了解自己
自知之明這個詞,說的容易,做起來特別難。但又特別重要。
以前我團隊里有個小伙,非常非常內向,話沒說幾句就臉紅,后來程序猿不干了要去做展會,學跟人打交道,說是要挑戰自己。我不知道他后來怎么樣,估計結果不太好。人的性格在十幾歲的時候基本就定性了,二十幾歲的人再想徹底改變自己,極難,有這個毅力,估計什么都能做好了。
扯遠了。這一條最想說的是,弄清楚你到底適不適合干程序猿這一行,我多年的經驗總結下來,優秀的程序猿都有如下的性格特質(或部分):細心嚴謹、細節強迫癥、完美主義、做事情有條理、耐得住寂寞、喜歡跟機器跟代碼打交道(相比跟人打交道)、口才一般不佳、容易偏激或鉆牛角尖、人情世故方面稍顯笨拙。與之相對的是銷售:口才極佳滔滔不絕、擅長跟人打交道、為人處世圓滑、八面玲瓏、說話虛虛實實、為達目的不擇手段。所以,適合什么樣的職業方向是有章可循的。
仔細想想自己是什么樣的人,結合上一條,有沒有一顆熱愛coding的心,你就能知道自己到底適不適合這一行。
自知之明還體現在,干這一行的過程中,詳細了解自己的各項技能的長短,揚長補短。程序猿不是簡單會敲代碼就行,構思、設計、編碼、測試、調試,往往編碼只占很小的比例。而且程序猿這一行范圍又極廣,底層驅動、操作系統、協議棧、前端、服務器、APP、數據庫、大數據、分布式、系統集成。。。。。。怎么選擇,怎樣能夠發揮優勢,真的應該好好想想。
這一條展開來說,可以講一天,具體也可以參照我在其他問題下面的回答。職業生涯規劃里面,知己知彼是非常非常重要的,知己,即是了解自我的個性、特點、優劣勢、需求;知彼,即是了解行業、企業、團隊、職位的情況和要求。
Be reliable 可靠,說到做到,做好本職
作為程序猿,最基本要求是:代碼可讀性好、功能正常沒有明顯bug。
但我見過太多這行里的毛頭小伙,數字常量到處埋,函數命名用拼音,if else 十層八層嵌套,匈牙利命名法和Linux命名法混雜,代碼像擠在一張皺了的紙上,零注釋或寫完代碼補注釋,異常處理缺失,還有基本功能一用就崩潰,還辯解說,在我那里是好的呀。遇到這一類人,通常我在心里先給打個D等(ABCD),日后恐難以翻身。
還有稍微進階一點的毛病,說這個功能包我身上沒問題,又或者一周之內絕對給你搞定,領導你放心。最后拿出來的代碼不是錯漏百出,就是規定時間根本完不成,而且到deadline前你詢問他的時候才告訴你搞不定。。。項目組里有這樣的人,要么得配一個給他擦屁股的,要么得配一個項目助理時刻監督他,換一句話說,他的貢獻值其實為負。
程序猿要想進階,其實什么設計模式、架構、高深算法、莫測技術都不重要,這些都只是術,或者說套路。最核心的應該是,把簡單的任務完成好,之后再完成更難一點的任務,這樣你就慢慢進階了。為了自己的承諾和項目組整體的進度,有的時候,你需要在保證質量的基礎上,拼命加班,不負所托。
再補充一點,可靠并不是說絕不出錯,是人都會犯錯。但你不能重復犯錯,相同的錯誤出現兩次,會嚴重影響別人對你的信心。
Work hardest 以絕大多數程序猿的努力程度,還輪不到拼天賦
這一點可能會有爭議,也會有很多程序猿跳出來說,老子996都不止,一周工作80個小時都有了。并不否認,很多行業里的程序猿,以互聯網尤甚,加班是很夸張的。但我想表達的是,你要做你們團隊里最努力的那個人,別人工作80個小時,你就工作90個小時。你以為所有爬上去的人都是領導親戚或是被潛規則?別傻了,如果大家資質差不多,一定是最努力的那個人首先得到機會。領導又不傻,馬群里挑一匹跑的最快挑的最重的來帶頭,肯定會有示范效應,也容易服眾。當然,健康是自己的,如何保持足夠的休息和鍛煉是你必須認真考慮的問題,不是你領導考慮的問題。另外,如果真的資質相差太大,省點力氣,排隊等機會吧,不行就換行。程序猿這一行里,最牛逼和最平庸之間的生產效率之比大致是50:1。
對我來說加班最夸張的一段時間是八點半上班,除去午休一個半小時,晚上十一點下班,差不多持續一個月。我從來都不認同不眠不休的持續高強度加班,所謂的彈性工作制其實是最坑人的,每天工作到夜里一兩點然后第二天十點十一點去上班?有意義嗎?十二點準時睡覺,第二天八九點準時去上班,想掛掉都沒那么容易。這一點很感激前東家死板的考勤制度。
另外,在我的職業生涯里,從來都是提倡快樂工作快樂生活,我所帶的部門,籃球羽毛球健身水平都是公司頂尖。最忙的時候我一樣一周打球兩三次。可現實中一有空不用加班依然打游戲看片呆坐電腦前熬夜的程序猿不在少數。不要為自己不健康和頹廢的作息找借口。真正牛逼的人,懂得人生是馬拉松而不是百米沖刺的道理。
另外的另外,真的加班到力不從心快要掛了還無法出人頭地,換工作吧,不行就換行。你的負能量和頹廢氣息三個街區外賣烤紅薯的大媽都聞得出來。
另外的另外的另外,剛看到春雨醫生CEO去世的消息,非常震驚,相比升職,好好活著更為重要,生者共勉。
Do the simple things right 再簡單的事情都要做好,注重細節
你review過的代碼里最低級的錯誤是什么?我遇到很多很多,“==”寫成“=”、三個參數只傳了倆、“1 <= month && month <= 12” 寫成“0 < month && month < 12”、不判斷返回值就直接下一步調用,太多太多。
寫郵件的時候,很多人直接把話都寫在標題,內容為空;也有標題空著的,或者叫“經理你好”;或者郵件字體時大時小,一會黑一會藍,看的人時刻有驚喜。
寫文檔的時候,busy寫成 buzy,該換行分段偏不,該用流程圖說明的偏要用文字,好不容易畫個流程圖,方框里一會是實體一會是操作,箭頭各種亂指,你寫得出來,別人可看不下去。
這類人,你是老板,你敢提拔他當主管?
再舉一個正面的例子,我的團隊里曾經缺乏一個項目助理,不得已選了一個程序猿小伙,讓他兼職管管樣機、發發通知,小伙沒有怨言,除了自己的代碼照常寫的非常穩妥之外,兢兢業業做好這些小事。后來沒多久他就當上了主管。一個有能力把小事做到極致的人,也必定有潛力把大事做好。
Be open-minded, don't be defensive 心態開放,接受他人意見,別人批評建議的時候不要習慣性辯解和說不
以前我的團隊里有幾個同一屆畢業的優秀小伙,其中兩人,就叫A和B吧。以編程水平、技術廣度來衡量,A要更勝一籌,當然B也是杰出的程序猿。按理說,先得到晉升的應該是A,實際上,B很快就連升兩級,再后來就帶一個大型的團隊了,而A始終是最基層的主管。
為什么?我舉一些實際的例子。
作為年輕人,免不了有做的不足的地方,通常我都會面對面跟他們具體指出來,B通常會說:“收到,以后我一定注意”、“我不是很明白,能否給我一些具體事例,或者再給我解釋一下。。。好的我明白了”、“我的理解是這樣的不知道對不對。。。好的知道了”。然后在接下來的一個季度里,你很快就能看到他迅速改進,原來的弱項變成了他的強項。
而A呢?他會說“不是吧,我覺得不是這樣的”、“這些道理雖然對,但是有點要求過高吧”,而往后,你所希望看到的變化還是沒有發生,或者收效甚微。
當你的領導,愿意明確對你提出指導,不管是耐心的說教還是嚴厲的批評,你都應該抱著“有則改之無則加勉”的心態,即使要反駁,也要準備充分的理由和依據。面對領導的意見,要弄清楚其準確意圖,然后實施針對性的改進措施。這就是團隊里的游戲規則和生存之道。即使不是領導,是平級和下屬,也應該采用類似的心態和應對方法。
Be logical. 有很好的條理,想事情做事情有邏輯
很多程序猿,表達的時候通常是“我認為”、“我覺得”,或者說“聽我的,只要這樣這樣,就能怎樣怎樣”但是一旦你追問其結論的依據,或者推導過程時,他又拿不出來。又或者,只知道埋頭苦干,壓根不管方向對錯,輕重緩急。
程序猿是100%純正的腦力工作者,但很多人卻把自己變成體力工作者,自嘲自己身處勞動密集型產業,有的人甚至以日產出幾千行代碼為傲。這無疑是自廢武功,自己把自己往“碼農”的“農”字上推。定位問題,分析問題,解決問題,貫穿其中的都突出一個“邏輯”。無論是寫設計文檔、編寫代碼、測試,還是產品功能、用戶需求、交互設計,概莫能外。先思考,謀定而后動,思考的過程,也就是找出因果關系,找出1234條論據以支持論點,找出step1 step2 step3 直至結果的推導步驟的過程。
當你有良好的條理性,有嚴謹的邏輯,也許憑直覺也能做出正確的判斷。但時刻別忘了這一點。
Be thankful 懂得感恩
什么是感恩?就是對指導、幫助、提攜乃至批評過你的人的一種由衷的感激之情,懂得感恩的人都是善良的,善良且努力的人運氣都不會太差(哈哈,仿爛雞湯體)。只要你懂得感恩,甚至無需你做太多,只需要適時的表達,對方就能感受到你是孺子可教的,他就會覺得他的付出沒有白費,而不是面對一個木頭人或白眼狼。
同樣還是上文的B童鞋,在我帶過的幾百人中間,他是最懂得感恩的一位。甚至于你在批評他的時候,他都會承認錯誤并感激你對他的指導。這樣的人才,當他也拿出實實在在的業績的時候,你怎能不提拔他?
而作為對比,有太多的人,你曾經無數次的幫助過他,無論工作上還是生活中,但從未聽到他的一句感謝。這樣的人,只能呵呵以對。
Think beyond technology 不要只會純技術化思維
Understand your products and users 理解你的產品和用戶
很多程序猿,癡迷于修煉技術,常常會在一個簡單功能模塊里面運用某某高深的算法和莫測的技術,純粹為了炫技,而不去考慮是否過度優化,是否用戶并不需要這么復雜的功能,是否投入產出比并不合理。無視用戶、產品和市場規律的思考方式,就是純技術化思維。
典型的一個案例是,(可能是處女座程序猿),所有的Bug都必須解完才可以發布版本,不管是不是犄角旮旯或耗時很久的。我在工作的第二年,我的領導跟我說了一個概念“Time to market”,讓我意識到,你最關注的問題,或許并不是用戶最關注的問題。你要做的,是應該快速把產品發布,再去傾聽用戶的呼聲,可能100萬用戶里,都不會有人關注你花了幾周時間死磕的問題,但他們會爆出更多更重要更迫切的問題。
你要時刻關注你的產品,關注你的用戶,從電商的網評,從售后的熱線,從論壇的帖子,從行業外的朋友,獲取他們對于你產品的第一手的評價。一個好的程序猿,也應該是一個好的產品經理。否則你就是一個缺乏大腦的泥瓦匠,而不是一個建筑師。
作為一個程序猿的leader,你是要代表團隊去跟產品經理撕逼的,如果你不懂產品,那么你的團隊也就完了。
Have good communication skills 良好溝通
做一個牛逼的程序猿,其實可以不用怎么講話,用牛逼的代碼和運行結果去碾壓別人即可。但如果你想做程序猿的leader,還繼續保持這么高冷的姿態可不行。溝通無疑是管理的基礎,一個程序猿想升職,想做管理,必然需要證明自己擁有不錯的溝通能力。跟高層領導要資源,跟產品經理撕逼,跟測試部門搞好關系,跟設計妹子開開玩笑,跟程序猿搞基,不會溝通顯然是不行的,最好是亦莊亦諧,葷素兼備。
這里不展開講如何擁有良好的溝通技巧。只說幾點:1. 溝通的意愿最重要,只要你愿意主動溝通,事情總會向好的方面發展。2. 溝通要真誠,不要套路。3. 口才不行,你可以多用寫,寫還有個好處就是留有證據,方便以后撕逼。
Take responsibility 承擔責任
常在河邊走,哪有不濕鞋。代碼寫多了,挖坑是必然的。面對爆出來的Bug,面對領導的責備,沒什么好說的,自己惹的,自己clean up。
放更長遠來看,誰都會出錯,不管你是程序猿,還是程序猿的leader,甚至是高管,總會被爆出問題。這時候是各種借口推諉,還是大大方方承認,并且用最快的速度處理干凈?我認為正確的處理方式是后者,這不單單是能力問題,更多的是人品問題。
當你有朝一日當了leader,你手下犯了事,你也得大大方方站出來“我把關不嚴,責任我擔”,絕不是把手下推出去了事(放你身上可能是小事,放他身上可能就得開除了),回過頭再關起門內部處理。只有這樣,你的手下才會服你,才會有人為你拼命干活。
最后,做不好管理就做純技術,做資深專家、技術大拿也挺好,不要強扭。
質疑1:作者沒提他是xx大學畢業的所以升職快?
李開復哥大畢業,所以他的事業成功理所當然?拜托,哥大也是他考上的好嗎,還不是回溯到他本身的努力和聰明。再者,這質疑的潛臺詞就是,xx畢業的才有可能升職這么快,不適用于其他人,大家散了吧。
以前也有類似的說法,背景論、陰謀論:比爾蓋茨的母親是IBM高管,巴菲特的父親是國會議員,所以他們的成功無非就是靠背景,不過爾爾。可是企業高管的孩子,政府官員的娃,清華北大畢業生何止千萬人,難道最終都是那么成功嗎,為何比爾蓋茨和巴菲特僅此一個?如果我們把別人的成功都歸結于他所擁有的先天優勢,忽略他們的聰明才智、開拓精神和巨大努力,這是在為甘于平庸和墮落找借口。請參考:
比爾蓋茨的編程水平怎么樣
實際上,所謂的成功學/成功經驗的最大問題就是每個人的經歷都是無法復制的。照著這些成功的經驗去做,并不能保證你就一定飛黃騰達。更有人在評論里跟我糾結努力是不是成功的充分條件。用一句說爛了的話來講“努力不一定能成功,但不努力一定不能成功”,明明說的是必要條件,硬要說我講的是充分條件。有誰敢說找到了成功的充分條件,且具有可操作性?那成功都可以流水線批量生產了。當然這里有個目標定義的問題,什么是成功?升職加薪就是成功?不一定,每個人的目標都不一樣,有的人還覺得過安逸的日子就是成功,這里就不贅言了。
質疑2:反對加班反對加班反對加班!升職加薪有那么重要,命都不要了?
反對有效。我跟你一樣反對,所謂的996、80小時、90小時,真的只是打比方。熬夜真的不好,12點前睡覺對程序猿來說真的太重要。早睡早起,堅持鍛煉,這是程序猿必須牢記的,這十年里我慶幸自己一直堅持在打球,從未放棄。
但是!我們可以在不熬夜、盡量不傷害身體的情況之下比別人更加努力,別人打游戲,看電影,看網絡小說的時間,你可以用來看書、編碼和參加技術交流,然后按時睡覺。笨鳥先飛、天道酬勤,這難道不應該是絕大多數非清華北大學生,絕大多數自認為起點不高的人,絕大多數沒有背景的人,應該相信和堅持的價值觀嗎?
質疑3:天賦比努力更重要,沒有天賦不要干程序猿這一行。
我想舉NBA的兩個頂級球員來作為例子,麥迪和科比。天賦來看,麥迪天賦大大超過科比(臂展身高彈跳手掌大小),從努力程度來看,顯然科比大大超過麥迪,最后誰的成就更高?當然你又可以扯隊友、運氣、傷病,等等。所以成功從來都不會有一個確定的公式,每個變量的權重大小早已明確,這是不可能的。詹姆斯、奧尼爾的成就里面天賦起很大作用,科比、AI、斯托克頓、納什、庫里更多的是靠勤奮的訓練。
但最直接的反擊是,給定一個人,他能不斷提升自己的天賦嗎?顯然不能。要么努力,要么換行。糾結于那些我們無法改變的事情上面是沒有意義的。雞湯有云:努力改變那些我們能夠改變的,接受那些無法改變的。我經常告誡自己:要么忍,要么狠,要么滾。
天賦決定了你的上限,勤奮決定了你的下限。你的上限可能比別人低,但你還是可以不斷提升自己。
質疑4:你這是資本家的嘴臉,給大家洗腦,讓大家做無腦員工,只知道埋頭苦干被剝削。
我的回答是:哈哈哈哈,真樂。被害妄想癥,不要放棄治療。雞湯有毒你別喝就是。