程序员到架构师的进阶之路是非常艰辛和漫长的,不但需要掌握很多高级的知识技能,还需要有过硬的基础知识。《Java架构师指南》就是这样一本指导小白到架构师进阶的书。本文摘取了这本书中的第一章节,主要介绍Java程序员走向架构师的基础知识,还有开发环境的搭建。通过本文的学习,可以大致了解程序员的进阶之路,也可更加深刻地认识到程序员的发展方向。
本书特别适合JavaWeb领域的开发人员以及刚步入职场的新手。本书通过讲述Java架构师必备的知识技能,让广大读者在原有知识的基础上更上一个台阶,争取早日实现架构师的梦想。
对于架构师的定义,每个人的看法都不尽相同,我结合自己多年的工作经验,也只是大致定义了一个范围,希望可以帮助到别人。读者可以结合自己的实际情况,通过阅读本书,不断地扩展和充实这种范围,以达到自己理想中的境界。“不想当将军的士兵,不是好士兵。”在软件行业中,也似乎有这样一句话:“不想当架构师的程序员,不是好程序员。”虽然这看似是一种调侃,但从学习的角度来说,成为架构师,显然是一个好的目标!人只有在心里有了目标,才会变得更加幸福。
如果你不希望一直停留在Java的初级阶段,想在未来成为架构师,那么本书非常适合用来全面提高自己的开发水平。如果你想转项目经理,那么本书同样适合你,因为书中的每个项目都是完整的迭代过程。
1.1 程序员进阶
大学毕业后,初出茅庐的菜鸟经过千辛万苦,总算是找到了人生中的第一份工作。但是,随着工作的开展,菜鸟所面对的问题越来越多。有些人坚持了下来,有些人中途放弃,有些人则在职业生涯中选择了转型。作为一名程序员,不但需要编写大量的代码,还需要对自己的职业生涯做一个规划。结合前辈们所走过的道路,这个职业规划大致是图1-1所示的这个样子。
图1-1 程序员职业生涯
一般来说,从初级程序员到高级程序员需要经过5年的磨砺,这个时间段基本上是业界的共识了。而且,在众多招聘信息中也可以发现程序员的起点都是需要两年工作经验的。也许,有些天赋异禀的程序员可能经过3年的刻苦学习也能达到高级阶段,但是,他们的知识技能往往并不全面,可能只是在某些方面比较熟悉罢了。到了高级程序员的阶段,可供选择的方案就比较多了,大概有图1-2所示的这3个走向。
图1-2 程序员发展方向
如果高级程序员再向上进阶的话,会面临3个选择。第一种方案是成为项目经理,负责管理加上部分开发。因为高级程序员对公司的项目是非常了解的,对公司目前的开发过程也驾轻就熟。如果本人有这方面的意愿,很容易胜任项目经理这个角色。而且,公司通常会从内部选择项目经理,空降项目经理的方式并不是常态,归其原因就是难以熟悉项目架构。
第二种方案是高级程序员可能更喜欢专著于技术,不喜欢出差和撰写大量的项目文档。在这种情况下,他可以成为一名架构师,专门负责维护公司的项目、产品方面的架构工作。如果公司有一定的规模,他可能会成为研发平台的负责人。当然,这种情况的前提是该程序员没有跳槽。
第三种方案是高级程序员可能经历了若干年的开发后,对写代码已经深恶痛绝,丝毫感受不到任何快乐了,但他对公司的项目和产品又非常熟悉,也有深厚的研发积累。在这种情况下,他可以彻底转型成为一名产品经理,纯粹负责公司产品的规划、设计、包装,甚至肩负一定的市场职责。当然,成为产品经理的前提是公司的项目已经产品化或者正在产品化之中。所谓的产品经理,通常就是向技术部提出一个原型设计:“看吧,这就是我想要的东西,至于怎么实现,你们看着办!”如果他懂代码还好说,但如果不懂代码,可能会让程序员陷入抓狂状态!
到了高级程序员的阶段,很多人就开始思考:究竟是去做项目经理?产品经理?还是继续写代码成为优秀的架构师呢?每个人的想法是不一样的,所作出的选择也是不一样的,这跟自己的能力和性格也有一定的关系。
项目经理:在大型公司里,主要起协调资源的作用,再往上还有项目集经理。而在一些中小型公司里,项目经理不但要做好管理,还要兼备一部分代码的开发工作,但与此同时,也会有5年经验左右的项目组长,来管理不同的项目组。在软件行业中,经常有这样一个争论,项目经理到底应该不应该写代码?支持和反对的人都很多,但作者认为,这也是仁者见仁、智者见智的事情。首先,项目经理自身也是资源,是资源就有消耗,有些老板可能会认为:“我花这么多钱,请一个项目经理过来只为了写写文档,是不是太亏本了?”但到了数万人的大公司,该公司的项目通常特别多,就需要项目经理非常专注地管理项目,而不是分心去写代码。这种情况下,老板的思路就会转变,你写什么代码?好好地管理好公司的项目,不让它出乱子就可以了。
产品经理:一般则是公司已经将项目过渡到了产品后,才能发挥更大的作用。如果公司一开始只有项目,则需要大量的时间来积累,最终实现产品化。在这个过程中,往往不是很需要专职的产品经理,可能项目中的每个人都会对项目献计献策,来使项目更加通用化。产品经理自身也是需要积累的,如果他成功地设计了一款App,并且在市场上取得了极大的成功,那么他的职业生涯可能会因此镀金,这个App将会成为他能力的体现。
架构师:专注于公司的研发平台,管理框架方面的东西。例如,写核心代码,并且指导底下的开发人员合理地编码,维护代码库。在小公司里可能只有一两名架构师,但是在数万人的公司里,架构师会非常多。在这种情况下,架构师有可能会成为程序员级别称谓。例如,你在该公司待了8年,虽然你干的活一直是普通研发,并不负责实际上的架构,但是公司有正常的晋升渠道,你的级别就会从高级软件工程师上升到软件架构师。这种情况,在外包公司比较常见。
全栈工程师:是最近才兴起的一个概念,但全栈工程师说到底还是程序员,类似于高级开发的角色,只不过是懂的东西比较多,前端和后端都可以做,技术比较全面。全栈工程师极大地拓展了自己的开发技能,成为了项目中的骨干成员,类似于技术专家的角色。一般而言,小公司比较喜欢这样的人,招募一个可以顶3个。但从学习的角度来说,全栈依然是不错的目标。因为只有成了全栈工程师,才更能接近架构师。
每种开发语言,都有自己领域的架构师,如C++架构师、PHP架构师,当然也有Java架构师了。架构师需要对公司的整个研发平台了如指掌,清楚平台中细枝末节的东西。他极有可能是陪伴着这个公司成长起来的程序员;也极有可能是在别的公司工作多年后跳槽过来的。前者对公司的项目、产品非常熟悉,甚至自己还动手写过业务层。后者可能只是从大体上了解公司的研发平台,毫不深入,但这并不影响他的发挥,真正的架构师看到代码就有一种亲切感,可以很容易分析出隐藏在代码前后的业务过程。
Java架构师,至少需要在Java领域有5年的开发经验。他需要掌握的内容很多,简单点可以分为前端、后端、数据库、服务器、中间件等。前端插件可以极大地提高开发效率,甚至在不需要美工的情况下做出时尚的界面,类似的插件有AngularJS、Avalon、Bootstrap、ExtJS、jQueryEasyUI、jQueryUI等,这些前端插件也可以称作前端组件或者前端框架,种种叫法也看人的习惯了,没必要吹毛求疵。除了这些前端插件外,还需要掌握Java、HTML等技能。后端需要掌握的技能主要是Java、JVM、Servlet、Struts、Spring、Hibernate、MyBatis等,还有最近流行起来的SpringMVC、SpringBoot等。这些技能和框架只有综合起来使用,并且合理地搭配才能发挥出最好的效果。至于效果能够达到什么程度就需要看架构师的本事了。也许有的架构师可以把这个积木撘得很好,也许有的架构师在搭积木的过程中,这个积木就倒下了。数据库方面需要掌握的内容有Oracle、MySQL、SQLServer,一般常用的数据库大概就是这3个。当然近年来,对于架构师需要掌握的数据库又有所增加,它们主要是代表了NoSQL的MongoDB等区别于传统关系型的数据库。但是,数据库相关的内容有不少,例如,需要熟练掌握SQL的各种语法,还需要掌握数据库性能的调优、备份和恢复。服务器并不是重点,但作为Java架构师,仍然需要有所了解。服务器包括物理服务器、云服务器,还有Web服务器,包括我们在开发中使用的Tomcat。中间件在一些中小型项目中并不怎么常用,如EJB技术、消息中间件ActiveMQ。当然,Web服务器也可以算作中间件,如Tomcat、Weblogic、WebShpere和JBoss等。
只有熟练掌这几个方面的技能后,才能算是一个初级架构师。如果想成为大神级别的架构师,还需要学习更多的知识。Java架构师需要对这些技能非常熟悉,并且能像搭积木一样把他们整合在一起,构建出成熟的、完整的软件开发平台,以供底下的程序员在此基础上进行业务层的开发。但是,随着软件技术日新月异地发展,越来越多的框架进入眼帘,这对于我们来说既是好处又是坏处。好处是我们可以选择更好的、更合适的框架来提高项目的性能,降低开发难度,简化开发流程。坏处是可选择的框架太多,以至于让我们难以选择。所以,本书为大家精心挑选出了一名合格的架构师所必备的专业技能和开发思想,以供大家学习和参考,争取尽早地成为Java架构师。
1.2选择开发工具
孔子曰:“工欲善其事,必先利其器。”这是一个千古不变的哲理,工匠想要使他的工作做好,一定要先让工具锋利,这样才能发挥出最大的效率。这个哲理告诉我们,不管做什么事情,都要选择合适的工具。那么在软件开发的道路上,选择一个合适的开发工具也是极其重要的事情了。Java的开发工具有几种,这里不做太多的赘述,我们只需要对比它们的特点,即可从中选择出一款最适合自己的。
Java中常用的开发工具有NetBeans、JBuilder、Eclipse、MyEclipse、IntelliJIDEA等。其中,NetBeans是Sun公司开发的,JBuilder是Borland公司开发的,这两个开发工具的功能和界面跟我们常用的Eclipse是没有很大的区别的,之所以在市场占有率方面输给Eclipse,完全是因为细节方面做得不好,还有在用户感知方面不太好。曾经有网友也在社区里面说过这样的问题,我尝试使用过NetBeans或者JBuilder,但总是因为个人习惯的原因没有坚持下来。可能Eclipse是大多数人接触的第一款开发工具吧,这种先入为主的感觉会一直伴随着我们。
Eclipse是完全免费和开源的,它的功能非常强大,开发起来也很顺手。MyEclipse是在Eclipse的基础上加上了自己的插件后的企业级集成开发环境,尤其善于开发Java、JavaEE方面的项目。于是,在市场占有率方面Eclipse和MyEclipse非常高,这也在另一方面促进了它们的发展。这两者其实是一个核心,所以选择哪一个都看自己的习惯了。IntelliJIDEA是Java开发的集成环境,在业界被公认为最好的Java开发工具之一,尤其在代码提示、重构、J2EE支持等方面非常强大。其中有一点对程序员的帮助非常大,就是调试功能,此外在某些细节方面似乎比Eclipse做得更好。而且,IntelliJIDEA与GIT结合得非常好,而Eclipse与SVN结合得非常好。时间久了,这一开发工具与版本控制工具相结合的特点,也渐渐被程序员们认可,甚至成了项目选择开发工具的一种参考。
举个例子,如果A项目列入了开发计划,为了保持大家代码的一致性,可能项目组内会统一使用开发工具。如何选择呢?如果,这个项目使用SVN来管理代码,那么大家就会优先使用Eclipse;如果使用GIT管理代码,那么大家就会优先使用IntelliJIDEA。当然,这似乎只是一种约定俗成的参考,并不是硬性要求。
在接下来的学习中,我们以MyEclipse和Eclipse为主来开发项目,并且会讲述SVN和GIT的不同,让大家在以后的工作中更加灵活地搭配开发工具和版本控制工具的组合。至于IntelliJIDEA,因为它的入手门槛确实有点高,而且一旦选定,后面对于代码的重构会非常麻烦(指Eclipse和IntelliJIDEA之间),所以本书暂不做相应的讲解。
另外,本书还会使用Eclipse相对较新的版本来做一些练习。其中,MyEclipse的版本是10.7,Eclipse的版本是Kepler,IntelliJIDEA的版本是。SVN和GIT的版本带来的差别并不大,所以并不对版本做具体的规定,MyEclipse10.7的界面如图1-3所示。
图1-3 MyEclipse10.7的界面
EclipseKepler的界面如图1-4所示。
图1-4 EclipseKepler的界面
IntelliJIDEA的界面如图1-5所示。
图1-5 IntelliJIDEA的界面
1.3 安装JDK
JDK是Java开发的核心,包含了Java运行环境、工具、基础类库。如果没有JDK,Java开发是无法进行的,Java项目也无法运行起来。所以要做任何项目的开发,第一件事情就是安装好JDK。接下来,我们才可以做更多的事情。
通常来说,每一个开发工具都会携带JDK,例如,MyEclipse10.7自带的SunJDK1.6.0_13,但是IntelliJIDEA并没有携带,需要自行配置。鉴于这种情况,我们在安装完开发工具后紧接着就应该安装合适的JDK。使用MyEclipse10.7自带的JDK也可以完成日常的开发,但这款JDK没有进行环境变量的设置,可能在后续的开发中会有影响,而且这款JDK是混杂在MyEclipse10.7的安装目录下的,给人的直观感觉不太好。为此,我们需要单独安装一款JDK,而说到安装JDK,就不免要选择合适的版本。目前,JDK版本已经到了8,但是因为历史原因,使用JDK8来开发项目的公司并不多,第一个吃螃蟹的人会有惊喜也有潜在的风险。使用JDK7也是个不错的选择,但是因为本书中所涉及的项目众多,为了项目的稳定性,还有学习的顺序性,我们仍然使用久经历史验证的JDK1.6版本,也可以称作JDK6,对于这个名称不用纠结,是因为历史原因造成的。JDK1.6以上的版本才正式改变了叫法,如JDK7,也有开发人员习惯叫它JDK1.7。读者可以在JDK1.6版本下熟练掌握本书的内容后,自行更用更高级的版本来测试程序的运行性能和代码编译方面的不同。因为本书的主旨是讲述常规的技术,所以对于JDK的新特性并没有过多讲解。
首先,需要在Oracle官方网站下载JDK6。因为Oracle