本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利。
毕业生和初级程序员(一般是工作经验3年以下)大多处于事业的青黄不接的阶段,在找工作时往往会遇到缺乏实际项目经验的瓶颈,作为技术面试官,我也经常在面试过程中感受到这些候选人缺乏实际经验的缺陷。不过本人之前做过java兼职培训老师,也总结了些这批人群提升实际技能和面试技能的技巧,最近也老有人来问我这个,所以我就干脆把这写成博客文章。
1 在校大学生最好积累些商业项目的经验,这样就能形成代差优势
公司一般会录用哪类人?我们把各种答案归纳成一句:需要技术匹配而且有相关项目经验的人,再简化一下,做过相关经验(一般是指商业项目经验,说再直白点就能挣钱的项目),那么用到的技术大多和公司要求匹配,也就是说,如果你有相关经验,那么和那些光有理论经验的候选人相比,就有代差优势,所以我在面试候选人时,经常会见到二本甚至三本大学生逆袭的场景。
如何积累商业项目经验?尽快开始实习,如果可以,大二暑假就可以找个软件公司打工了,如果你有老师在外有项目,那最好也一起做,如果学校安排实习,那更得去。如果实在找不到实习公司,或者也可以去一些网站接些商业项目的兼职活。
这里请注意,一般毕业设计的分量没商业项目的分量重,那如果你就只有毕业设计的经验,那只能和同样没商业项目的这群人一起竞争了。
代差优势能给你带来什么样的好处?
1 在校招时,大多数人没商业项目经验,但你有,你的简历通过初审的可能性就非常大,而且在实际面试时,哪怕你算法基础知识等问题没回答好,但只要让面试官确信你做过商业项目,通过面试的可能性也比无商业项目的人群要高很多。
2 在通过网站等形式投简历时,很多公司实际上是要有商业项目经验的,如果你没,甚至连面试的机会都没有,但如果你有实习等的商业项目经验,那至少你通过初选的可能性就大大提升了。
2 走上社会后,在初级阶段,选定一个目标,这样项目经验就有积累
我在面试毕业生乃至初级程序员时,感觉有过实际项目经验的人非常少,(这就更验证了有经验的人相当有利),而且,这批人通过面试的可能性比3年左右的程序员要小很多。下面我来分析下这群人的普遍问题。
问题1,商业项目经验很少,所以简历甚至无法通过筛选,这样根本得不到面试的机会。
问题2,即使有些项目组因为着急要人,从而让一些初级程序员得到面试机会,但在面试过程中,这些人往往无法证明自己真的在项目中用过相关技巧,这些仅有理论经验的人通过面试的可能性非常小。
问题3:大多数初级程序员往往能通过准备,能知道算法、逻辑题和一些简单的说辞,无法证明自己掌握一些工作中必要的技能点,从而无法证明自己胜任这份工作。
上述问题的结果就是:在我手上通过面试的程序员,八成以上具有3年之上经验的,其实面试要求不难,能干活就行,但大多数的初级程序员就是没法证明这点。
针对上述问题,给出的建议是:学习和积累。
1 给自己制定一个明确的目标,工作后3年内尽量少换,否则就得从头开始积累。
2 比如目标方向是Java后端开发,那么在工作中,别得过且过,多跟组里的前辈学,多掌握些知识点。
3 一定得围绕“性能优化”这个主题,比如内存性能优化,数据库优化,多掌握些项目中能用到的优化技能点。
4 哪怕你最近不准备面试,但也得边工作边看面试题,最好定期出去面试下。毕竟每个人在学习过程中都会走弯路,用句比较流行的话来讲就是试错,通过不断的面试,能不断修正自己的学习方向。
3 来点干货,在Java Core,java Web和数据库方面,一般公司的最近标准是什么
这些也是能找到工作的最低标准,Java Core的标准如下。
方面 |
合格程序员的标准 |
集合 |
1 对于各线性表类对象(比如Array, LinketList, ArrayList, Stack, Set等)和键值对类对象(比如HashMap等),会基本的遍历和增删改操作 2 会使用Iterator,泛型,比较器等常用对象 |
异常处理 |
1会用try…catch…finally框架 2 了解各种异常的类型,比如运行期异常,数据库或者IO等异常。 |
IO |
能完成基本的IO操作,比如读写文件,读写内存,读写压缩包等 |
JDBC |
会基本的连接,增删改查预处理批处理操作 |
多线程 |
1会创建多线程,而且能通过notify, wait,sleep等的关键字,让多线程协调地完成项目里的任务。 2 会用synchronized等常用关键字,在多线程读写情况下不会产生冲突问题。 3 最好会用线程池。 |
面向对象和设计模式 |
能知道基本的概念和诸如继承,抽象类和接口等的语法 |
垃圾回收和内存性能管理 |
知道基本的概念,知道基本的System.gc等的语法,知道通过java –xms等基本的配置内存的操作。 |
Java Web方面的要求点大致如下:
方面 |
合格程序员的标准 |
JSP+Servlet +JavaBean (简单的MVC框架) |
1 会用JSP+Servlet+JavaBean这套框架编程,知道基本的MVC流程。 2 最好了解些简单的JS,DIV,CSS等前端技术。 3 知道怎么把Web程序发布到服务器上。 |
Struts方面 |
可以不用了解,因为用得比较少 |
Spring方面 |
1知道IOC和AOP的概念,知道如何使用这些技术。 2 知道Spring MVC的开发流程,能在项目经理带领下开发基于Spring的Web项目。 3 最好能了解下Spring MVC方面的一些组件。 |
Hibernate (或者ORM) |
1 可以只掌握一种ORM技术。 2能用Hibernate干些基本的增删改查等操作。 2 熟悉一些基本组件,比如SesionFactory,Criteria和Session等的用法。 3 知道一对一,一对多,多对多的基本用法。 4 知道缓存概念,最好了解下性能优化等技能。 |
Spring和Hibernate整合 |
这点上合格和高级程序员的差别不大,要求是,能整合,能配置连接池。 |
而在数据库方面,最低的要求体现在如下三方面的需求。
第一,针对一类数据库(比如MYSQL,Oracle,SQL Server等),会基本的增删改查操作,会用一些基本的函数,会编写存储过程触发器索引等工具。
第二,知道一些基本的对项目开发有帮助的概念,比如范式,索引,分区等。
第三,能编写一些相对复杂的SQL语句,比如带连接,带子查询,嵌套查询等。
在java web轻量级开发面试教程这本书里,我对此做了详细的说明。
我知道,其实大多数的初级程序员都知道上述知识点,但无法有效地在项目中证明这点,而且,我之前也说了,上述仅仅是最低要求,接下来给出的要点将大大提升各位的面试成率。
4 通过简历证明自己在项目中用过相关知识点,面试时尽量找机会说出来
这里给出些准备简历时的注意要点。
1 针对每份工作微调简历,在发给目标公司的简历中,多写些在该公司职位介绍时出现的关键字。
2 少写不相干的工作经验,任何经验都往目标公司的职位要求上靠,比如目标公司的职位是java后端开发,你写一些linux上项目维护的经验或数据库DBA的相关经验尚属搭边,但如果写上测试或实施等经验,就属于不相干了。
3 少写关于项目业务介绍的内容,因为目标公司不关心。
4 这个是关键,一定得结合业务实际,写上自己有过相关技能的经验。
比如目标公司要求有数据库优化的经验,那你就可以写,在xx项目里,对sql的执行时间有要求,所以在订单管理模块里,我用到了xx技术,实现了sql优化效果。
类似的文字要多,涉及到的项目年限也请尽可能地长。这样当筛选简历的人和面试官看到你的简历时,不由得不信你第一有实践项目经验,第二在实践经验中用过相关技术。
而在面试时,技术面试官一定会问到职位要求里的相关技能,你事先得准备。如果你能在面试过程中有条理地说出你是如何在项目里用到相关技术的,那么这样的说服力要比你单纯说“你知道“要强很多,甚至有些面试官听到你的这些叙述后,会少问或不问相关问题。
5 多准备些“你优于别人”的证据
这些证据可以出现在简历中,当然你更应该在面试中说出来。
我在面试中,往往会不得不从10个人符合要求的人里挑选出3人。(按我说10个人全要算了,但不行,预算不够)。这样如果某个候选人表现出优于别人的技能,那么这个人就一定是在同等条件里优先考虑的。
如下是Java Core方面可以准备的亮点。
技术方面 |
可以说的亮点 |
Java集合对象 |
1 能根据项目的需求选用合适的集合对象,比如知道ArrayList和LinkedList的差异,并能合理选用。 2 能在合适的场合选用WeakHashMap。 3 可以适当讲一些集合的JDK底层实现代码。 |
异常处理方面 |
能在finally从句里写释放资源的代码 |
JDBC方面 |
1 能通过PreparedStatement的预处理方法来防止SQL注入。 2 能通过批处理来提升操作性能。 3 能通过实例讲述事务隔离级别的含义 |
多线程方面 |
1 会使用线程池 2 能通过锁或信号量等手段正确地处理多线程并发时的数据一致性。 |
在下表里,我们列了些在数据库方面可以准备的亮点。
技术方面 |
可以说的亮点 |
建表 |
建表时需要根据项目的数据情况,考虑是采用三范式或是反范式。 |
SQL调优 |
1 可以通过查看日志等方式看哪些SQL需要调优。 2 可以通过执行计划查看SQL的所消耗的代价,并据此调优。 3 可以通过建索引,建分区等手段来优化SQL性能。 |
事务 |
1 可以说下JDBC或Spring里是如何管理事务的。 2 可以说下Spring里的声明式事务的做法和优点。 3 可以举例说明事务隔离级别和事务传播机制的用法。 |
分布式数据库 |
1 可以通过水平或竖直等方式的方式来拆分数据库,从而减轻对单表访问所需要的代价。 2 可以通过集群等方式来承担对数据库的过量的访问请求。 |
NoSQL和Hadoop |
这两个本身就是个亮点,如果大家用过,可以结合项目来说明。 |
下面里列了Java Web方面可以准备的亮点
技术方面 |
可以说的亮点 |
Spring MVC架构 |
1 可以说下Spring的IOC和AOP是如何优化项目结构的。 2 可以说下拦截器等Spring组件对项目的帮助。 |
ORM,比如Hibernte或Mybatis |
使用这种ORM技术时,如何优化访问和操作数据库的性能。 |
Spring和Mybatis等的整合 |
可以讲下整合框架的细节,并可以举例说明整合后的框架能很好地适应需求的变更。 |
此外,大家还可以在Linux使用技能以及项目管理软件的使用经验方面展示自己的亮点。这里请注意,一定找合适的机会“顺带”地说,如果没机会宁可别说,更不能仗着有所准备就直接自说自话地说。否则的话,反倒可能会得到“表达能力不清晰”或“叙述条理混乱”等的不良评价。
6 总结
本文涉及到的点有些广,这里来总结下本文中提到的观点。
1 在校生尽可能早地积累些商业项目的经验。
2 工作后找准发展方向,然后通过不断的面试来调整自己的学习路线。
3 简历中的项目描述应该尽量与目标公司的需求一致,在面试中也应当尽量证明这点。
4 多积累些优于别人的优势。