J2EE架构师
10年毕业,转眼入行已三年,依旧有一丝丝刚踏入社会的感觉-迷茫。如同IT行业的大多数人一样,到了该走向管理还是走向技术的分水岭,不知何去何从。回头望去,做过项目不少,碰到问题不少,但基本也都能解决,技术能力自问不算特别突出;也带过小组做项目,但谈不上有多少管理方面的天赋和能力。
心中向往的,想成为一个PM,带领团队做出像IOS或者QQ、微信这样子的产品;亦或者想成为一个团队乃至一个公司甚至是一个行业的核心技术领先者,妙指生花,做出漂亮的设计,解决别人无法解决的问题。这或许就像是成为一个团队的leader或者是DPS的区别。
这是两个完全不同的职业方向,所需要的技能也不同,但是并非选择一条路就无法转向另一条路。做IT这行,看似衣着光鲜,但其个中滋味,只有IT人才懂,曾经有人问过:你有没有考虑过换行?我几乎都是毫不迟疑的回答:目前还没有。一个原因是,自己确实喜欢这一行,愿意花时间花精力在上面;再一个是,自己转行能做什么的困扰。
从业3年,前辈分享的文章也看过不少,吐槽的、励志的、成功的、失败的都有,品尝下来,酸甜苦辣各种味道都有。每每夜深的时候,自己都会禁不住问自己,自己想要的是什么?有时候也觉得自己挺可怜的,仿佛没有目标,凭借自己的喜好和心情行事。喜欢玩,就去玩了;想出去看看,就出去看看了;想踢球,就置办各类装备,找只球队一周踢两场。闲下来,感觉自己依旧找不到自己,可能这就是这个时代的年轻的人通病-浮躁。听过别人的夸奖,也听过别人的批评,自己也不过是芸芸众生中的一个,不算最好,不算最差,但应该是最普通的。其实静下心来想想,自己并非未曾考虑过,只不过始终拿不定一个主意,总在摇摆不定,时间就在不经意间慢慢的溜走。自己差的,就是静下心来,尽心尽力的去做一件事情,其实不管做哪一行,认真去做,就一定可以成为佼佼者。看过一条励志的微博:据说人只要专注于某一领域,7300小时(5年)可成专家;14600小时(十年)可成权威;21900小时(十五年)能成为世界顶尖。人对自身潜力的挖掘还远远不够,一般人仅达到6%到8%,如爱因斯坦、霍金那样的天才,也才挖掘到10%到12%左右。所以自己要做的,不是总在原地想自己适合做什么,尝试做什么,而是去做,也许到最后就会发现自己是适合的,就算真的不合适了,也没有什么损失,而是得到一笔宝贵的财富。所我现在要做的,就是挖掘自己的潜力。
其实写这篇文章的过程,就是梳理自己思绪的过程,所以说读出,和写文章,确实是益处多多,有句话说的对:吾日三省吾身。不断反思不断改正不断进步,就像目前公司做的项目的理念:PDCA。
翻翻自己的收藏夹,其实收藏了很多的文章,有的读过,有的只匆匆看过几眼,刚好也借此机会,整理一番,算是一盏指路明灯吧。
-------------------------------------分割线---------------------------------------
架构师之路:
一、书籍
1、基础书籍
《Java编程思想》
《J2EE应用与BEAWebLogicServer》
《精通EJB》
2、设计书籍
《UML和模式应用》
《设计模式:可复用面向对象软件的基础》
《Java与模式》
《J2EE核心模式》
《EJB设计模式》
《敏捷软件开发:原则、模式与实践》
《企业应用架构模式》
《软件架构:组织原则与模式》
《重构:改善既有代码的设计》
3、流程书籍
《统一软件开发过程》
二、专注做好一件事
1、分享
分享自己的工作或者学习心得,同时会有理解、应用、总结、表达甚至推广方面的提高,对于自己的进步很有利。
2、共进
找志同道合的高手,和他们多交流,向他们多学习,少走弯路,同时扩大自己的社交圈子。
3、协同
学习重要,实践也很重要。有机会参与开源项目,与世界各地的高手交流,学习。
4、修炼
能力不是天生的,是可以后天培养的;能力不是一成不变的,是可以学习提高的;一个人的成功,不是他做事的成功,而是他自我修炼的成功。认真规划自己的目标和时间。第一,要找到一件事,把它当目标,然后发誓把这件事做到超乎想象的程度。第二,要学会利用时间。用长远的眼光来规划这件事,用短期角度来思考和执行这件事。
三、架构师的职业技能
1、卓越的程序员
做产品之前,架构师必须要帮助产品团队把可行性、技术需求以及权衡取舍等因素一一剖析清楚。技术需求出来之后,架构师需要设计整体的技术实现步骤(大多数成功的架构师都喜欢与其他团队成员一同完成架构和设计这一块的工作)。与开发团队一起,完成设计与实施的细节。与开发团队和运维团队一起,完成部署的过程。与运维团队一起,进行部署之后的维护和故障排除。在这个过程中,一个架构师至少有一半以上的工作是需要与开发团队一起进行的,一个架构师不能将实施细节抛之脑后。一个架构师必须通过自己的个人影响力来对开发团队进行指导工作,通过自己写代码以及和其他成员一起写代码,来指导团队成员实现每个架构细节的思路。一个架构师不仅要会写代码,还必须要能够写出自己设计的系统中最难实现的那段代码。这样他才能够放心的把“落地”的这个重担交给开发团队来做。一个架构师的价值在于,他不仅能看到系统的美,而且能够在建造系统的时候能够把这些美创造出来。
素质:经验和技术基础。创造性和知识汇总能力。基于2、3语言的沟通学习能力。市场嗅觉。艺术气质和冒险精神。逻辑思维和抽象能力。
技能:架构理论和方法学。对象理论。JEE/.NET/动态,技术领域技术能力。模式。遗留系统互联。中间件。消息机制和协议。本地化和国际化。安全性和性能。
做为一个架构师,需要实现(这个过程是结对编程,会有一个搭档)一个系统最难实现的一部分。可以将其称之为“先锋”,因为这是检验脑中的主意是否真的是一个好主意的过程。需要在第一次实施中会细化这个主意。然后才能放心的让编程团队的其他成员按照这个模式来走。这就是“架构”。
2、抽象思维
抽象思维能力。逻辑思维能力。
3、技术前瞻性
好的架构师,应该提前想到如何为程序员尽可能减轻负担,比如数据库软件新的特性可以提高性能,简化查询步骤,那架构师是不是第一时间要引导程序员去适应新的特性,提高开发效率。技术前瞻性还体现在对新技术的选择上,哪些东西适合自己团队,哪些不适合肯定要自己心中有本帐。架构师在自己所处的领域肯定了解颇深,未来本领域技术该如何发展,应该有自己的理解。也会对未来技术的发展有所期盼,有自己的见解。
4、问题解决大师
抽象思维是往高层次的升华,透过问题看本质则是往深层次的挖掘。从问题看本质,实质上是一个从表层逐步深入的过程。在架构师面对一个用户需求时,这个“用户需求”是非常表层的——比如说,一个自动远程备份数据库的功能。而架构师的主要工作,就是把这样的“业务需求”翻译成“技术需求”。这个过程一方面需要通过抽象思维将用户需求提炼为启动、读取、存储、中断处理等模块,而另一方面则需要看到更深层次的网络、操作系统、硬件等方面,以及其可靠性、稳定性、适用性、安全性等问题。如果你在编写Java代码时考虑到了JVM的性能,在编写PHP代码时想到了潜在的安全问题,甚至于在编写HTML+CSS页面时考虑到了不同浏览器的兼容性,这些都体现了“透过问题看本质”的素质。
5、多领域大师
多学习跨领域、跨学科的东西。谈到跨领域学习,知识面广似乎是最好实现的目标,只要博览群书,加上高中之前各学科扎实的基础,相信大多数程序员本身就具备一定的跨领域学习的能力。还有一种跨领域学习的目标,就是多语种的学习。学习除英文之外的语言,既能开拓国际视野,也能在平时的工作中有所建树。IT行业的发展,依靠的业务,从而给人们带来的方便快捷,改变人们的生活、工作方式,其核心就是服务。科学技术本身并不能创造价值,只有当其转换了生产力之后才会具有价值,这一切的核心,就是业务。
6、沟通能力
首先自然是沟通要清晰明了,平和待人。架构师不能将自己锁在自己的象牙塔上,颐指气使的对程序员发号施令。做到人性化的沟通,需要我们在平时就进行培养。写出大部头的架构书,有的时候并没有用VISIO画出的简单架构图好理解。人对图形理解远远大于对文字的理解,直观简单的UML图可以极大的方便程序员理解架构师的意图。其次,可以召开小范围的技术人员会议,大家一起来讨论,一起理解架构师真正的意图。甚至就是一块小白板,几支笔就能把问题摆清楚,讲明白,统一意见后的团队必然干劲十足,再不会出现互相推诿的情况。
锻炼沟通能力,首先我们需要更多的感性思考,说话时也要注重别人的感受,尊重对方才能更好的交流。微软MVP陈广琛在与51CTO编辑谈到程序员沟通能力时,曾说道:“很多程序员总能列出一堆的理由来,说明为什么自己不适合学习或者不需要掌握某项与程序无关的技能,例如说演讲、英语、设计等等。但其实问题并没有那么复杂,你需要考虑的只是多学一项技能是否对你的职业发展更有利,只要你愿意,没什么是不能改变的。”
7、内力
内力更多的是一种思考能力,结合技术的思考能力。架构更多的内力体现在对技术的综合运用上,光会编程的程序员,最多就能做到高级程序员,也就是技术实现上的高手。就比如两个高手比武,比的不光是招式,更多的是对招式的运用,毕竟招式是死的,人是活的。
内功的修炼第一层,自然是开发技术的培养。从写第一行代码开始,就多想为什么,有没有什么其他的路径能实现同样的功能。当我们写了很长时间代码了,是不是就该考虑更多的问题,比如优化、预期未来。其次是对架构的熟悉。要做一名优秀的架构师,就得对各种架构做到了熟于心。
更高层次的修炼,就在于不同技术的学习。要懂得数据库知识,懂得安全监控方面的知识,还要懂得网络构建方面的知识。这是比较高层次的内功修炼,很有可能与程序员目前所处的开发环境关系不大,对程序员来说并不是什么有用的东西。但一个优秀的架构师必须懂得这些,才能更好地抽象软件的使用环境,选择符合需要的架构以及开发模式。
8、权衡取舍
没有一个人可以建造一个没有缺陷的架构。这个项目可能缺乏时间,缺乏金钱,缺乏人手,或者缺乏合适的技术。在项目从开始到进行中的每时每刻,架构师都需要对这些架构的“缺陷”有明确的了解。所以架构师必须要对权衡取舍方面有着出色的把控能力,即架构师有没有看到各方面诉求的差异,以及有没有意愿为了这些差异而做出妥协。一个大型云计算服务,需要在安全、伸缩性、可用性、性能以及性价比方面获得高分,同时必须维持全球上百位客户不间断的使用需求。对于系统而言,在某一个地方或某一个层面发生的改变,势必将影响到系统的其他地方和层面,乃至整个系统。出于对可用性权衡的研究,加州大学的EricBrewer教授提出了CAP理论,认为对于一个共享数据的系统而言,数据持续性、系统可用性、对网络划分的耐受性这三个属性是不可调和的,任何时候只能同时达成两个。所以在知道了鱼和熊掌不可兼得的情况下,要深刻理解各个方面不同角度的诉求,并找出各方都可以接受妥协的制衡点,自然是必不可少的。
9、管控能力
作为一名优秀的架构师,比较迫切的管理任务可能就是开发成本与收益平衡的问题。举例说,采用MySQL做数据库与采用Oracle做数据库,价格肯定有很大差距。但是究竟该采用何种技术,架构师需要仔细权衡用户的报价与本公司收益率的问题。又比如说采取甲技术开发出的软件,界面大方性能一般,但是需要耗费程序员更多的劳动时间,那在有些场景下就不如采用乙技术快速开发后节约的大量人力成本,尽管界面有些难看。通管理,能增强技术团队内部的团结。安全监控也是架构师的重要职责,负责监督整个开发过程中可能出现的问题,在出现问题后还要牵头及时解决问题。这里我们讲到的管控能力,就是这种内部团结的实现,是一种对于程序员人格尊重的实现。
10、艺术气质
架构师最大的价值在于艺术。
商业软件项目的首要目标是实现来自客户或公司的商业需求。然而,在架构过程中仅仅考虑到实现商业需求而建立的系统往往缺乏伸缩性、安全性、可维护性、可靠性、可移植性等等,导致其在短短数年内便因无法与时俱进而被抛弃。这一点几乎每一位维护过项目的程序员应该都能够体会到:面对着缺乏文档、不知所云的代码,想要修改或添加一个功能却无从下手。而一个优美的系统则是可以像有机的生命一样成长的,这是因为从系统开始架构的那一刻起,架构师就考虑到这个系统以后将会面临的挑战,为系统的成长预留好空间。项目经理经常会对这位架构师提出的看似理想化的要求不置可否——项目经理只想着能够尽快以比较低的成本实现客户的需求,然而这些充满艺术美感的想法其实是打造健康——因而优美——的系统的根本因素。
在软件开发产业发展的过程中逐渐建立起了一些行业准则和参考标准,这些将有助于架构师在面对复杂需求时仍然能够保持清晰地头脑来思考问题。学习前人总结的软件与架构方面的知识,遵循既定的指导标准——比如,按照模版编写软件架构文档——看似死板,却是必要的修炼。这些架构师的基本功是全面的、抽象的、深层次的。没有这些基础,那么架构师连实现商业需求都会感到吃力,更不要说去顾及需求之外的东西。另外我们提到过架构师需要有前瞻性:超前的眼光是架构师实现其艺术追求的必不可少的一部分。
阅读公开的软件架构文档(SoftwareArchitectureDocument)是一个很好的学习途径(在Google上能够找到很多)。软件架构文档是架构师在项目早期阶段对于系统的一个描述性概览,这份文档提供了这个系统预计实现功能的概述,这个系统将会使用什么技术以及可能存在的技术局限,以及最重要的部分:视图模型。
用例视图(Use-CaseView):这是业务需求的角度。
逻辑视图(LogicalView):这是功能实现的角度,用例执行的流程图。
上面两个视图是必需的,也往往是项目经理最关注的部分。如果只考虑这两个角度,系统可以被建立,但正如之前所描述的那样,是不可能优美的。架构师还需要视情况考虑下面这些视图:
进程视图(ProcessView):如果系统是多线程的,高并发的,则需要考虑线程的角度。
部署视图(DeploymentView):如果系统分布在多节点,则需要考虑服务器端和客户端节点等硬件映射的角度。
数据视图(DataView):如果持久层在系统中很重要,则需要考虑数据的角度。
有些视图框架有一定通用性,比如业内广为流传的4+1模型、RM-ODP模型等等;但是对于每一个系统需要考虑哪些视图,则需要架构师去摸索、去感觉、去研究;况且现在新技术层出不穷,一个比较前沿的项目需要从前人没有考虑过的角度看问题也不是没有可能。如果架构师没有一定的艺术气质来指引方向,那么一味的照搬现有的模式可能会水土不服而使系统变得臃肿复杂,而完全不考虑商业需求之外的因素则会让系统先天不足而夭折。
如果没有扎实的技术基础,如果架构师缺乏全局观、抽象思维能力以及透过问题看本质的能力,那么他仅仅为了实现客户需求都会感到力不从心,更不用说发挥自己的艺术气质云云了。从另一个角度来讲,做艺术的架构师们也都是行业里大师级别的人物了,这也是架构师们的终极目标吧!
四、架构师的进取之路
在管理体系里面,一人的个人特性决定了你在哪个位置,而技术技能只是做事实施的必需。架构师这个职务,同时要求较高的个人素质和技术能力,因此它的进取之路总结起来就是:做人、做事,做架构师。
1、个人特性
有效沟通:
包括学会谈判,心里分析,局面分析,写作训练。
学会谈判:
包括对结果的预期,过程的控制,适时停止讨论。
风险与防备:
包括冷静观察,最大的风险是成本的枯竭,准确理解决策者的意图和方向。
抽象思维:
包括理性决策,把事情搞清楚。
2、技术能力
模型化:
包括建立抽象模型,基于模型分析与评估,准确的图形表达。
实现能力:
包括架构推行,体系/系统的把握,设计能力。
决策背景:
包括需求决定设计,丰富的领域知识。
五、架构师
架构师是具有技术发言权,方向决策权,和团队人员开发资源调配权的开发团队的TeamLear,也是这个程序的设计者,当然他是这个程序团队的灵魂。进行没有设计的架构设计不叫架构师。面向未来的,才叫设计,设计因未来而存在,没有创新,就没有设计,没有改变,就没有设计。用进化论去思考你的设计,让你的设计超越一切理论,设计只是记忆的载体而不是记忆的全部,其实程序员是艺术家,而不是建筑工人。