不確定“再見理想”是“再見了,理想”還是“再次燃起理想”,稀里糊涂地對這句話有感覺。作為程序員,總會有自己的技術價值觀和技術理想。工作七年多,開始癢了。
程序員的生活總是喜憂參半,出入體面的寫字樓,在小小的cubicle里虐殺腦細胞;偶爾有條件小資一下,常被工作、生活壓力逼得點燈熬油;有時候想,這么辛苦,不論做什么行業都會做的好,是不是入錯行了?手放在鍵盤的時候,又享受投入思考的快感。或許注定是個程序員,限于天賦,或許注定是個庸庸碌碌的程序員。
前端時間因為跑到鄉下,沒法上網,網癮一上來撞墻流鼻涕,百無聊賴開始勾畫價值觀和技術理想。人總追求快樂,每天清醒的十六個小時中,——程序員可能有十八個小時,至少有八小時花在工作上,所以,為了過得快樂,工作一定要快樂。如果當前的工作注定沒法使你快樂,就趕快結束它。畢竟,多數時候,拼命工作不如拼命找工作來得實在。程序員當然不算光鮮的職業,但確實挺費腦子,如果你智商低于110,換個軟件公司也注定痛苦,還是直接換個行業吧。
工作的基本原則是要保持身價,何為身價?不是你現在月薪多少,而是你現在跳槽,能拿多高的offer。這跟很多因素有關,主要因素包括
1.你當前薪水——HR往往參考這個給你定薪水;
2.你的資歷——畢業的學校,工作年限,外企工作年限,你當前的title,在當前公司工作了已經幾年…
3.你在面試中的表現——能發揮多少技術水平,英語對答如何。
像我這種身價的本來沒資格討論身價,但誰叫這是我的blog,我的地盤聽我的呢.挨個亂噴一下。
1. 關于當前薪水
假如你跟我一樣笨,沒有別的好辦法,就只能多投入精力工作。在以前的博客 與神對話 里也提過一個程序員對于產品的價值。每天上班8小時,每天多專注一點,日積月累,做的事情會多很多,對自己的提高也會多很多。加薪或許是水到渠成的事,如果不順利,要么跟領導談談,或者直接閃人。無論如何,不要抱怨。善于抱怨的人表示他還不夠強。你需要尊重權利,包括他人的權利和自己的權利。
2. 關于資歷
如果你畢業于名校,學歷又好,一畢業自然就能進大公司。如果你還在江湖三流公司混,就得每天想著早點換工作。工作年限不總算是資歷,好公司的工作經歷才有用。要記得換工作是有成本的,我工作七年多,現在的工作是第五份工作,所有公司都詬病我不stable,這樣的資歷很難騙取信任,教訓??!聰明的你肯定想到簡歷作假,但好公司都有reference check的,我還是勸你別冒險。
3. 面試
千萬記住,一定要預先做好充分的準備才能參加面試。對于一個java程序員來說,面試之前要翻一遍類似于Thinking in Java的書,背一遍設計模式,復習sql,復習mvc框架,復習Hibernate,復習Spring, 復習Servlet spec?;蛟S還有其他的,web service之類的。你可以想象,真要復習一遍,起碼要三個月,這就是我認為換工作之前至少要預留出來的準備時間。機會有限,僥幸心理出去碰運氣純粹是浪費機會。平時工作總有局限,看書是最有效準備面試的途徑。
上面說的都是不登大雅之堂的事情,有熱情的程序員總想成長為高手,我當然也有這樣的愿望。問題是你認為什么樣的人算是高手,每個人心里會有不同的答案,關鍵是找出你和理想之間的差距并盡量縮短它。高手一定不僅僅是技術超群的,高手必然有高手的胸懷。
自己有時候會考慮一些工作和技術上的原則,想到哪兒敲到哪兒吧。
關于工作:
作為程序員,你要關心產品。這沒什么可說的,這是職業道德問題。
作為程序員,你要尊重QA。工作越久,就越覺得QA對產品非常重要,程序員很多時候陷在具體的技術問題中,太多精力被牽扯住了。好的QA讓程序員心安,能夠有助于控制風險. QA應該有做最后決定的權利,所以QA需要對產品有很好的insight. 而且好QA需要明白,測試不是找bug的游戲。
關于技術:
effective java 和 Refactor書都是總結各種編程原則的書,那些熟為人知的原則不說,我只說我的理解
static: Joshua在effective java里強調盡量使用static method。這肯定是沒錯的[這句話說錯了,請看下面T.H.E的評論。他說的很有道理。我是做應用的程序員,不暴露API給其他產品,所以一直都覺得IDE里移動static method沒成本。但如果寫Service層給未知產品用的話,耦合class的確有危險]。太看重這一點,就容易轉到一個誤區——多使用static field. 而static field有時代表了封裝的問題,需要謹慎。
exception: 包括Thinking in java的Bruce, Martin Fowler等很多人都對checked exception不感冒。自己也思考了一下,你當然能舉出checked exception的應用場景。你可以說某個方法它拋出checked exception是為了讓caller處理exception.但你說的是讓“這個caller”處理它。從重用的角度說,你并不預知所有被調用的情況,所以不能排除一些情況下這個checked exception并不能得到特別的處理。這個想法更本質的原則是,寫底層程序的時候,要裝作不知道caller是怎么使用它的,哪怕是你自己調用它。
重復代碼:所有程序員都對重復代碼表現出深惡痛絕的樣子。但我覺得,重復代碼不是定性問題,而是個定量問題??梢赃@樣考慮:三行代碼反復出現在三個不同的文件里,甚至在不同的package里,這算重復代碼么?四行代碼呢?十行代碼呢?曾經聽到一個高手說,編程的核心在于重用。我不反對這個說法,但我更傾向于說,編程的核心在于可維護性。對于重復代碼,大段的重復肯定要消滅的,三五行的重復不是不可以存在,但是要盡量把它圈在一個小范圍里,比如一個包,或者文件,或者方法里。有時候刻意追求“不重復”,反而讓程序變得別扭。
技術存在的價值在于能夠解決現實問題。你可以對技術狂熱,但不能忘了這個客觀事實,技術需要實現商業價值,需要最求投入產出比。最最根本的原則,是pragmatic