技术面试-程序员能力考察
2023-02-10 10:02:20 1 举报
AI智能生成
结合日常面试JAVA技术岗位总结的有关技术面试考察点
作者其他创作
大纲/内容
编程能力
考查候选人能不能实际动手写程序,有没有基本的编程思维
考察编程能力
目的
招聘程序员主要是来干活的(说白了就是写代码)
主要考察
实际编程动手能力
编程思维
代码质量
两个面试题示例
问题 1:请写出求二叉树深度的算法(我会给出二叉树图例和节点的定义)
1重点剖析
表面上是看候选人对二叉树数据结构的掌握程度
实际上考查的重点是
递归思维
本题如果用递归算法解的话,5~6 行代码就可以解决
但是没有掌握递归思 维的候选人一般会陷进去,要么搞半天也写不出来,要么花半天弄出一个很复杂的非递归算法
递归是一种很强大的编程武器
开发工作中一些看似非常复杂的技术问题(例如语言解析 器、代码生成器等),都可以通过递归简单优雅地解决
而没有掌握递归的程序员则对此类 问题常常束手无策
面试官需关注的点
不管候选人有没有解出这个问题,我都会仔细看看他写的代码
看看程序组织、变量命名,甚至标点符号等细节
这些不仅可以看出他的代码质量,同时可以看他是否细心认真 (程序员的基本素质)
有些候选人能把算法思路讲出 来,或者把伪代码写出来,但是实际代码写不好,说明他写实战代码的能力还是比较生疏
问题 2:用一台普通电脑对一个 100G 的大文件(内部是字符串记录)进行排序,本题只需给出算法思路
2重点剖析
实际上考查的重点是
分治思维(分而治之)
先将大问题分解为子问题,依次解决子问题,最后再合并子问题的解得到最终解
分治思维 也很强大,能帮助我们解决很多表面上看起来很庞大的问题
例如一个中大规模系统的架构 设计,甚至一个企业组织的架构设计都离不开分治思维
本题考察目的
用一个技术问题考查候选人是否具有分治思维,也就是看他是否具备解决大规模问题 的思维基础
这个问题同时也考查候选人对计算机组织(内外存)、文件操作、算法 时空复杂度,以及各种排序算法(快排、归并等)的掌握程度,可以说是一举多得
技术技能经验
考查候选人之前参与过哪些实际项目,积累了哪些实际的技能经验
技术技能经验考察
技能经验本身并不容易考查
行业的一般做法
先考查你对 Java 语言的掌握程度
因为如 果你实际做过生产级的项目,那么对 Java 语言的核心知识点(Core Java)就应该掌握得 比较好
五个面试题示例
问题 3:介绍 Java 垃圾回收器的基本原理
3重点剖析
Java 语言最著名的特性就是自动垃圾回收(GC)
很多生产上 Java 应用的问题(尤其是 性能和内存问题),大都和 GC 有关
对于一个实战型的 Java 程序员来说
在生产实践 中一定会不止一次地遇到 GC 问题,所以对 GC 的理解程度,基本可以作为衡量一个 Java 程序员是否合格的门槛
面试官基本要求
至少要把 Java 的分代垃圾回收机制讲清楚
否则差不多就可以判定“不合 格”了
对于有些能讲清楚的候选人,我还会进一步延伸
让他解释什么是 GC Root
解释 Java 程序中有哪些可以作为 GC Root?
甚至深入到如何直接操作堆外内存(offheap) 的程度
GC 的基本原理可以背诵
但是对于延伸的知识
如果没有拓展阅读或者实际动手实践过, 你一般很难回答上来
问题 4:介绍 HashMap 的实现原理
4重点剖析
在我们日常编程的中,除了 List/Array 以外,用得最多的数据结构基本上就是 HashMap 了
在大学时 HashMap 也是数据结构课程中必学的一种基础结构(课本中称为“散列表”)
因此,我基本上都会问 Java 的 HashMap 是如何实现的
面试官基本要求
至少要把 HashMap 的内部数据结构实现和 get/put 算法给讲清楚
好一点的候选 人要能把装载因子(load factor)和再哈希(rehashing)給讲清楚
这个问题可以考查三个点
1. 你是否真的在一线写代码,因为只要是写代码就一定绕不开 HashMap
2. 对这么常用的数据结构,你是只停留在会用 API 的层面,还是说能够深入到内部算法实现?
3. 你在大学时有没有认真学习过数据结构,对这门核心计算机课程的态度如何?
问题延伸
既可以向 Java 集合框架 方向延伸
也可以向 Java 多线程方向延伸
HashMap 的基本原理并不难,但是延伸的内容如果没有实际动手实践过,你一般很难回答 上来
问题 5:讲讲 Web 应用程序中的 Cookie 和 Session 是什么关系?
5重点剖析
互联网应用大部分属于 Web 应用,开发人员或多或少会开发 Web 应用
Web 应用开 发中一个很基本的问题是理解 Cookie 和 Session
这个问题需要一些底层 HTTP 协议知识
理解 HTTP 是无状态协议
理解服务端和客户端 会话存储机制
问题延伸
Session 可以存储在哪些地方?
客户端?
服务器端?
缓存?
数据库?
粘性会话(sticky session) 是什么意思?
如何实现粘性会话?
分布式会话如何实现?
问题 6:你在生产实践中使用过哪些设计模式,是什么场景下使用的?为什么使用?
6重点剖析
随着一个工程师项目经验的积累,他会逐渐体会到软件设计中有很多模式性解决方案,也就 是所谓的软件设计模式(Design Pattern)
设计模式
是软件研发行业几十年实践后提炼出来的一些通用的设计方案
是比数据结构更高 一层的抽象
学习和应用设计模式可以帮助我们提升软件设计能力
工程师能力提升的一个标志
就是会开始注重设计模式的学习和积累
并且在实际项目中应用模式解决具 体问题
询问设计模式相关的问题
在实际项目中应用过哪 些设计模式(因为工厂和单例太常见,我一般会要求两者除外的答案)?
什么场景下使用的?
为什么要使用?
对于有模式使用经验的候选人
我会要求横向比较几种相关模式
策略(strategy)和模板方法(template method)模式的差异
代理(proxy)和装饰 (decorator)模式的差异
对这个问题的回答,可以看出侯选人项目经验是否充分,是否已经上升到模式性解决 问题的高度
问题 7:讲讲你最近开发的一个项目的业务背景和架构(或技术)
7重点剖析
这是一个开放性问题,考查目的并不在项目本身,而是看以下三点
1、侯选人近期是否还在一线参与实际项目?
2、侯选人的沟通表达能力,能否用简单的语言,给一个完全没有上下文的人,讲清楚自己开 发(或者参与开发)的一个项目的业务背景和架构。该问题也是后面软性能力考查的重要 参考
3、侯选人的技术热情,但凡有技术热情的侯选人,一讲到自己开发项目的架构或技术时,常 常会两眼放光,滔滔不绝,充满激情
总结
额外补充几点
1. 知之为知之,不知为不知,面试过程中如果有的问题回答不上来,那就诚实讲不知道 (或者自己没有相关经验”
我们不可能每个问题都回答得上来(面试官也并不对此抱多大期望)
即使面试失败了
也建议你坦然面对,这不过是一次很好的学习机会,回 去后查漏补缺,下次再看新机会即可
但是如果不懂装懂,就违反了诚实正直的价值观 大忌,你在面试官心目中的形象会大打折扣
2. 整个面试重点考查侯选人的实战能力(说白了就是干活、产出的能力),这个不太可能通 过研究面试攻略搞突击来完成
你还是要平时一步一个脚印,多参与实际项目,多写代 码,多阅读代码和图书,不断学习和提高
3. 数据结构和算法、编程语言(Core Java)、编程思维(递归和分治)、Web 开发和软 件设计模式等,是我考查程序员硬技能的重点,我想也是很多其他公司面试侯选人的重 点
4. 面试过程中,要注意面试官同时也在考查你的软性技能
时刻保持谦虚谨慎,回答问题 前先思考,再有条理地表达出来
过程中和面试官保持良好互动,同时表现自己的积极 主动性和合作性
展示自己心理成熟、负责任、有担当的一面,也尽可能展示自己有管 理甚至领导力的一面
遇到上司不成熟
根据领导的风格和个人的目标,选择开诚布公地谈,或者小心谨慎地干,或者干脆利落地走
职业成熟度
职业成熟度包括了职业技能和职业态度等方面,是在心理成 熟度之上的表现
比如,能否协作、能否全局角度考虑问题、能否照顾长远利益等等
工作刚开 始的五、六年是职业成熟度发展的关键期
软性能力
考查候选人的沟通合作能力如何,心理成熟度如何,管理和领导力如何
通过前面两关的考查,基本上可以说候选人的硬技能过关了
硬技能过关
说明侯选人能独 立干活,可以说是过了面试的门槛
考查侯选人的软性技能
主要有两个目的
一个是筛选掉那些明显有合作性问题或者心态问题的侯选人
另一方面是考查候选人的管理和领导潜质
有些侯选人不仅能独立干活,而且还能带团队
有潜力成为一个管理者,甚至是领导者
软技能考查的点非常多
主要关注
沟通能力
心理成熟度
以及管理
领导力
1. 沟通能力考查
其实在上面问技术问题的时候,我就已经开始观察侯选人的沟通表达能力了(比如第 7 题)
同样一个问题
沟通表达好的侯选人能够抓住重点
有条理地用简单的语言把问题讲 清楚
而且面试过程中能够认真倾听面试官的问题
并且和面试官保持良好的互动
2. 心理成熟度考查
我们招一个人进入公司和团队
是要能够长期一起合作的(说白了是一起吃饭)
需要心理成熟的成年人,而不是动不动就耍小脾气的未成年人
不少技术人员硬技能是有的,但心理不成熟
心理不成熟有很多表现
比如自负任性
喜欢单干合作性差
喜欢扯皮不愿意担责
言语经常传播负能量
这样的侯选人如果招入团 队,可能造成一个烂苹果毁掉一篮筐的问题,所以必须谨慎!
在整个面试过程中
表面上我问的是技术问题,但时刻都在通过察言观色
对侯选人进行心 理成熟度的考查
有的时候,我会和侯选人一起探讨问题,过程中看他的合作性和积极主动性
有的时候,我会故意否定或刁难(甚至带一点蔑视的态度),看侯选人在压力环境下的反应
没有压力的时候
大家的表现都挺好
一旦在压力或逆境中
很多心理上的小毛病就 都暴露出来了
如果在压力环境下仍然能做到镇定自若
冷静思考并解决问题,往往在一定程度上表明候选人心理成熟稳定,有一定的责任心和担当
3. 管理能力考查
做工程搞开发,不仅需要良好的技术技能,同时也需要良好的计划性和时间管理能力
当我们做中大规模的项目,或者是作为管理者带团队的时候,这种能力就显得格外重要
不管之前有没有做过项目管理或者是团队管理,都会了解候选人
你是怎么管理你的时间和项目的?
你每天 / 周 / 月 / 年是如何做计划的?
自己有没有一套完善的计划和时间管理系统?
比较可惜,只有非常少数的侯选人能够清楚说明自己的计划和时间管理系统
这也可以 说明为什么能从程序员成长为架构师甚至管理者的人少之又少
4. 领导力考查
我们招一个人,有能力能干活是基本要求
但是如果只能按部就班地执行,没有领导创新 力,那么做老板的就会很累
相反
如果员工还能积极主动创造性地干活
时不时搞点意想 不到的新东西出来
那老板可以省很多心,招到这样的员工是老板之福
领导力并不容易考查
一方面通过面试过程中侯选人的沟通表达和积极主动性来考查
另一 方面也可以提问
比如让侯选人讲讲在之前的职业经历中
在缺少资源和支持的情况下
自 己主动发起项目,最终还把事情搞成了的案例
0 条评论
下一页