毕业之后的创业阶段算是告一段落了, 没有得到任何物质上的汇报, 但是经验教训得到了不少. 公司解散之后得到了两个面试机会,一个是创业公司的,另外一个是ThoughtWorks的. 第一个创业公司的面试是公司原来的老板推荐的, 这个创业公司的创始人都比较牛x, 面试过程也非常的诡异, 面试结果被pass掉了. 第二个面试机会是朋友的推荐ThoughtWorks的面试机会, 这个面试拿到了offer. 第一个面试机会没有怎么准备, 而且后续公司面试过程中的印象也不佳,所以没有什么好总结的. 第二个TW的面试机会, 一方面不能给朋友抹黑, 另一方面scala圈子里几个人都在TW, 所以一直印象还ok. 索性花了三天的时间稍微准备了一下. 下面记录一下我是如何准备TW的面试的.
TW的面试流程基本上是这样的: 电话面试 --> 笔试题[编程题目] --> 面试[logic test + code review + 技术面试 + 公司文化交流] --> 等待宣判. 整个流程从面试开始(2014年9月17号)到拿到offer(2014年9月28号)一共经历了10天左右的时间. 之前在网上看到过关于TW的风声:. 看到这个帖子之后心里不免有一些发憷. 不过既来之则安之, 好好准备一下吧. 不论面试结果怎么样, 至少经历了这个面试咱也是经历过了最难的面试, 也算是"没有吃过猪肉,也见过猪跑" 的人了. 反正面试就这样紧锣密鼓的开始了.
我是9月17号下午接到的电话面试, 电面的hr姐姐声音甜美, 接到电话后感觉陌生感消失了一大截. 电话面试大概经历了40来分钟左右, 内容也是老生常谈的内容: 自我介绍, 工作经历, 职业规划等等.这应该是比较大的三个主题. 其中hr姐姐中途会展开对每个话题进行一些详细的讨论. 比较具体和详细的问题都已经忘却, 但是这个环节整体是比较轻松的, 有啥说啥就行了, 不需要任何准备. 但是前提是自己说的话是要负责人的, 言外之意不能说假话, 要如实的描述自己的经历. 这个环节完成之后一般会拿到编程题目, 编程题目是三道题你自己选择一个自己想做的就行了, 三天之内提交上去.编程题目的具体内容是不能透漏的, 总的来说都不是什么特别刁端的题目, 如果有过一些编程经验都可以完成.
我在编程环节有点小题大做了, 三天的时间我是这样分配的: 第一天全力的思考这个题, 揣测考官的出题意图, 琢磨题里边的陷阱, 思考应对方案; 第二天设计实现方式+编码, 总的来说能拿来装逼的就用一下; 第三天测试+设计文档. 提前透漏一下这个题目是下一个环节code review的素材. 当我经历到了code review环节我才发现, 之前基本上所有的concern都是不必要的, 整个题目过度设计. 所以, 拿到这个目, 只需要把它当成平时你见到的一个日常问题就好了, 最自然的实现方式才是最优的实现方式.
接下来的面试环节才是重头戏,也是我准备比较充分的一个环节. 这个环节的面试思考过程比较有意思, 分享一下. 总的来说就是: 知己知彼. 搞清楚自己的能力, 然后站在对方的角度去像一些合理的问题.
提纲
* 首先第一个环节: Logic Test. 因为之前有两个朋友到TW面试过, 所以可以大概问一下这个环节的测试大概是什么样子的. (注: 不是咨询考试题的内容, 而是交流一下考试的过程. 在做logic test之前是要签署保密协议的.)
* Code Review 这个环节需要自由发挥的空间比较大. 不过基础是清楚的表达自己的设计思路, 意图.
* 技能面试 完全不可测. 需要做的是: 回顾简历中自己所列举的技能list, 把每个点说清楚.
* 企业文化交流 完全不可测. 需要做的是: 认真的听对方说话.
* 自我介绍 [必不可少] 你好,我叫XX,XX大学2012届毕业生。毕业后呆过两家创业公司,XX和YY。2012年4月-2013年7月,在XX担任开发工程师,主要做java web相关的一些开发工作;2013年7月-2014年9月,在YY担任技术负责人,主要工作是搭建IM工具的后端服务,团队管理,开发流程管理等工作。这两年的收获:接触一些新技术:scala相关的、node.js;了解到一些nosql技术(mongodb,dynamodb),分布式系统,软件架构,以及敏捷管理。通过我对tw,twer的了解,我可以感觉到三个品质:思考,践行,改变。我很看重这些品质。很幸运有这次面试的机会。
我可能会被问到的一些问题: 1. 怎么理解敏捷? 我认为敏捷要做的事情就是:优化流程和应对变化。优化流程主要解决沟通问题,时间管理问题。之前在我经常遇到开发出来的功能和需求不一致;一个功能承诺一个礼拜搞定,拖拖拉拉几个礼拜也不能交付。敏捷流程里不论是提出需求的方式,还是各种会议首先都要确保每个人员对需求理解是一致的;对于任务的拆分做到足够细粒度,保证时间可控。对于应对变化这块我目前没有什么太多的想法。
2. 软件架构的经验?怎么理解软件架构?他具体的工作是什么?你会怎么做? 软件架构=业务建模+技术解决方案。首先一个软件的出现一定是旨在解决用户某种需求,所以首先弄清用户的需求,然后构思统一、规范的解决问题的流程,这是业务建模阶段。 对于技术解决方案则是如何用技术更好的支持这种业务模型。
3. 分布式系统中常见的问题?如何设计分布式系统? 刚刚接触,理解不深。下边是我的理解:分布式系统就是对CAP三个指标做的一个这种考虑。 分布式系统还要尽可能做到状态无关,状态相关以为着和某一台server的绑定
4. scala和node.js怎么样? 面向对象,同时scala提供了trait方便实现mixin。 函数式编程让语法富有表达力 方便的调用一些java生态圈里边的库。 提供了akka这样的构建高并发系统的类库。
对于nodejs的特性我想可能有两个:事件驱动+无阻塞IO。nodejs本身是单进程单线程的,通过事件驱动的方式实现异步编程,即单线程高效率地维护事件循环队列来实现。异步io机制则采用os层的异步io机制。做法就是向内核发送io请求,然后即可执行后续任务,当内核io操作完毕后通过信号或者回调将数据返回应用程序。
5. 怎么看待NoSQL这个技术? NoSQL本身是专门用来存储数据的分布式系统,对比传统的关系型数据库:没有事务,没有Schema,高性能读写,集群能力。所以如果用nosql产品就意味着事务控制,scheme组合更多的放到应用系统中去控制。对于业务单一,事务要求较低的场景,可以选择尝试。 |
大概准备的就是这样的一张list, 整场面试下来准备的80%都是有用的. 自己发挥的空间也是蛮大的, 应该可以占到40%, 所以面试中心态也是非常重要的.
我是9月26号去tw公司面试, 拿到offer是28号, 那会我还在香山玩儿. 接到电话hr首先会总结一下你整场面试的表现, 那些地方表现比较好, 那些地方不是太好, 需要提升的. 还是蛮负责的, 因为不论面试结果如何, 对于一个面试者来说通过面试找到自己的长处和不足才是最重要的.