非好学校科班出身的程序员,该如何快速提升自己
目前一般的大点的公司,往往会在招聘时(尤其在招聘3年以下工作经验的程序员时)会设置学校的门槛,比如需要211或985相关专业毕业。这里我无意贬低不在这个范围的程序员,相反在本文里还将根据我所见和我所闻,为这些同学给出发展的建议。
首先我用我的切身体会给大家予以足够的信心:我最近呆的都是一些不小的公司,虽然在招聘时有上述的门槛,但事实上,在3年左右的正式员工里,大约30%是一般学校,或非科班出身,在外派的员工里,这个比例会高到70%左右,而且,每个组平均每年有3个左右转正的名额。所以,出身一般的程序员,只要有足够的勤奋度,而且方法得当,绝非就一定低人一等。
恕我直言,在学校和学历方面稍微欠缺的同学里,我有见过能力很强的,但平均综合能力确实不如好学校。(这里如果我说高于好学校,说出来也没人信)。 不过对于勤奋的同学来说,并非是能力不行,而是努力的方法和方向不对。对于这批敬业勤奋的同学,我非常敬佩,所以在这篇文章里,我将专门分享些相关的提升技巧。
1 战术上要重视,分析为什么大公司要设置学历和学校的门槛
平心而论,为什么有这样的设置呢?第一,能进好学校的同学在之前的学习过程中已经证实了自己“综合能力强“这个特质,第二,好学校毕业的同学,一般基础能力比较扎实,比如数据结构算法操作系统编译原理等,不仅理论经验,不少还有实训经验。
在前进的过程中,我们必须认清自己,所谓知己知彼百战不殆,但认识自己绝非是让我们妄自菲薄,而是明白自己的短板,归纳一下,在招聘时,一般会对这批程序员重点考核如下的要点(这其实就是目前普遍存在的短板):
1 是否有实际的商业项目经验?
2 基本功是否能达标?比如是否熟悉链表Hash表的基本数据结构,是否熟悉排序等基本的算法。
3 学习能力,团队协作能力以及责任心等是否达标?
其实归根到底就一点:如果程序员在大学毕业前,有过实际的项目经验,比如做过兼职,或在学校里帮老师干过商业项目经验,这能一定程度上弥补学历学校和专业方面的劣势,而且,如果做项目的时间足够长(一般1年左右),而且项目里用到的技术和公司职位需求比较匹配,而且候选人动手能力强,一些规模不大的公司甚至会忽视学校等方面的因素。
2 如何通过第一份工作,让自己有个不差的起点
程序员在踏上社会后前两年的发展,会比较重要。这里给出的建议是,如果你感觉学校和学历会成为障碍,可以找个规模一般但干的活和你的职业发展相关的工作,如果万不得已,不得不干销售等之类的工作,但一定得让自己干点和编程相关的事情。下面给出些我见到过的案例。
案例1:小A本科毕业后,学校一般,能力属于中下。不过他找了个外派公司,外派进了一个规模比较大的公司,在其中发展了2年,用项目经验冲淡了学校的因素,后来就跳槽进了一个大公司,从初级开发做起,平时也经常学些知识,目前在升级到高级开发的路上顺风顺水。
案例2:小B学校一般,也大专学历,但在大三期间已经在软件公司实习,积累了一些基本的开发能力,毕业后就凭此顺利进入到一个中型公司做开发,至少能在社会上站稳脚跟。
案例3:小C大专学习,专业是理科,但和软件关系不大,后来参加一个软件培训,积累了些技能,目前至少也能在公司里做软件开发的活。
在这个案例中,我绝非说一定得通过培训学校,其实在培训学校是用钱买时间买学习方法买项目经验,如果你自己毅力足够,靠自己看视频运行项目,也能达到类似的效果。
案例4:我在面试时就看到不少简历,候选人学校学历都一般,3年后,绝对有能力挑战大公司的职位,而且公司更看重这些同学靠前3年工作积累的项目和技能经验。
总结一下,如果学校学历都一般,那么该采取哪些措施呢?
1 最好在毕业前,进入软件公司实习。这可以靠学校推荐,更得自己去找。学校里的一些老师,会和外面公司合作,大家就可以找这些老师干活。或者就到处投简历,工资看着要,以积累项目经验为主。
2 平时可以适当放松娱乐,但就更得自己了解项目经验。比如,通过视频等方式,自己搭建一个框架,或者用python搭建一个数据分析平台,这种案例多多益善。
3 准备简历时,一定得增加商业项目的经验,同时靠刷面试题积累面试经验。
这里也给大家交个底,我在上海,上海软件公司数量多不胜数,往往一个楼里就有5,6家,而且,小型或中型的公司,出于节省成本的考虑,往往只会看项目技能和基本功,不怎么看学校和学历。其实每个城市都一样,所以要找工作,或者是不差的工作,绝对没问题。
3 只要勤奋了,任何时间点都不算晚:论时间的安排
在龟兔赛跑里,最让人痛心的不是兔子在中途睡觉,而是乌龟自暴自弃。天道酬勤,但如果自己都失去信心或贪图玩乐,那真就没人能帮你了。
在上文里提到,在学校里,就该去积累项目经验,或自己通过运行代码熟悉框架技能。不过如果已经不慎错过学校里的时间,但现在想迎头赶上,只要努力了,什么时候都不晚。
这里给出些关于Java方面自学的途径和时间点。
表 第1个月的学习进度
学习时间 |
要学的技术 |
应该达到的水准 |
第1周 |
搭建Java环境,熟悉基本语法 |
安装好JDK,Eclipse或MyEclipse开发环境。能运行出第一个Java程序。最好还能熟悉int之类的基本数据类型和一些加减乘除等基本运算。了解Math等常用的类,了解if分支语句,了解while,for等循环语句,能用开发出诸如计算闰年或累加和之类的小程序。 |
第2周 |
基本的面向对象语法 |
了解封装继承多态等的语法,知道面向对象的基本概念,但此时不必深入。这部分内容对应本书第2章。 |
第3周 |
Java集合部分的内容 |
知道List,Set和Map等对象的用法,知道泛型的用法,而且知道诸如hashCode等的常用知识带你。这部分内容对应本书第3章。 |
第4周 |
异常处理流程和基本的IO处理流程 |
知道try…catch…finally的工作流程,知道基本的IO读写操作。会结合异常处理流程开发一些读写文件读写内存等的程序。这部分内容对应本书第4章。 |
在第2个月里,大家可以在掌握上述知识的基础上深入了解Java Core的高级知识点,并可以进入Java Web初级阶段的学习,这个时间段的学习进度如下表所示。
表 第2个月的学习进度
学习时间 |
要学的技术 |
应该达到的水准 |
第5周 |
搭建数据库环境,熟悉JDBC编程 |
安装好MySQL等数据库环境,会通过JDBC编写诸如读写数据库的操作,而且能掌握批处理和预处理等操作。最好能会和事务相关的操作。这部分内容对应本书第5章。 |
第6,7周 |
多线程编程 |
能用多线程协作完成一件事情,掌握至少一种控制多线程并发的技巧(比如Lock),最好能掌握线程池。这部分内容对应本书第7章。 |
第8周 |
基本的Web技术 |
能开发并运行基于Jsp+Servlet+JavaBean+DB架构的简单项目,并了解其中的一些重要技术。 |
在第3个月里,大家可以深入了解Java Web里比较资深的框架技术,比如Spring MVC和ORM等,这个阶段的学习计划如下表1.4所示。
表 第3个月的学习进度
学习时间 |
要学的技术 |
应该达到的水准 |
第9周 |
Spring的诸如IOC和AOP等基本概念 |
能运行通IOC和AOP部分的代码,并能结合代码知道诸如AutoWire等的重要知识点。 |
第10周 |
Spring MVC框架及其基本流程 |
能通过一个简单的Spring MVC程序了解它的组成结构,并了解其中各部分的开发要点 |
第11周 |
ORM技术 |
了解Hibernate或ibatis的基本开发模式,知道如何通过ORM和数据库交互。 |
第12周 |
Spring MVC+ORM框架 |
能运行通一个简单的Spring MVC+ORM框架的案例,并大致了解这种框架里各部分的开发要点。 |
本人一直在上海上一个为期3个月的政府补贴的Java培训班(具体名字就不说了,有打广告嫌疑),就按上述时间点要求学生(不少还是零基础的),经实践下来,不少同学上完后至少能出去面试初级程序员了。
换句话说,只要你肯了,大概也就3个月的时间(基础稍微差的同学最多5个月,如果上心点的,估计也就2个月),即能达到初级开发的水平。
我之前听过一种说法,说Java培训学校量产初级开发,根据我所见所闻,不无道理,而且量产对象,学历甚至可以是高中,读过计算机大专的,也寥寥无几。相比之下,学校一般的同学基础要好得多,更应该有能力和信心快速提升自己。
4 看下程序员的基本功,其实自己也能在工作后弥补
这个大家可能有个认识误区,好学校高学历的毕生生在工作后有优势,并不是他们多学了几门课多会了几个知识点,而是在这些学校里,项目实践的机会比较多,实习机会也好找。换句话说,基本功比较强。
什么叫基本功(俗称内功)?分两块,第一是知识类的。 大学里学的课不少,但实际对5年内程序员工作有帮助的,可能也就以下的内容。
1 数据结构知识,而且仅限于数组,链表,堆栈,队列,Hash表和树等知识,图的知识不怎么用得到。
2 算法,用得最多的也就是排序,遍历(树链表等)。
3 编译原理中的状态机思想。
4 网络通讯里的网络协议知识点和通讯包的发送流程。
5 操作系统里的一些知识点和算法。
6 Java等编程语言,学校里一般会更多地偏重知识点,而实际公司里,要求更多的是动手开发能力。
大家可以看下,这些其实不怎么难学,这也是为什么非软件专业的同学能转行,以及培训学校能量产程序员的原因。至于说,基础理论知识阻碍了程序员升级,比如某程序员由于不熟悉Hash表数据结构从而导致缺乏优化能力,这不是程序员没经过大学里基础课的培训,而是在工作后,没有主动弥补这方面的知识点。
基本功另外一类是关于技能的,分为如下几个层次。
1 调试代码的能力,比如边上没有人,你能自己通过debug把代码调通。
2 能山寨别人代码的能力,比如你要实现一个JDBC连数据库的功能,自己不熟悉JDBC的操作,但你可以从网上找段相似的然后改改实现。
3 学习的能力,比你是做后端的,但需要实现一些基本的前端功能,这你要能通过看资料快速上手。
4 搭建环境和框架的能力,小而言之,在linux上搭建mysql等zookeeper,大而言之,搭建一个nginx+zookeeper+dubbo集群的能力。
5 能通过看日志排查问题的能力,比如日志在linux上, 你能通过grep, less等命令快速定位问题。
6 这个可能比较难点,叫解决问题的能力,比如目前系统性能一般,你得能通过压测,看日志等手段看出问题点,然后动手解决。
从上述描述里,大家可以看到,这些技能上的基本功,在大学里能得到锻炼的很少,很多都是在工作后慢慢积累的,也就说,哪怕学校一般,学历一般,在工作中绝对是有机会迎头赶上的。
5 如何自己弥补基本功
那么初级程序员该如何提升自己的基本功?实践是最重要的,重要程度没有之一,具体来讲,怎么做呢?
1 入门阶段,先买本书,建议是纸质书,这样阅读效率更高,下载代码,边运行代码边看书里的解释。
刚开始不知道买哪类书怎么办?一般能通过出版社审核的书都不会差。比如就拿Java后端方向,买本Java Core的,一本Web书(含SSM框架),数据库的书也可以买一本。由于边运行边看,所以最长3个月能把代码运行通。
2 在这三个月的过程中,也可以看些视频,视频里一般会含代码也代码的配置步骤。
3 理论略过,着重看代码运行。运行代码时一定别先自己动手,因为刚开始能力弱,自己动手一定会遇到很快坑,这样多遇到几次调不通,信心就没了,就会不了了之了,记得,刚开始时最多可以在运行通的前提下改别人的代码,以验证各模块和各参数的效果。
4 在看的时候,初级程序员往往会多看些平时用不到的知识点,所以在这个阶段,可以去看下别人培训班的课程体系,或者看些面试方面的书,这样就知道哪些知识点不怎么用到,这样能节省学习时间。
这样看书看视频运行代码持续3个月后,就具备动手调试代码和搭建环境的能力了,然后就有进软件公司干活的能力了。在这个时间点上,再了解上文提到的算法,如果可以,再通过Java等语言,按数据结构书里的代码运行一下,了解下基本的数据结构和排序等算法,这样能力甚至会高于一般学校软件行业的毕业生了。
6 在做项目时,有意识地积累些值钱的知识点
通过上述方法积累些理论方面的经验之后,就得通过做项目来积累实战经验了。很多时候,在做完2到3个项目后,非科班出身的程序员和好学校科班出身的程序员动手技能实际上就差不多了,这个时候就得注意积累些“值钱”的技能点了。
第一,尤其得注意调试问题的能力,比如一个模块代码开发好了,怎么通过dubug或单元测试的手段,验证模块没问题,或者出现问题了能知道怎么解决。
第二,能通过SQL语句看数据库,以及通过看日志等手段,了解程序的运行流程,看下是否缺少功能点,或者出了问题能据此解决。
第三,架构方面,这可能刚开始有些难,但可以采用MVC的思路,比如看下前端的请求怎么通过控制器,控制器如何把请求发送到后端,后端做好以后怎么返回。在此基础上,可以看下分布式部署的实现方式,比如反向代理,分库分表等方式。
第四,一定得掌握些调优的手段,主要包括SQL语句调优(看执行计划)和JVM性能调优(通过Jconsole,Dump等手段)。
如果有机会,再了解些大数据分析, AI等当前比较值钱的知识点。
不过,很多程序员会仅仅停留在“代码“ 层面,在此之外,大家可以更开阔思路,掌握些项目管理部署和发布方面的技能。
1 项目管理方面,比如可以用敏捷开发的模式,大家可以了解下敏捷开发的流程。
2 比如项目用Maven管理jar包,在此基础上用jenkins打包部署,这个流程细节,大家可以掌握下。
3 java项目开发后,一般会打成jar包或war包,部署到tomcat服务器上,在此基础上还可以做些负载均衡等方式,这块配置步骤,或者tomcat等的细节,大家可以掌握下。
总之,不论是哪类程序员,掌握了上述技能,并能在简历和面试中充分证明这点,
7 有实践性的进阶路线
工作2年后,如果注意积累,好学校和一般学校的程序员差别一般就不大了,可能这时候仅仅剩下“学校名“的差别了,不过话说回来,工作2年后,还得靠学校名来证明自己,这未免也有些可悲。
这时候,思考的出发点就应该从“如何站稳”转变为“如何更好的发展自己”。这时,视野就应该从一般公司升级到大厂了。
如果你想积累技能经验,可以刚开始选择个互联网公司,在其中体验下这类公司的开发氛围后,就再想办法进BAT。现在,外企的吸引力未必有前几年那么强,不过也是个好的选项。或者,也可以选择个国内大点规模的公司发展,比如证券金融类公司。
如果你能直接进,那最好,或者还可以通过外派的方式进大公司,这样干个两年,或者有机会转成正式员工,或者这个时候就有资历直接进大厂了。
8 总结,版权说明和求推荐
原本打算在周一时就发表本文,但本周公司事情太多,又在整理另一本书,所以延迟到周五。不过在这段时间里,我天天回顾文本,也加了些内容,所以“延迟”总算也有些价值。
总结下,如果要迎头赶上,第一得靠信心,不妄自菲薄,第二得靠勤奋,笨鸟先飞,第三得靠方法,所谓事半功倍。
本文里提到的方法和技能,如果能对大家有所帮助,请大家帮忙转发,或者点击下面的按钮来“推荐本文”,或者通过评论来参与讨论。
本文欢迎转载,不过请注明文章来源,同时给出本人写的两本书的连接Java Web轻量级开发面试教程和Java核心技术及面试指南。
再次感谢大家读完本文。