2012年5月28日星期一

(轉載)Bruce Eckel:程式設計生涯


作者 Bruce Eckel 是程式設計界的大牛,著有大名鼎鼎的《Thinking in C++》和《Thinking in Java》。
本文是他對程式師(尤其是新手)的忠告。

================華麗的分割線================

大家總是問一個錯誤的問題:我應該學習C++還是Java在本文中,我將告訴大夥兒:對於選擇程式設計生涯真正需要關注的是哪些問題。

請注意,這篇文章的目標讀者並不是那些已經做出自己選擇的人。(對於這些人而言)你會繼續自己的程式設計生涯,而不管別人會怎麼說。因為它已經滲透到你的血液中,你已經無法擺脫。你已經知道答案:C++JavaShell腳本、Python、還有其它一大堆的語言和技術,你都理所當然地會去學習。甚至有可能你才僅僅14歲,就已經知道好幾種不同的語言。

問我這樣的問題的人可能來自其他行業,或者來自諸如Web開發之類的領域。他們知道HTML是一種類程式設計語言,而且想嘗試構建某些更大型的應用。但我特別希望,當你在問這個問題時,你已經意識到了想要在電腦領域取得成功,你需要掌握自學能力,而且永不停息。

在這個領域做得越多,我越覺得軟體發展比任何行業都更接近於寫作。 我們從來不知道是什麼造就了優秀的作者,我們只知道什麼時候我們會喜歡某個人的文字。程式設計不是一種工程,僅需要把東西從入口倒進去,然後再轉動手柄。把軟體發展看成確定性的,是一個誘人的想法。因為這個想法,人們總想搞出一些工具來幫我們開發出想要的軟體。但是我的經驗告訴我,事實並非如此——人的重要性遠高於流程。而軟體是否運行在一部精確的機器上已經越來越不重要了——這猶如測不准原理對人類的影響。

我的父親是造房子的,小時候我偶爾會幫忙打下手,放放磚塊之類。他和他的木工告訴我,他們是為我好才讓我幹這些活——這樣我就不至於走入這個行業。事實確實是這樣。

我們不妨把軟體發展比作蓋房子。造房子的人當然不可能完全一樣。這些人裡面有:混凝土工、屋頂工、管道工、電工、磚瓦工、水泥工、瓦片工、搬運工、粗木工、細木工。當然,還有工頭。每個工種都需要相應的技能,這些技能都需要花時間和精力去掌握。跟軟體發展一樣,造房子也是一個建立/推翻的過程。如果你想很快地獲得回報,你可能從搬運工和磚瓦工開始做,這樣的話,你無需太多的學習曲線就可以獲得回報。當需求很多時,你的工作會很穩固,甚至收入也可能提升——如果沒有足夠的人手的話。但是,一旦行情不妙,木匠甚至工頭就可能把磚瓦工一腳踢開。

當互聯網剛剛興起時,僅僅是花一點時間學習HTML,你就可以得到一份薪水豐厚的工作。但是當形勢慘澹時,對於技能的要求更高了——HTML程式師(就像搬運工和磚瓦工一樣)第一個被拋棄了,而擁有更高技能的程式師則留了下來。

我想說的是: 除非你準備活到老學到老,不然的話,不要進入這個行業!程式設計看起來似乎是一個高收入而又穩定的工作。但要做到這一點,唯一的途徑是:始終讓自己更有價值。

當然,你總能找到例外。總有那麼一些人,僅僅學了一門程式設計語言,就可以勝任留在一個崗位上,而不需要增長他的技能。但他們只是倖免於難而已,他們最終無疑是很脆弱的。為了不讓自己變得脆弱,你需要持續的提高自己,通過閱讀、加入用戶組、參加研討會...... 你學得越深入,你就越有價值,也就意味著你有更好的職業前景,可以配得上更高的薪水。

另一個方法是:先大致瞭解這個領域,找到最適合你的地方。打個比方:我的兄弟對軟體很感興趣,也入了這行,只不過他的工作是安裝、維修、升級電腦。他總是一絲不苟,所以當他把電腦搞好,一定會很完美——不光是軟體,連電線都會被仔細地捆好。他總是生意興隆,遠超出他的精力所能及。他甚至都不用擔心 .com 泡沫的崩潰。顯然他的飯碗不容易被搶走。

我在高校裡待了很久,甚至還在UCLA(加州大學洛杉磯分校)進修博士學位,後來又幸運地終止了。我說幸運是因為我不再喜歡呆在學校,而我之前在高校待了那麼久,只是因為我很享受它。但我所享受的,基本上是不務正業的東西——藝術和舞蹈課,在校報工作,還有一小撮電腦課程(之所以說電腦課程不務正業,是因為我本科是物理專業,研究生才是電腦專業)。雖然我在學術上遠談不上卓越(有意思的是很多當時也許不會接受我這個學生的學校現在卻用我的書做教材)。我真的很享受作為學生的日子,當我完成博士課程,也許會以一個教授的身份終老一生。

但就如現在看到的,我在學校裡最大的收穫恰恰來自我那些不務正業的課程,它們拓展了我的思維,使之超越了我們已經知道的東西。在電腦領域中,你總是為某種目標而程式設計。你對目標瞭解得越多,你就做得越好。我遇到過一些歐洲的研究生,他們需要結合其它專業領域來搞程式設計,他們的論文需要解決這個專業領域的特定的問題。

瞭解程式設計之外的領域,將會極大得提高你解決問題的能力 (就如同多學幾種程式設計語言將極大地提高你的程式設計技能)。很多時候,我發現僅僅學習電腦專業的學生,比那些(除了電腦之外)擁有其它背景的學生,在思維上有更多的局限性。因為後者有著更嚴謹的思維,也不那麼容易想當然。

有一次我組織了一次會議,其中一個議題是:理想的應聘者有哪些特徵:
把學習當成生活方式。比如:你應該知道不止一種語言,沒有什麼比學習一門新語言更能讓你開闊眼界了。
知道如何獲取知識
Study prior art
善用工具
學會把事情簡化
理解業務
為自己的錯誤負責。我就是這樣的是不能接受的托詞。能找到自己的失誤。
成為一個領導者,善於溝通和激勵。
搞清楚你在為誰服務
沒有絕對正確的答案(更好的方法總是存在的)。展示並討論你的代碼,不要帶著感情因素——你的代碼並不等於你本人。
明白完美是漸進的

適當嘗試一些冒險——尤其是能令人感到害怕的冒險。當你嘗試之後,將體會到出乎意料的興奮。(在冒險的過程中)最好不要刻意去計畫某個特定的結果。當你過於注重結果,你往往會錯過那些真正有價值的問題。我的冒險往往是這樣開始的——“我們先做些試驗,看看它會把我們帶到什麼地方

或許某些人會對我的回答感到失望,並回復我說:是的,這很有趣也很有用。但我到底應該學什麼?C++還是Java 我再重複一次:並不是所有的問題都有一個唯一的簡單的答案。問題的關鍵不在於選擇某個程式設計語言,然後掌握之。問題的關鍵在於:持續學習,並且很多時候,有不止一個選擇。 相信我所說的,你的生活會更精彩!

没有评论:

发表评论