显示标签为“communication”的博文。显示所有博文
显示标签为“communication”的博文。显示所有博文

2013年9月22日星期日

赴美工作常识(Part 4 - 面试)

最近跟同事讨论面试的事情比较多,所以就综合大家所说的列举几条面试建议吧。这些建议是针对中国候选人应聘美国职位而写的,但适用范围可能更广。假若你实际的实力是 X,面试官感知到你的实力是 Y,这些建议既不能让你实力暴增(X++),也不能让你展现超乎实际的实力(Y > X),只能帮助你避免由于沟通问题而造成的实力不被发现(Y < X)。

当做讨论而非考试

尽管面试有个「试」字,但在真正好的技术面试其实不是一问一答的考试,更多是如同同事之间的技术讨论一样,从比较糟糕的解决方案开始做优化,直到做到大家都可以接受的程度为之。这个观点在《理想的技术面试过程》中也提到过,在这里就说一下具体应该怎么做。

首先你要自信,不能觉得面试是公司对你的单向选择,其实是同时包括你对公司的双向选择。有些心理学上的技巧可以让你显得自信一点的,例如说在公司大堂等待的时候尝试深呼吸和伸展一下四肢。由于人的心理状态和身体语言是互相加强的,所以如果你使用自信的身体语言,你就会无意识地被「误导」以为自己确实自信,不过这正是你想要的效果。(如果你想更多的了解什么身体语言表示自信,可以去找本身体语言方面的书来看。)

然后你不要高估题目的难度。有些人可能被 Google 中国的某些面试官虐待过,觉得越是好的公司题目自然越难,但这其实是中国应试体系的思维方式而已,题目难度不是筛选出少数人的唯一手段。就好像同事问你问题一样,问及的事情有可能是你完全没做过的,你就凭借常识来提供一些基本的判断;也有可能是你深入研究过的领域,你可以说出很多细节和难以遇见的问题。面对后面一种情况,假设你说的都是对的,面试官会很开心;面对前面一种情况,面试官会让你说出更多细节,或者问你哪里还能继续优化,这时候你就知道你的答案和已知最优答案还有差距了。(有些 Google 面试官会在你给出该问题业界已知最优解后仍然问你能不能继续优化。)所以千万不要一开始就假设题目很难,觉得给出一个没有优化过的答案很丢脸。

英语说慢一点

很多时候人一紧张起来,说话就会越说越快,在有点口音的情况下只会让对方越来越难听懂。在对自己技术自信的基础上,同时也需要对自己的英语表达能力自信。其实语法或者词汇有点问题,说话有口音,这些影响都不大,只要对方能够听到关键词汇,意思还是能明白的。有时候可能双方都要多说几次「excuse me」和「what is it」才能问明白对方的意思,但只要最后问题能讨论清楚,那你至少还是让面试官了解到了你的真实实力。

代码要易读易改

这个问题来源自某人的一句评论:

有 ACM 背景的人往往在面试过程中都很不介意写全局变量,但我更期望这个问题的解决方案就是一个函数,所以实现细节都在内部解决。

其实「全局变量」不是重点,代码的易读性和可维护性才是重点,而这往往是 ACM 或个人项目所缺乏的训练,这种问题尤其容易出现在编码能力很强但很少跟人合作的人身上。

对于 ACM 而言,只要程序能运行代码怎么写都没所谓,反正代码的生命周期也就是几个小时,无论是否通过几个小时后你就不会再去阅读或者修改这段代码了。这种训练使得写 hacky 代码缺少惩罚。但在实际工作当中,任何 hacky 的代码都会引入新的 technical debt,最终肯定是你以及你的同事承担。你写下的第一个版本,可能要在代码库中停留几年才有人完全推倒重写,这几年内不停地有人在上面做修改,你需要保证在这个过程当中大家都还能明白这段代码是干什么的。

如果你把面试官看做同事,那么你写的代码自然是要经过他 code review 的。不要为了追求高性能而写出很难读的代码来,面试官读不懂就判断不了代码的正确性,性能再好也没有用。你宁可先写下来最清晰可读的版本,如果面试官说需要优化性能时再做优化。

其它参考资料

我暂时能想到的就这么多了。此外推荐 David Wei 的《面试硅谷创业公司:请把面试官当成你的同事》。

2013年8月3日星期六

赴美工作常识(Part 3 - 英语)

在《Part 2 - 申请》的评论中有人问英语要达到何种水平,以及如何提高。其实英语也不是我的强项,只是刚刚好做到能够沟通而已。由于我在知乎上回到过一个类似问题,我就基于那个答案简单说一下吧。

Aa

首先,你要能脱离中文和翻译,纯粹地使用英语来思考。很多英语单词短语是没有对应中文翻译的,就如同很多中文字词是没有对应英文翻译一样,然而这不妨碍你在使用中文时使用这些字词传达意思。同理,很多英文单词短语你不须要知道他们对应的中文翻译,只要你能够使用它们传达意思就行了。有时候你只需要感知一个词汇所传达的形象或者是感觉就可以了,你甚至不需要能够解释清楚它是什么意思。例如说,中文里面常见的「屌丝」和「hold 住」,让你解释或许你也无法用简单语言解释清楚,但这不妨碍你使用它们传达信息。

接着,你需要把你小学时候学习语文的过程重复一遍……没错,这是最痛苦的阶段,也是最多人坚持不下去的阶段。很多人认为自己已经完成那个人生阶段了,成年后再学习新知识就应该使用更「聪明」的方法,提高效率减少痛苦。其实这种「聪明」的方法是不存在的,有时候已有经验还会拖你后退。如果你在学会游蛙泳几年后再学游自由泳,你就明白我说什么了。我在蛙泳能轻松游 1000 米的时候,学习自由泳还是从挣扎着游完 25 米开始的,然后把目标提升到 50 米、100 米、150 米、200 米……花了几年时间才能轻松游 1000 米。

在我自由泳游不动的时候,或者是在我觉得自由泳会被鄙视的时候,我就会放弃然后改游蛙泳,这就是拖后腿的地方。同理,在你可以轻易放弃使用英语的时候,其实你的英语学习效率会比你的小学语文学习效率更低,因此你应该预期更大的投入和更长的时间才能达到同样的效果。如果你预期「聪明」的方法可以减少投入或者缩短时间,那么你一定会失望,然后你就会拒绝和放弃。给自己设置正确的期望是很重要的第一步。

Bb

在进行听说读写的训练之前,你还需要有一定的单词量。词汇量就如同一个训练效率基数,并不是说词汇量少就完全不能进行听说读写的训练,而是训练效率低而已,因为你需要同时面对训练内容和不懂的单词。

话说你小学和中学总共用烂了多少本新华字典?显然你也必须在英文字典上花费同样的功夫吧。因为中文翻译没有用,所以一本英英字典就足够了。我中学时候用的是 Collins Cobuild,版本貌似是 Learner’s Dictionary,重点在于例句足够多。因为我说过了,理解一个单词精确的意思并不重要,重要的是知道怎么用它。阅读足够多的例句可以让你感受到这个单词在不同的上下文下表达什么意思,之后你再看到这个单词就可以通过类比例句来理解它的意思,当你想表达跟例句相似的意思是也可能用这个单词。

Cc

在有了一定的单词量之后,就可以练习听说读写了。因为这是写给对美国科技类职位感兴趣的人看的文章,所以我所选择的方法都是跟工作领域相关的。

:可以从听 podcast 开始,因为免费的同时又不妨碍你做其它事情,成本极低。如果你使用 Mac 或者 iOS 的话,直接使用 iTunes 订阅就可以了。科技类的 podcast 相当得多,而且也相当地专业,因为科技领域的节目是最先尝试通过 podcast 传播的。我从大学开始听的 TWiT (This Week in Tech) 已经由当年的一个节目发展到现在二十多个节目的网络。如果你愿意花钱,则可以考虑直接去 Audible 买书来听,使用 TWiT 的优惠码 可以先免费获得两本书,然后每个月 $23 两本书。

:这估计是一个人最难自己训练的。你可以找找自己身边有没有 Toastmasters 的活动,有些大公司(尤其是外企)会有自己的 Toastmasters 组织,否则找自己所在城市的组织也可以。如果你已经在外企工作,可以考虑加入一个跨国合作项目,每天工作进度会议必然要用英语来进行,这足以强迫你每天使用英语思考然后表达,就算只是十分钟的会议。

:现在上 Amazon 买 Kindle 电子书已经如此方便,使用 iOS Newsstand 订阅电子杂志如此方便,我觉得这已经成为了最容易训练的项目。我一般会在 Kindle 上买一些畅销书来看,这是由于畅销书之所以畅销是因为写得足够吸引的同时保证易读性,这能在一定程度上降低阅读产生的疲劳。如果你喜欢看小说的话,畅销小说应该是易读性最高的,因为你甚至不用去思考,只要一直追剧情就可以了。

:上 Stack OverflowQuora 回答问题是很好的方法。相对于宽松的命题作文而言,回答问题的目标跟明确,要么你能回答要么你不能回答。你不能回答的就直接跳过,你可以回答的就应该尝试把你的思路解释清楚。因为你不是漫无目的地写一些你并非真正在乎的题目,所以你不用太过刻意去准备回答所需要的素材,你只需要把注意力集中在表达上就可以了。

Zz

最后回到开头的问题上来,就是要达到怎样的水平才算是足够。我觉得能够沟通就足够了,意思是你的自然语言表述能力不能比编程语言的差,凡是你能写出来的代码你都能用简单的语言说清楚。有可能你的思路绕了一个大圈才找到了结果,这就如同一个改完又改的程序,但别人其实只需要看到你最后重构过的版本。所以无论你想得有多复杂,在使用自然语言表达出来时最好是一个简单清晰的版本。如果你暂时做不到,就需要培养 awareness,知道自己哪方面做得还不够好,然后不断再练习中刻意调整。