我也谈面试 附赠一份题目
老赵一出手,又引来无数跟帖。详见 我在面试.NET/C#程序员时会提出的问题
小弟不才,只被面试过,从未面试过别人。所以想从被面试方的角度来谈谈,在我心中理想的面试应该是咋个样的。
前阵子lzprgmr同学,站在面试官的立场上谈了谈他的感受,见 谈谈技术面试。里面写道:
首先,我觉得技术面试是需要讲究技巧的,不是随随便便拉一个技术不错的人就可以,因为面试的过程是双方相互交流的过程,你需要给对方营造一个轻松的气氛,并在不断的提问与回答的过程中,进行“合理的引导”,“适时的追问”与“正确的判断”
我非常赞成他的观点,面试官跟被面试的人无论如何都很难做到绝对的平等, 面试官对题目准备充分,享有话语权,而且接受面试的人很容易也很普遍表现紧张,如果再遇到不太Nice的面试官,很容易搞坏心情,影响发挥。
面试的时候我比较乐意回答些开放式的问题,或者由浅入深的问题套问题的问题。有时候我们可能一上来没完全理解面试官的意图,缺失上下文,一时半会儿答不上来, 如果这样就被一票否决的话,我觉得是有失公允的。如果面试官能够稍加提示,“合理的引导”,说不定就能答上来,说不定还有自己独特的见解。
面试官应该更多地考察对方想法,思路,而不是简单的考察那些 知道/不知道 很容易只有正反答案的问题。
比如:写一个Swap函数,不借助第三方变量。 这个问题太考验技巧了,如果之前看过,自然不难,如果没有接触过想半天也很难答的上来。况且会跟不会都说明不了什么问题,我不清楚这样的问题意义何在。 再说这道题在实际项目中一点意义也没有,我写逻辑简单,性能还不错的代码,也不愿意写羞涩难懂,标榜性能最大化的代码。 有时候这么点性能的提升真的有必要吗?
以上我只是就事论事谈谈对这个问题的看法,如果作为面试题,我觉得无所谓,面试嘛什么都可以谈,不管是纯技术的,还是涉及到实际项目应用的,都可谈。但千万别一棒子打死人,答不上来就觉得对方能力不行。我到更喜欢,一开始答不上,适当给点提示后,对方很快就跟上节奏的人。
我享受如下的面试过程,LinkedList有用过吗?能简单说说跟List有什么区别吗?两者适用的场景是什么?他们各自的优势是什么,性能有什么不同,什么原因造成了性能的区别。。。
先抛出个简单的问题,然后”适时的追问”去挖掘更深层次的问题,最好能问及到对方恰巧未思考过,不熟悉的领域,加适当地提示。我觉得这个过程式相当考验人的,而且良莠应该很容易分辨。
我觉得:程序员的价值,不仅在于他懂得多少个知识点,更多的时候体现在于能不能融会贯通各个知识点,能不能做到举一反三。更重要的是在遇到困难,遇到新情况时所表现出来的特质,是如何思考问题的,能否从过去的经验中得到启发,并进行合理的变通,恰当地解决当下的问题。
最后引用我们CEO的一段话:
Innovation is rarely about the creation of something entirely new; in fact, it's about looking at things from a new perspective, and changing or combining them in ways that create new value.
老赵很大方,在博客上提前罗列了很多可能会考察的知识点,不怕应聘者做突击准备,“蒙混过关”:
我并不担心大家知道这些问题,而且我可以表示以后的面试估计也逃不开这些。如果您有某些意向,做些针对性的准备可能也是不错的。当然,既然是面试,就会有“随机应变”,你我都一样。我有自信可以在不断追问下发现到底是“真材实料”还是“临时抱佛脚”。
我特相信,一个优秀合格的面试官确实能够大致分辨出对方的水准。反过来,合格的程序员也应该能通过一次愉快的面试,大致了解到面试官的水准,自己是不是合适加入他们的Team。
@DeepNight同学在下面评论到: 其实仔细看了CLR via C#大多数的问题还是能答上来的。
我想如果你带着问题去看的话,确实都能找到答案。那对于上面未罗列的问题呢?问题背后的问题呢?你在看CLR via C#能够对所有的知识点,展开一番思考吗,多问几个问题吗?
《幸福课》里提到:很多事情一直都在那里,只是你没有问为什么,所以忽视了他们的存在。Question create realistic。 这句话TTM令我震撼了!
小弟不才,简单罗列了下几个问题,希望能够引起一番思考如果你还不会的吧
.NET Quiz
// 代码 1:
{
Console.WriteLine("Start In main");
A a = new A();
Console.WriteLine("End In main");
}
// 代码 2:
static void Main(string[] args)
{
Console.WriteLine("Start In main");
SimpleWrap();
Console.WriteLine("End In main");
}
void SimpleWrap()
{
A a = new A();
}
如果class A是定义在另一个工程里,运行的时候凑巧A所在的dll不在应用程序目录下,会发生什么,两者输出有不同吗?
{
// Setp 1: check valid path
path.PopTo(...)
if (path == ...)
...
}
附加题:一个计算密集型操作,我不想使用多线程,又希望同步进度条, 可以做到吗? 如何做到?(提示: 消息泵, .NET 3.5)(如果有人能顺畅答上这道题,我觉得可以加50分:))
Sunday, June 26, 2011:
下面2段代码有什么区别:
{
if (mMouseMove != null)
mMouseMove(this, 10);
}
public void FireMouseMove()
{
var tempCopy = mMouseMove;
if (tempCopy != null)
tempCopy (this, 10);
}
Level 2: 什么是线程栈?