关于应届生项目经验的思考
关于应届生项目经验的思考
关于应届生找实习、找工作时项目经验的一些思考。
为什么要有项目经验
功利地说,去面试的时候,如果你一个项目也没有,面试官会觉得你并不是很喜欢编程这份工作,导致面试的时候无话可谈,如果有项目的话,往往会针对你的项目提一些问题。 非功利地说,大学四年,没有拿得出手的项目,没有写过几万行代码,实在说不过去。林纳斯在大学期间鼓捣Linux就是一个典型的例子,热爱编程的人不会缺项目。 但并不是所有的项目都适合拿去面试,这里,我想谈的就是校招面试时,什么样的项目称得上好项目。
什么是好的项目经验
我首先总结了好项目需要满足的要求:
- 有足够代码量(需要用软件工程、设计模式来架构、解耦等)。
- 涉及重要知识面(网络编程和数据库、安全性和高并发)。
- 与目标岗位联系紧密。
- 能切合市场需求或受到开源社区关注(加分项)。
下面是我暑期实习的简历:
现在看来,都是一些不够好的项目。下文具体分析:
有足够代码量
为什么要有足够的代码量?以一个贪吃蛇游戏为例,可能就1000行左右的代码量,很多人半天就能完成。这就不是一个好项目,因为它太简单了,你能写别人也能写,没有自己的特色。而代码量大则意味着整个项目花的时间也多,可能半年,愿意花半年完成一个项目的人,没有人会怀疑他的编程热情和编程基础。 其次,很多问题5000行以下的代码是看不出来的,当代码量越来越大,整个程序肯定会出现很多耦合、很多功能重复的代码,这时候,你就要用设计模式的知识来解耦、重构你的代码来消除重复。这是非常有意义的,试想别人面试时谈如何实现一个功能,你谈的却是整个项目的架构,孰优孰劣、立判高低。
涉及重要知识面
什么是重要知识面,我认为从企业的角度来说是网络编程和数据库。但这两个恰恰是在校生最容易忽视的。举个简单例子,我工的计网和计网实验都只讲理论和硬件,我自己有想法写了个IPv6抓包程序才算接触了一点网络编程,其他人基本没有;数据库则是非常形式化地检查一下基本的SQL语句操作。所以,这两块知识点对于大部分人来说都只是停留在理论层面。再者,我们学习编程,都是在电脑本机上写一些简单的程序,不会与其他主机交互(网络编程),也很少涉及到大量数据的持久化存储(数据库),我们大部分时间停留在这样一个舒适区内,有意无意地忽视了其实大部分程序的主要部分都是在和网络和数据库打交道。比如QQ、微信他们需要通过网络及时传递消息、提供可靠的视频通话,又或者他们要在服务器端存储聊天记录等数据。可见,真正生产环境下网络和数据库非常重要,但很多人没意识到。 而安全性和高并发更是离大部分应届生很遥远。很容易解释,我们的程序基本在本机运行,不会担心有人攻击(安全性),我们的程序也不会像微信那样在除夕夜处理几亿用户同时发红包、又或者像淘宝那样在双十一处理几亿单交易的同时提交(高并发),我们最多看到每个学期抢课的时候,教务处会登不进去,所以我们很容易忽略高并发的问题。 所以,如果我们的项目能涉及到数据库和网络方面的知识、在安全性和高并发方面有所考虑,那绝对是一个优质的项目、是一个能打动面试官的项目。 以我的简历为例,我觉得最难、最有料的就是ToyPascal编译器,他涉及了编译原理的很多知识点,代码量在10000行,大量使用了设计模式进行解耦,但就面试来说算不得好的项目,原因很简单,虽然编译原理也是计算机专业核心课程,但并不是企业最需要的(除非这家企业就是做编程语言相关的),编译原理可以算是程序员的自我修养,但和企业的业务关联并不紧密,而且正因如此,工作多年的面试官也已经不太熟悉这方面的知识。所以,我几次面试发现,几乎所有面试官都不会详细追问这个项目,即使这个项目真的很不错。
与目标岗位联系紧密
这个很好理解,拿C语言的去面Java岗,相信没人会这么做,这是常识。一般企业希望你入职后能尽快熟悉业务,你所做的项目与岗位联系越紧密,面试成功的可能性越大。
能切合市场需求或受到开源社区关注
如果你做了一个APP,面试官可能会问,这个APP的用户有多少,有用户就要考虑安全性,用户多就涉及高并发,前面已经提过,用户数量间接体现了你的项目价值,而在此基础上如果很好的处理了安全和并发,面试官很难拒绝你。 以我的大工助手项目为例,这个项目就有几个问题:缺乏用户,没有重构代码,没有考虑安全和高并发。我半年前完成的时候觉得看起来很不错,但是面试官的技术水平更高,他关注一些本质的东西,所以我这个项目就算不上一个好项目了。 一个项目,能受到开源社区关注是需要实力和机遇的。比如一些著名的开源软件,大家争相学习,自然有关注度,这是项目发起者的实力;又比如,前不久Google宣布Kotlin成为Android官方语言的时候,一些翻译Kotlin书籍的项目火了,翻译这些书不算难,但谁抢占了先机,谁就能获得更多的关注并形成良性循环。我们做一个项目,再开源出来、获取关注,周期很长,但是也有一些曲线救国之策。比如,在知乎或者其他程序员社区发发文章、写写回答,然后借机宣传一下,贴个GitHub的链接,又或者在一些大平台(知名公众号)投稿,也能迅速获得关注。前提是自己实力过硬。
关于项目经验的其它问题
什么时候做项目
一般来说,在大三下(3、4月份)就有实习招聘,大四上(9月份)就有正式校招,一般要提前6个月,才能拿得出符合以上4点要求的项目。
做项目是为了什么
我觉得做项目的本质还是为了提高自身实力,无论是自己做,还是团队协作,本质都是提高水平、实践理论,为了找工作去做一个项目,只注重形式而不能从中学到知识,毫无意义,而且往往面试官一问就能判断你项目的质量和你本人的水平。一定不要面向面试编程。