談談寫程序與學英語
俗話說,沒有金剛鉆,就別攬瓷器活兒。套用到IT業,英語不行,就別做程序員。網上關于程序員學英語的文章不少,但我想談談我自己的看法。首先詳細討論一下為什么程序員離了英語不行,然后針對程序員應該怎么學英語說說我的體會。
英語是計算機的母語,是程序的母語,所以必然是程序員的母語。程序中的變量名、函數名起得好不好是決定代碼質量和可維護性的最關鍵因素。高質量的代碼應該是這樣的:代碼基本上是自解釋的(self-explanatory),不需要太多注釋,不管代碼的規模有多大,具有相關知識背景的讀過文檔的人都可以立刻上手、立刻參與維護和開發。要想使代碼能夠自解釋,給變量和函數起個好名字很關鍵,很顯然,只能用英文起名字,一是用漢語拼音起名字可讀性很差,二是英文單詞通常比漢語更expressive(看吧,如果用漢語來說,就得說“表達能力更強”、“更有表現力”這么羅嗦),由于程序的復雜性,變量和函數往往表示一些很抽象的概念,起個既準確又簡潔的名字并不容易,可是很多時候,用漢語需要很多字才能說清楚的一件事,用英文一個單詞再加點詞形變化就能說清楚了。例如APUE上講sleep函數的實現,其中有個變量表示“本來應該睡到某個時刻,但是提前被信號喚醒了,喚醒時與本來應該睡到的時刻相差的時間”,如果為了簡潔而不求準確,這個變量名至少也得叫“未睡到”,而書中只用了一個單詞unslept,非常準確、簡潔地表達了這個意思。為了寫程序而學英語需要學到什么水平?我認為能起出這種變量名就夠水平了。很多在IT外企工作的中國人,說話寫文章經常夾雜著英文單詞(比我嚴重多了因為我不在外企),非常可以理解,確實是為了表達得更準確簡潔的需要,而不是純為了play zhuangbility。總之,要寫程序必須學好英語,否則連變量名都起不好,這雖然是一個非技術問題,但卻是個根本問題,比任何技術問題都重要。當然,現在很多編程語言也支持用Unicode字符給變量和函數起名,但是你見過有人用漢字寫程序嗎?根本不實用。有人會辯駁說一頁英文翻譯成中文往往只占半頁,中文不是更簡潔嗎?但是你算算打一頁英文和打半頁中文哪個敲鍵盤次數多。另外,要讀別人的代碼也必須學好英語,如果你不知道unslept是由sleep變形而來的,就體會不到其中的精妙,只有大量閱讀高質量的代碼,才能寫出高質量的代碼,創作都是從模仿開始的。
說說英語對于看書學習的重要性。中文技術書和英文技術書的水平根本不在一個量級上,這是有很多原因的,不能全歸結于中文書的作者水平差。最重要的是,出中文書的低回報率決定了作者不可能花太多心血在上面,你去amazon看看一本書賣多少美刀,再去chinapub看看一本書賣幾塊錢。老外寫一本書,可以做到全書沒有一個拼寫錯誤(當然英文的拼寫檢查工具更完善也是部分原因),中文能找出一本沒有錯別字的書嗎?Knuth可以懸賞讓全世界讀者來找磋,中文書作者有哪個敢這么做?不是因為老外態度有多認真治學有多嚴謹,而是因為他們賺到了,就應該拿出高質量的作品來,不然會被讀者罵的。
英文技術書的翻譯質量通常很差。也不能歸結于譯者的水平差,我也翻譯過書,也努力想譯好,但真的很難譯好。IT業的新名詞層出不窮,像“內核”、“網絡”這種常見術語還好,稍微專一點的術語都沒有統一的譯名。我們在教學中發現,很多學員看書時搞不清這本書的名詞A和那本書的名詞B是什么區別,來問老師,才發現原來A和B就是一回事兒。這是一個單詞對應多個譯名的情況,還有一個譯名對應多個單詞的情況,比如field、domain、realm都譯成“域”,block、 bulk都譯成“塊”,argument、parameter都譯成“參數”,attribute、property都譯成“屬性”,雖然這些詞的意思本來就差不多,但是在一篇文章里,作者可以換著用,不同的單詞表示不同的概念,翻譯完了一看,都成一個概念了。英文書背后都有index,看到一半忘了某個名詞是怎么定義的就可以翻index,而譯文通常沒有index,名詞都已經亂七八糟了,沒法做index。還有更發指的是,老外喜歡造詞,現有的單詞上加一點變化和組合(例如有人喜歡說automagically),看著心領神會,想譯出來就很費勁。老外即使在技術書中也經常用一些生動的表達方式和俏皮話,而中文的書面語言非常死板,生動的表達方式只存在于口語中,如果寫在書上就很不像話,這也是很難翻譯的一個重要原因。看中文譯本,不僅質量差,而且跟不上時代,通常一本英文書出來,至少要等一到兩年才能看到中文譯本。兩年啊!等你看到這本書的中文譯本時,這個版本都快淘汰了。
然后說說英語在開發工作中的重要性。看書學習通常只起一個引導入門的作用,在工作中更有用的是手冊、文檔。學完了C語言開始寫程序了,誰還會去查K&R附錄中的庫函數?查man page才是最有效率的。然而手冊比入門書更少有中文譯版,因為手冊是隨時變的,會隨著軟件版本更新,而且需要看這些開發手冊的人通常不會有英文障礙,有英文障礙的人即使看了翻譯的手冊也寫不出好程序來,所以當然沒必要翻譯了。不管什么技術,官方的手冊和技術標準才是最原始的第一手資料,看別的書都是以訛傳訛,由于自然語言不可避免是有歧義的,文檔中表達得不準確的地方就會被文檔的讀者也就是技術書的作者誤解,技術書中再有表達不準確的地方又被譯者誤解。我們小時候都玩過傳話的游戲,幾個人站一排,通過悄悄話傳一句話,傳到最后變成什么了?所以,學網絡協議,就得看RFC,學ARM,就得看ARM公司的 Architecture Reference Manual,要學習C語言就得看C99,有歧義不要緊,自己去揣測原作者的意思,總比道聽途說的可靠。
我們的學員出去面試經常被問到的一個問題就是:在開發工作中遇到問題,書和文檔上都沒有答案,網上搜一下也沒有答案,怎么辦?要我說,能看懂源代碼的就去源代碼中找答案,這稱為hacking,不管是內核、libc還是各種framework,你調用的東西有問題都能從它的代碼中找到原因。如果沒有能力 hacking,或者時間緊不想去hacking,最好的辦法就是去官方郵件列表和IRC問。如果英文不行就沒辦法了,只能去一些中文論壇:“各位大蝦幫忙,小弟有一個問題求救!跪求!!在線等!!!”在線等了好幾天也無人問津,或者答非所問。豈不知逛這些論壇的沒有大蝦,都是菜鳥,大蝦們都在IRC上聊得正歡呢。我在做Qt開發時曾經有一個問題,當時在教育網,上國外網不方便,去各大中文論壇問了好幾天也沒人給出滿意的回答,后來花錢連了國外網,去 trolltech官方新聞組提問,只等了幾分鐘就得到了滿意的解決辦法。這次經歷給我留下了深刻印象,從此以后再也沒有去中文論壇。
那么,如果現在英文水平很差,又想做程序員,應該怎么學英語呢?我下面說的方法有兩個前提,一是你的英文至少達到高中畢業水平,也就是語法基本都學完了,即使用得不熟練也知道有那么回事兒,二是你希望盡快在工作中用上英語,寫程序夠用就行,而不是有考T考G這樣的更高要求。
學習英語有聽說讀寫四個方面的要求,做程序員至少需要讀和寫非常流暢,如果在外企工作還需要聽和說的能力。技術英語和考T考G是不一樣的,一是聽和說不像讀和寫那么重要,不必擔心自己是“聾啞英語”,沒關系,絲毫不影響你成為編程高手,二是要求的詞匯量要小得多。考T考G都要拿一本單詞書背,很少有人會覺得背單詞很有意思,至少我是覺得很痛苦,幸運的是看技術書不需要多少詞匯量。技術書的描述對象都是局限于一個很窄的領域的,就那么幾個單詞翻來覆去地用,而且技術書是為了讓人看懂的(不像詩是為了讓人看不懂的),比較復雜的詞在書中都有定義或解釋。有些作者喜歡賣弄詞匯量,用一些很生僻的單詞,也有些作者賣弄一些典故,由于文化背景不同很難理解,不過這些通常都可以無視,不會影響閱讀,還是因為技術書是為了讓人看懂的。對于學習者來說,閱讀能力是最重要的,等你完成了學習,成為一個合格的開發者時,需要寫代碼注釋,需要寫文檔,需要通過郵件交流,寫作的能力才開始重要了。所以應該首先從閱讀開始練習英語。
現在就拿起一本英文原版書開始看吧。和學游泳一樣,閱讀的能力只能通過閱讀本身來練習。我的經驗是,不必先系統學習了單詞和語法再看書,可以在看書時用到什么就補什么。我建議初學者看電子版,因為現在的詞典軟件都可以鼠標取詞,邊看邊查很方便,很多勤快人喜歡把查過的單詞都抄下來,我覺得沒有必要,反正查字典很方便,下次再看到了就再查,多查幾次總會記住的,抄下來就打斷了看書的思路,而且不見得抄下來就能記住。也許是因為我這人比較懶,我用的都是懶辦法。很多人不喜歡看電子書,理由是盯著屏幕看書太累,那么盯著屏幕寫程序累不累?這種人顯然不適合做程序員。語法不熟練怎么辦?大多數情況下單詞的意思都明白了就不影響閱讀。技術書有時候喜歡用長句,其中可能包含各種從句,如果實在讀不懂就去查語法書,同樣也不需要把這種從句徹底弄明白,只要這一句能看過去就行了,以后多查幾遍書,自然就掌握了。另外,技術書是說明文,通常不應該有過去時,看到過去時就需要注意了,很可能是虛擬語氣,如果不注意這一點,看到的意思可能和真實的意思正好相反。
應該從哪本書開始看起呢?從你當前最需要學的技術書看起。看書是相當花時間的,如果能一邊學英語一邊學技術,這時間利用得就很有效率。比如,如果你的C語言已經學得相當好了,不要專門為了學英語去重看一遍原版的K&R。市面上有一些專門的計算機英語教材,我的建議是不要看,浪費時間,nonsense。初學時最好選一本有中文譯本的書,有看不懂的地方可以翻中文版來對照,但是不要相信中文的翻譯,原因在前面討論過了。如果你是初學編程,沒有任何基礎,我可以推薦一本英文很淺顯技術也很淺顯的書:How To Think Like a Computer Scientist,有Python、Java和C++版本,可自由下載。
要逐漸養成良好的閱讀習慣。一是不要每個生單詞都去查,有些單詞很生僻,查了也記不住,記住了也不會再見到它了,但是前面講過,都是作者在賣弄詞匯量,無視它絲毫不影響閱讀,因此要學會猜測單詞的意思,能不查就不查,繼續貫徹“懶”的原則。二是看書不要動口,不念出聲也不行,就是不要動口,要努力在大腦中建立從詞形到語義的直接映射,如果只能從詞形到讀音再到語義就太慢了,嚴重影響閱讀速度。三是努力做到每句話都從頭到尾只看一遍,不許回頭反復看,這一點比較難,必須注意力高度集中,經常在記憶中暫存前面半句的內容和句式才能做到,但是一旦神功練成就會成倍地提高閱讀速度。最后一層境界,學會skim,就是略讀,很多優秀的作者在組織材料時會給讀者一些建議,比如這一段是擴展的高級話題,和主線的相關度較低,可以先skim到后面,注意不是讓你skip到后面,這一段還是要讀的,但是不必逐字句地讀,而是抓主旨,大概講了個什么概念(有一些下定義的句式),有哪些要點(有數字編號或bullet列表項),適用于哪些場合有哪些注意事項(有 caveat、gotcha、noteworthy這種字眼),后面可能還會碰到這個概念,雖然你沒有仔細看這是個什么東西,但大體上也知道了,這樣就能不影響后面的閱讀,這不僅需要高度集中的注意力、熟練的語言能力,而且要有足夠的背景知識去猜測性地理解。但是語言能力還是最重要的因素,我和幾個同學交流過,他們也能熟練地看英文書,但是需要skim查一個東西時就覺得還是不如中文書查得快。skim的技能在查閱手冊時尤其重要,沒有人會像看入門書一樣把上千頁的手冊從頭到尾看一遍,都是用到哪兒就查哪兒。總之,鍛煉各種閱讀習慣就為了一個目的:如何在最短的時間內,在保證正確性的前提下,獲取盡可能多的知識。程序員的學習時間都是非常寶貴的。
以上本著“夠用就好”的原則,多次提到用懶辦法,但是學技術學英語這兩件事不能懶,貴在堅持。要養成良好的閱讀習慣也有很多東西需要堅持,其中最根本的是持續高度集中注意力,充分調動記憶能力、推理能力、猜測能力,就像考試做閱讀題一樣看每一段話。最根本也是最重要的,“有英文原版就不看中文版”這個原則一定要堅持。一開始看英文書可能會很慢,但只要一直堅持就會慢慢達到原來看中文書的速度,再堅持下去就會比中文書看得更有效率,因為避免了很多歧義和術語翻譯的問題。有人會說,項目緊任務急,看英文資料太慢,這次就先用中文盡快解決工作中的問題吧,等以后有時間了再看英文書學習。可是什么時候才會有時間呢?工作總是一個接一個的,老板怎么會付了工資讓你閑著呢?如果你有這樣的困難,我的建議是干脆辭職,學好了英文再去工作。你只要想想,你的同行們在外企全英文的環境下工作,英文和技術每天都在突飛猛進,而你還在用效率極其低下的方式學習和工作,你和別人的差距不是越來越大了嗎?另一方面,現在的在校學生從小學就開始抓英語,基礎都很好,很多高校也逐漸重視引進原版教材,開設很多英文授課的專業課。你再不奮起直追,就不覺得以后的職業道路充滿危機嗎?
最后說說寫作。剛開始練習時不要怕寫錯,能表達清楚自己的意思即可。我看過很多源代碼和文檔中的英文,一看就是中國人寫的,謂語動詞不分單復數,名詞復數不加s,處處可見中國式英語,但是絲毫不影響我對這些編程大牛的景仰,因為其中的思想我看懂了,并且我認為很強大。我有一個朋友,中學畢業就出來混的,由于工作的性質總要跟老外打交道,他從來不懼和老外交流,雖然連一個囫圇的句子都說不出來,但總是能用中學學的那點單詞讓老外明白他的意思,這一點我就非常佩服。總之就是說,不要因為不知道怎么寫是對的就不敢動筆寫,只要敢交流,并且別人能懂你的意思,就是很有效的交流。而且隨著閱讀量的增加,自然能寫出一手好英文,前面講過了,創作總是從模仿開始的。不怕出錯才能有一個好的開始,才能逐步練習提高,而練習的最終目的當然還是希望寫好,不僅字句通順無語法錯誤,還能適當修辭。
留言列表