2009年开始研究Android编程,以当时Android资料的稀缺性,能够参考的只有官方的文档,于是我便开启了生啃英文文档的过程,初读英文文档的时候觉得比较伤脑,好在自己有强烈的学习Android编程的动力,能够坚持下来。感谢当年国外网站在国内还没有被普遍屏蔽,那几年靠着Google和StackOverflow解决了不少编程上的问题,也培养了自己遇到问题去查英文的习惯。
研究生的时候我第一次面试美国公司的实习生职位,对面的面试官问了我一个基本的问题:面向对象(OOP)的三大特性是什么?这个问题我作为学生当然知道——封装、继承、多态,但是当时的我光顾着算法方面的准备,对于这样的基本概念却傻眼了。我涨红了脸,只能用稚嫩的句子去解释对这三个特性的理解,好在接下来的面试面试官可能意识到我的英语表达水平有限,也没有过多的询问这种知识类的问题。在美国公司实习的一年多间,平均一星期会有一次和美国同事的视频会议,虽然当时的英文表达能力还是很菜,但是培养了我写英文邮件的能力,以及敢于开口说英文的能力。
2012年出国工作后去了日本工作,开始学日语。其实我在大学里上了三个学期的二外日语,在出国之前也通过了N1的考试,没想到到了日本之后,遇到的最大日语理解障碍的是竟然英语。因为日语和汉语共同的部分我已经可以连蒙带猜的理解,但是日语中有很多从英文直接“拿”过来的词语,特别是现代出现的事物,几乎都都是直接拿来。在生活中,菜店里的进口蔬菜,甜品店里的点心,医院开出的处方药,到处都充斥着英文词汇。我的很多英文词汇,还是在学习日语的过程中补充的。
2014年跳槽到美国公司之后,办公室里的官方语言是英文,于是开启了不得不说英语的模式。刚开始到组里的时候说英语还是用的脑内翻译汉语的思路,在脑内实时翻译中文的句子,这样说出来的英语口语是结结巴巴的,而且经常有中文概念不知道如何表达,只能采用定语从句(Which is blablabla...)来描述,有时候需要半天才能把自己的想法解释清楚。好在同事比较nice,不会因为我的英语说的不流畅就拒绝交流,他们会尝试理解我的意思之后用正确的表达方式重复一遍,求证是否是我要表达的意思,于是我就会去一点点的模仿别人的英语,如果同事的表达我觉的比较简明易懂,下次我在同样的场景就会和他说一样的句子。渐渐的,我的脑子中不会再出现中文再翻译英语的过程,而是有什么想法就直接蹦出来对应的英语语句。拿算法来对比的话,就是在脑海里已经维护了一个自己的意图(Intent)到英语语句框架(Fragment)的map,使用O(1)的复杂度就可以将这个框架提取出来并填词。
直到现在,我也不敢说自己的英语能力有多好,我可以看懂英文资料,可以正常的用英文和同事交流,但我会经常单复数不分,会用错单词,也会犯低级的语法错误。但是我不会觉得在一堆老外中插不上话,可以很自信的去和他们交流自己的观点。
我的经历可能对大家没有太多的参考价值,毕竟有全英文的工作环境是一个很大的助力,下面我想分享一下我自认为的即使在没有英文环境的情况下也可以提高自身英文能力的方法。
我们将英语能力分为听说读写四方面,如果一般不在外企工作的话可能听和说的能力不太长用到,那么我们就谈谈读和写的能力。
读英语的能力
程序员在读英文文档中的最大的问题是专业词汇的问题。说道专业词汇,不得不说中国在本土化上做的比较好,国内计算机专业的课本几乎可以做到0英文。所有英语的概念,都有对应的中文概念翻译。这在翻译层次上来说是一个进步,至少不会像日本那样在本国的语言中引入大量的外来词汇,但是带来的问题就是大家对于计算机领域中的概念所对应的英文完全不敏感。
所以我的建议是,在接触一种新的技术、框架的时候,先不要搜索《XXX入门宝典》,《学习XXX看这一篇就够了》这样的总结性文章,而是先去项目的官方网站/Github主页看看对应的文档。读文档学英语的好处是你不是为了学而学,是确实在工作上有需要去学习,这样降低了学习的成本。
一开始读英文文档确实会比较头蒙,但好在现在的翻译软件比较发达,屏幕取词,划词翻译等这些方便的功能可以很便利的提供所选词汇的意思。一般一种技术的文档,读过几篇之后就基本上没有什么障碍了,因为最核心的概念词语就那么几个,看完几篇之后就可以融汇贯通了。其实计算机专业的词汇真的不算特别多,读完几个项目的文档之后你会发现共通的词汇越来越多,读起来也越来越轻松。
对于刚开始看英文文档的程序员,个人建议一开始可以从比较小的项目看起,比如用到的某个linux命令的用法,某个小开源插件的用法,等到读文档的能力提升了,再去看看大型项目的文档。读文档不是为了读而读,结合工作上的需要,能够引起自己读的动力最好。
写英语的能力
作为程序员,我们平常的工作中少不了也写代码,在写代码的过程中,实际上我们也不可避免的要书写英文。程序员虽然不一定需要达到能够写大篇的英文议论文的程度,但是拥有能够使用英语正确的向其他程序员表达自己思想的能力还是很重要的。具体一点来说,有以下几点值得我们去锻炼。
代码中的变量,函数,类的名字是否清晰易懂,翻译是否做到“信达雅”。在国内的程序员有时限于自己的英语词汇量,使用拼音来取名,有时看的会觉得莞尔一笑。有时程序员做到了英文命名但是用的词却不得当,比如之前有个虾米程序员在代码中歧视活动VIP用户的例子,就是一个活生生的英语没有做到“信达雅”的反面教材。做活动送的VIP用户可以翻译成EventVIP或者是PromotionVIP、CampaignVIP,Event是字面的活动意思,但是这里的VIP是指代在促销(Promotion)活动中免费送出的VIP,所以从语义上说更加贴近Promotion,而在国外这类促销活动俗称为Campaign,所以个人觉得最好的翻译应该是CampaignVIP。其实取名方法并不难,开源的代码很多,开源代码中和自己项目有类似的概念的地方,都可以借鉴过来。
代码中的注释是否语句通顺。一开始写代码注释时不可避免的会写一些语法上比较幼稚的语句,错词、单复数不分、时态错误甚至病句的情况也并不少见。如何改善这样的情况呢?我个人有几点体会:
a. 照葫芦画瓢法。如果该项目中的其他代码已经有比较好的风格的注释,可以把别人写的句子抄过来,再将意思稍微改动一下。
b.搜索引擎纠错法。在不得不自己“原创”注释的时候,如果自己没有十分的把握,觉的句子写的不是很地道,那么不妨把自己写下来的草稿拿去原味Google一番,一般这样你会在网上搜到意思相近的句子。这样的方法特别适合纠正一些副词使用的错误,比如in,on,at等等。
为项目写Readme。Reame就是一个项目的门面,写好Readme的话会为项目的专业性增色不少,尤其是有项目有开源需求的时候。这里我建议可以去借鉴一下其他开源项目的Readme。Readme其实也是有“八股”的,参照别人的Readme形式为自己项目的Readme打好结构稿,然后逐条替换。长久之后可以形成自己的风格,写起来就越来越顺手。
总结起来,我自己总结程序员学好英语的两个关键就是多读英文文档和模仿别人的英语,这和我们学习编程的方法其实是差不多的——读代码和模仿代码。而且很多学编程的学弟学妹经常问我是不是要英语好才能学编程?所以说呢,学编程并不是一定要你有好的英语底子,你想学编程,你多写代码多读代码,自然而然就可以慢慢提升你的英语能力了!
,其实作为一个开发者或者编程学习者,有一个学习的氛围跟一个交流圈子特别重要!我自己也是一名从事了多年开发的C/C 程序员,组建了一个编程交流群八六八,零一七,一五七,如果有兴趣的同学可以关注加群哦!不管你是大牛还是小白,大家都一起成长进步。群内还会不定期分享学习资源,欢迎各位有兴趣的小伙伴哦。