给程序员新手的一些建议

前段时间,因负责公司的实习生计划,我花费了大量时间参与招聘工作。在此记录一些由此产生的想法,希望能给在校同学们提供参考。

在这次招聘过程中,我发现当前的在校学生普遍具有以下特点:

1. "NB"的项目经历

当谈及自己做过的项目时,我发现同学们参与的内容都非常“高端”。要么是研究 Linux 底层内核,要么是图像识别处理,要么是推荐算法,要么做高性能计算,要么做数据挖掘,要么是移动方面的协议,还有一些很高深的课题我听不太懂。

这让我想起当年我在学校里的实习经历,对比起我用 Java Applet 和 HTML 做操作系统的教学课件,或是在公司里用 Delphi/PowerBuilder 做的那些 MIS 系统,实在让我觉得有些汗颜。

2. "OK"的解决问题能力

当问到算法题时,我发现他们的问题解决能力还算"OK"。我一般会问 1 到 2 个中低难度的算法题和 1 个基本的面向对象设计题,都不难。我相信只要在学校里好好学习的人都应该答得出来,无非就是一些基本的算法和基本数据结构操作的问题,以及比较基础的面向对象设计题,说白了就是作业题。

可惜的是,统计结果如下:

  • 不到 5% 的同学能够在不给提示的情况下答出来;
  • 70% 的人可以在给一定的提示下答出来;
  • 15% 左右的同学需要提示到几乎给出答案才能答出来;
  • 还有 10% 的同学怎么给提示都答不出来。

3. "WTF"的编码能力

老实说,对于解算法题的思路,我还是比较可以接受的,因为 80% 左右的同学在给予提示后都能描述出解题算法。于是,我让他们把这个算法用他们最熟悉的语言写出来。但结果让我出乎意料:

一段在解法很清楚的情况下只需要不到 30 行代码的小算法题,只有一个人能在 10 分钟内写完,其它的人基本都需要 30 分钟左右(甚至 40 分钟),还有两三位同学居然写不出来。

有一个比较极端的 Case 是——有个同学花了十分钟都写不出“从一个整型数组中找到最小的正数”的代码。这个事让我觉得很惊讶:难道大家在做项目的时候不编程吗?

给在校学生的建议

对于这种情况,我想给大家以下一些建议:

  • 思考重于获取。我感到我们在校的学生正如"为什么中国的网页这么烂"中所说的——他们习惯于获取大量的知识,而从不对这些知识进行思考和总结。问题不是我们知道多少东西,问题是我们在获取这些知识的时候会不会去思考这些知识背后的东西?比如:为什么会有这么多经典的数据结构?数组、链表、树、哈希表、图这些数据结构主要用来解决什么样的问题?他们的优势和劣势是什么?没有思考过,就不算真正的懂;没有思考过,你将无法应对万变的问题;没有思考过,你将成为书呆子
  • 多多实践而不是研究。编程不是在实验室做科研搞理论,计算机本就是一个实践性很强的学科,这不是数学,这需要你多多的实践。我们不要真以为读的是——计算机科学(Computer Science)就是搞理论的了,这里面需要很多很多的 Engineering 的工作。(我实在是很难想像,居然有这么多人写一般难度的程序居然会是那么痛苦的事)。
  • 拒绝做“码农”。我在新浪微博里说过,我们不要以为做过项目、会写程序,我们就是程序员了。如果你只是在按部就班地写代码,你就是 Coder,江湖叫“码农”。不要把自己当成“码农”,我们一定要对自己的代码、自己的设计不停地反思和总结,并精益求精。写程序本来就是一件有价值的事,这就像写篇作文人人都会写,但并不是人人都能把文章写好。编程和写作都是一样的,这都是在搞创作啊。想做“码农”还是想做“程序员”?自己决定吧
  • 教育不是借口我们的教育的确很“废柴”,但这不是我们成为“废柴”的原因。如果我们的学习还停留在“别人给我什么我就学什么”的被动学习阶段,那么你真的不懂什么是学习。虽然,我们的学校里并没有教你什么是"Version Control",什么是"Coding Style",什么是"Refactoring",什么是"Code Review",什么是"Unit Test",也没有告诉你一些经典的设计和架构,等等,等等。但是这是什么年代了?这个时代不是像我上学那时——学校机房里上机用的电脑连内存和硬盘都没有,用 5 寸的低密软盘面对绿色显示器的 286,上网还要“猫”,而且贵得要死(一小时 22 元),而且网上什么都没有的时代了。我们身边有很多很多优秀的人,网上有很多优秀的文章,书店里也有很多不错的书,而且我们的软件开发日趋成熟,如果我们还学不好的话,那么我们就是在犯罪!

关于实习生招聘的说明

最后,和大家说一下公司的实习生招聘。这个事情其实是毕业生招聘的一个组成部分。也就是说,因为我国教育的问题,再加上学生自己的问题,导致毕业生“量多质次”的情况很严重。对于公司,其很难从学校招到一个比较不错的毕业生,这种情况已经不是新问题了,所以,也有很多公司都不招刚毕业的学生。

因此,通过实习机会了解并招聘毕业生成了很多公司的毕业生招聘手段。所以,在这里想告诉在校的同学们,千万不要以为实习计划就是字面上的实习。其实,这和正式的招聘没有什么差别,同样也要看你的能力的。

说明:本文提及的技术栈(如 Java Applet、Delphi、PowerBuilder)及硬件环境(286、软盘)具有明显的时代特征,反映了作者早期的从业背景。尽管技术环境已发生巨大变化,但文中关于编程思维、实践重要性及自我驱动学习的核心建议依然具有参考价值。