话题开始之前,请先容我哀悼一分钟。
1,2,3…60,好了,一分钟过了,我又凑多了几个字。
毕业三年了
哈哈,开个玩笑。
之所以写这篇文章,也是最近才觉察到自己已经毕业三年了,从2017年6月30号算起,整整三年多的时光。时间不知不觉地飞逝,转眼之间,我也从一个青春少年转变成了一个老油条,额。。。说老油条好像早了点,那就叫中油条吧。
记得当初校招找到工作之后,我热情满满的对自己的未来做了详细的规划,像什么三年升高级,五年做架构师。如今看来,这一切也只不过是一个初出茅庐的小白的自我陶醉而已。当然,每个人都会有年轻的时候,毕竟刚出校园嘛,对未来有幻想是正常的,可幻想过后终究还是要面对现实,不得不接受自己就是一个菜鸟的设定,接受自己就是一个普通人的设定。
学历一般,能力一般,一个没有天赋的农村小伙能跟别人竞争的最大优势可能就只有奋斗了。毕竟,再差的菜鸟也有成为老鸟的一天,这三年的时间里,我也许没有做过什么特别有价值的事,最大的价值也唯一算得上价值的可能就是我这三年以来的从业经验了,三年的时间说长不长,说短不短,但我可以信誓旦旦的说,比起刚毕业的时候,我对自己所在岗位和行业的认知都上升了一个高度,也正是从业了三年的原因,让我开始明白为什么如今很多公司的社招岗位普遍要求要三年以上的工作经验。
为什么是三年
为什么是三年这个时间段呢?不是一两年或者是五年?
我个人认为,三年是一个小坎,对于工作流程的熟悉度和岗位需要的协调能力都有一定的积累,简单来说,就是可以直接上手做事,不用花太多时间去调教。
比起一两年的求职者,三年工作经验的人对工作的熟练度更甚,跟其他同事协作的能力也已经具备,同时还能承担部分重要的职责,主导部分重要的工作,比如带新人做项目之类的,这样的一个门槛限制,可以过滤掉很多不合适的求职者,给企业招聘省下很多的人力。
比起五年左右的求职者,虽然能力和经验稍逊一筹,但贵在便宜啊,而且岗位的能力不是特别高的话三年的经验足够胜任了,所以,很多岗位的要求也就三年以上,最多也就3-5年,五年以上的相对不是很多。
三年经验的程序员
前面说到,我是2017年6月底毕业的,但其实,当时4月份的时候我就开始工作了,我的第一份工作做的是Java开发,直到现在依然是做Java方面的项目,这么算起来,我也有三年多的Java开发经验了,想起当初大学时候跟同学调侃,简历上写精通Java一定有很多面试机会,同学戏谑地反驳我,呵,年轻,没有三年以上的经验还敢说自己精通Java。现在想想,即使过了三年我也不敢说自己精通Java,这条路还长着呢,真的是太年轻了。
当然,虽然没有做到精通,但我对这个职业也算有一定的认知吧,从我个人的角度来看,一个合格的三年经验的程序员,他应该具备以下的几种特质:
1、扎实的基础。
基础的重要性不言而喻,在我看来,基础方面是否扎实是衡量一个程序员是否合格的入门门槛,也是几乎所有的互联网公司都会考量的重要知识体系。
什么是基础呢?就拿Java的知识体系来说,基础包括但不限于:
Java基本语法,Java集合,多线程开发,JVM,数据库,计算机原理,计算机网络,基本的算法和数据结构,web端相关技术,常用框架的使用和原理等等。
千万不要觉得很多,也不要觉得基础不重要,有时候,你的基础知识不扎实,你写的代码可能会造出你自己都理解不了的bug,比如下面这段代码,
public class ThreadSafety implements Runnable{
//共享数据
public static int i = 0;
public void increase(){
for (int j= 0;j<10; j++){
i++;
}
}
@Override
public void run() {
increase();
}
public static void main(String[] args) throws Exception{
ThreadSafety demo = new ThreadSafety();
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}
我们知道运行后的结果肯定不是20,因为没有对共享变量做线程安全的操作,如果你的多线程基础不扎实的话,这样的代码你可能不经意间就写出来,最后程序跑的时候数据就不一致了。
当然,一般人不会这么蠢,即使是我刚学Java的时候都知道这种代码有问题,但基础确实是很重要。
如果你是一个即将毕业的大学生,相信我,学好这些基础的知识将是你跟同龄人拉开差距的最大优势,因为多数的大学生没有经历完整的企业项目开发,在实际项目方面即使不是一张白纸,也不会有多丰富的经验。这个时候,企业招聘考察的最好方式就是你们对基础知识方面的掌握程度,扎实的基础将帮助你在激烈的同龄竞争中脱颖而出。
2、良好的编码能力。
除了能正常实现功能外,还需要有优化代码的意识和习惯,最基本的习惯就是注释要清楚明了。
一个项目往往需要多人的协作,你的代码并不只是给自己看的,很可能会经过很多人的接手,如果注释不清楚的话,别人光看你的逻辑就要仔细的揣摩半天,而且可能还偏离方向。
我看过很多人写的代码,一个方法的业务流程注释很不清晰,有些人一个方法100多行就一两句注释,完全让接手者摸不着头脑,像我自己的话,一般写业务代码会按照步骤来写注释,这样看上去每一步的逻辑都比较清楚,
public GardenUserFruitDetailDesp userFruitDetail(GardenBaseReq req, Long userId) {
// 1、查看有没有正在参与活动的用户果树,没有的话返回 "未选择水果" 状态
.......................
// 2、水果还是未选择状态,证明用户未通过新手教程
.......................
// 3、果树成熟,返回可采摘状态
.......................
// 4、获取用户果树的相关数据
.......................
不过,注释清晰也只是基本的要求,即使是新手也能很容易的做到,但说到代码的优化方面就另当别论了。
一个有经验的开发者除了专注功能的实现外,代码的优化也是其比较上心的部分。
举个例子,比如说逻辑有共通性但分类较多的情况下,很多人会写大量的if/else语句来表示,虽然也能实现功能,但从可读性和扩展性来说是比较差的,如果想更上一层楼的话,可以引入一些其他的设计理念来优化一下代码,比如可以引入策略模式或是适配器模式的设计来处理代码,兼容不同分类的共通性逻辑,不仅实现功能,还让代码看上去更加的高端,便于维护。
当然,这方面的能力不是一蹴而就的,除了多写之外,意识和习惯方面的培养也不能少。
3、承担一个项目的设计开发任务
如果是刚入行的新人,一般上级的任务是让你修改一些bug或者实现一些小功能,厉害点的人会让你负责单个模块的开发工作。
随着你经验的增加,你负责的工作内容会慢慢的开始扩展,从单个子模块到多个子模块,然后是重要模块的研发和维护,甚至最后可能是负责一个中小型的完整项目的研发过程。
当你有三年左右的工作经验之后,我们日常负责的将不仅仅是代码的编写工作,可能需要经历一个完整的项目生命周期,从技术评审,到模块设计,以及分配工作、功能实现,还有项目维护这一系列的工程。除此之外,如果你能力和经验足以胜任的话,上级还会给你分配新人,让你来带他们做项目开发。
4、对架构方面有一定的理解
算起来,三年经验的程序员也是有一定经验的工作者了,从经验上看不能归为普通的初中级,但也没有达到高级程序员的高度,大概就是中级到高级程序员之间的过渡阶段吧,毕竟要成为高级程序员的话,除了基本的编码能力之外,对架构方面也要有一定的理解,我姑且称之为架构思维吧。
什么是架构思维呢?就是当你的视野和思考已经有足够的高度,能对项目全局或部分做一个整体的架构方面的设计和优化。
举个例子说,现在公司有一个电商类的项目,因为项目初期没有考虑到未来业务扩展快速的原因,所以在架构设计方面有所欠缺,造成现在单表数量太多,单个工程代码量太庞大,日常qps过高导致页面响应过慢等问题。针对这些问题,如果让你来对项目的整体架构做优化的话,你会怎么考虑?
在实际中,公司或许不会把项目架构优化这么庞大的工程量交给我们这个阶段的开发者来设计,但工作之余的我们也可以学习思考一下,如果让我们来接手的话,我们该怎么结合实际业务场景来优化架构?
又或者说公司的架构师或者是业界已经有成熟的架构方案了,我们可以拿他们的方案和自己思考的方案做下对比,看看有哪些地方需要改进,然后看看自己的架构技术盲点,课余时间去进一步的学习和补充。
我相信,这样的学习策略对于自己的架构方面的理解一定会有所帮助,长此以往的思考方式也一定可以提高自己的架构思维能力。
总结
当然,上面所说的几点也只是我个人的见解,现实中没有哪个通用的考察标准,虽说是合格的三年开发者必备的特质,但说实话,我自己都达不到这样的要求,所以,我也不知道自己算不算得上合格,也不知道现阶段的我跟同龄的程序员相比是否有优势。但有一点我是坚信的,那就是,不管自己现在是什么阶段,不管自己从业了多少年,只有终身的学习,不断的精进自己的知识技能才是保持我们竞争力的最大优势。
ps:虽然是吹水文,但撸了那么多字也是挺难为我的,我不知道正在看文章的读者你看完本文后有什么想法,但我想说,如果你也感同身受的话…快给个三连吧,臣妾不容易啊!
作者:鄙人薛某,一个不拘于技术的互联网人,欢迎关注我的公众号,每周不定期更新干货文章,这里不仅有技术,还有吹水~~~