软件开发工程师的面试应该考察哪些素质,如何做权衡?后端工程师需要掌握哪些知识
庄生的回答
首先介绍一下背景
行业:我所在的行业IT很重要但并不是revenue center,属于烧钱部门,地位不能跟纯互联网公司或者游戏公司比
组:我们组最近几年的方向都是招一条龙的程序员,以便减少沟通成本和方便问责。这里的一条龙不但包括技术上写前后端和数据库的代码,也包括在公司内部和用户沟通拿需求,测试,发布部署前后的行政工作。基本上出了问题推都推不掉。
个人:我本人从来没有在国内工作过,所以经验上可能会有所偏差。我一般来说都是第二面,第一面主管已经面过了,简历上的问题问的差不多了,所以我很少会问简历上的问题。除非有匪夷所思的经历。
从最近几年招人的经验中得出的结论主要有以下几点。按重要性排序如下:
1 - 态度
这是我最看重的特质,当然这个态度说的不是对我的态度,而是思考问题和解决问题的态度。
个人来说比较偏好的是对自己感兴趣的领域具备‘打破砂锅问到底’的精神,具备这样精神的人往往有一种完美主义,对于自己的代码有强烈的mental attachment,会自己挤时间不断地fix bugs,增加unit tests或者refactoring,长远来看对项目质量非常有好处,组里有这样的人非常省心。(哎,我干嘛帮资本家去想这些)
这样的面试,我一般直接问candidate你最有自信的技术是什么?然后顺着这个不断地深入挖掘。通过“如果你来设计”这样的假设,来考察应聘者对自己自信的技术到底有何种程度的了解,到底有没有想过这些技术为什么会是这样的。
案例1,我对数据库很熟悉
那么“如果你来设计”的问题就会类似这样:
1,如果你来设计数据库,你会怎么管理文件的? 比如我insert了一行数据到employee表,具体在后台发生了什么事情? 会有什么样的写入操作?有哪些东西会被更新
2,好,现在record已经在数据里面了。我跑一句 select * from employee where last_name = 'Smith'。你觉得数据库具体做了哪些事情把这一条数据给返回的? 它是怎么从文件系统中把这一条记录给出来的?
3,假设我的employee表里已经有一些数据了,这时候我加了一个新的column,会发生什么事情? 文件系统中需要做哪些改动?
4,假设我的employee表里已经有一些数据了,这时候加了一个index,又会发生什么事情? 要写入哪些文件,具备什么特性的数据结构?
5,好,现在已经有index了,那么同样的查询 select * from employee where last_name = 'Smith' 在执行的过程中会有什么区别?看能不能具体展开解释
6,如果你来设计数据库,你会怎么实现join呢?如果两个表都建了索引是怎么做的?如果两个都没有呢?如果一个表有索引?
7, 等等等等。。。。
案例2,我用Spring用得最熟
1,singleton到底有什么用?我用static method为什么不能做同样的事情? 什么情况下会用static method更好一些?
2,dependency injection到底有什么用? interface在这里的作用到底是什么?
3,好,这么看来,spring确实可能在某些情况下有点用,那么如果你来改善spring的话,你会改进哪些点呢?
4,能不能大致讲讲,你觉得autowire具体是怎么实现的?实际使用中会有哪些问题呢?
5,constructor injection和method injection的优劣比较? 什么情况下用哪一个?
6,spring在unit test中起到什么作用,哪些情况下可以不用spring,给一下具体的例子?
7,如果有一天Oracle想在语言层面支持DI,你会怎么设计syntax?为什么?
8,等等等等。。。。
注意:这里主要考察的是思维能力,看看他有没有想过这些问题,而不要纠结于Sybase或者Spring是否真的是这么实现的。我再重复一遍,不要纠结回答的准确性,关键是这个人的思路怎么样,是不是能自圆其说。
这一部分一般持续20分钟到30分钟,取决于candidate的素质和话题本身能不能聊出东西来。可能因为我的这个面试方式比较少见,感觉许多candidate一开始会比较紧张。这时候作为面试官需要不断地给于正面回馈,让他觉得自己还不错,以便放松下来。当然,如果实在是太差的基本就直接“do you have any questions for us”了。
2 - 经验
这个经验不但包括过去公司里从事过哪些项目,也包括平时都做些什么。因为我的行业关系,我感觉纯大公司流或者纯互联网公司流的都有缺憾。前者过于保守死板沉闷,后者过于激进缺乏质量意识,都比较极端。最理想的是在大公司工作一段时间,同时业余维护一个github项目之类的。这种人一般既比较积极主动,又能理解并遵守历史遗留问题。属于兼容并包的好队友。
这一块一般10分钟,取决于有没有东西聊。
3 - 算法
这个可能会引起争议,算法上只要不是太差就行,毕竟我们日常工作牵涉算法的部分不是特别多。 由于一般我们第三面会有别的同时做pair programming,所以我这边都是大概问一个简单的但是实际的问题。举个例子,给你一列区间,如何把它合并起来?
def merge(ranges: List[Int, Int]): List[(Int, Int)] = ???
伪代码写在纸上就行了。就是看看基本的排序递归的使用。具体排序算法也不是非得写出来。
这一块一般15到20分钟。
4 - 对新技术的热情
最近有关注什么新技术吗?angularjs啊,好在哪儿呢?akka啊,解释解释什么是Software Transactional Memory啊?之类的。因为很多人很喜欢聊这些,也算是给自己充充电。
可能是我个人经历的关系,对新技术的热情是一个必要条件,但并不单独构成一个加分项,我见过很多对新技术很有热情,完全只是因为好奇,想尝鲜的想法。对于组和公司的利益却不怎么放在心上。把组里的项目当成试验场,这样的人最后往往需要其他组员帮他擦屁股。
这一块基本就是闲聊,当是收尾了,5到10分钟吧。vczh的回答你就这么想把,这个人进来了,要跟你一起做同一个项目。你愿不愿意?在我们这,愿意就给hire,不愿意就给nohire,然后经过了一整天的面试这个人就有了很多hire和nohire,到时候一看便知。李运华的回答谢@忻尚魁的回答我这边招人的话普遍是如下
1.满足该岗位的技术能力(不扯细节代码,从一些技术实现方式上即可快速了解其程度)
2.喜欢编程(从自己做的非公司项目看)
3.可塑造(比如够年轻,可弥补技术能力问题)
4.交流能力好(说话听不清或者解释的东西让人很难理解,基本没戏)
5.有一定产品意识(能对产品提出质疑或从技术角度纠正产品的问题,而非像机器一样只干活)
我觉得技术方面不需要牵扯太深。多年工作经验的话技术还是一般,是我的话就不会考虑的,不如去选一个刚毕业底子还不错的。Milo Yip的回答這個問題是和公司和工作性質相關的。
以我所在的部門而言,較偏向於技術研發多於純粹軟件開發,所以會比較看重基礎。但由於國內一般比較不看重技術研發方面,而是重於產品製作,所以較難到合適的有經驗的人材。在這個情況下,通常比較希望慢慢培養基礎好的畢業生,讓他們養成良好的技術研究及軟件開發習慣,包括做實驗驗證想法、寫單元測試、寫各種文檔、嘗試做一些軟件設計、與客戶溝通分析需求等等。這需要長時間的投入,不斷討論、檢查代碼文檔、給予建議等等。
當然,程序員總不會100%時間做高大上的事情,總要做一些較簡單、枯燥的工作,這也是一種訓練。
或許有時候可能用不著全部基礎,但有良好基礎的人往往有更好的潛力,在未來可以做更深入的事情。侯天资的回答可能刚出校门的人或跨了领域的人,基础很好但没有职位所需的领域知识,需要从头学起。也有一些人有多年工作经验,但基础一般,领域知识的掌握深度也一般,但可能可以解决公司或项目组面临的人手不够的迫切问题。像这种情况,如何做权衡?
有闲钱就人才储备,没闲钱就项目优先,公司能够存活下去是第一位的,其次才是发展。
面试中,基础方面的考察,数学,数据结构与算法,写程序的功底,掌握到什么程度会认为是合适的人选?
再有,算法和数学题可能相对容易设计,但软件抽象的领域则不是三两句话就说得清的,如何在面试中考察一个人抽象的能力,和设计易于维护易于测试代码的能力?有项目经验,以考察项目经验优先,从面试人员对其在项目中所做工作的描述就可以对其代码能力,业务熟悉程度以及人际沟通等各方面了解个七七八八。再深入问一下做项目的时候遇到过什么问题,怎么解决的?这时候侧重要了解的就是解决问题的能力,会包括数学,数据结构与算法的深入讨论。
没有项目经验,场景测试吧。从一个已有项目中的实际问题聊起,看看面试人有何反应,以及能够提出怎样的解决方案。
一言概之,从实际项目出发,逐层深入,从架构到模块到技术难点,以开放式场景代替固定答案的算法与数学题,重点观察/考察的是思考的过程,而非结果。不过这种方式对面试官的
能力要求很高,不是所有的面试官都能以这种方式考察被面试对象的
有很多日常的dirty work,以及很多业务逻辑性的代码,事实上并不需要太多数学以及算法方面的知识也能解决。那么招人标准抬得很高,让超水平的人来解决这些问题,是否又有浪费之嫌?
真正高水平的人都是聪明的懒人。像这样的dirty work或者重复性劳动,本身就可以通过跑脚本或者流程优化的方式大大提高效率。你会发现当你真正雇佣到一个超水平的人去做这种事情的时候,他的效率会比死脑筋做这些dirty work的人高很多倍,然后这些dirty work就被他们打理得不那么dirty了,再然后他们所采用的工作流程和脚本就可以推广到整个Team乃至部门使用,再再然后他们就被晋升了(或者跳槽)然后你又开始招聘新人补他们的坑。。。成隽的回答1.有洁癖
各类元素的命名、包名字空间划分,代码自解释
这些素质能很快区分出“高-中低”两个层次。
2.对“为什么”感兴趣,热衷并善于动手解决“怎么干”
3.懂取舍,懂平衡
“趋势-性能-成本-维护”这些方面懂审时度势,趋利避害。
1是好员工,搞定多且平凡的琐事
2是能手,搞定难点
3是牛人,给个方向目标,带着1、2就能把事了了。
考察1,百行代码的基础逻辑试题足够。
考察2,面试官可无意曝露或伪造自身项目架构烂点,或表达含糊不清。
好奇心强爱刨根问底的应聘者会追问、提疑虑、给建议。
太傲的不屑的放弃。
考察3,暴露一堆烂尾,面试者能总结出失败点很好,给出整改方案更好,还能敏感准确预计改造点风险和技术/非技术阻力,有靠谱成本估算,收吧
国内IT偏项目,较少偏学术。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论