tufeiping.github.io

涂飞平的个人博客

Follow me on GitHub

程序技术人员的进阶

原创 涂飞平 2019-03-27

这段时间,面试,面谈了些新人和同事,与他们的不断交流中,发现他们都很努力,也想做好这个职业,但由于是刚刚进入这个职业,还是需要了解该如何学习。 带过很多小孩了,基本上,很多次聊这个话题,基本内容都差不多,我想可以简单写下来,以后就直接给其他人看,就能够少说一点,他们也能长期保存,而不至于听完半年后就淡忘了。 以下分几个维度来说吧。

类型

其实程序员应该是不分类型的,但根据侧重点和个人意愿的不同,还是可以勉强用 ** 类型** 这个维度。

程序员(或者IT技术人员,称呼无所谓,以下都以程序员作为称呼)如果按照其发展方向来看,我将他们分为两类:业务型程序员、技术型程序员

业务型的程序员主要是在某个行业多年,精通该行业业务,技术能力可能一般,将业务与CURD结合起来,能完成行业客户的各种需求,这种程序员大家身边都有,他们跳槽基本上都是在一个行业内相关公司之间,他们技术单一,代码能力一般,但深刻理解业务,了解客户;

技术型的程序员更多的对技术痴迷,研究IT技术本身,对于特定业务了解不多,需要配备专业的需求及原型人员帮助其理解业务,这种程序员大家身边也有不少,当然,相对于业务型程序员,他们更换工作的范围可能更广一些,可能上家公司是做传统MIS的,下一家公司就是做SAAS服务的。

这里没有孰好孰坏的区别,只是大家在进入IT行业前几年,努力方向不同而已,在实际工作中,两者尽量融合起来:业务型的程序员也要不断提升技术能力,提升自己的竞争力,业务型程序员,因为深耕行业,导致(技术)面窄,竞争力会不如工作2-3年的小孩子,所以会面对技术转型的问题;技术型的程序员也需要提升业务素质,所谓做一行爱一行,如果要为企业创造更大的价值(其实也就是自身存在的价值),你必须理解公司所在的行业业务,没有哪个公司为技术而技术,只为技术买单的

记住:技术只是手段,盈利才是企业的终极目标!

所谓35+岁程序员焦虑,多数是这两个类型没有融合好,处理好。35岁后,在技术更新,学习,包括接受新生事物的能力肯定不如后起之秀;在业务产出(代码,功能开发速度甚至“熬夜”连续作战能力)及新业务理解方面也不如后起之秀。工作年限长,薪水不低,所以在BOSS眼里,性价比就显得很低了,通常会成为被裁撤或被惦记的对象。

只有将两者融合好,持续保证自身存在的价值,才能尽量长时间保证自己在BOSS眼里的性价比高。我希望大家能尽量提前将两者平衡好或者融合好,不要偏废一门~

当然,如果觉得自己的年龄还没有到这个程度(所谓青春还很长),可以按照自己的兴趣,重点关注某个(或者某几个)技术方面,或者某个行业(产业),为未来做好储备也可以,但要聚焦,切忌发散,虽然青春很长,但精力总归有限!

方向

刚入行的程序员,面对纷繁的技术,知识点,很容易迷失。他们也不断在寻找职业发展方向,技术研究方向。

首先是职业发展方向,我觉得这个方向其实会影响技术研究方向的。现在IT技术领域,已经很细分了,比如:后端开发工程师,前端开发工程师,移动端(APP)开发工程师,数据分析师,数据库管理员,测试工程师…… 每个企业内部,可能还会细分,所以,结合自己的爱好和特点,需要准确定位未来几年(当然不是一辈子)职业发展方向,并为此努力。 我跟一些同事聊天,在企业做得还不错,但一问及如果离开这个企业,后续能做什么?能感觉他会有点懵,因为他自己也不是很清楚自己的未来想做什么,只是目前这份事情他在做,做得也还不错,但没有精进下去,没有形成自己的长处和竞争的优势。比如他会数据库的各种操作(当然,仅限于某种数据库)和调优,但离专业DBA还是差很多,又会一点编程,但离专业的程序员又差很多,目前公司的工作,这两个要求并不高,所以,他能很好适应工作,但却并没有把握适应其他公司要求。

所以在职业规划上,前几年一定要经常给自己立Flag,要不断实现阶段目标,这里还是得提醒一下,在职业生涯的前1-2年,其实不需要太关注薪水,而应该集中精力提高自身水平,争取在3年工作经验时(也就是第一次跳槽时机)能占到优势位置;而如果为了薪水经常更换公司,其实是不划算的:说实话用人单位很忌讳经常更换公司;跳槽一次涨薪2000-3000对你的生活其实没有多大帮助的。而如果能沉下心来学习技术和业务,沉淀2年,我想第一次跳槽薪水Double的几率非常大,毕竟,第一份工作薪水的基数不高,很容易就Double的。

对于技术方向,对于刚入职的新人,特别是Java这个生态非常完备的语言,更多的是迷茫,面对纷繁的框架,工具,模式,不知道该如何下手,感觉要学习的内容太多了!

这个时候,我都会提醒新人们,一定要去伪存真,抓住基础。如果是Java程序员,问我前2-3年的学习路线,我会给出如下几个学习建议:

2.1 学习JDK源码,JDK是每个Java程序员的《圣经》,必须如《圣经》一般,早晚都看一点。俗话说:书读百遍其义自见,通过JDK源码,你能够学习到类库的实现,Java代码编写规范,这里值得学习和关注的地方有很多:比如各种容器类的实现细节,线程休眠和唤醒的底层实现,Java如何与操作系统交互,平台在什么地方开始在不同平台各自实现,还有就是JDK发展的几个重要历史,注解的实现从哪个JDK开始,JDK8与JDK7在HashMap内部实现有何不同…;

2.2 常用的算法,算法总是业务程序员的梦魇,业务大量的流程化代码,不需要过多的算法介入;但其实,在提升效率方面,应用建模方面,有算法加持,能大幅度提高软件的运行效率和稳定性,比如你需要理解链表,队列,栈,红黑树,布隆过滤器,贝叶斯过滤等基础的内容;

2.3 多线程,这总是面试的重灾区,多线程协同一直都是软件稳定性的大敌,其并发特性,不好调试,在不同规模下表现可能完全不一样,测试阶段很难覆盖到,Java里面需要了解synchronize实现原理,轻量级锁,偏向锁和重量级锁,concurrent包和cas的实现机制都是需要理解的;

2.4 Spring框架,说实话,我确实不建议新人学习各种框架,我是从新人过来的,回顾从业这么多年,学习的各种框架多如牛毛,随着时间的推移,很多框架会被新的框架替代(你还能记得几个框架?这也是自然规律),所以,大量学习各种框架的使用对自己是没有太大提升的(阅读源码的情况除外)。但是,Spring框架除外,它极为优秀,无论是思想,设计,实现及实际效果,都是Java世界无与伦比的经典,其目前在Java生态圈的地位也证明其巨大的价值!所以,这个框架一定值得你学习,看看其源代码,了解IOC,AOP的实现技术,同时要理解其思想。当你理解这部分,你就会清楚SpringBoot的实现机制,就会理解SpringCloud为什么会基于SpringBoot,然后做到融会贯通,对于新的技术的产生,也不会心慌而是心中有数!

2.5 设计模式,代码规范,这部分我归为程序员的软实力,它区别于实际中的代码和可视能力,但它却是一个可以体现程序员水平的重要标准,当你进入一个公司,你可能不能让人很快知道你的水平,但只要你提交了代码,同事们就能从代码中大致了解你的水平。 因为我们看待代码时,会从代码规范,对问题的抽象设计和模式上来看一个人真实水平!新人刚进入一个新的环境,在业务,原系统代码,库表结构的了解程度上,肯定不如老员工,但这并不表明新员工的水平比老员工低,只是暂时不熟悉而已!当熟悉之后(也许就半个月之后),这些隐形能力马上就能让你超出老员工。建议多看看常见的设计模式(不需要每种都了解),注意,一定要结合代码来理解,比如Spring里面涉及的9个设计模式,可以结合平时使用Spring的代码来助你理解!

方法

对于新人的学习方法,主要还是在于动眼,动手,动脑。多利用业余时间,学习基础知识,因为作为刚入职的新人,工作时间大部分都是忙于熟悉业务,熟悉之前的代码,不会有时间来让你学习基础知识的。很多新人,还在延续大学的作风,有空就逛逛网络,玩玩游戏!其实我并不反对玩游戏,我也喜欢看游戏直播,比如英雄联盟比赛,我一场不落。我的手机里面,一直都有牛客App,可以帮助我有空的时候刷刷题(我考试,也很难考到满分,每次考试都会有收获),手机浏览器收藏openjdk代码,坐地铁,有空的时候,还可以看看源码。

多写笔记,学习的过程,必须做好记录和整理,其实,整理过程也是对知识点梳理的过程。我自己每天都写日记,通过日记,可以强迫自己平时工作做到事前计划,事后总结的习惯,也能强迫自己每天按照计划行事,建议使用有道笔记或者印象笔记

以上都是我这几天面试过程,与新同事交流过程中的一些想法,记录下来,算是一个小的总结,如果能够帮得上新人,我会很高兴!

yonyou-program-life.png

2019-03-27周三于北京用友产业园