太极儒


面试经验分享之编程语言题

目录

前言

概述

编程语言题这个设定太狭隘了,应该说是偏工程类的题目,其中有些带有经验性质。出题范围大概是操作系统、数据库、网络、面向对象编程思想、编程语言特性理解和语法掌握等。相关书籍或或网络教程当然是要看的,但并不意味着你都看了就能有好的发挥,要理论、实践两手抓

对于算法工程师岗位来说,这种题目大量出现在笔试试卷中,比如概念理解啦、判断程序的运行输出啦,可以参见我的博客 《2014 年百度、腾讯与搜狐的校招笔试回忆》。在这里插入分享在另外一家公司的笔试里遇到的一道有意思的题目。

请问如下程序的输出。

一道笔试题
1
2
3
4
5
6
7
8
9
double a = 0;
double b = 99;
while(true) {
	double c = (a+b)/2;
	if(c == a || c == b) break;
	a = b;
	b = c;
}
cout<<a;

解答:

浮点数判等,会无限循环么?由于浮点数精度有限,所以这个程序迭代个五六十次就终止了,又由于 cout 有默认的输出精度,所以输出结果应该是66。

面试过程中虽然以算法为主,不过在让你纸上写代码、询问你项目经历的过程中,面试官也能考察出你的工程底子。以下我们分基础问题和进阶问题分别介绍。

基础问题

这类基础问题的引子一般是,“你熟悉什么编程语言呀”,“你平常用什么语言比较多呀”,“这个项目你们用什么语言实现的呀”。

如果不是真大牛,就挑一个相对而言自己掌握最熟的语言或最有准备的语言,不要用过啥就说啥。这么一来,无外乎 Java,C/C++,Python,PHP 等几种主流程序语言,Shell、SQL 等都是比较好的添头。就个人对算法工程师和数据挖掘工程师岗位的了解,Python、Scala、Go 很可能是加分项,如果此前没有用过,也可以在面试前学习了解,一句“正在学习”也可以让面试官感受到你的诚意哈。

总结自己在面试中被问到的基础问题如下。

  1. 面向对象编程的各类问题,多态、虚函数等;
  2. C++ 和 Java 的区别有哪些;
  3. 你用过这种语言的哪些库;
  4. 对 STL 是否熟悉;
  5. Java 虚拟机了解么,解释垃圾回收机制的原理;
  6. 线程/进程间通信如何实现,写过多线程的程序么;
  7. 大数据处理框架用过哪些(其实就算是编程语言的杀手应用吧);
  8. 机器学习、数据可视化的库用过哪些;
  9. java 中 final 的用法,C/C++ 中的 const 的用法;
  10. MySQL 的如何建立索引进行查询的,存储方式是怎样的,为什么要分块;
  11. 堆区和栈区的区别在哪里;
  12. malloc 执行的时候发生了那些事情;
  13. 正则表达式的写法;
  14. vim 中执行某项操作的快捷键;
  15. ……

这些问题想要第一次遇到时就都回答得正确完善恐非易事,主要还在于总结积累。虽然可供考察的知识点和题目变式浩如烟海,但是一定量的面试能给我们指出高频在哪里,理由有三。

  • 面试官中的绝大多数也是通过面试选拔上来的,他们在准备的过程中应该也知道常考什么样的问题;
  • 高频题目提供了可比较性,有筛选价值,而即便你背了网上的解答也可能是不全面的(我一般把网上看到的和自己的使用经验一起说,显得比较真实…);
  • 有闲情雅致给你出新题、难题的面试官毕竟是少数。

这种高频基础题都回答不好,又指望面试官怎么看你呢。所以说每次面试回来后回忆一下自己遇到的问题,如果你做出了回答,查一查是否需要修正或补充什么;如果你被问住了,那更得查阅资料学习

进阶问题

虽然我没有遇到过,但我觉得有两个例子可以表示我对进阶问题的定义。

第一个问题曾在微博上引发热议。

这种问题既开放又确定。开放在于广度,涉及到的知识点与环节很多,你可以从你了解的部分去叙说;确定在于深度,每一个知识点或环节都是扎实的,不容信口开河。

类似的问题还可以提出很多,不过我们的知识储备未必有那么深广。个人认为,相比于对基础问题的了解,能够较为完善地回答出这类进阶问题,才是 IT 从业者素质与能力的真实体现。

当然,知识的积累要一点一点来,保持一颗好奇心比功利心或三分钟热血更重要

日拱一卒,乐在学中,与君共勉

总结

用四篇文章分享了自己的面试经验,这是最后一篇。尽力之所及,恰在一个月后兑现了自己的 承诺,也算是苦劳一件。

从这四篇总结应该可以看出,本人的应试能力还是比较强的,享受过它带来的好处,也越发体会到它可能带来的弊端,那就是对技巧的追求超过了知识本身

如果不是因为面试或者考试,很多人懒得问自己为什么。一种可能的场景是,程序出错了,Google/百度出了解决方案,调通了,也就过了。就好像刷题拿了高分,错误中蕴含的价值却没学到。我也当过很长一段时间这样的人,不过后来发现有些问题重复性的犯,而有些问题有很强的相似性,自己逐渐意识到需要记录错误解决的过程、思考产生错误的原因。坚持一段时间后发现,对原因的探寻不但能够加深记忆,也能够提高自己跨语言、跨应用场景的问题解决能力。

针对面试,或者不仅仅针对面试,我想说我们也可以假想自己是面试官,在习以为常的场景中多问自己为什么,学问也都在这里头了。

最后的最后,希望我的面试经验分享可以对各位看官产生一点帮助,比如提早规划、准备;也欢迎大家的提出建议、指出错误。

面试经验分享之 机器学习、大数据问题智力题数据结构与算法题编程语言题 已经撰写完毕,访问入口如下。

本文原载于 http://frank19900731.github.io (为获得更好的阅读效果,请在PC端访问此链接),作者宋成儒,微信号 frank19900731,微博 @太极儒