京东
面试关键词
项目,架构,负载均衡,C++深入,UNIX网络(深入)
淘米网面试内容
基础知识(概念性):进程通信的方式,vector的插入删除时间复杂度,TCP/IP的四次分手,还有针对笔试卷提问。
软件工程知识点,C++的知识点,c/c++的区别、进程、线程?
技术问题,C语言的。
算法的时间复杂度。前一晚笔试的题目。
数据库方面知识,nosql的知识,mysql原理,引擎?
简单的多线程程序和简单的linux编程。简单的两个线程同步,线程和进程的区别等。
网络基础的问题,操作系统的问题。
数据结构?
每个面试官都会拿着应聘者的笔试卷子和上个面试官的面试记录提问。
淘米我投的是AS,也是问了一些算法,比如说怎样判断一个数字是否是2的n次幂,怎样判断一个链表是否是有环的,怎么寻找树中两个节点的最近公共父节点,怎样去寻找一个链表的中间节点。
一面针对笔试题问问题,主要包括数据库、数据结构,现场编程,勉强通过;二面在对这个岗位的认识和要求上挂掉了。 印象最深的问题:单链表旋转?
前两面都是技术面,一面上来就问我证明勾股定理,
然后问了我一些算法,问我map是怎么实现的,貌似对C++特别感兴趣,
一直在问我C++
二面就问一些项目,问我大学看了什么书,什么什么的,不难。
结果三面就被刷了。我也不知道为什么。
腾讯
自我介绍,项目介绍,这两个是必须的,在介绍项目的时候,面试官会深入问问题,会对某些细节,例如数据机构,算法复杂度,数据库连接问一些问题。随后是专业面试,题目都是相当经典的题目,大致有:进程与线程;Unix和windows进程间通信的主要方式和系统调用;叙述TCP/UDP协议,他们的应用,TCP的三次握手,滑动窗口,超时重传;HTTP协议和COOKIE机制和一些COOKIE的问题(这个我不会);让你设计一个PDA上的通信簿,你会用树还是哈希,从这个问题会引申出hash,平衡数,红黑数的一系列问题;面向对象的多态是什么,设计一个多态的例子;C++的虚函数实现机制。问题不难,
在进行技术面的时候,一个最重要的问题就是,你要清楚的知道自己的强项,自己的特长,尽可能的把面试官朝你的方向引。我的特长是应用软件开发和面向对象建模,所以我每次自我介绍总要强调自己的软工很好,软件开发流程很熟,这样和很多面试官在软件开发流程方面就有很多问题可以探讨。你一定要展现出你的技术专业性(你是技术类的)和你对公司,职位的热情。
进程和线程,TCP/UDP,排序算法(让我给他完整的说了一遍我所知道的排序算法和他们的时间复杂度),Windows的内存寻址方式,Socket中阻塞模式干什么用的,你所认为的软件开发模式和你对你所做项目的一些评价。最后是那个程序题,写代码,个题非常重要,如果做不出来或者做错了,那就估计没戏了。题目是给定一个字符串,例如 abc123de4f67,把里面所有的数字字串找出来,并且存贮起来,例如你要把123,4,67找出来,放到3个char型数组里。这个题目很经典了,相信很多人都知道。
对技术类公司的一些总结:基础全面,重点突出,专业对口,满足这三点,就绝对可以找到一个不错的技术类职位。如果你能对你所要从事的行业有清醒的认识(主要公司,目前格局,发展趋势),那你将在求职中无往不胜
关于面试-–—耗子
我想,让面试者解决一个难题的真正思路是:
- 看看他对知识的应用和理解。比如,他是否会用一些基础的数据结构和算法来解决算法题?
- 看看他的整个解题思路和想法。答案是次要的,他的想法和行为才是重要的。
- 看看他是如何和你讨论交流的。把面试者当成你未来的同事,当成你的工作伙伴,一起解题,一起讨论,这样可以看看大家是否可以在一起工作。
其他
这些方面才是考查应聘者的能力(思路,方法、态度,性格等),并顺带着考查面试者的经验和知识。下面是一些面试的点:
- 应聘者在解算法题时会不会分解或简化这个难题。这是分析能力。
- 应聘者在解算法题时会不会使用一些基础知识,如数据结构和基础算法。这是知识。
- 应聘者在解题时和你讨论的过程中你有没有感到应聘者的专研精神和良好的沟通。
- 应聘者在对待这个算法题的心态和态度。如,面试面是否有畏难情绪。
- 应聘者在解题时的思路和方法是否得当,是否是比较科学的方法?
- 等等。
在解难题的过程中考查应聘者的能力才是最终目的,而不是为难应聘者,不然,你只是一个傲慢而无知的面试官。
模拟实际中的挑战和能力
作为面试官的你,你应该多想想你的工作,以及你的成长经历。这会对你的面试很有帮助。你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么?你的成长经历是什么?你是怎么获得知识和能力的?你喜欢和什么样的人工作?相信你不难会发现你工作中的实际情况和面试的情况完全是两码事,那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢?
所以,最为理想的面试是一起工作一段时间。当然,这个在招聘过程中,操作起来几乎不可能,因此,这就要求我们的面试官尽可能地把面试的过程模拟成平时工作的过程。大家一些讨论来解决一个难题,和应聘者一起回顾一下他已经做过的事情,并在回础的过程中相互讨论相互学习。下面举一个例子。
我们知道,对于软件开发来说,开发软件不难,难是的下面是这些挑战:
- 软件的维护成本远远大于软件的开发成本。
- 软件的质量变得越来越重要,所以,测试工作也变得越来越重要。
- 软件的需求总是在变的,软件的需求总是一点一点往上加的。
- 程序中大量的代码都是在处理一些错误的或是不正常的流程。
所以,当我们在考查应聘者的代码能力时候,我们为什么不能模拟这样的过程呢?比如,让应聘者实现一个atoi()的函数,实现起来应该很简单,然后不断地往上加新的需求或新的案例,比如:处理符号,处理非数字的字母的情况,处理有空格的情况,处理十六进制,处理二进制,处理“逗号”,等等,我们要看应聘者是怎么修改他的代码的,怎么写测试案例的,怎么重构的,随着要处理的东西越来越多,他的代码是否还是那么易读和清晰。如果只是考查编码能力,一个小时,就问这一个问题,足矣。真正的程序员每天都在和这样的事打交道的。
如果要考查应聘者的设计能力,同样可以如法泡制。不断地加新的功能,新的需求。看看面试者的思路,想法,分析的方法,和你的讨论是否流畅,说没说在点上,思想清不清晰,会应用什么样的知识,他在设计这个系统时的经验是会是什么样的,面对不断的修改和越来越复杂的需求,他的设计是否还是那么好?
当然,因为时间比较短,所以,你不能出太复杂的问题,这需要你精心设计一些精制的有代表性的问题。
比如我一个朋友在回答什么是异步的问题时,举例说明了异步调用就是不能处理完就返回,并且需要传递一个回调函数给调用方以便完成后回调通知结果。这样的回答并没有错,但是这并不符合面试官心里想要的答案,面试官对此并不满意,进而认为我这个朋友还需要去多读读书。
参考资料
[1] 程序员软件开发 面试常见问题 http://blog.163.com/wenxianliang08@126/blog/static/83583263201132401541805/