给程序员新手的一些建议
前段时间因为实习生计划花了很多时间做了实习生招聘的工作,产生的一些想法,写在这里。
这次招聘过程中,我发现我们在校的学生有下面的这些特点:
1)NB的项目。当说到自己做过的项目时, 我发现他们做的事都是很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分钟),有2、3个人居然写不出来。有一个比较极端的case是——有个同学花了十分钟都写不出从一个整型数组中找到最小的正数的代码。这个事让我觉得很惊讶,难道大家在做项目的时候不编程吗?
对于这种情况,我想给大家以下后一些建议:
- 我感到我们在校的学生正如“为什么中国的网页这么烂”中所说的——他们习惯于获取大量的知识,而从不对这些知识进行思考和总结。问题不是我们知道多少东西,问题是我们在获取这些知识的时候会不会去思考这些知识后的东西?比如:为什么会有这么多经典的数据结构,数组,链表,树,哈希表,图这些数据结构主要用来解决什么样的问题,他们的优势和劣势是什么?没有思考过,就不算真正的懂,没有思考过,你将无法应对万变的问题,没有思考过,你将成为书呆子。
- 多多实践而不是研究。编程不是在实验室做科研搞理论啊,计算机这本就是一个实践性很强的的学科啊,这不是数学,这需要你多多的实践啊。我们不要真以为读的是——计算机科学(Computer Science )就是搞理论的了,这里面需要很多很多的Engineering的工作。(我实在是很难想像,居然有这么多人写一般难度的程序居然会是那么痛苦的事)
- 我在我的新浪微博(@左耳朵耗子)里说的,我们不要以为做过项目,会写程序,我们就是程序员了。如果你只是在按部就班地写代码,你就是Coder,江湖叫“码农”,不要把自己当成“码农”,我们一定要对自己的代码,自己的设计不停地反思和总结,并精益求精,写程序本来就是一件有价值的事,这就像写篇作文人人都会写,但并不是人人都能把文章写好。编程和写作都是一样的,这都是在搞创作啊。想做“码农”还是想做“程序员”?自己决定吧。
- 我们的教育的确很“废柴”,但这不是我们成为“废柴”的原因。如果我们的学习还停留在“别人给我什么我就学什么”的被动学习阶段,那么你真的不懂怎么是学习。虽然,我们的学校里并没有教你什么是“Version Control”,什么是“Coding Style”,什么是“Refactory”,什么是“Code Review”,什么是“Unit Test”,也没有告诉你一些经典的设计的和架构,等等,等等,但是这是什么年代了?这个时代不是像我上学那时——学校机房里上机用的电脑连内存和硬盘都没有,用5寸的低密软盘面对绿色显示器的286,上网还要“猫”,而且贵的要死(一小时22元),而且网上什么都没有时代了。我们身边有很多很多优秀的人,网上有很多优秀的文章,书店里也有很多不错的书,而且我们的软件开发日趋成熟,如果我们还学不好的话,那么我们就是在犯罪!
最后,和大家说一下公司的实习生招聘。这个事情其实是毕业生招聘的一个组成部分,也就是说,因为我国教育的问题,再加上学生自己的问题,导致毕业生量多质次的情况很严重,对于公司,其很难从学校招到一个比较不错的毕业生,这种情况已经不是新问题了,所以,也有很多公司都不招刚毕业的学生。因此,通过实习机会了解并招聘毕业生成了很多公司的毕业生招聘的手段。所以,在这里想告诉在校的同学们,千万不要以为实习计划就是字面上的实习。其实,这和正式的招聘没有什么差别,同样也要看你的能力的。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《给程序员新手的一些建议》的相关评论
能沉淀下来做东西的人没以前多,大家都想着1:哪个学院的妞漂亮2:怎么在学院里跟老师混好关系3:考试怎么分就高了,保研指着这个了4:毕业了怎么买车买房,这个社会太浮躁
公司里也来了,几个实习生(还是学弟)。 还没毕业,却挺有勇气,想做项目,想把项目带回学校做,也想获取报酬。
从这件事上我看到,不管公司也好,或则实习的学生也好。多有挺多问题要解决的。
早起的鸟儿有虫吃,居然做到沙发了。。。
code review 是不是一个冗余的过程呢?只要你Unit test 写好了,我PASS了,那还有什么问题。
@几度秋
码字的过程中就被人抢先了。得意忘形啊!!
因为大学没有教育出刚毕业, 公司就能用的人才, 就说中国大学教育失败, 好像不对吧.
高校本来的就是要教育通用型人才, 不是为某某公司教育人才, 那样的人才是职业技校出来的.
如果一个学生在校的基本理论知识很好, 对于编程这种事, 花半来个月就OK了, 个人理解.
1)关于中国大学的教育我不多说了,你上网搜一搜就可以看到很多相关的批评了。
2)关于大学里教职业技能就成了技校,这个就是在找借口了,大学里的《软件工程》这门课如果不讲怎么控制版本,怎么做单元测试,怎么做code review,怎么做重构…… 等等其它软件工程中的最佳实践,没有实践的工程,那就不能叫工程了。
3)关于你说的,对于编程这种事, 花半来个月就OK了。这是码农的思想!根本不是做程序员的态度。
OK的理论基础的情况下,对于毕业生来说,结合理论知识大量编码,可以有个质的提高.
唉,好了好了,爷爷都是从孙子过来的
@小gau
你说的没错,每个人都有成长的过程。但是如果连最基础的编程能力都没有话,实在是让人失望了。如果做项目做的都是那么的“爷爷”,但是写代码写得那么的“孙子”,这就太让人费解了。
@小gau
说到点子上了…
> 一段在解法很清楚的情况下只需要不到30行代码的小算法题,只有一个人能在10分钟内写完
话说这是什么题目……我很好奇……
@eric
代码风格是否良好,可扩展性怎样,是否有不必要的冗余代码,甚至注释是否合理。
以上问题,你可以用你的Unit test解决吗?
我完全可以写出让你安排交接的员工无从下手的代码,但是Unit test和所有测试都能完全通过。这样的代码你敢用?
现在的社会,能踏踏实实安下心来做点事的同学,确实比较少了,但凡工作了一两年,就动不动要拿多少多少月薪,也不反思一下自己肚里有多少墨水。要么就是每天做着各种投机的想法,梦想某一天就突然暴富。
不知道博主的代码编写考试是通过什么方式,反正我对于在纸上写代码而不是敲键盘,要花一阵子才能适应转变过来。特别是在工作中穿插的面试。毕业生那种集中一段时间的面试可能还好一点。
有在电脑上的,也有在纸上的,但我倾向于用纸,因为我想看到代码修改的痕迹,从此来了解应聘者编码的过程。用纸还是用键盘,这无所谓嘛。因为代码足够的简单,我在让他们写代码的之前已经把整个算法描述得很清楚了。
@陈皓
我们学校的《软件工程》课还真没教这些东西。。。不过都要自己学的,靠老师,笑话吧
也对博主题目的深度很感兴趣,难了别说毕业生,有经验的都经常写不出来,另外纸上写代码也确实需要适应。简单了的话,我都是在想不出能有什么说错的可能。
@松暮囧
是啊,这本来应该是学校要教的东西的。现在,这样的东西在网上一搜一大堆,不像我那个时间,是用错误一点一点地积累起来的。靠老师真是靠不住,因为老师也不懂。
@天堂的隔壁
很多人都说在纸上写代码不适应,这点我非常理解。所以,如果面试者不适应的话,我就直接给他我的电脑上有IDE,也有代码的自动提示。我的观察是——在纸上和在电脑上写代码基本上都是一样的,要难产一样的难产,如果编码的思路混乱,在那里都是一样的。
中国在最重要的本科教育上过于失败,而且是在各个方面,课程设置、教学内容,就是最基本的做人规范也没教好。 到了研究生就更悲剧了,本科没学好的东西统统要到研究生来补。最典型的就是编码能力,基本你编码做的好,就有人喊你大牛了。本科计算机的有的还好,要是电子通信什么的,大部分是0经验。实验室并不是每个都是编写代码的,老师要出论文,你也要出论文,分到学术项目天天看论文写ppt,出去后肯定是不会写代码了,因为在这种情况下用的最多的是MATLAB。
看来下次回答问题要小心了
前两天看关于教改的《头脑风暴》,高校的老师们都一致认为中国教育失败,这是三方面原因:高校商业化,行政化;老师不看重教学;学生不爱学;
就实践环节,我觉得还是靠学生自己吧,技术方面的东西,需要勤奋+实践。
主动一点,收获多一点。
说到底还是真正对技术有兴趣的人太少,都太浮躁,当年在校园里面我也是这样,浪费了不少青春,希望同学们能珍惜在学校的宝贵时间,能够沉下去多学点东西。老师不是用来靠的,什么都得靠自己。
补充一下,千万不要怨天尤人,教育环境不好,但是在互联网时代,这不是大问题,还是在于自己的主动性;
也不要漠视这个问题,觉得不太严重,就是因为是互联网时代,技术方面竞争越来越激烈,因为资源对于所有人都是均等的,需要有紧迫感,反过来讲对所有人也都是机会。加油各位!!
我觉得有几个问题应该问学生:
你想不想以编程为长期职业
你平时课余时间是否编程
你喜欢哪些技术书籍
你编程时常用的工具是什么
你是否能够适应没有自动提示的编程环境
@eric
《软件随想录》中第二部分的,关于Windows Vista那段,我印象很深刻,建议您去看看。。。
我也是大三结束,准备找实习。情况跟文中说的差不多。现在看来这些建议都是很中肯的,但当年却不以为意。悔之晚矣。对于大部分人来说,环境的影响还是很大的,牛人毕竟是少数,一个人摸索太难了。我希望能用大四一年的时间在工作中锻炼,不知道能不能找到这样一个机会。
订阅里挨着这一篇就看到这个. Forget about the tools … buy a decent book and type in the programs by hand. One at a time thinking as you go. After 30 years you will get the hang of this and be a good programmer.
@陈皓
嗨 博主,请问是在北京招实习生吗?
我想自荐可以吗?就看看我简历。我是搞LINUX C方向的。现在在自学着python。
最近投了些简历,都是没有消息。暑假觉得是时候出来练练手了。
@0x73756e7573
我觉得我那3点还行吧。起码有coding style 能 自己用git管理项目。有自己的github :D
any chances?
其实大部分学生都太懒。我读书那会也是,真的愿意花时间实践的只有一小部分学生。
现在的毕业生,技术上NB的,都是自己学出来的,如果跟着学校的步伐走,出来充其量是码农,甚至更多连码弄都够不上。
BTW:博主现在还收实习生吗?可以的话我想去试试呢。
编程能力NB的人根本不在乎是用纸还是用IDE,而且我相信博主考察实习生的编码能力也不会特别专注于某个API调用是否正确之类的,基本上用纸的话伪代码OK就行,IDE的话有自动提示,可能需要编译通过⋯
ACM比赛都是两人一台电脑,空出来的那个人一般都是用纸,本科的时候在教室上一些无聊的课,我都是把代码打印出来带去手动Debug,而我所认识的NB的业内人士,貌似都经历过这么一段手动Debug的过程。
企业招的是能解决问题的人,理论知识再厉害,解决不了问题的理论就没有任何意义。理论和实践结合才是王道。
至于软件工程的那一套,我比较不能理解为什么会有学校不教?我们学院当年所有课程设计都要求直接上svn,最后项目答辩的时候要求从svn里面check out出来现场编译执行。
代码风格这种东西真的是因人而异,而且阅读别人的代码也是程序员修炼的必经之路。实际项目中往往都会对编码风格做一些响应的规范,遵守Team的规范就行了,要真的自己随便写的话我保证立马开除你。
还是盛赞博主的观点。
对于那些手写能力严重退化的人来说(比如我),在纸上写的感觉和电脑上的感觉很不一样的。。。比如我习惯先把括号配对然后再在里面写内容,比如我有时先写几行注释作为伪代码然后再一步一步替换为实际的代码。。。不过对于那些无需调用api的代码如果写的时候很依赖于自动完成那就不好了。。。
我自己的一些迷茫,一名刚毕业的大学生走入社会时的迷茫。
我是一个刚毕业的大学生,毕业于一所985、211大学,不过由于学校太低调,离开东北就没有人听过我们学校的名字。
在学校期间参加了一年的ACM/ICPC竞赛,使用语言C/C++。学习了包括模拟、搜索、动态规划、图论等算法。虽然算法学的不深入,但每种算法都独立编写过完整的代码。仅此一项比赛编码超过一万行,保留下来的大约有7千行。
离开ACM/ICPC集训队以后,开始学着做软件,使用Qt库,独立完成了一些极其弱智的小游戏(如俄罗斯方块、贪食蛇什么的)。
后来学习Linux、bash,gcc、make,但学的都很肤浅。
后来又创立了名叫“地瓜皮”的项目,挂在了github.com上(http://lexdene.github.com/Dlut-Game-Platform/)。目前在这个项目里面提交代码6783行。
刚毕业,没见过世面,可能会很狂。我刚离开学校的时候,真的觉得自己很牛逼。
可是一次面试,我却备受打击。
第一次面试,应聘算法工程师。面试官提问了两个问题我都不会。一个是关于外部排序,一个是关于广义表。在ACM/ICPC的比赛中是绝对不可能涉及到这些算法的。后来,我说我懂一点Linux,懂一点bash、gcc和make。结果面试官问我关于服务器管理的问题。我用Linux完全是桌面应用,几乎没有服务器管理经验。
现在沦落到大连一家做精密检测仪器的公司扫地。说是实习,实际上每天的工作就是扫地。
突然感觉自己的生活没有了方向。
我该怎么办?
@陈皓
你希望刚毕业的学生, 就有丰富的编程经验, 那本身就不大可能…. 如果理论知识过硬, 逻辑思维好, 编程的技能是可以很快提高的, 当然需要多多实践. 你不能说学电子专业的, 不会修电视就说人家大学白读了吧!
关键的问题在于中国学术太假了….
@Gaser 大家都要吃饭。这能乖谁?!不管是程序员,还是码农首先是生存吧?!
“码农” 这个词谁创造的? 如果说编程类似于培育庄稼, 那再恰当不过. 哈哈
@elephant_liu ACM是锻炼编程能力的一种途径,但除非你能用这些比赛算法来解决实际问题,否则就是白搭。
国内对Linux的桌面端基本没啥重视的公司,基本上都是后台服务端用Linux比较多。
看代码行数貌似还过得去,但远远不够,仔细分析一下这些代码中有多少是可以合并的,多少是封装不够好的冗余代码,多少是注释,多少是所有逻辑都跑不到的?
首先想清楚你想要做什么方向的?服务端?前端?客户端?手机移动应用?企业计算等等,在自己想做的方向上多花点时间,然后把简历投给合适的公司。
扫地没啥不好,每一家IT公司都有一个默默无闻的扫地阿姨,会在偶然之间,经过你的电脑,抬头说了一句,“小心,栈溢出”⋯
千里马难寻?伯乐更难找啊!
博主扪心自问,是否有一个识才得慧眼?如此众多的毕业生中,总有这么几个略加点拨,即可成才。关键还是在于你自己呀。
本人深有体会。总有这么几个本不大看好的人,给他个机会,略加指点,结果反而是最出色的那么几个!
@陈皓
我觉得当我们攻击一种观点的时候,不应该提升到攻击持有观点的人本身,虽然我在两种观点中更倾向于博主,但是还是认为您最后两句话说得有些过了
@Radoy
单指您七楼的回复
@Radoy
谢谢你的意见。的确看上去有点太猛了点,我把其调柔和一些。
另外,我表达的时候只是想调侃一下,不过看起来有点刻薄了。可见,我对心中想法的encoder和大家对我文字的decoder不是配套的。呵呵,我的encoder还需要改进。
@陈皓
要不博主在开发一次收简历,让我们几个评论里想去实习的同学投投简历看看:>
@elephant_liu ,“一所985、211大学,不过由于学校太低调,离开东北就没有人听过我们学校的名字”,哇,大工校友啊。继续努力,Good luck。
@elephant_liu
看到了很多的回复都是求职的哈哈。
elephant_liu你可以南下试试,北京,杭州,广州深圳,还可以继续往南到赤道澳大利亚南极,很多牛逼的程序员二十几岁时职业都是混混。
@eric
只是通过 unit test 的要求太低了。能通过 unit test 不能说明一切。代码可读性是不是好,是不是容易维护,等等很多方面都是需要 code review 的。
我很想了解博主出的是啥题目,可否透露下?像我常出的题目就是字典分组、搜索最大最小值或者设计一个标签系统等等,我觉得这些都不难但很多知识点都是比较常用的。
UNIT TEST做得好不好,到不到位,全不全面,在实际操作中很难像理论本身那样明确。以我的经验,往往UNIT TEST以得到一些浅层的、直观的BUG为主,适合在单元功能刚出来的时候进行一个基础的逻辑测试。况且,代码风格好不好,是不是最优解法,这些东西是UNIT TEST很难去验证的。code review我觉得反而是比UNIT TEST更贴近本质的质量控制方法。
@陈皓
我更喜欢用记事本来写,如果面试官给出vim,那就更好了。
用纸来写的话,很多时候硬件已经决定了算法的线性编写,而我自己写代码,在编辑器里可以不用线性顺序编写,这两者差别还是很大的,需要时间适应。
当然,纸和笔还是很重要的,对于算法思路的整理非常方便,因为可以随意的组织结构。
大连理工吗?现在名气还可以吧,不过大连理工的985是后续批次,含金量是没办法跟哈工大这类早期的985高校相比的。说实话,学校出身只是在你刚毕业的时候给你点便利,进入职场超过3年以后,学校出身对你的影响就微乎其微了。
嗯,这个还是深有体会。
有时在想,是不是招聘也有八股的味道,前阵子参加我们学院的就业经验交流会,师兄师姐说只要把程序员面试宝典搞懂,面试就不是问题。如果真的是愿意招到优秀人才,招聘方式是不是可以改改。
就拿我们实验室的来说,很多同学对于学习和工作都不是很积极,导师安排的任务,能拖就拖,大家能够想像的出是什么状态。对生活都不够积极,何谈干好工作
但是像师兄师姐说的,一本程序员面试宝典在手,怎么就能区分出优劣呢?
@elephant_liu,也许只是你没找对公司而已,不同的公司、不同的岗位,对程序员的要求都是不同的,而且不一定是“层次”的不同,也可能是侧重点不同。例如如果你熟悉在linux下用qt开发桌面软件,那么对于那些招后台开发的人来说这个能力就没有太大意义,但是对于那些做基于linux的智能手机的岗位来说则有可能会有加分。不要在妄自菲薄和妄自尊大之间摇摆,淡定……
@elephant_liu 校友啊,祝福一个。出去闯吧,大工人前途无量。