己要镇静,说“还没说完,最好是在递归函数里检查参数范围”。他突然笑了,说其实你只要改一个地方,我马上明白了,说把 n==0 || n==1改成n<2。他说是,不过处理负参数并非使用函数的本意,对吧?我说对,这种情况我应该throw一个ArgumentException。他说还有一种不错的方式,只要把递归函数的参数类型改一下,“你说改成什么”,我说uint,他这下才算比较满意,翻过卷子继续看。
刚舒一口气,没想到第二道编程题我写得更糟糕,题目要求将字符串如”A car is running” 变成”running is car A”,我刚来时大概还在晕头转向,只是把字符串倒过来了,变成了”gninnur si rac A”。人家当然有兴趣了解下我是如何理解的,我只好说我只是忘了加行代码,将每个词再倒过来( 事后想,应该是 result = Regex.Replace(result,”\\w+”,m=> new string(m.Captures[0].Value.ToCharArray().Reverse().ToArray())) )。不知他对我的奇思妙想觉得蛮新鲜还是蛮无语,说了一句“那倒还可以”,这道题就过去了(大家就别笑话我了,现在想起来都很汗)。
然后这哥们如天马行空般提问题。Active Directory我完全是在瞎编,他没管,不过指出NTFS要用更多磁盘空间而不是像我写得那样节省空间。问我GC的理解,我说用来回收堆上分配的内存,他问我堆上的空间在系统回收时会全部扫描吗,我想了下说“应该不会。”看我确实不清楚原理,他略讲了一下,又问“那一些非托管的资源.Net中如何处理”,我说可以定义析构函数清理非托管资源,也可以由程序员自己控制回收,.Net提供了try…finally和using语法支持,接着他又让我说了下这两种的用法。他纠正了我两处说得不准确的名称,大体是予以了肯定。
接下来他还问了override、delegate、java script闭包、Css样式类型、Sql中group和having一堆知识点,我答得还不错。只是Css上面卡了一下,一时忘了div .link和div.link的区别,不过他好像知道我能想起来,相当耐心,我最后总算想起来了。最后,他问我知不知道Sql语句的over用法,我扫描了一下脑中的数据,比较肯定地说“我看过的Sql语法手册中,没有这个关键字。”他哈哈笑起来,说,“那你看的手册可能比较久远了。”
这时,已经11点50了,他说“好吧,上午面试就到这里,你待在这里,一会Tony会带你去吃饭。”
曾听说微软的面试要一天,中午面试官会和你一起进餐,这也是一种面试。Tony过来,让Steven(刚才面试我的)把我带的包放在他柜子里。带我去餐厅,就在对面楼的一层。餐厅人很多,不过大家排队很有秩序。结账自然是Tony,我们找了一个靠窗的位置坐下。
看我还是有些拘紧,Tony说没事的,就是随便聊聊。一交谈,原来还是山东老乡。我问,微软全球技术支持中心不是在徐家汇美罗吗,怎么搬到这里了。他说,刚搬来没几天,以后那边要全搬过来。说到美罗,又说到唐骏,Tony说他就是唐骏招聘进来的。
吃完饭又聊了一会,Tony看了看表,说他要先上去忙了。“这里周围环境不错,你可以去转转,1点再上来找我”。
这里环境确实比张江好,有点像公园,很安静,正是专心写程序的好地方。
走了几圈,回到上面。Tony带去茶水间,让我等下,又匆匆走了。茶水间当然不只茶水,果汁可乐咖啡一应俱全,还有几种水果。一位阿姨正在剥柚子,那柚子有排球般大。跟阿姨聊了几句,她听说我是来面试的,连说:“来这里好啊,待遇好!我们这些人就是专门为你们服务的。”大概连在这里做后勤的阿姨对工作都比较自豪。
第二个面试我的哥们进来,领我一起到旁边的一个会议室里。他先问了点基础知识,然后给我出了道题,大意是:一个手机功能界面,屏幕上显示了许多大小不一的矩形,怎么计算这些矩形彼此间交叉次数?和网上流传的微软试题一样,到了该要求性能的时候,复杂度至少要求O(logn),最好是O(n)。
不用写代码,只要说出思路。我先后提了三种方式,把连通和非连通图概念都用上了。我在白板上边画边说,这哥们穿着牛仔裤、运动鞋,翘着二郎腿,脸上始终带着微笑,将我的算法一一挡在O(n2)门槛外。 后来他说,我们有个解决方案是这样滴,问我觉得有什么问题。我猜就是他想出来的,这答案是反常规的,面向对象和数据结构有时也是条死胡同。我又看了一会,方案好像无懈可击,说“我想没有问题”。
然后他考我一个SQL联接查询语句,我写出来了,然后他把我的语句一变,成了Update语句,问我这样行不行。我只知道可以这么写,但实际一次也没用过。我只好凭猜测,说由于无法判断Set的值是哪一行的对应值,所以应该不行。他问确定吗,我犹豫几番后还是坚持了最初的结论。
他正要问另一问题,一看表,说,“我的时间到了,得走了,你在这坐一下”。
这次等的时间稍久些,我出来在办公区转了转,也没人过问。远远看到Tony和面试过我的两哥们在一起商量着什么,不知是不是关于我的。又回到那间小会议室,过了会Tony进来,托着一个笔记本。问我今天来的感觉怎么样,我说这里不错,面试我的人水平都很高。接着他出了两道编程题,一道Sql题,都比较简单,让我写在白板上。我这次注意写上抛异常的情况了。我写完后,他很快看一下,说“没什么问题,对吧?”然后出下一个题,第二道题可能我理解得和他想得不一样,解释了一会,不知道他最后明白了没。我在上面写,他则在笔记本上打着字,看来忙不是假的。接着他又问我几个概念性的东西,他一直低着头,我唯恐他漏过什么东西,尽可能说得很罗嗦。但他问到程序池是什么时,我卡壳了,说我只知道线程池。Tony也顺风使舵,问我线程池是什么,我又凭自己理解罗列了一大通。
然后他出去了一会儿,回来后对说:“今天就到此为止吧!”
天哪,我终于长舒了一口气。
天色已暗,走出了5#楼。这次面试印象真深刻,直到现在,对当天的许多细节仍然记忆犹新。
周末休息两天后,周一来到互软复试。这一次要进行机试,题目是模拟一个权限管理系统的核心功能,有登录、管理员平台、用户平台。坐下来开始敲键盘后,感觉确实挺冷。从下午1点半开始到5点,有人跟我说就做到这里吧,先去面试。于是我去了会议室,面试我的是部门经理。
他问我上机情况,我说还差管理权限更新没写完。他说,这个题目快的话两个小时,一般三个小时就可以做完了。我光C#代码就已经写了近三百行了,大不以为然,不过没直接说,就说上机电脑SQL Server有问题,耽误了不少时间(也是事实)。
接着部门经理问了我一些技术问题和做过的项目,除了Reporting Service没用过外,都应答自如。这时,外面检查上机题结果的人已把评价送到他手上。他还考了两道智力题,大概对我的情况基本有数了,总结说:“你有一定开发经验,但比起和你相当工作经验的开发人员,还是有差距。”这时我轻摇了摇头,不慌不忙地回答:“我不这么认为,我接触过.Net开发经验和我差不多的人当中,还没发现水平比我高的。”
“看来你还是挺自信的”,他说,然后又拿我简历一些地方说事。我已经打定主意,他爱怎么说去,我都还没想好要跳到你们公司,就想压薪资,没门儿。看这里工作环境,也不像能负担得起高一点工资的。最后,他说“不过我们还是可以合作”,然后说带我去见他们副总。晕,这么大的公司,招聘个开发人员要笔试、机试,最后还得副总决定,要崩溃了。不过既然到这一步了,就坚持一下吧。
这个副总在楼上的一个办公室里,年纪不大,穿个暗红色外套,好像也懂点技术,也问技术问题。看得出他不大耐烦,我