序员到架构师的进阶之路是非常艰辛和漫长的,不但需要掌握很多高级的知识技能,还需要有过硬的基础知识。《Java架构师指南》就是这样一本指导小白到架构师进阶的书。本文摘取了这本书中的第一章节,主要介绍Java程序员走向架构师的基础知识,还有开发环境的搭建。通过本文的学习,可以大致了解程序员的进阶之路,也可更加深刻地认识到程序员的发展方向。
点此链接购买纸书
本书特别适合Java Web领域的开发人员以及刚步入职场的新手。本书通过讲述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、jQuery EasyUI、jQuery UI等,这些前端插件也可以称作前端组件或者前端框架,种种叫法也看人的习惯了,没必要吹毛求疵。除了这些前端插件外,还需要掌握JavaScript、HTML等技能。后端需要掌握的技能主要是Java、JVM、Servlet、Struts、Spring、Hibernate、MyBatis等,还有最近流行起来的Spring MVC、Spring Boot等。这些技能和框架只有综合起来使用,并且合理地搭配才能发挥出最好的效果。至于效果能够达到什么程度就需要看架构师的本事了。也许有的架构师可以把这个积木撘得很好,也许有的架构师在搭积木的过程中,这个积木就倒下了。数据库方面需要掌握的内容有Oracle、MySQL、SQL Server,一般常用的数据库大概就是这3个。当然近年来,对于架构师需要掌握的数据库又有所增加,它们主要是代表了NoSQL的MongoDB等区别于传统关系型的数据库。但是,数据库相关的内容有不少,例如,需要熟练掌握SQL的各种语法,还需要掌握数据库性能的调优、备份和恢复。服务器并不是重点,但作为Java架构师,仍然需要有所了解。服务器包括物理服务器、云服务器,还有Web服务器,包括我们在开发中使用的Tomcat。中间件在一些中小型项目中并不怎么常用,如EJB技术、消息中间件ActiveMQ。当然,Web服务器也可以算作中间件,如Tomcat、Weblogic、WebShpere和JBoss等。
只有熟练掌这几个方面的技能后,才能算是一个初级架构师。如果想成为大神级别的架构师,还需要学习更多的知识。Java架构师需要对这些技能非常熟悉,并且能像搭积木一样把他们整合在一起,构建出成熟的、完整的软件开发平台,以供底下的程序员在此基础上进行业务层的开发。但是,随着软件技术日新月异地发展,越来越多的框架进入眼帘,这对于我们来说既是好处又是坏处。好处是我们可以选择更好的、更合适的框架来提高项目的性能,降低开发难度,简化开发流程。坏处是可选择的框架太多,以至于让我们难以选择。所以,本书为大家精心挑选出了一名合格的架构师所必备的专业技能和开发思想,以供大家学习和参考,争取尽早地成为Java架构师。
1.2选择开发工具
孔子曰:“工欲善其事,必先利其器。”这是一个千古不变的哲理,工匠想要使他的工作做好,一定要先让工具锋利,这样才能发挥出最大的效率。这个哲理告诉我们,不管做什么事情,都要选择合适的工具。那么在软件开发的道路上,选择一个合适的开发工具也是极其重要的事情了。Java的开发工具有几种,这里不做太多的赘述,我们只需要对比它们的特点,即可从中选择出一款最适合自己的。
Java中常用的开发工具有NetBeans、JBuilder、Eclipse、MyEclipse、IntelliJ IDEA等。其中,NetBeans是Sun公司开发的,JBuilder是Borland公司开发的,这两个开发工具的功能和界面跟我们常用的Eclipse是没有很大的区别的,之所以在市场占有率方面输给Eclipse,完全是因为细节方面做得不好,还有在用户感知方面不太好。曾经有网友也在社区里面说过这样的问题,我尝试使用过NetBeans或者JBuilder,但总是因为个人习惯的原因没有坚持下来。可能Eclipse是大多数人接触的第一款开发工具吧,这种先入为主的感觉会一直伴随着我们。
Eclipse是完全免费和开源的,它的功能非常强大,开发起来也很顺手。MyEclipse是在Eclipse的基础上加上了自己的插件后的企业级集成开发环境,尤其善于开发Java、Java EE方面的项目。于是,在市场占有率方面Eclipse和MyEclipse非常高,这也在另一方面促进了它们的发展。这两者其实是一个核心,所以选择哪一个都看自己的习惯了。IntelliJ IDEA是Java开发的集成环境,在业界被公认为最好的Java开发工具之一,尤其在代码提示、重构、J2EE支持等方面非常强大。其中有一点对程序员的帮助非常大,就是调试功能,此外在某些细节方面似乎比Eclipse做得更好。而且,IntelliJ IDEA与GIT结合得非常好,而Eclipse与SVN结合得非常好。时间久了,这一开发工具与版本控制工具相结合的特点,也渐渐被程序员们认可,甚至成了项目选择开发工具的一种参考。
举个例子,如果A项目列入了开发计划,为了保持大家代码的一致性,可能项目组内会统一使用开发工具。如何选择呢?如果,这个项目使用SVN来管理代码,那么大家就会优先使用Eclipse;如果使用GIT管理代码,那么大家就会优先使用IntelliJ IDEA。当然,这似乎只是一种约定俗成的参考,并不是硬性要求。
在接下来的学习中,我们以MyEclipse和Eclipse为主来开发项目,并且会讲述SVN和GIT的不同,让大家在以后的工作中更加灵活地搭配开发工具和版本控制工具的组合。至于IntelliJ IDEA,因为它的入手门槛确实有点高,而且一旦选定,后面对于代码的重构会非常麻烦(指Eclipse和IntelliJ IDEA之间),所以本书暂不做相应的讲解。
另外,本书还会使用Eclipse相对较新的版本来做一些练习。其中,MyEclipse的版本是10.7,Eclipse的版本是Kepler,IntelliJ IDEA的版本是2016。SVN和GIT的版本带来的差别并不大,所以并不对版本做具体的规定,MyEclipse10.7的界面如图1-3所示。
图1-3 MyEclipse 10.7的界面
Eclipse Kepler的界面如图1-4所示。
图1-4 Eclipse Kepler的界面
IntelliJ IDEA 2016的界面如图1-5所示。
图1-5 IntelliJ IDEA 2016的界面
1.3 安装JDK
JDK是Java开发的核心,包含了Java运行环境、工具、基础类库。如果没有JDK,Java开发是无法进行的,Java项目也无法运行起来。所以要做任何项目的开发,第一件事情就是安装好JDK。接下来,我们才可以做更多的事情。
通常来说,每一个开发工具都会携带JDK,例如,MyEclipse 10.7自带的Sun JDK 1.6.0_13,但是IntelliJ IDEA并没有携带,需要自行配置。鉴于这种情况,我们在安装完开发工具后紧接着就应该安装合适的JDK。使用MyEclipse 10.7自带的JDK也可以完成日常的开发,但这款JDK没有进行环境变量的设置,可能在后续的开发中会有影响,而且这款JDK是混杂在MyEclipse 10.7的安装目录下的,给人的直观感觉不太好。为此,我们需要单独安装一款JDK,而说到安装JDK,就不免要选择合适的版本。目前,JDK版本已经到了8,但是因为历史原因,使用JDK 8来开发项目的公司并不多,第一个吃螃蟹的人会有惊喜也有潜在的风险。使用JDK7也是个不错的选择,但是因为本书中所涉及的项目众多,为了项目的稳定性,还有学习的顺序性,我们仍然使用久经历史验证的JDK 1.6版本,也可以称作JDK 6,对于这个名称不用纠结,是因为历史原因造成的。JDK 1.6以上的版本才正式改变了叫法,如JDK 7,也有开发人员习惯叫它JDK 1.7。读者可以在JDK 1.6版本下熟练掌握本书的内容后,自行更用更高级的版本来测试程序的运行性能和代码编译方面的不同。因为本书的主旨是讲述常规的技术,所以对于JDK的新特性并没有过多讲解。
首先,需要在Oracle官方网站下载JDK 6。因为Oracle官网经常更新,具体的地址也会经常改变,很难有一个确切的下载地址。但是,在Oracle官网可以找到Downloads的菜单,基本上Oracle公司所有的产品都可以在这里找到。另一种方法是可以在其他的网站下载JDK 6,例如,国内的一些网站,下载起来速度也相对比较快,Oracle官网下载JDK如图1-6所示。
图1-6 Oracle官网下载JDK
下载完JDK6之后,最好将它安装在非系统盘里。接着,需要对刚才安装好的JDK进行环境变量的设置,以方便我们在DOS系统下使用JDK命令。例如,最常用的编译命令javac,显示JDK版本的命令java -version,这些命令的使用都依赖于环境变量的配置。如果没有配置,是不会生效的。
首先,打开Windows的环境变量界面,新建系统变量JAVA_HOME和CLASSPATH。编辑JAVA_HOME变量,在变量值里输入JDK6的安装地址,如D:\Program Files\Java\jdk1.6.0_43,点击“确定”保存。接着,编辑CLASSPATH变量,在变量值里输入
%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar,点击确定保存。最后,选择系统变量名为Path的环境变量,在原有变量值的基础上追加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin,点击“确定”保存,添加环境变量的界面如图1-7所示。
图1-7 Windows环境变量设置界面
为了验证Java环境变量是否设置成功,可以运行CMD程序,打开Windows的命令行模式,输入
java -version
命令,如果环境变量设置成功,会在下面输出当前的JDK版本号以及JDK位数,正确的输出结果如图1-8所示。
图1-8 命令行模式下输出JDK版本
配置好了环境变量,还需要在MyEclipse 10.7中配置JDK,使其可以在开发工具中使用。打开MyEclipse 10.7,在Preferences菜单中的Java选项下找到Installed JREs选项,就可以看到当前工作空间中的JDK设置,MyEclipse 10.7默认自带一个JDK6,如图1-9所示。
图1-9 MyEclipse10.7自带的JDK6
点击Add按钮,在弹出的Add JRE对话框中选择Standard VM点击Next按钮进入下一步,在弹出的对话框中点击Directory按钮,选择JDK6的安装目录,点击确定。对话框会自动识别出JDK的相关信息,并且在JRE system libraries列表框中显示出来,如图1-10所示。
图1-10 MyEclipse 10.7中设置JDK6
点击Finish按钮完成设置。这时,MyEclipse 10.7会自动回到Installed JREs对话框中,刚才的列表中会多出一栏我们刚刚设置好的JDK选项,在勾选框中选择它点击OK。至此,MyEclipse10.7下的JDK设置就成功了,在以后的开发工作中,我们全依赖这个JDK提供的基础JAR包来开发和运行项目。
1.4 安装Tomcat服务器
安装好了JDK,我们就可以在MyEclipse 10.7中进行一系列代码编写工作了。例如,可以在开发工具中写一些类,做一些练习。普通的包含main函数的Java类,我们可以通过Run As菜单下的Java Application命令来运行,输出程序结果。例如,可以在MyEclipse 10.7下新建一个Java Web工程practise。具体的过程如下,选择File菜单下的New选项,在弹出的右侧菜单中选择Web Project,在对话框的Project Name文本框中输入
practise
,将J2EE Specification Level选项设置为Java EE 6.0,和安装的JDK保持一致,点击Finish按钮,practise项目就建立好了。
选中practise项目的src目录,右键选择新建Package,在对话框的Name文本框中输入
com.manage.practise
,点击Finish,就可以给这个项目建立一个空包。接下来,就可以在这个空包里新建类。选中Java包,右键选择New菜单下的Class,在弹出的对话框中在Name处输入类名
Test
,并且勾选
public static void main(String[] args)
,点击Finish。这样,在practise包下的第一个类Test就建立成功了。打开Test类,在main函数中输入第一行Java语句
System. out.println("Hello World");
,使用Java Application来运行。此时,控制台会在空白区域输出Hello World。理论上来说,我们的第一个Java程序就这样诞生了,尽管这个程序非常简单!
如果只是在MyEclipse 10.7下安装了JDK,这款开发工具能做的事情无非是编写类,利用Java Application来运行,并且进行程序的测试。在这种情况下,我们的代码中所设定的数值均是由自己输入的参数;然后再根据程序中的处理逻辑,做一些简单的运算;最后,输出正确的结果。可是,程序开发远远不是这么简单的事情,我们需要做的是开发一个具有交互能力的项目,而不仅仅是写一段简单的程序。要达成这个目标,我们就必须在MyEclipse 10.7安装Web服务器来运行项目。在这里,我们选择使用Tomcat服务器,这是因为Tomcat服务器具有简单、易用的优点。
首先,打开Apache的官方网站,在下载Tomcat 6.0的页面找到对应的软件,在Core列表中选择64-bit Windows zip的版本,将Tomcat 6.0保存到本地,并且解压缩到本地的非系统盘内,如E盘的根目录。下载Tomcat 6.0如图1-11所示。
图1-11 下载Tomcat 6.0
打开MyEclipse 10.7的Preferences对话框,在MyEclipse的列表中选择Servers,这时,会出现一个列表,列出MyEclipse 10.7支持的服务器。选择Tomcat,再选择Tomcat 6.x。这时,对话框右侧会出现Tomcat 6.x的配置项,选择Enable,启用Tomcat 6.x。点击Tomcat home directory对应的Browse按钮,在弹出的磁盘目录列表中选择Tomcat 6.0所在的位置,MyEclipse 10.7会自动补齐其他的两处空白,点击OK按钮,Tomcat 6.0服务器就配置好了。
我们通过工具栏运行Tomcat 6.0,启动成功后,点击工具栏的Open MyEclipse Web Browser功能的图标,在地址栏中输入http://localhost:8080/,就可以看到Tomcat 6.0运行成功的画面。接下来,就可以通过在Tomcat服务器里部署Web项目来进行正式地编码工作了,运行界面如图1-12所示。
图1-12 Tomcat 6.0运行成功
1.5 Hello World程序
完成了前面几节的配置,MyEclipse 10.7 的开发环境已经正式配置成功了。这时,我们可以在MyEclipse10.7下完成第一个Hello World程序来结束本章的学习。
在MyEclipse 10.7的界面中,我们可以看到Package Explorer视图下有一个Java Web项目practise,这个项目是之前创建好的,并且在包里建立了一个Test类。我们通过运行该类,可以在控制台里输出了Hello World,说明这个类没有问题。但是,这种简单的编码没有交互性,是不能满足项目的需求的。如果要开发一个项目,必须让其在Tomcat服务器里运行,才能起到交互的作用。那么我们可以把practise项目部署到Tomcat服务器里试试效果。
选中practise项目,右键弹出功能菜单选择MyEclipse,在弹出的右侧菜单中选择Add and Remove Project Deployments功能,在弹出的对话框中可以看到Deployments列表中为空,说明Tomcat服务器里并没有部署任何项目。这时,我们点击Add按钮,在Server下拉框中选择Tomcat 6.x,点击Finish,把practise项目正式部署到Tomcat服务器中。部署好的 practise 项目如图1-13所示。
图1-13 部署好的practise项目
这时,我们启动Tomcat服务器就会自动加载部署到服务器里的practise项目。通过控制台,可以看到服务器的启动日志,如果没有报错的话,说明practise项目没有编译错误,那么Tomcat服务器启动成功。打开IE浏览器,在地址栏中输入http://localhost:8080进行访问,可以看到程序运行成功,但显示的仍然是Tomcat服务器的默认页面,这是因为我们没有输入项目名称。
打开practise项目的WebRoot文件夹下的index.jsp文件,把title标签里的内容修改成First Page,把body标签里的内容修改成Hello World,保存index.jsp文件。再次打开IE浏览器,访问http://localhost: 8080/practise,可以看到页面上已经发生了变化,如图1-14所示。
图1-14 practise项目运行
1.6 小结
本文我们全面阐述了程序员的职业发展规划,从而为广大读者提供一个晋级的参考。从程序员到项目经理、产品经理、架构师的过程至少需要5年。这5年是一个学习期,5年后就可以进行转型了。所以,建议大家在工作的前5年不要频繁跳槽,还是需要系统地掌握知识技能,积累经验才是硬道理。频繁跳槽不但让自己的知识会出现断层,也可能影响到自己在HR心中的形象。
接着介绍了Java开发中常用的工具,并且做了简单的对比,相信读者可以根据自己的喜好选择其中的一款。因为本书主要采用MyEclipse 10.7作为开发工具,所以读者最好先使用这款开发工具,其他的工具会在后面的章节中介绍。等对这些工具驾轻就熟的时候,再随意切换。每个开发工具都有自己的优缺点,但不要人云亦云,选择自己最习惯用的才是最好的。最后介绍了安装JDK、Tomcat服务器的过程,并且开发了第一个Hello World程序。如果读者已经牢牢掌握了本章的内容,这就是万里长征迈出了坚实的第一步,相信在以后的学习当中大家的收获会更多。
本文摘自《Java架构师指南》
《Java架构师指南》
王波 著
点击封面购买纸书
资深Java专家多年经验总结,全程项目驱动,首本完整介绍Java入门进阶到架构师的编程技术图书。
程序员走向架构师是必经之路,本书基于官方API的完美解读,从架构师的角度来讲解Java知识技能,并且从搭建虚拟机开始,学习常用的Linux命令,力争做到使程序员在较短的时间内成功迈入架构师的殿堂。
今日互动(仅限微信端点击参加)
你是怎么入行的?第一份工作是什么?截止时间6月15日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版80元异步社区代金券,(留言点赞最多的自动获得一张)。
推荐阅读
2018年5月新书书单(文末福利)
2018年4月新书书单
异步图书最全Python书单
一份程序员必备的算法书单
第一本Python神经网络编程图书
长按二维码,可以关注我们哟
每天与你分享IT好文。
在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程
点击阅读原文购买《Java架构师指南》
阅读原文