1. 引言

搞Java的弟兄们肯定都想要达到更高的境界,用更少的代码解决更多的问题,用更清晰的结构为可能的传承和维护做准备。想想当初自己摸着石头过河,也看过不少人介绍的学习路线,十多年走过来多少还是有些收获。现通过自身经历总结一篇文章,供弟兄们参考。

2. 用好正在用的框架

在已经加入的团队中,和大家协作使用团队已选好的框架。不管框架优劣与否,特点如何,选择了它必然有一定的道理。并且能够在业界经久流行的框架也一定有它的优秀之处。

使用框架第一步是熟悉,可能通过复制和修改前人的代码来实现新的功能或修改已有功能,逐渐熟悉该框架的使用方法。

第二步是深入了解,会用、多用之后,根据用法和现象掌握其规律,从而形成对框架内部结构和运行机制的猜测,大部分肯定都是对的。

第三步是用好,在对框架内部机制有了一定的感觉后,逐渐总结并采用更佳实践,达到同样目的采用更简洁清晰或更高效率的方法。可以参考框架的“最佳实践”文档(比如Hibernate参考手册的最后一章),对没有提供“最佳实践”文档的可以自己总结一些经验,并不断完善。

没有绝对的最佳实践,只有适应于某一场景的最佳实践,和适用于大多数场合的较好实现。能够根据场景选择不同的模式,是水平提高的标志。

3. 了解标准类库、企业级技术和开源项目

Java界现有的积累已经很丰富,当遇到某个问题感觉它是个普遍问题时,很有可能就已经有现成的标准类库或开源项目等在那里了。掌握好标准类库和开源项目,可以减少工作量,使代码结构清晰容易理解。企业级技术是指JavaEE平台内的技术,其多是从已有积累中提炼出的标准,比如JPA就很大程度上来自于Hibernate。企业级技术的运用对程序的标准化很有好处。

对标准类库和开源项目的了解不分先后,可以是交叉进行的,用到了哪个就看看学学哪个。也可以用业余时间挑自己喜欢的学习学习、做做实验。

3.1. 标准类库

从Java自带的文档中可以看到标准类库(以及平台工具)的列表以及相互关系。下面这幅图就是层次关系图:

以挑自己感兴趣的点进去详细了解。

乍一看内容众多,但实际上可能已经有很多已经被用过了。比如JDBC,应该是每个Java程序员在涉世不深时就已经用过的了吧。JNDI应该也是做WEB工程必须接触的东西。也许只是其中几个API,不过什么都是了解、熟练、精通这三步,了解了,后面就不远。

其中规则表达式、XML处理、applet、并发(多线程)、网络、IO、图形是比较实用的功能,可以先从它们入手。本地接口(JNI)、管理扩展(JMX)、反射等可以用在更高级一些的场合,会了之后可以为更多的场景提供解决方案。

3.2. 企业及技术

包括JavaMail、JMS、EJB、JPA、JSF、web service等,具体的列表可以到JavaEE技术官网找到。这些技术用起来并不深奥,甚至比标准类库还浅显。

3.3. 开源项目

框架一般都是开源项目,目前拥有开源项目最多的组织莫过于Apache。可以通过需要来学习开源项目,比方说需要处理Excel文档,那就去学用POI;要用web service就看看CXF;需要字符串处理就看看Commons Lang中有没有实现;需要IO操作就看看Commons IO中有没有实现。

除了Apache,还有eclipse、springsource和Jboss等多家开源机构提供了大量的免费好货,有时间就去了解一下不失为进阶的好手段。“君子性非异也,善假于物也“——厉害的家伙不一定是什么都会自己写,而往往是会结合使用各种神器。

这里顺便说一句,很多开源项目都用了比较少见的英文单词或是自造词作为名字,遇到时最好去官网上确定它的读音。很多人吧Struts(原意:大摇大摆)读成了Structs,明显跟struct(结构)搞混了,听起来实在业余。还有PostgreSQL应读作postgres-QL,而不是postgre-SQL,请尊重作者的原意。Debian应读作“戴博伊恩”,是作者夫妇的名字合体,读成“大便”就太对不起人家了。Ubuntu也别读“优斑图”了。

4. 把程序写得更好

4.1. 代码格式整洁优雅

尽量遵循官网上的代码格式建议,善用开发工具(Eclipse)的自动格式化功能。

复杂的条件、循环嵌套提炼为方法,把方法名起得有意义,尽量让后人看程序就好像看直白的英文句子一样。追求代码自我注释。要注意尽量用单词别用拼音,特别是模块之间交互的接口(模块内部小范围使用的还好些),英语单词和拼音的混杂使用会让后人昏死。现在的电子词典品种繁多、易于使用,善用它们,让代码优雅的同时还可以多认识几个单词。

4.2. 代码内容高效

用过很多框架和开源项目并自己写了不少程序之后,可以开始考虑实践《Effective Java》中所讲的内容,何时何地如何运用合适的技术与机制。

5. 通过标准类库、企业级技术和开源项目了解模式

说到模式大家首先想到的可能是“设计模式”,有很多初学者为了进步也看了《设计模式》这本书,不过据我经验,当时看不懂,不知道那些模式为何存在,也不知道何时可以用上它们。实际上所谓“模式”不过是前人的习惯用法,被后人认为好用并广泛流传。所有将前人代码复制过来改一改就用的,这样的代码其实都可以说是某种“模式”的实现。

有了对标准类库、企业级技术和一些开源项目的运用后,模式的感觉才会在头脑中建立。这些类库、技术、项目本身实现了很多模式,对它们的使用也是模式。只不过后者常被称为实战,而并没有当做“模式”出现在出版物中。

“模式”除了《设计模式》包括《企业应用架构模式》、《J2EE核心模式》,也许还有更多其它的。标准类库和开源项目(包括很多流行框架),出于设计的灵活性、便捷性、优雅性,对它们有杰出的运用。

Spring就是对工厂模式的实现。JDBC和JMS是对抽象工厂方法模式的实现。

Struts除了大家皆知的MVC,其实还实现了J2EE核心模式中的好几样。

Hibernate内部使用了Proxy模式,而它整体的存在是《企业应用架构模式》中“表数据入口”的实现。而老的EJB2.0中的CMB更像是“行数据入口”的实现。

这些模式直接当做概念来学习,没有实际经验,就会像我当初一样不知它们为何存在也不知如何运用它们,事倍功半。

现成的产品用多了就有感觉了。感受它们带来的方便,将它们中功能相似的互相比较,就可以看得出各种模式的存在和它们的优秀之处了。

6. 了解面向对象的真谛

了解了模式,就会发现实现这些模式的根基正是面向对象提供的封装、多态这些特性,这也是面向对象出现的意义。

面向对象的八大原则在《敏捷软件开发——原则、模式与实践》中有所介绍,其中我最看重“单一职责”原则,这个原则在模块划分时很有帮助,其思想甚至可以延伸到组织结构的建设上。

7. 展望——架构师

架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。

架构师在软件开发的整个过程中起着很重要的作用。

有了以上几步,应该就可以作为一个合格的设计人员而存在了。想做到架构师,曾经有位培训师告诉我们:“学习Linux内核。”

大的步骤是:看0.01版了解其结构,看0.10版了解其进步,看0.12版了解其完善,看最新版了解其现状。

学习方法是使用UML工具,对下载的Linux内核源文件进行反向工程,从得到的类图中可以看出模块依赖关系,出度最大的模块就是系统的核心,从这个模块看起,看它如何调度其它各个模块,再去看各模块如何实现自己的功能。

进阶架构师图解

1、阅读源码

阅读、分析源码是程序员最基本的码代码能力也是码农的根本所在,学习经典源码中所用到的经典设计思想及常用设计模式,能够帮你了解大牛是如何写代码的,从而吸收大牛的代码功力。在阿里面试中,MyBatis,Spring等框架的底层原理是经常会被问到的

开源框架解析

2、分布式架构

阿里巴巴有很多大团队,这种大团队里有很多小团队,到小团队之后,做的业务都不相同,如果想立足成为一线互联网公司中的万能选手,最主流的分布式架构中有很多知识都是必须要去了解与学习的。并且在阿里面试过程中,面试官会问到实际应用场景的问题:比如微服务化、用户量、并发量、业务复杂度以及可扩展程度等,这里不多赘述。本屌提供一个分布式架构的学习思路也是自己目前还在学习中的体系:

高性能架构专题

3、微服务架构

微服务是现在互联网架构技术中最火热的话题之一,也是本屌目前正在学习研究的方向。在阿里面试过程中,面试官很少会问到关于微服务相关的问题。但作为一名开发者,一名有技术梦想的程序员微服务架构是现在必须要去了解的主流技术,小编给自己制定了一个微服务技术的学习计划:

微服务架构专题

4、并发编程

并发编程几乎是所有互联网公司面试必问问题,并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。目前网上没有系统的全面的并发编程学习大纲,我搜集了很多资料总结出来一个最全面的学习大纲:

并发编程

5、性能优化

性能一直是让程序员比较头疼的问题。当系统架构变得复杂而庞大之后,性能方面就会下降,特别是阿里巴巴这样的一线互联网公司最为注重,因此想进入阿里,性能优化一定是要去深入学习与理解的一环,本屌在性能优化这一块虽然不能算专家,也可以自信的说是精通了(注意:自己的简历上一定不要写精通xxxx,要不然面试官会怼死你。好在本屌这一块还算自信)

性能优化

6.设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

设计模式

这份架构图是我画出来的,掌握了以上技术月薪三万基本不难,想要把这些技术都掌握,确实不简单。所以我把这些技术都整理好了,还特意找了几位朋友录制了一些架构技术视频,这几位朋友在圈内都有一定知名度,曾经都在一线互联网公司任职架构师。这些资料都已经有整理出来,现免费分享给大家。

部分资料截图

获取方式:关注+转发后后台私信回复“架构资料”获取资源传送门。记得一定要转发后才能获取到。

8. 结语

这些步骤并没有严格的界限,可以穿插、迭代地进行。

学习是一个先发散后收敛的过程。开始好像面对一个扇形,越往外走发现不会的越多,需要学的越多。但到了后来就会发现学过的东西相通之处很多,新看的东西能够快速理解,甚至能够发现有些东西不过是新瓶装旧酒,看两眼就会了。

“愚者察异,智者察同”,愚人看到事物各有不同就觉得世界难以掌握,而智者善于看到事物间的共同点(规律)以使事半功倍。既然程序员都干得了就别当自己是个愚者。

关注+转发后后台私信回复“架构资料”获取资源传送门。记得一定要转发后才能获取到。

五年Java程序员进阶架构师的一些心得以及职业生涯规划相关推荐

  1. 从Java程序员进阶架构师,必看的书单推荐!

    算法与数据结构: 数据结构(严蔚敏) java数据结构和算法(美:拉佛) 算法导论 大话数据结构 剑指Offer 程序员面试金典 编程珠玑 编程之美 程序员笔试面试最优解 数据结构与算法经典问题解析( ...

  2. Java程序员进阶架构师的五个阶段,你到了哪各阶段?

    之前有个讨论:实现同样功能,简洁代码一定比复杂代码效率高吗?有的说,还得看算法,如果算法相同,简洁代码效率应该会高一些.有的说,即使算法相同,简洁代码也不见得比复杂代码效率高,而应尽可能减少循环的使用 ...

  3. Java程序员进阶架构师推荐阅读书籍

    [IT168 技术]作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些 ...

  4. 这可能是JAVA程序员进阶架构师的最佳之路了 !

    随着大数据时代的到来,[这次国家教育部的改革要动真格了],JAVA程序员们仅有的一点点竞争力很快就不复存在,为什么这么说呢? 人生别只顾低头拉车,更要抬头看路! 国家教育部全面改革:大数据领衔 所有高 ...

  5. 一份Java程序员进阶架构师的秘籍,你离架构师还差多远

    一.如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并发量. ...

  6. 跳出误区:Java程序员进阶架构师真的没你想象的那么简单......

    小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL).所以,架构师在广大码农中的占比大概平均不到 10%.而架构师也可以分为初级.中级.高级三档,江湖上真正高水平的软件架构师就更少了. ...

  7. Java程序员进阶架构师必备学习文档:SSM+微服务+分布式+Nginx+MySQL

    SSM企业级战 SSM框架是以Spring为核心,整合Spring MVC和Mybatis的轻量级框架技术的组合.利用SSM整合框架可以开发出分层.易扩展.易维护的企业级应用系统,能够极大地满足企业需 ...

  8. 程序员进阶架构师路线

    作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历. 下面是作者根据自己15年的互联网电商经验总结的,Java程序员进阶架构师的路线图,希望对初入职场的同学和对自己技术 ...

  9. java程序员 进阶_Java程序员进阶架构师的五个阶段,你到

    之前有个讨论:实现同样功能,简洁代码一定比复杂代码效率高吗?有的说,还得看算法,如果算法相同,简洁代码效率应该会高一些.有的说,即使算法相同,简洁代码也不见得比复杂代码效率高,而应尽可能减少循环的使用 ...

最新文章

  1. stm32 cubemx hal 工程中 微秒延迟 delay_us
  2. visualVM 安装使用
  3. 吊打一切的YOLOv4的tricks汇总!
  4. 怎样用springboot开发cs_SpringBoot分布式任务中间件开发 附视频讲解 (手把手教你开发和使用中间件)...
  5. CSS实现半透明div层的方法
  6. PCL_三维点云拼接融合/点云粗配准/点云精配准
  7. Java数组:随机排序
  8. HTML网页设计:二、网页的基本标签
  9. YeeCOM DTU 轮询采集
  10. IBUS-WARNING **: 09:23:08.407: The owner of /home/cl/.config/ibus/bus is not root!
  11. 如何在BaseFragment中直接调用BaseActivity中相关属性代码的问题
  12. 华农大学计算机专硕,华南农业大学电子工程学院(人工智能学院)林芳老师课题组招收计算机方向学硕及专硕...
  13. matlab ode45修改,matlab ode45增加输入值
  14. PE工具制作(大白菜+U盘启动模式)+系统重装
  15. 【论文笔记】Towards Universal Sequence Representation Learning for Recommender Systems
  16. 现在如何注册台服服务器,《英雄联盟手游》台服账号注册教程 台服拳头账号注册步骤图解...
  17. 小白如何开通微信公众号中的订阅号(服务号)以及认证账号
  18. 收集所有QQ空间模块制作软件大全
  19. 基于stm32f103c8t6及AS608-----指纹锁项目
  20. python获取键盘按键_Python中捕获键盘的方式详解

热门文章

  1. A20 Plus(esp8266与A6C)拍照传输图片
  2. 西南科技大学OJ题 求最小生成树(Prim算法)1075
  3. Unity编辑器扩展——自动生成UI界面脚本
  4. matlab读取hdf显示,matlab读取.hdf文件
  5. 11.Scrapy框架基础-使用Scrapy抓取数据并保存到mongodb
  6. 编辑Visio2016的自动对齐与粘附功能
  7. 递增数列 woj3749
  8. STM32L4系列单片机的低功耗问题
  9. 【Android】UI布局之线性布局(登录界面代码)
  10. R语言实战笔记--第十二章 重抽样(置换检验)与自助法