|
本帖最后由 linux_Ultra 于 2009-6-30 09:13 編輯
在網(wǎng)上看到 篇文章,-----俗話說(shuō),沒(méi)有金剛鉆,就別攬瓷器活兒。套用到IT業(yè),英語(yǔ)不行,就別做程序員。網(wǎng)上關(guān)于程序員學(xué)英語(yǔ)的文章不少,但我想談?wù)勎易约旱目捶āJ紫仍敿?xì)討論一下為什么程序員離了英語(yǔ)不行,然后針對(duì)程序員應(yīng)該怎么學(xué)英語(yǔ)說(shuō)說(shuō)我的體會(huì)。英語(yǔ)是計(jì)算機(jī)的母語(yǔ),是程序的母語(yǔ),所以必然是程序員的母語(yǔ)。程序中的變量名、函數(shù)名起得好不好是決定代碼質(zhì)量和可維護(hù)性的最關(guān)鍵因素。高質(zhì)量的代碼應(yīng)該是這樣的:代碼基本上是自解釋的(self-explanatory),不需要太多注釋,不管代碼的規(guī)模有多大,具有相關(guān)知識(shí)背景的讀過(guò)文檔的人都可以立刻上手、立刻參與維護(hù)和開(kāi)發(fā)。要想使代碼能夠自解釋,給變量和函數(shù)起個(gè)好名字很關(guān)鍵,很顯然,只能用英文起名字,一是用漢語(yǔ)拼音起名字可讀性很差,二是英文單詞通常比漢語(yǔ)更expressive(看吧,如果用漢語(yǔ)來(lái)說(shuō),就得說(shuō)“表達(dá)能力更強(qiáng)”、“更有表現(xiàn)力”這么羅嗦),由于程序的復(fù)雜性,變量和函數(shù)往往表示一些很抽象的概念,起個(gè)既準(zhǔn)確又簡(jiǎn)潔的名字并不容易,可是很多時(shí)候,用漢語(yǔ)需要很多字才能說(shuō)清楚的一件事,用英文一個(gè)單詞再加點(diǎn)詞形變化就能說(shuō)清楚了。例如APUE上講sleep函數(shù)的實(shí)現(xiàn),其中有個(gè)變量表示“本來(lái)應(yīng)該睡到某個(gè)時(shí)刻,但是提前被信號(hào)喚醒了,喚醒時(shí)與本來(lái)應(yīng)該睡到的時(shí)刻相差的時(shí)間”,如果為了簡(jiǎn)潔而不求準(zhǔn)確,這個(gè)變量名至少也得叫“未睡到”,而書中只用了一個(gè)單詞unslept,非常準(zhǔn)確、簡(jiǎn)潔地表達(dá)了這個(gè)意思。為了寫程序而學(xué)英語(yǔ)需要學(xué)到什么水平?我認(rèn)為能起出這種變量名就夠水平了。
很多在IT外企工作的中國(guó)人,說(shuō)話寫文章經(jīng)常夾雜著英文單詞(比我嚴(yán)重多了因?yàn)槲也辉谕馄螅,非常可以理解,確實(shí)是為了表達(dá)得更準(zhǔn)確簡(jiǎn)潔的需要,而不是純?yōu)榱藀lay zhuangbility?傊,要寫程序必須學(xué)好英語(yǔ),否則連變量名都起不好,這雖然是一個(gè)非技術(shù)問(wèn)題,但卻是個(gè)根本問(wèn)題,比任何技術(shù)問(wèn)題都重要。當(dāng)然,現(xiàn)在很多編程語(yǔ)言也支持用Unicode字符給變量和函數(shù)起名,但是你見(jiàn)過(guò)有人用漢字寫程序嗎?根本不實(shí)用。有人會(huì)辯駁說(shuō)一頁(yè)英文翻譯成中文往往只占半頁(yè),中文不是更簡(jiǎn)潔嗎?但是你算算打一頁(yè)英文和打半頁(yè)中文哪個(gè)敲鍵盤次數(shù)多。另外,要讀別人的代碼也必須學(xué)好英語(yǔ),如果你不知道unslept是由 sleep變形而來(lái)的,就體會(huì)不到其中的精妙,只有大量閱讀高質(zhì)量的代碼,才能寫出高質(zhì)量的代碼,創(chuàng)作都是從模仿開(kāi)始的。說(shuō)說(shuō)英語(yǔ)對(duì)于看書學(xué)習(xí)的重要性。中文技術(shù)書和英文技術(shù)書的水平根本不在一個(gè)量級(jí)上,這是有很多原因的,不能全歸結(jié)于中文書的作者水平差。最重要的是,出中文書的低回報(bào)率決定了作者不可能花太多心血在上面,你去amazon看看一本書賣多少美刀,再去chinapub看看一本書賣幾塊錢。老外寫一本書,可以做到全書沒(méi)有一個(gè)拼寫錯(cuò)誤(當(dāng)然英文的拼寫檢查工具更完善也是部分原因),中文能找出一本沒(méi)有錯(cuò)別字的書嗎?Knuth可以懸賞讓全世界讀者來(lái)找磋,中文書作者有哪個(gè)敢這么做?不是因?yàn)槔贤鈶B(tài)度有多認(rèn)真治學(xué)有多嚴(yán)謹(jǐn),而是因?yàn)樗麄冑嵉搅,就?yīng)該拿出高質(zhì)量的作品來(lái),不然會(huì)被讀者罵的。英文技術(shù)書的翻譯質(zhì)量通常很差。也不能歸結(jié)于譯者的水平差,我也翻譯過(guò)書,也努力想譯好,但真的很難譯好。IT業(yè)的新名詞層出不窮,像“內(nèi)核”、 “網(wǎng)絡(luò)”這種常見(jiàn)術(shù)語(yǔ)還好,稍微專一點(diǎn)的術(shù)語(yǔ)都沒(méi)有統(tǒng)一的譯名。
我們?cè)诮虒W(xué)中發(fā)現(xiàn),很多學(xué)員看書時(shí)搞不清這本書的名詞A和那本書的名詞B是什么區(qū)別,來(lái)問(wèn)老師,才發(fā)現(xiàn)原來(lái)A和B就是一回事兒。這是一個(gè)單詞對(duì)應(yīng)多個(gè)譯名的情況,還有一個(gè)譯名對(duì)應(yīng)多個(gè)單詞的情況,比如field、domain、realm都譯成“域”,block、 bulk都譯成“塊”,argument、parameter都譯成“參數(shù)”,attribute、property都譯成“屬性”,雖然這些詞的意思本來(lái)就差不多,但是在一篇文章里,作者可以換著用,不同的單詞表示不同的概念,翻譯完了一看,都成一個(gè)概念了。英文書背后都有index,看到一半忘了某個(gè)名詞是怎么定義的就可以翻index,而譯文通常沒(méi)有index,名詞都已經(jīng)亂七八糟了,沒(méi)法做index。還有更發(fā)指的是,老外喜歡造詞,現(xiàn)有的單詞上加一點(diǎn)變化和組合(例如有人喜歡說(shuō)automagically),看著心領(lǐng)神會(huì),想譯出來(lái)就很費(fèi)勁。老外即使在技術(shù)書中也經(jīng)常用一些生動(dòng)的表達(dá)方式和俏皮話,而中文的書面語(yǔ)言非常死板,生動(dòng)的表達(dá)方式只存在于口語(yǔ)中,如果寫在書上就很不像話,這也是很難翻譯的一個(gè)重要原因。看中文譯本,不僅質(zhì)量差,而且跟不上時(shí)代,通常一本英文書出來(lái),至少要等一到兩年才能看到中文譯本。兩年啊!等你看到這本書的中文譯本時(shí),這個(gè)版本都快淘汰了。然后說(shuō)說(shuō)英語(yǔ)在開(kāi)發(fā)工作中的重要性?磿鴮W(xué)習(xí)通常只起一個(gè)引導(dǎo)入門的作用,在工作中更有用的是手冊(cè)、文檔。學(xué)完了C語(yǔ)言開(kāi)始寫程序了,誰(shuí)還會(huì)去查 K&R附錄中的庫(kù)函數(shù)?查man page才是最有效率的。
然而手冊(cè)比入門書更少有中文譯版,因?yàn)槭謨?cè)是隨時(shí)變的,會(huì)隨著軟件版本更新,而且需要看這些開(kāi)發(fā)手冊(cè)的人通常不會(huì)有英文障礙,有英文障礙的人即使看了翻譯的手冊(cè)也寫不出好程序來(lái),所以當(dāng)然沒(méi)必要翻譯了。不管什么技術(shù),官方的手冊(cè)和技術(shù)標(biāo)準(zhǔn)才是最原始的第一手資料,看別的書都是以訛傳訛,由于自然語(yǔ)言不可避免是有歧義的,文檔中表達(dá)得不準(zhǔn)確的地方就會(huì)被文檔的讀者也就是技術(shù)書的作者誤解,技術(shù)書中再有表達(dá)不準(zhǔn)確的地方又被譯者誤解。我們小時(shí)候都玩過(guò)傳話的游戲,幾個(gè)人站一排,通過(guò)悄悄話傳一句話,傳到最后變成什么了?所以,學(xué)網(wǎng)絡(luò)協(xié)議,就得看RFC,學(xué)ARM,就得看ARM公司的 Architecture Reference Manual,要學(xué)習(xí)C語(yǔ)言就得看C99,有歧義不要緊,自己去揣測(cè)原作者的意思,總比道聽(tīng)途說(shuō)的可靠。我們的學(xué)員出去面試經(jīng)常被問(wèn)到的一個(gè)問(wèn)題就是:在開(kāi)發(fā)工作中遇到問(wèn)題,書和文檔上都沒(méi)有答案,網(wǎng)上搜一下也沒(méi)有答案,怎么辦?要我說(shuō),能看懂源代碼的就去源代碼中找答案,這稱為hacking,不管是內(nèi)核、libc還是各種framework,你調(diào)用的東西有問(wèn)題都能從它的代碼中找到原因。如果沒(méi)有能力 hacking,或者時(shí)間緊不想去hacking,最好的辦法就是去官方郵件列表和IRC問(wèn)。
如果英文不行就沒(méi)辦法了,只能去一些中文論壇:“各位大蝦幫忙,小弟有一個(gè)問(wèn)題求救!跪求!在線等!!”在線等了好幾天也無(wú)人問(wèn)津,或者答非所問(wèn)。豈不知逛這些論壇的沒(méi)有大蝦,都是菜鳥(niǎo),大蝦們都在IRC上聊得正歡呢。我在做Qt開(kāi)發(fā)時(shí)曾經(jīng)有一個(gè)問(wèn)題,當(dāng)時(shí)在教育網(wǎng),上國(guó)外網(wǎng)不方便,去各大中文論壇問(wèn)了好幾天也沒(méi)人給出滿意的回答,后來(lái)花錢連了國(guó)外網(wǎng),去 trolltech官方新聞組提問(wèn),只等了幾分鐘就得到了滿意的解決辦法。這次經(jīng)歷給我留下了深刻印象,從此以后再也沒(méi)有去中文論壇。那么,如果現(xiàn)在英文水平很差,又想做程序員,應(yīng)該怎么學(xué)英語(yǔ)呢?我下面說(shuō)的方法有兩個(gè)前提,一是你的英文至少達(dá)到高中畢業(yè)水平,也就是語(yǔ)法基本都學(xué)完了,即使用得不熟練也知道有那么回事兒,二是你希望盡快在工作中用上英語(yǔ),寫程序夠用就行,而不是有考T考G這樣的更高要求。學(xué)習(xí)英語(yǔ)有聽(tīng)說(shuō)讀寫四個(gè)方面的要求,做程序員至少需要讀和寫非常流暢,如果在外企工作還需要聽(tīng)和說(shuō)的能力。技術(shù)英語(yǔ)和考T考G是不一樣的,一是聽(tīng)和說(shuō)不像讀和寫那么重要,不必?fù)?dān)心自己是“聾啞英語(yǔ)”,沒(méi)關(guān)系,絲毫不影響你成為編程高手,二是要求的詞匯量要小得多?糡考G都要拿一本單詞書背,很少有人會(huì)覺(jué)得背單詞很有意思,至少我是覺(jué)得很痛苦,幸運(yùn)的是看技術(shù)書不需要多少詞匯量。
技術(shù)書的描述對(duì)象都是局限于一個(gè)很窄的領(lǐng)域的,就那么幾個(gè)單詞翻來(lái)覆去地用,而且技術(shù)書是為了讓人看懂的(不像詩(shī)是為了讓人看不懂的),比較復(fù)雜的詞在書中都有定義或解釋。有些作者喜歡賣弄詞匯量,用一些很生僻的單詞,也有些作者賣弄一些典故,由于文化背景不同很難理解,不過(guò)這些通常都可以無(wú)視,不會(huì)影響閱讀,還是因?yàn)榧夹g(shù)書是為了讓人看懂的。對(duì)于學(xué)習(xí)者來(lái)說(shuō),閱讀能力是最重要的,等你完成了學(xué)習(xí),成為一個(gè)合格的開(kāi)發(fā)者時(shí),需要寫代碼注釋,需要寫文檔,需要通過(guò)郵件交流,寫作的能力才開(kāi)始重要了。所以應(yīng)該首先從閱讀開(kāi)始練習(xí)英語(yǔ),F(xiàn)在就拿起一本英文原版書開(kāi)始看吧。
和學(xué)游泳一樣,閱讀的能力只能通過(guò)閱讀本身來(lái)練習(xí)。我的經(jīng)驗(yàn)是,不必先系統(tǒng)學(xué)習(xí)了單詞和語(yǔ)法再看書,可以在看書時(shí)用到什么就補(bǔ)什么。我建議初學(xué)者看電子版,因?yàn)楝F(xiàn)在的詞典軟件都可以鼠標(biāo)取詞,邊看邊查很方便,很多勤快人喜歡把查過(guò)的單詞都抄下來(lái),我覺(jué)得沒(méi)有必要,反正查字典很方便,下次再看到了就再查,多查幾次總會(huì)記住的,抄下來(lái)就打斷了看書的思路,而且不見(jiàn)得抄下來(lái)就能記住。也許是因?yàn)槲疫@人比較懶,我用的都是懶辦法。很多人不喜歡看電子書,理由是盯著屏幕看書太累,那么盯著屏幕寫程序累不累?這種人顯然不適合做程序員。語(yǔ)法不熟練怎么辦?大多數(shù)情況下單詞的意思都明白了就不影響閱讀。技術(shù)書有時(shí)候喜歡用長(zhǎng)句,其中可能包含各種從句,如果實(shí)在讀不懂就去查語(yǔ)法書,同樣也不需要把這種從句徹底弄明白,只要這一句能看過(guò)去就行了,以后多查幾遍書,自然就掌握了。另外,技術(shù)書是說(shuō)明文,通常不應(yīng)該有過(guò)去時(shí),看到過(guò)去時(shí)就需要注意了,很可能是虛擬語(yǔ)氣,如果不注意這一點(diǎn),看到的意思可能和真實(shí)的意思正好相反。 |
|