年前朋友问我,要不要试试 ThoughtWorks 澳洲线的岗位。对于这家号称“世界上面试最难”的公司,多少还是有一点畏惧,直到朋友安慰我说,它们这次有中级的岗位,还是可以试一试的,梦想还是要有的,万一实现了呢?自此,我凑齐了西安. NET圈子里的四大“天花板”公司的面试:葡萄城活跃网络奥博杰天ThoughtWorks ,而对于我来说,亦有幸见识到世界上最难的面试,虽然后来事实证明,这个世界上没有太多的逆袭,可我还是想分享一下我的这次面试经历,因为它让我知道,在过去的两年里,我在哪些方面取得进步,在哪些方面存在不足。当我写下这篇博客的时候,我即将在今年夏天迎来我的29岁,果然我还是希望自己能再努力一点,因为不想让平行世界里的某个人失望。

面试流程

关于ThoughtWorks 的社招流程,大体上由HomeWorkPair ProgrammingFace-to-face Interviews 3个部分组成,其中,HomeWork,即家庭作业,原则上给3天时间来完成,不过据说可以向 HR 申请更多的时间来完成。Pair ProgrammingFace-to-face Interviews 通常是安排到同一天来进行的,前者时间为1.5小时,即传说中的结对编程,面试时会有一左一右两名面试官看着你现场写代码。后者时间为1小时,即传说中的技术文化面试,考察技术的深度、广度以及对 Thought Works 敏捷文化的认同感。

HomeWork

2月18日,下班以后接到HR小姐姐的电话,在明确了我投简历的意向以后,我收到了HR小姐姐的邮件,基本上就是一个家庭作业,三选一提交,需要在三天内完成。我选择了Conference Track Management 这道题目,因为白天要上班,所以,我为此而连续肝了三个晚上。

坦白说,不同的阶段对这道题目的理解是不同的,在做家庭作业的阶段,你以为这道题考察的是职责分离和设计模式;而等到结对编程的阶段,你终于意识到,这其实是个背包问题。当然,这并不是说我会错了意,考虑到面试官有上帝视角,他们更容易看清楚问题的全貌。或许,面试官想最想看到的,恰恰就是你从冰山一角到目窥全牛这一瞬间的反应。

当我接到HR小姐姐的通知,这份作业Review通过时,我内心是非常激动的,因为这意味着我获得了去ThoughtWorks面试的“入场券”。可当我事后再以上帝视角去看待这个题目,我内心又变得非常难过,因为无论怎么看这份作业,都会觉得它设计得并不好,尤其是当它引入弹性时间这个因素以后,我一直深陷于如何从Part 1 到 Part 2,是不是按 Part 2 重新设计会更好一点?此时此刻,终于能理解面试官反馈的,关于扩展性方面的问题。

作业反馈01
作业反馈01
作业反馈02
作业反馈02
作业反馈03
作业反馈03

关于这部分,我个人建议多多关注:

  • 编程风格:编码规范、项目结构、代码坏味道等。
  • 语言特性:澳洲线岗位需要熟悉 .NET Core,所以,我使用 .NET Core 完成整个项目的编写。
  • 设计模式:选择合适的设计模式,遵循 SOLID 原则。
  • TDD:一定要有单元测试代码,这一点TW最为看中。如果写的好,一定是加分项。建议遵循AAA原则来编写用例。
  • 程序满足要求:程序一定满足题目要求,可执行,运行结果满足题意,这是最基本的要求。

Pair Programming

提交作业后,等了一周多的时间,1月29日,HR 小姐姐终于联系我了,正如我上文所述,当时听到这个消息非常激动,因为终于有机会去 ThoughtWorks 这家世界上面试最难的公司去看看,ThoughtWorks 西安办公室位于环普产业园,这个地方相信大家都非常熟悉啦!当时算上周末,我给了自己 5 天时间去准备面试,因为我觉得面对 ThoughtWorks 的面试还是要重视一点,虽然后来好多问题都没有被问到。

结对编程是基本上就是,两个面试官一左一右地坐在你旁边,采用聊天和探讨的方式一起写代码,刚开始本来是用电视投屏“直播”的方式,后来因为 HDMI 接口接触不良的缘故,两位面试官干脆就直接看我电脑屏幕啦!在这个环节,个人感觉解释编码思路花时间太多,重构完有一个用例没有通过。最重要的是,家庭作业阶段的设计不利于现场新需求的开展,所以,这些因素综合起来,导致我结对变成这个部分表现得不好,希望大家引以为戒啊。

整个结对编程时长为一个半小时(1.5h),在这段时间,你需要讲解编码思路完成代码重构完成现场作业,时间上还是非常紧凑的,回想起那天下午的两个半小时,有种像参加高考的感觉:你以为时间会很长,结果发现时间完全不够用。看起来轻松的氛围下,其实在不经意间考察你的沟通能力、工程能力和学习能力,ThoughtWorks 的面试,往往就是这样的朴实无华且“有趣”……

对于这部分,我个人建议多多关注:

  • 工程能力:语言特性、调试能力、设计能力等。像TW非常重视快捷键的使用,频繁使用鼠标会拉低印象分。
  • 沟通能力:善于倾听和表达、以及理解需求的能力,需要你在面试官的引导下完成需求确认,这个阶段一样可以展示你技术的深/广度,但建议最好长话短说。
  • 学习能力:要求你对TDD、敏捷开发等有一定的好奇心,面试官教给你的新东西/思路,能否举一反三、学以致用,我是在重构的过程中得到了面试官的指导,对此我表示感谢。
  • 适应能力:能否以开放的态度接受面试官的重构意见,当意见不一致时,能否有理有据地、自信地表达你的观点,我遇到的问题是,面试官认为我混淆了职责分离和组件依赖。

Face-to-face Interviews

结对编程环节结束以后,正当我还在关注那个失败用例的时候,两位新的面试官就走了进来,就这样,我迎来了那天下午的“技术文化面试”,考虑到天气的原因,我那天穿了一件鬼灭之刃的卫衣就去参加面试了,可那个小房间的闷热还是让人焦躁不安,一杯放凉的白开水,完全不足以缓解那种闷热的感觉。ThoughtWorks 的办公室和大多数外包公司的办公室没有什么区别,不同的是,它的办公室摆满了各种 O’Reilly 的动物书,至少在氛围上确实像它对外所展示的那样重视技术。

在这个环节,我遇到了很多的开放型问题,譬如你经历过的、印象最深刻的项目是什么你在项目中遇到问题以后都是怎么样去解决的你所在项目的人员配置、研发流程是什么样的……等等,虽然一开始还是经典的“自我介绍”,可我感觉我在回答这些开放型问题的时候,缺乏一种系统性思考或者某种方法论,它和回答技术问题不同,有时候我们需要层层展开、关注细节,可是在这样的问题上,它需要的是简洁而准确的答案。面试期间,面试官不止一次提示我听清楚她的问题,难道真的是我的沟通能力出了问题吗?

坦白来讲,这次我准备的很多面试题都没有被问到,我以为至少会问一下.NET Core、微服务 和 DDD 这些东西的。我同样不太明白的,是关于项目经历方面的,为什么面试官会认为,工作中主要负责的内容就是由我一个人单打独斗来的呢?我承认我这几年,性格上收敛了许多,没有了攻击性和对抗性,变成了一个非常随和的人,可我本质上并不是一个喜欢兜售或者推销的人,我并不觉得无法口若悬河是缺乏自信的表现。后来,面试官就考察了一下我的口语,本来就是口干舌燥,说到为什么选择 ThoughtWorks 的时候,大脑有一点卡壳,一边在组织中文,一边在想怎么翻译成英文,还有什么比结结巴巴地说完一段英语更让人难过的呢?

对于这个部分,我个人建议多多关注:

  • 系统思考:结合工作经验,不断去提炼类似架构方向、敏捷开发、项目管理方面的内容,不要永远局限在一个点上看待问题,不管是表达还是编程,都采用系统性、结构化的思路来梳理,要做到清晰、准确、完整。
  • 自信:ThoughtWorks 是一家咨询服务公司,所以,很多研发都是顶着咨询师的头衔,个人觉得还是自信一点,会就是会,正常交流,不会的话,就虚心接受,表现出后期愿意去学习的状态。
  • 协作能力:能否影响和带动团队中的人一起学习、成长,ThoughtWorks 盛行学习和分享的文化,你一定听说过它们的技术雷达、洞见。
  • 沟通能力:这体现在你能否和客户正常地沟通、能否和团队成员达成有效的协作,虽然程序员都不大喜欢说话,但你至少应该能传达出正确的声音、能理解来自别人的观点。
  • 动机:对 ThoughtWorks 的意愿性/认同度,为什么会考虑 ThoughtWorks 等这些问题。

面试心得

其实,当天面试一结束,我就知道这次面试大概率是凉了。回去的路上,我和老大哥说了我面试的过程,老大哥说,“让我冷静,要对自己有信心”。果然,第二天下午,收到HR小姐姐的回复,说面试没有通过,看了下面试官反馈的意见,主要是在结对编程过程中重构做得不好,对重构的意义不太明确;其次是面试官觉得我在沟通方面还不够大胆,希望我可以在发展他人方面做出改变

听到这话,怎么突然就有种传销的感觉呢?说到影响别人,从12年开始写博客至今,我自认为我的博客还是帮助到了很多人,可能面试官一直觉得我在单打独斗吧,都2021年了,早就不是求伯君、雷军这些前辈们单打独斗写软件的时代啦,所以,果然还是我的表达出现了问题吗?我的朋友们经常批评说我沉迷于技术无法自拔,可我同样见过30多岁怕别人问原理的“中年”程序员,原本这个行业因为门槛低而越来越内卷,而这个圈子里的人又不以技术为重,有太多单纯为了钱而进入这个行业的人。可当整个行业都越来越“体力”劳动的时候,有很多浮躁的人跑来你面前说,技术并不重要类似的话,这个世界到底怎么了呢?

我想说什么呢?我认为技术因素和非技术因素都很重要,其实写作一直是我练习表达的一种方式。也许,在那些能言善辩的人眼中,我们这些“闷葫芦”都是些内向的、不太会沟通的人吧!这次面试结束以后,我打算找点系统性思考方面的书来看看,继续背单词增加词汇量,利用空闲时间来练习口语我从来不认为,一个技术人员努力钻研技术有什么不对,因为这是一个技术人员的基本功。沟通能力能做到妙语生花是一种艺术,而我,追求的目标非常简单,即有条理的、清晰的、结构化的表达,我不追求所谓“高情商”的话术,人类时常因为这些模棱两可的字眼而相互误会,因为信息失真,因为信息冗余。当然,此刻我的首要目标是,完成那个家庭作业的重构,因为它写得实在是太糟糕啦!