Java程序员成长之路(二)

Do morejava

作的更多,作的比你主管安排给你的任务更多nginx


我在HW的时候,负责一个版本的开发,这个版本的工做量大约是2000行左右,可是我除了作完这个功能,还将关联的功能所有掌握清楚了,代码(大约10000行)也所有看了一遍,作完这个版本后,我对这个版本相关的整套业务所有很熟悉了。通过一两次会议后,你们发现我对这块掌握最熟了,接下来就有趣了:产品讨论需求找我、测试有问题也找我、老大对外支撑也找我;后来,不是我负责的功能他们也找我,即便我当时不知道,我也会看代码或者找文档帮他们回答。。。。。。最后我就成了我这个系统的“专家”了。虽然这个时候我仍是作业务的,仍是写业务代码,可是我已经对整个业务都很熟悉了。程序员


以上只是一个简单的例子,其实就是想说:要想有机会,首先你得从人群中冒出来,要想冒出来,你就必须作到不同凡响,要作到不同凡响,你就要作得更多web


怎么作得更多呢?能够从如下几个方面着手:面试


1)熟悉更多业务,无论是否是你负责的;熟悉更多代码,无论是否是你写的
这样作有不少好处,举几个简单的例子:spring


需求分析的时候更加准确,可以在需求阶段就识别风险、影响、难点数据库


问题处理的时候更加快速,由于相关的业务和代码都熟悉,可以快速的判断问题可能的缘由并进行排查处理编程


方案设计的时候考虑更加周全,因为有对全局业务的理解,可以设计出更好的方案设计模式


2)熟悉端到端
好比说你负责web后台开发,但实际上用户发起一个http请求,要通过不少中间步骤才到你的服务器(例如浏览器缓存、DNS、nginx等),服务器通常又会通过不少处理才到你写的那部分代码(路由、权限等)这整个流程中的不少系统或者步骤,绝大部分人是不可能去参与写代码的,但掌握了这些知识对你的综合水平有很大做用,例如方案设计、线上故障处理这些更加有含金量的技术工做都须要综合技术水平。浏览器


“系统性”、“全局性”、“综合性”这些字眼看起来比较虚,但其实都是技术大牛的必备的素质,要达到这样的境界,必须去熟悉更多系统、业务、代码。


3)自学

通常在比较成熟的团队,因为框架或者组件已经进行了大量的封装,写业务代码所用到的技术确实也比较少,但咱们要明白“惟一不变的只有变化”,框架有可能要改进,组件可能要替换,或者你换了一家公司,新公司既没有组件也没有框架,要你从头开始来作。这些都是机会,也是挑战,而机会和挑战只会分配给有准备的人,因此这种状况下咱们更加须要自学更多东西,由于真正等到要用的时候再来学已经没有时间了。


以java为例,大部分业务代码就是if-else加个数据库操做,但咱们彻底能够本身学些更多java的知识,例如垃圾回收,调优,网络编程等,这些可能暂时没用,但真要用的时候,不是google一下就能够了,这个时候谁已经掌握了相关知识和技能,机会就是谁的。


以垃圾回收为例,我本身平时就抽时间学习了这些知识,学了1年都没用上,但后来用上了几回,每次都解决了卡死的大问题,而有的同窗,写了几年的java代码,对于stop-the-world是什么概念都不知道,更不用说去优化了。

Do better

要知道这个世界上没有完美的东西,你负责的系统和业务,总有不合理和能够改进的地方,这些“不合理”和“可改进”的地方,都是更高级别的怪物,打完后可以增长更多的经验值。识别出这些地方,而且给出解决方案,而后向主管提出,一次不行两次,多提几回,只要有一次落地了,这就是你的机会。
例如:

  •   重复代码太多,是否能够引入设计模式?

  • 系统性能通常,能否进行优化?

  • 目前是单机,若是作成双机是否更好?

  • 版本开发质量不高,是否引入高效的单元测试和集成测试方案?

  •   目前的系统太庞大,是否能够经过重构和解耦改成3个系统?

  • 阿里中间件有一些系统感受咱们也能够用,是否能够引入 ?
     

只要你去想,其实总能发现能够改进的地方的;若是你以为系统哪里都没有改进的地方,那就说明你的水平还不够,能够多学习相关技术,多看看业界其它公司怎么作,BAT都怎么作。


我2013年调配到九游,刚开始接手了一个简单的后台系统,天天就是配合前台作数据增删改查,看起来彻底没意思,是吧?若是只作这些确实没意思,但咱们接手后作了不少事情:


解耦,将一个后台拆分为2个后台,提高可扩展性和稳定性;
双机,将单机改成双机系统,提升可靠性;
优化,将原来一个耗时5小时的接口优化为耗时5分钟
还有其它不少优化,后来咱们这个组承担了更多的系统,后来这个小组5我的,负责了6个系统。

Do exercise

在作职业等级沟通的时候,发现有不少同窗确实也在尝试Do more、Do better,但在执行的过程当中,几乎每一个人都遇到同一个问题:光看不用效果不好,怎么办?


例如:
学习了jvm的垃圾回收,可是线上比较少出现FGC致使的卡顿问题,就算出现了,恢复业务也是第一位的,不太可能线上出现问题而后让每一个同窗都去练一下手,那怎么去实践这些jvm的知识和技能呢?
Netty我也看了,也了解了Reactor的原理,可是我不可能参与Netty开发,怎么去让本身真正掌握Reactor异步模式呢?


看了《高性能MySQL》,可是线上的数据库都是DBA管理的,测试环境的数据库感受又是随便配置的,我怎么去验证这些技术呢?


框架封装了DAL层,数据库的访问咱们都不须要操心,咱们怎么去了解分库分表实现?
诸如此类问题还有不少,我这里分享一下我的的经验,其实就是3个词:learning、trying、teaching!


1)Learning
这个是第一阶段,看书、google、看视频、看别人的博客均可以,但要注意一点是“系统化”,特别是一些基础性的东西,例如JVM原理、Java编程、网络编程,HTTP协议。。。。。。等等,这些基础技术不能只经过google或者博客学习,个人作法通常是先完整的看完一本书全面的了解,而后再经过google、视频、博客去有针对性的查找一些有疑问的地方,或者一些技巧。


2)Trying
这个步骤就是解答前面提到的不少同窗的疑惑的关键点,形象来讲就是“本身动手丰衣足食”,也就是本身去尝试搭建一些模拟环境,本身写一些测试程序。例如:
Jvm垃圾回收:能够本身写一个简单的测试程序,分配内存不释放,而后调整各类jvm启动参数,再运行的过程当中使用jstack、jstat等命令查看jvm的堆内存分布和垃圾回收状况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。


Reactor原理:本身真正去尝试写一个Reactor模式的Demo,不要觉得这个很难,最简单的Reactor模式代码量(包括注释)不超过200行(能够参考Doug Lee的PPT)。本身写完后,再去看看netty怎么作,一对比理解就更加深入了。


MySQL:既然有线上的配置能够参考,那能够直接让DBA将线上配置发给咱们(注意去掉敏感信息),直接学习;而后本身搭建一个MySQL环境,用线上的配置启动;要知道不少同窗用了不少年MySQL,可是连个简单的MySQL环境都搭不起来。


框架封装了DAL层:能够本身用JDBC尝试去写一个分库分表的简单实现,而后与框架的实现进行对比,看看差别在哪里。
用浏览器的工具查看HTTP缓存实现,看看不一样种类的网站,不一样类型的资源,具体是如何控制缓存的;也能够本身用Python写一个简单的HTTP服务器,模拟返回各类HTTP Headers来观察浏览器的反应。


还有不少方法,这里就不一一列举,简单来讲,就是要将学到的东西真正试试,才能理解更加深入,印第安人有一句谚语:I hear and I forget. I see and I remember. I do and I understand ,并且“试试”其实能够比较简单,不少时候咱们均可以本身动手作。


固然,若是可以在实际工做中使用,效果会更好,毕竟实际的线上环境和业务复杂度不是咱们写个模拟程序就可以模拟的,但这样的机会可遇不可求,大部分状况咱们还真的只能靠本身模拟,而后等到真正业务要用的时候,可以信手拈来。


3)Teaching
通常来讲,通过Learning和Trying,能掌握70%左右,但要真正掌握,我以为必定要作到可以跟别人讲清楚。由于在讲的时候,咱们既须要将一个知识点系统化,也须要考虑各类细节,这会促使咱们进一步思考和学习。同时,讲出来后看或者听的人能够有不一样的理解,或者有新的补充,这至关于继续完善了整个知识技能体系。


这样的例子不少,包括我本身写博客的时候常常遇到,原本我以为本身已经掌握很全面了,但一写就发现不少点没考虑到;组内培训的时候也常常看到,有的同窗写了PPT,可是讲的时候,你们一问,或者一讨论,就会发现不少点尚未讲清楚,或者有的点实际上是理解错了。写PPT、讲PPT、讨论PPT,这个流程所有走一遍,基本上对一个知识点掌握就比较全面了。

-------------------------------------------------------------------------------------------------

我一直认为比较抽象的问题(像这个问题),没有完美的解法,其余任何人的经验你都有参考价值,但落到实处又必然因人而异。对待这类建议型回答,我以为若是你迷茫,能够采起一个问题下高票回答的建议;若是你只是有点困惑,那就多看看别人怎么建议的,挑选你认为有用的部分;最重要得,是你本身的思考。

来聊聊对于java初级程序员,提高自我价值的几个我认为的最佳实践。

1 多深刻了解一点

面试应届生,新人程序员时我喜欢问这么一个问题:你怎么理解HashMap?一个看似简单的问题能够看出众生百态。第一类人回答道,这是个键值对的结构。下面的补充颇有意思,懂数据结构会继续补充hash这个数据结构,说一说Hash冲突,懂Java HashMap实现的人,会聊一聊hashCode,equals方法对于其的意义。再往下,能够聊一聊HashMap在1.8中的优化,横向对比TreeMap,ConcurrentHashMap,纵向对比LinkedHashMap,这样能够从全局把握对HashMap的理解。

为何说这个例子,就是想表达这样的观点:一样一个问题,不一样经验的人理解的深度不同。项目中遇到问题,尝试剖析问题,深刻理解问题,不只仅是解决了这一次的问题,也杜绝了之后问题的出现。一个简单的需求,谁均可以完成,那可替代性就很强;一个比较复杂的需求,只有交给你领导才放心,那么这就是你的价值。靠什么来支撑,就是你须要比其余人了解的更多。

 

2 保持持续的热情

我见过的比较厉害的程序员,他们老是保持持续的热情。在J2EE早期学习Spring,大数据时代又开始学习Hadoop,Storm,微服务时代热衷于dubbo,springcloud,云时代开始搞Docker,k8s。

兴趣驱动的程序员老是比普通的程序员成长的更快,多看书,多关注一些大牛的博客,多关注开源,遇到问题多搜索。但愿你即便是暂时的一腔热血,也能多烧一下子。

3 多交流

程序员的眼界很重要,在学生时代,我还只知道百度、CSDN,觉得那就是世界,直到后来知道了谷歌、Github、StackOverflow,世界的边界开始变大,知道再后来,接触到了不少其余有意思的程序员,公众号,参加一些交流会,一些线下沙龙,遇到一批一样热衷于技术的人,才知道,原来程序员的圈子能够这么广。多交流,这方便你知道本身的定位。

 

4 程序员的价值不是技术框架的堆砌

不少脑壳瓜比较聪明的新人程序员常常着迷于各类框架,开源技术的探索,一般表现为,经理要求开发一个全文搜索需求,他能够提出es,luncene,solr多种解决方案;说到微服务就能够和别人大谈特谈dubbo,springcloud;说到分布式事务也能够聊一聊2pc...这本是一件好事,可是大多数此类人,只是对框架和技术有了基础的认识,可能他们所“了解”的技术,有经验的程序员看一两篇博客就能掌握如何使用了,但新人程序员却陷入了一个怪圈,他们鄙视写业务代码,不重视软件思想,只看重技术框架,而后自我感受良好,这可怕又惋惜。

相关文章
相关标签/搜索