程式设计师面试面试中的优缺点

程式设计师面试面试中的优缺点,第1张

程式设计师面试一直是大家讨论的热门话题。面试中优缺点有什么,我对这个问题有自己看法,下面是我对程式设计师面试问题的一个阶段性反思和经验总结。

经验面试优缺点

这里所说的经验不是通过工作了多少年来衡量的,而主要是指面试者的经历,比如,是否完整地实现过一个软体,或作为主要开发者完成过一个专案。经验的重要性在于它能说明一个人的综合能力。从专案的性质、规模和难度,面试官就可以大致判断出面试者的综合能力。如果一个面试者一直在大公司负责一个小模组的开发维护,那么基本可以判断他不具备独立或作为主要开发者承担一个专案的能力,只适合在另一家大公司做类似的事情。对于门槛较高需要宏扰森长期技术积累的职位,相关经验更显得尤为重要,比如,Linux核心开发,JVM开发,游戏引擎开发,资料库实现,高阶UX等。对于这类职位,没有经验的面试者即使综合素质不错也是需要长时间的学习和积累才能胜任。所以,基本上如果确定了你的职位属于此类,那么相关经验毫无疑问应该成为首选因素,换句话说,P工作好 | 相关经验好的概率是非常高的。

通过专案经验判断面试者的优劣比通过基础和演算法测试更加靠谱,所以,面试过程中面试官应该花比较多的时间听面试者介绍专案经验,并进行深入地探讨交流,了解面试者的李颤知识面、思维能力、表达能力等。同时,可以结合专案提一些基础知识和演算法的问题,比如,如果面试者做过C++相关的专案,那就可以问他如何进行记忆体管理?是否熟悉智慧指标?如果面试者的回答不能令人满意,那么就基本上可以判断他的专案做得不是很好。

要注意的是,经验也是一个多维度的事物。比如,C++股票交易中介软体系统,这就涉及C++,中介软体,股票 3个维度。假如面试者A做过C++股票交易客户端,面试者B做过C的股票交易中介软体。从语言角度看,A最匹配,从专案性质看,B最匹配,你如何选择?这就是在多个维度中,哪个维度更重要的问题,就这个例子而言,我个人更倾向于B,因为我认为中介软体开发经验是主要矛盾,而从C切换到C++并不是问题。所以,面试官需要判断哪一种经验是主要的,而哪一种经验是次要的。比如,我们招聘Android应用开发,这个职位的Android技术门槛并不高,它的真正难点在于做出好的使用者体验UX。所以,如果一个面试者没有Android的经验我们是可以接受的,但是我希望他在UX方面有经验,至少做过其他平台的移动应用开发。

   基础面试优缺点

基础面试是指考察诸如指标使用、程序执行绪概念等基础知识的面试,十分类似于大学期末考试题。我曾经以为基础面试十分重要,但是现在不这么。在工作中基础的确是重要的,但是在面试过程中,它必须具有区分性才有意义,也就是说P工作好|基础好的概率要高,那么考察指标使用,程序执行绪区别这样的基础题目才有它的意义。我的实际经验是,基础面试并不具有很好的区蔽亩分性,和演算法一样, 差不多P工作好|基础好 = 50%。同时,基础面试是最容易准备的,中国人有长期的应试教育经验,要准备几个把玩指标题目太容易了。

我曾经遇到过这样的面试者,他的C语言基础和编译、连结等原理掌握得非常好,给我留下了深刻的印象,我给的面试结论是:知识面不宽,只会C语言,但基础很扎实,建议录用。后来的事情证明了那个结论的前半部分是对的,但是”建议录用“错了。他在实际工作中表现得一塌糊涂,不理解需求,不理解整体架构同时,上班时间不是花在专案上,而是花在阅读诸如《程式设计师的自我修养》之类的书籍上。最后,这位同事由于长期“不出活”离开了公司。

基础不是不重要,而是“基础好”不足以说明面试者能干好工作,因为基础是属于区域性性知识,而实际工作需要综合性能力,二者有天壤之别。C语言、作业系统能考高分,但是不会写程式的人在大学我们还见得少吗? 软体开发就像盖房子,综合能力是设计和搭骨架,基础知识是码砖。张小龙原先Foxmail是Delphi开发的,他它不懂C#,你如果要招聘一个开发.NET Email客户端的人,你考察他对CLR掌握得好不好有意义吗? 让张小龙来开发一个C#版的Foxmail真的会有困难吗? 你招一个精通C#但没有Email客户端开发经验的人来真的比张小龙靠谱吗?

我说基础知识不重要,和古人说的“不积洼步无以至千里”是不是矛盾呢?不矛盾!“洼步”与“千里”是一种可累加关系,但再多的“基础知识”都累加不成“综合能力”。学习软体开发要像持续整合一样,一开始就是一个完整的系统,虽然规模不大,问题很多,但它麻雀虽小五脏俱全,从小系统到大系统,从简单系统到复杂系统逐步演化。

所以,基础好本身不足以说明太多的问题,必须进一步考察综合能力。对于基础面试表现不好的面试者,如果时间允许也要进一步考察,有的面试者其实是有能力的,只是没有进行充分的准备。最理想的状态当然是基础和综合能力俱佳,若不能兼顾,应当综合能力优先。

性格面试优缺点

现在,我来谈我认为最重要的因素:性格。这可能是许多初为面试官的朋友所难以想象的,怎么会是性格最重要呢?说实话,当我意识到这一点时,我自己也很惊讶!说白了,还是 P工作好|性格好的概率最高啊。我的实际经验是,如果一个人的性格好,他能把工作做好的可能性是最高的,性格好远比基础好、演算法好要靠谱。

一个人如果技术上有缺陷,经验上有不足,但性格好,在团队中是很容易由其他人来补位的,他自己也很容易逐渐补起来相反,如果一个人的性格不好,所有的技术优势经验优势都发挥不出来,甚至还会起到负作用,而且性格缺点很难改变。我一直谈到实际工作所需要的是综合性的能力,这种综合能力的发挥中性格是至关重要的。专案中不止会遇到技术问题,要涉及沟通、协调,不同的人不同的部门既有合作又有磨擦,如何处理这些事情都需要一个良好的性格。可以说,在开发团队里让你与众不同的不是你从哪个学校毕业,也不是你过去的经验,而是你的性格。

当然,性格是一个复杂的东西,它包含了很多的方面,并非所有方面都是程式设计师面试所需要关注的。我的经验是可以重点考察这些方面:

1 态度积极还是消极。有的面试者在谈吐中就会自然给你一种积极上进的感觉,或者你可以在他的经历中发现他积极的因素,这些都不是太难看出来的。相反,有的面试者你能明显感觉到他的消极情绪。积极性在工作中是十分重要的,积极的人能给团队带来朝气,也更易于合作。基本上,如果确定面试者属于态度积极的,他通过我这一关的可能性就会大大增加相反,如果确定属于态度消极的,即使技术能力不错我也会十分谨慎。

2 IQ。我的经验是,总体来看,聪明的人在工作中的表现更为优秀。在面试中要考察一个人是否聪明并不一定要像Google和MS那样找些专门测试IQ的智力题,其实,你只需要看他讨论问题是不是很有逻辑性,思考和说话是不是反应敏捷就可以做出大致的判断。另外,眼睛是人心灵的窗户,一个人聪明与否,眼睛是会说话的。不过,聪明也不完全是优点,比如,当公司或专案遇到困难时,往往是聪明人先跑掉了,坚守的往往是IQ一般的人。

3 语言表达能力。语言表达能力也是程式设计师十分重要的一项素质,它关系到专案中的沟通是否顺畅。面试官可以看看面试者能否用简明的语言介绍清楚曾经做过的专案,能否抓住要点,能否考虑到听者的相关背景。一般来讲,语言表达能力强的人综合能力都不会太差。

4 是否具有使用者意识。有人说程式设计师是做研发的,哪来什么使用者?只有销售、市场人员才会和使用者打交道。其实,这是完完全全的错误认识。你写一个模组,甚至一个API,只要有别人用,他就是你的使用者。有的程式设计师设计一个模组或是一个软体总是习惯于从使用者的角度来考虑,尽量地方便使用者,这就是一种良好的使用者意识。具有良好的使用者意识的人更能考虑别人的感受和整体的需要,而不是单纯地从自己和区域性来思考问题。当面试者谈及过去的专案经验时,面试官可以常常站在使用者的角度对其进行提问,从这个过程中观察其是否具有良好的使用者意识。

5 如何应对质疑和压力。面试官应该对面试者的回答以及以往专案进行合理的质疑,看看他如何应对。曾经有一位面试者谈到做游戏登入伺服器的经历,我就问:“如果登入伺服器挂了,怎么办呢”?他说原先虽然没有考虑这个问题,但是可以怎么怎么改进。其实,大家都理解专案中有各种不完美,这里面原因很多,只要面对质疑和压力能从容应对努力往好的方向思考解决就可以了,不需要掩饰缺陷,更不应该有情绪。我遇到过有的面试者,一旦你对其专案提出质疑,他马上产生反抗情绪,或不高兴,或不承认有问题,这很容易一下子看出来他在工作中容不得质疑和批评,这种人要想合作就很困难。

6 个性特点。许多面试者喜欢在简历上写“精通C++/Linux“,这些字眼看得人麻木,如果有人写”喜欢C++/Linux“,我就会有一种眼前一亮的感觉。“精通”是没有感 *** 彩的叙述,而“喜欢”包含了面试者的个性,我更愿意看到面试者的个性。我相信对某样东西真正的热情远比你当前对它的掌握程度更为重要。其实,N年的经历告诉我们,同一个班的同学,同一个专案组的同事,虽然每天所学的知识,所接触的工作都是相同的,但其实每个人的成绩和表现差异是十分明显的。那么,到底本质的差异是什么呢?其实,就是每个人的个性。是个性使得有的人业余时间去打球,有的人业余时间去看书,有的人喜欢Linux,有的人喜欢Mac。一个人在团队中扮演的角色也和他的个性有很大的关系。面试官应该引导面试者展现自己的个性,并判断其是否有益于团队。

import java.awt.*import java.awt.event.*import java.awt.geom.*import java.util.*import javax.swing.*/** * 多线程,小球演示. 打开Windows任务管理器,可看到线程变化。 可搜索到,run()方法/.start() * * du: 程序技巧体会: 所谓产生一个小球,即是 new 其类对象,其属性携带画小球的 坐标、颜色、所在容器 等参数。 * * 一个类,属性用来作为参数容器用, 方法....完成功能。 * */ // 运行类 public class BouncePress { // public static void main(String[] args) { JFrame frame = new BouncePressFrame()// 生成窗口。执行构造。-----业务逻辑。 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)// similar to // window // listener frame.show()} } class BouncePressFrame extends JFrame { private BallPressCanvas canvaspublic BouncePressFrame() { setSize(600, 500)// 窗口大小 setTitle("Bounce Ball")Container contentPane = getContentPane()// Swing的窗口不能直接放入东西,只能在其上的ContentPane上放。 canvas = new BallPressCanvas()// 生成一个新面板。-----canvas contentPane.add(canvas, BorderLayout.CENTER)// 窗口中心 加入该面板。 JPanel buttonPanel = new JPanel()/告或数/ 再生成一个新面板。----buttonPanel // 调用本类方法addButton。 addButton(buttonPanel, "Start", // 生成一个按钮"Start"---加入面板buttonPanel new ActionListener() { // |------>按钮绑上 action监听器。 public void actionPerformed(ActionEvent evt) { // | 小球容器对象的 addBall(Thread.NORM_PRIORITY - 4, Color.black)// 事件处理时,执行---addBall()方法。--->产生小球(参数对象)--->团激加入List中--->开始画球。 } })// 按一次,addBall()一次--->产生一个新小球--->加入List中--->开始画此新小球。 // --->画球线程BallPressThread的run()--->小球(参数对象).move()--->每次画时,先移动,再判断,再画。 // --->BallPressCanvas类的canvas对象.paint()--->自动调BallPressCanvas类的paintComponent(Graphics // g)方法。 // --->该方法,从List中循环取出所有小球,第i个球,--->调该小球袜首BallPress类 // .draw()方法--->调Graphics2D方法画出小球。--使用color/ addButton(buttonPanel, "Express", new ActionListener() { public void actionPerformed(ActionEvent evt) { addBall(Thread.NORM_PRIORITY + 2, Color.red)} })addButton(buttonPanel, "Close", new ActionListener() { public void actionPerformed(ActionEvent evt) { System.exit(0)} })contentPane.add(buttonPanel, BorderLayout.SOUTH)} public void addButton(Container c, String title, ActionListener listener) { JButton button = new JButton(title)// 生成一个按钮。 c.add(button)// 加入容器中。 button.addActionListener(listener)// 按钮绑上 action监听器。 } /** 主要业务方法。 */ public void addBall(int priority, Color color) { // 生成 小球(参数对象) BallPress b = new BallPress(canvas, color)// 生成BallPress对象,携带、初始化 // 画Ball形小球,所需参数:所在容器组件,所需color--black/red. // 小球加入 List中。 canvas.add(b)// 面板canvas 的ArrayList中 加入BallPress对象。 BallPressThread thread = new BallPressThread(b)// 生成画小球的线程类BallPressThread对象。传入BallPress对象(携带了画球所需 // 容器、color参数)。 thread.setPriority(priority)thread.start()// call run(), ball start to move // 画球线程开始。--->BallPressThread的run()--->小球(参数对象).move()--->先移动,再画。canvas.paint--->BallPressCanvas类的 } } // 画球的线程类。 class BallPressThread extends Thread { private BallPress bpublic BallPressThread(BallPress aBall) { b = aBall} // 画球开始。 public void run() { try { for (int i = 1i <= 1000i++) { // 画1000次。 b.move()// 每次画时,先移动,再判断,再画。 sleep(5)// 所以移动比Bounce.java的球慢。 } } catch (InterruptedException e) { } } } // swing面板类. // 作用1) 本类面板对象.paint()方法---->自动绘制面板,且自动调paintComponent(Graphics // g)方法,--->重写该方法,绘制面板(及其上组件)。 // 作用2) 该类对象 属性ArrayList balls---兼作小球(参数对象)的容器。 class BallPressCanvas extends JPanel { private ArrayList balls = new ArrayList()public void add(BallPress b) { balls.add(b)// 向ArrayList中添加球。当按下按钮,添加多个球时,都保存在这个List中。 } // 重写了 javax.swing.JComponent的 paintComponent()方法。 // paint()方法自动调用该方法。 public void paintComponent(Graphics g) { super.paintComponent(g)Graphics2D g2 = (Graphics2D) gfor (int i = 0i <balls.size()i++) { // 循环 BallPress b = (BallPress) balls.get(i)// 从List中取出第i个球, b.draw(g2)// 画此球。 } } } /** * 画出球。 * * 在 canvas上画出,color色的小球图形。 * * 属性,可用于携带画小球所需参数。 * * * * @author ducongan * */ class BallPress { private Component canvasprivate Color colorprivate int x = 0private int y = 0private int dx = 2private int dy = 2// 构造 初始化 容器 颜色 参数。 public BallPress(Component c, Color aColor) { canvas = ccolor = aColor} // 制定位置,画出小球。 public void draw(Graphics2D g2) { g2.setColor(color)g2.fill(new Ellipse2D.Double(x, y, 15, 15))// ellipse:椭圆形 } // 移动小球。 // 每次画时,先移动,再判断,再画。 // 该方法每次执行,画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。 public void move() { x += dx// x=x+dx画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。 y += dy// y=y+dyif (x <0) { // 小球已到左边框。保证,从左边框开始画。 x = 0dx = -dx// 小球横坐标变化值取反。开始反向运动。 } if (x + 15 >= canvas.getWidth()) { // 小球右边已经到画板右边。 x = canvas.getWidth() - 15dx = -dx// 开始反向运动。 } if (y <0) { // 保证,从顶框开始画。 y = 0dy = -dy} if (y + 15 >= canvas.getHeight()) { // 小球已到画板顶。 y = canvas.getHeight() - 15dy = -dy} canvas.paint(canvas.getGraphics())// 画出面板对象canvas----(及其上所有组件) // //.paint()方法,自动调用 } } /*import java.awt.*import java.awt.event.*import java.awt.geom.*import java.util.*import javax.swing.**//** * 单线程,小球演示 搜索不到,run()方法/.start() *//* public class Bounce { public static void main(String[] args) { JFrame frame = new BounceFrame()frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)// similar to // window // listener frame.show()} }

呵呵,我也是刚刚经历了面试进入了一家锋迹满意的公司,希望我的回答能帮助你。面试的话,会问你的项目多一些呢还是知识多一些呢,并不是绝对枯基侍的,这个完全要看公司,而且要看具体的没吵面试官。我经历了两次面试,还有我周围朋友们的面试,到底要不要讲项目不同的公司要求都是不一样的。

一般问项目的话,都会先让你自己讲一下,项目中用了什么技术,有什么心得,然后会根据你的讲解问一些针对性的问题。针对这种情况,我们可以采用这样的策略:1.你肯定是做过项目的(如果没做过项目肯定也不会在简历上写,人家肯定也不会问你项目的问题),那么就算做过一个也好,就认真看好这一个,把这个项目涉及的知识都看熟了,想想人家可能问你什么相关问题(就算做过多个也只准备一个就好,到时人家问你你就说自己准备的这个项目自己了解的比较多),这样的话就没问题了。

2.在面试官让你对做得项目做介绍的时候,这时比较关键,要想办法把考官的注意力往自己擅长的知识上引导,这样会对你很有利。

3.其他的,基本知识也是要多看的,尤其是数据库方面的一定要熟悉。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12233951.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存