`
yingyingol
  • 浏览: 739425 次
文章分类
社区版块
存档分类
最新评论

面试经历-201106

 
阅读更多

一个偶尔的机会,获得几个公司的面试邀请,其中两家比较熟悉,在09年第一次跳槽的时候就面过,毫无疑问都是以等消息无果而告终。现在这个机会又呈现在面前,由于最近公司比较忙,很难请假,最终选择挑战W公司,虽然它是个外包公司。挑选的理由有两个:

第一,在我看来W公司的水平还算不错,如果能加入,能提升自己各方面的能力。

第二,W公司提供了两个职位尝试,而且薪水也能满意。

回想起来,09年那次面试准备不充分,连面试题都没看,直接冲了过去面,早上8点出门,下午4点半才面完,感觉整个人都被掏空了,这算是一次非常难忘的经历吧!由于了解了他们出题的一些思路,准备也稍微多了一些。

=『电话面试』 ===================

周五的时候通知,第一轮是电话面试,会涉及到英文面试,不过人事MM说,英文不会涉及得很深,只需要准备一下英文的自我介绍和项目经历就好了,时间就约在周一上午。

一个周末的准备,时间还算充裕,为了这轮英文面试准备了很多,幸好有同学这方面还算不错,两人交流了两个晚上,终于准备好一段三分钟的自我介绍,说的是自己的一些事情,所以,背诵起来并不难。

周一,特别起了个早床,虽然电面中彼此看不到双方,也准备了许多,但还是忍不住有些紧张,脑瓜子里全是英文,走在路上开口闭口就是自我介绍的前面几句。

该来的终于来了,然而,这次面试官出招却让我始料不及!我以为一开始会是英文面试,导致脑子里全是那些东西,没想到一开始会是中文的技术问题,搞得我有点时空错乱的感觉,他问了五个问题:

Q1. Asp.net page的生命周期

Q2.谈谈Session和ViewState

Q3. 如何在两个页面之间传值

Q4. 谈谈Ado.net

Q5. 谈谈MVC模式

A1. 问题好像不是这么问的,但考的是这方面的知识,面之前还看过这方面的东西,可以,那会儿脑子里全是英文,一时间竟然反应不过来,被这个问题搞得非常狼狈,自我感觉是没有说清楚。

A2. 这个问题非常及时,是个老生常谈的问题,刚好对于这方面稍微熟悉一点。我简单的说了下session的实现机制,存储session的三种方法,禁用cookie对于session的影响,以及应对办法(URL重写)。接着,讲了webform的服务端控件保存状态的一些原理,其实就是ViewState的相关,相对于asp.net mvc来说,webform在这方面有一定的性能损耗,毕竟要来回传递隐藏表单域。

A3. 办法比较多吧,可以通过提交表单的形式,也可以通过Url传值,另外利用cookie、session也可以传值,讲得不深,对方听到你谈到这些,感觉也差不多了。

A4. Ado.net也没谈多少,就讲了讲封装的一些操作数据库的方法,对方听了也没继续让我讲更多。

A5. 这个问题经常问,网上一搜也是一大把,基本上随便讲讲,问题不大,不过,要清楚我们在项目中常用的三层架构,跟MVC模式还是有些区别的,这个在设计模式书中会有比较详细的解释。

终于,技术问题问完了,到了面英文的环节,然而,这时候又出状况了,他让我简单用英文介绍下自己的兴趣爱好,这下让我有点手足无措,主要是在那种场合下,自己没准备,心里就发虚,后面,我说,要不我用英文介绍下自己的经历和项目经验吧!对方说好,于是,我尽量用平静稳定的声音来念我准备的“稿子”!

- - 直感觉口干舌苦,估计那会儿口气特别大,我自己也清楚自己的英文水平,发音还算OK,但交流经验太少,遇到情景对话的环节会比较囧!不过好在我准备充分,一些常用的句式,和一些缓冲转移话题的语句都有准备(我想这也是一个积累,如果过去我有这些积累,也不至于临阵抱佛脚!),听我念完,那边的面试官感觉也比较诧异,毕竟准备了两个晚上的东西!还是有料的!

然后,就是一些简单的英文对话,例如:我的兴趣爱好啊?我在什么时候什么地方毕业啊?基本都能听明白,虽然答得不是很流利,估计语法也是一塌糊涂,可恨的是,面试官并不问我项目相关的东西,白让我准备了一堆Q&A。

面了差不多20多分钟吧,然后又听到了纠结的等消息!自我感觉不是很好(主要是面试官出招有点出乎我的意料),泪奔……

心想:面不过就算了。

大约11点左右吧,收到人事MM的电话,问我对于面试感觉怎么样,个人觉得可能英文还好,技术方面有些遗憾,有些问题没回答好,一个是紧张,一个是对于英文准备过于充分,脑子有点反应不过来。

不过,人事MM给的回复还不错,约我去面试,并且把刚才电面的反馈发给我了,看了看,自我感觉还比较欣慰,不枉我准备了一些,评价是这样的:

English Skills: He can introduce himself well but looks like he prepared a lot. He can communicate with me but cannot speak long and fluent.

Comments: Normal English, Good Asp.net technology, can answer my question on a deep range. SDE2 Recommend 2nd interview.

=『第一轮面试』========================

接下来到了真正的考验考场,这次职位的要求3~5年的工作经验,有asp.net mvc框架的开发经验,最好有支付类相关项目的开发经验,这几个条件我基本满足,而且这个职位在W公司对应的等级是SDE3,对于我来说,有挑战,并且我了解到,接下来会有两轮面,一轮是技术,一轮是跟副总裁的面谈,过了接下来一轮技术,只要其他要求不太过分,基本OK。

非常远,坐了两个小时的地铁(09年去的那次更严重,没通地铁,坐了很久的公交,屁股都坐疼了)。

进入正题,面我的是个胖子(带一个旁听),看起来不苟言笑,估计是做技术的那种(后面的遭遇也证实这个)。

他问了很多,有印象的大概是这些:

1. 先谈了一些asp.net mvc的东西,Razor视图引擎,2和3的一些特性,Model的校验,filter等等。

2. 谈asp.net mvc的分页控件

幸好自己写过一个asp.net mvc的分页控件 ,而且在blog中整理过, 对于这个并不陌生,不过,很显然我的那种实现方式在他眼里,太草根,对于点击菜单头排序的做法也不是很理解,主要是,这个控件使用起来比较麻烦,而且代码也不是很优雅。

3. 不通过ajax,如何实现一个异步加载的用户自定义控件?

这个问题没了解过,不知道从哪里答起,讲一些替代方法,面试官也没兴趣听,后来,只好老实说不了解。

4. 由一个简单的问题讲到对象的栈和堆,为什么栈比堆的效率要高,具体访问一个对象,在栈和堆中是怎么操作的,类的static属性存在堆的哪些地方?

说实话,我对于栈和堆的了解并不深入,只说了一个引用型的对象会在在堆里面保存对象的值,在栈里面保存堆的地址。存放在堆里的对象,不会因为对象超出作用域而主动删除,它的回收基于垃圾回收机制,而对于栈来说,在操作系统底层对栈有支持,由于分配了特定的寄存器用于保存栈的地址,并且出栈与入栈都有相应的指令,因此,栈的访问效率会比堆要高。对于类的static变量保存在哪里,也说不清楚。导致,这个问题答得比较纠结,我回答的那部分在他看来太肤浅,深究的话,我也说得不清楚。

这个问题的答案参考:自动内存管理机制深入剖析-C#分析篇C#的内存管理:堆栈、托管堆与指针

5. 由第四个问题引申到这个问题,那就是对于GC的理解。

我的回答也较浅,堆栈中的引用会在超出作用域后,被删除,而堆中的实例只有在垃圾回收机制能处理,由于垃圾回收机制太耗系统资源,因此从实例超出作用域到被销毁,必然有一段时间(他可能更期望我会怎么处理这种情况,例如:使用类的Dispose()方法或者定义析构方法来处理这类问题),答案参考自动内存管理机制深入剖析-C#分析篇 ,当时,我说不出来。

6. 谈谈ref和out,写一个使用的例子出来。

比较纠结,这个问题回答很糟糕,想想也是一个很简单的问题,因为没有关注,也没有使用过,导致不知道如何回答。后面看到这篇文章:C#中ref和out的使用小结 ,感觉更加纠结,实际上在项目中用过它们,只是因为用得少,同时,用的时候也经常copy,导致对于它们没有多少印象。

7. 谈谈闭包这个概念。

没答出来,C#和Java的闭包-Jon谈《The Beauty of Closures》

到这里差不多了,自我感觉也挺受打击的,很多问题一旦深入就答不出来,可见我本身C#的基础并不好,并且,由于一直专注于做实际应用,忽略了这些概念和原理才导致这个结果。

很快我得到结果,被告知基础不够,不适合这个职位,比较失落,一来是自己确实准备了不少东西,关于web应用的、js及一些框架、css、ajax、sql等等;二来,面试过程比较受打击,感觉被问到的东西,很多都说不清楚。

后来人事MM调解一下,问我想不想做测试的相关职位,待遇差不多,想的话,可以接着被另外一个团队面,我个人倾向于开发,而且对于测试相关不是很熟悉,婉拒了,并表示想试试另外一个职位。

=『多轮面试之一』========================

人事MM的效率很高,20分钟后,我进去下一个职位的面试流程。

这是一次故地重游,眼前这个招牌对于.net程序员来说,让人心潮澎湃,09年的时候,我就是在这栋大厦里,差不多同样的房间,被面了一整天,回想起来,感慨万千。

第一轮面试是个MM,非常凑巧,她就是09年面我的其中一个,很想笑,我礼貌地问了下,是不是在这个地方只有他们一个团队是外包的(实际上我的意思是,怎么又碰到了?太巧了?还是一些其他的原因?),她说不是,后面我还是没忍住,跟她谈了以前面过的事情,虽然,她对我没有印象,结果,得知她面过我之后,她笑了笑说:“面过你啊!那算了!”然后她就走了,换了一个人过来(内牛满面,我太耿直了!这个MM出的题目明显要简单很多)。

新来一个男的面试官,比较年轻,直接上题目:

1. 考察类的继承、覆写、虚方法,一个类继承自一个类,覆写父类的构造函数,然后,new实例,求打印顺序(即构造函数的执行顺序),这个问题网上很多,略过。

2.谈谈session和cookie的机制

session的问题之前问过,也讲过很多,基本上一些关键点都要讲到:

a. session是服务端保存单个用户状态的一种缓存,一般情况下是保存在服务器的内存中,重启IIS,session会丢失

b. 它有三种保存方式:InProc、StateService、Sql Server AspState,后面两种需要对象支持序列化。第二种要求启动asp state service,它的状态保存在asp_net state服务的进程中,IIS重启,不受影响;第三种,是保存在aspstate数据库,访问效率要低一些,并且无法捕捉session_end的事件

c. 当客户端发送一个带session的请求,服务端会校验这个请求中session是否带sessionid,带的话,查询这个id,找到对应的session,并检验是否过期;不带的话,会创建一个不重复的难发现规律的字符串作为sessionid,一般情况下,sessionid依赖cookie保存,每个请求传递的sessionid都是缓存在cookie中,如果禁用cookie,就只能通过URL重写的方式,来实现session(http session原理 )。

d.如果session通过InProc的方式保存,又在IIS上配置了负载均衡,可能发生session状态丢失的问题(由于某台机器保存了session状态,但是IIS将后来的请求发送到另外一台web服务器上),可以通过配置machinekey的方式解决问题:解决WEB场中网络负载均衡后产生大Session丢失的问题

cookie的话,正统的cookie是客户端请求产生的,它存在于http请求的报头中,包括五个部分:域、存储路径、键、值、过期时间,域和存储路径决定了它的作用范围,大小是4KB,只能存储字符串,不设置过期时间的话,它在浏览器被关闭后,自动删除,设置过期时间,在浏览器关闭后,会保存在硬盘中。

然后,他问了子域如何共享父域的cookie的问题,要做一种什么特殊处理,我想了想,应该不会是指定一下cookie的域名那么简单吧?不大敢说这个答案,于是,说了一种替代的办法。

3. asp.net mvc的原理,浏览器是怎么解析url的

讲了asp.net mvc的路由机制,讲得不深,看得出,不是他想要的答案,后面自己找了找答案,感觉还是没把握他出这个问题的考点:ASP.NET MVC 原理及路由(转)

4. 算法题:两个byte[]数据,非常大,找出第一个重复的数和第一个不重复的数,写出最优算法。

时间给得不多,我的第一思路是两个for循环遍历,把位置不同的数字比较一遍,发现重复出现的数值就退出循环,要实现肯定是非常简单的,只是这明显不是他要的答案,他强调了两点:第一,它是一个byte数组;第二,它非常大。

当时没有想出好的解决办法,到网上找了一下,没有答案,但是从海量数据处理的帖子上找到一些思路:<!-- google_ad_section_start -->百度曾经考试过的一个算法题:从2.5亿个数字里面找出不重复的数字的个数<!-- google_ad_section_end --> ,在内存,或者在硬盘中创建一个缓存区,记录已访问过的数据和访问次数,通过操作内存或者操作文件的方式,找到第一个重复的数和第一个不重复的数。

时至中午,这轮面试差不多结束了,感觉还好吧,他问的问题基本都能答上,有些可以讲得稍微深入一点,有些可能还不够熟练,差不多时间到了中午,我被告知下午还有至少两轮面试,一点开始。

=『多轮面试之二』========================

1点前,人事MM带我去食堂吃饭,得到一些消息,心里稍微好受一点,这个消息是人事MM的一点抱怨,主要是针对上午第一位面试官,从3月份到现在,基本上他们人事相关的各个团队给他推荐的人,没有一个不被毙掉,非常挑剔的一个人,让她们也很愤满,毕竟这个职位没有高得吓人的薪水,要求水平高,工资又没达到相应的要求,找不到人也是正常的(我如是安慰自己)。

中午吃完饭,还剩下不到十五分钟,午睡已经来不及了,我干脆给同学打了个电话,侃侃上午发生的事情,也为自己减减压。

下午第一轮面试也是个胖子,不过这位看起来要和蔼很多,我们还算聊得比较开心,然后,技术问题也答得还算比较满意吧!可以说是最轻松的一轮面试了。

由于前面面过算法,他也没给我继续出算法题,我试探了一下,问他那个byte[]数组的问题怎么解决时,他也没给出答案,绕了过去。

后面基本问一下js和css相关的问题,js方面可能jquery比较多一点,是自己比较熟悉的领域,感觉基本答得还可以,因此没有特别留意的题目,唯有一道题我没有答上来:

当一个Ajax访问无响应时,怎么中止这个Ajax请求?

网上找了一些答案:怎样取消ajax的请求?使用JavaScript杀死使用jQuery Ajax请求

总的来说,这轮面试还可以,主要是面试官也比较擅长沟通,两个人聊得开,最后走的时候,他微笑跟我握手,说:希望我们能成为同事,比较开心。

=『多轮面试之三』========================

上一轮完了不久,接着又是一轮面试,这次的面试官比较年轻,年纪跟我差不多,他主要问了以下一些问题:

1. 谈谈单例,singalton模式

忘得差不多了,没写来,感觉挺可惜的,很久之前看过,单实例模式(Singleton) ,表述不是很清楚。

2. 一个算法题,实现F(n) = F(n-1) + F(n-2)。

当时的第一感觉题目不应该这么出吧?!我倒是看过一个类似的题目,不过那个题目给出的是一个数组:1, 1, 2, 3, 5, 8, 13, 21……计算出第30个数字。需要你观察数字的规律,写出算法实现,后面写一个递归实现了,不过比较囧的事情是,自己写的算法有个小bug,被他抓住了。

3. 拆箱和装箱的概念

随便讲了讲,这个问题又可以引申到堆和栈,然后,又可以引申到对象在内存中的操作,可以出很多实际题目,我是无比的纠结啊!C#核心概念--装箱和拆箱(什么是装箱和拆箱)

4. asp.net mvc可以基于route机制可以整出比较漂亮的url,那么如何在webform中实现同样的需求?

这个问题没答上来,网上找到了答案:如何在Web Form中使用URL Routing?

差不多又是基于c#这门语言的特征题目比较多,回答还好,这轮面试结束,三个面试官开始讨论了,等了大约40分钟,最终,得到一个结果,他们这个项目有一个Leader,我还需要那个Leader再面谈一次,才能确定,由于这个项目是临时调过来试的,Leader是不在的,因此只能另外约时间面谈。

=『多轮面试之四』========================

这个时候差不多已经到了四点,我也打算回去了,按照人事MM的要求,走之前打了一个电话,这时候,他又推荐了一个职位让我尝试,这个职位对于英文要求比较高,客户是印度人,不需要你听懂他说什么,会配一个翻译,但是需要你说给他听,他能听懂,所以,接下来的面试是英语的场景对话,我想拒绝掉,后面在对方的强烈要求下,尝试了。

英文问题很简单:用五个关键字描述你自己?谈谈对上海的看法啊?谈谈你接下来几年的想法?你是愿意在团队工作,还是愿意单干?为什么?

基本都能听明白,但是话到口里,说不出,硬撑了过去,估计对方也不满意。

后面又考了一段算法题:两个数组,一个升序,一个降序,把它们合并成一个升序的数组,求最优算法。 这个类似的算法做过,所以,写起来比较顺利,复杂度大约为O(n),他看了也基本满意,面了差不多半个小时。

后面说,还是需要Leader来决定,这一天的面试到这差不多就结束了,剩下的还是等他们的二次通知电话。

=『总结』========================

对于sql的考察基本没有,对于web、js的一些考察也比较少,很多短板倒是被测了出来, 还是比较遗憾的。

总的来说,对于c#语言中,对于程序员透明的那块考察比较多,这应该算是衡量.net程序员水平的一个要素吧!对于我这个学java出身,毕业后转.net,并一直专注于实际应用开发的人来说,考到了点子上!很多缺陷都暴露出来!

另外一个感触比较深的地方在于,还是要积累 ,英文积累是一个方面,其他技术都需要积累,写Blog是个很好的习惯

总之,不管这次面试的结果怎样,都算一次比较好的经历,至少,我从以前不敢面英文,到勉强能应付英文,这算一个小小的进步吧!技术方面,也考察得比较全面,明白自己的短板在哪里,以后,能有的放矢地补全这方面的知识。

最后,赠言于即将面试的朋友,这个世界很小,W公司是什么公司,很多人可能猜得出来,如果你也获得这样的机会,不妨多准备一下,临阵磨枪,不快也光!也许一些必要的准备,就能成就你的一次飞跃。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics