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