最近几天一直在思考是否要成为架构师,如何成为一个架构师的问题。因而上网搜集了一些关于架构师的文章,细细读了以后,里面的内容不只广阔了个人视野,有些之前知道的知识又有了更深一层的感悟,感受大有所获,至少对于我目前思考的问题是有很大帮助的,在此谢谢各位网上的前辈们。读完他们的文章以后,须要本身再思考一下,最近2天写一下关于架构师的一些思考。 前端
1.为何要成为架构师mysql
这篇谈谈第一部分,为何要成为架构师。首先“架构”这个词就显得很高端,架子、结构、顶层设计,这些事在工程领域来讲,好比对一幢大楼、一套系统来讲是很是重要,骨架很差,虽能凑合着用,可是经不起大风的考验。能作这件事的人是顶着“光环”的,是使人向往的角色。架构师是公司的“金领”,有着很是高的收入,不多须要考虑生存的问题,从而有更多的精力思考关键技术问题,沉淀一些基础技术解决方案,造成“强者愈强”的良性循环。程序员
而对于大多数程序员来讲,工做到必定时间,coding到必定程度,ctrl-c 和ctrl-v也更加纯熟,这时会到达一个瓶颈,毕竟不少年轻的后辈们过一段时间就能够达到这个地方,你若是想突破瓶颈,就要开始考虑本身的将来到底向哪一个方向发展。在中国,程序员的最终的归途无外乎两条:一是转向技术管理
,它的终点是CTO;二是继续深刻,它的终点是首席架构师。若是程序员的沟通能力强过技术能力,在补充必定的项目管理知识后,能够向技术管理的方向转型;若是其对技术很感兴趣,而沟通能力也不弱,则能够试着进一步增强技术修养,以期向架构师的方向发展,最终“修成正果”。sql
2.架构师的技能数据库
架构师须要普遍的知识,是一个“杂家”,“博学家”,可是我以为架构师必须有1,2个本身特别精通的领域,不少架构师就是从专家过来的。架构师须要什么技能呢,咱们须要先看看架构师的职责。编程
2.1 架构师的职责windows
我以为《架构师之路》(王泽宾)之中的有一段描述很好,直接拿过来分享一下。设计模式
”架构师这个称呼不是拍脑壳想出来的,是有国际标准(ISO/IEC 42010)可查的。架构师是软件开发活动中的众多角色之一,它多是一我的、一个小组,也多是一个团队。微软对架构师有一个分类参考,咱们参考一下,他们把架构师分为4种:企业架构师EA(Enterprise Architect)、基础结构架构师IA(Infrastructure Architect)、
特定技术架构TSA(Technology-Specific Architect)和解决方案架构师SA (Solution Architect)。微软的这个分类是按照架构师专一的领域不一样而划分的。api
EA的职责是决定整个公司的技术路线和技术发展方向;IA的工做是提炼和优化技术方面积累和沉淀造成的基础性的、公共的、可复用的框架和组件,这些都是一个技术型公司传承下来的最宝贵的财富之一;特定技术架构师TSA,他们主要从事相似安全架构、存储架构等专项技术的规划和设计工做;SA的工做则专于解决方案的规划和设计,把产品、技术或理论,不断地进行组合,来创造出知足用户需求的选择。缓存
大公司会把各类类型的架构师分得很清楚,小公司通常就不那么讲究了,架构师多数是是IA+TSA+SA,一人包打天下,因此说大公司出专才,小公司出全才。
实际工做中,咱们也常常会见到另外一种比较简单的分类方式,把架构师分为软件架构师和系统架构师。软件架构师基本上是TSA+IA,这也是程序员最容易突破,最可能走上的一条道路,好比JAVA架构师、DotNet架构师、LAPM架构师等等,我后面所讲的内容都是与软件架构师的相关的话题。系统架构师其实是SA+TSA,更着力于综合运用已有的产品和技术,来实现客户指望的需求。系统架构师要求通晓软、硬件两方面的知识,因此它的知识体系相对庞杂。“
架构师须要参与到软件项目开发的整个过程,需求分析,架构设计,开发实现,测试联调和发布部署。负责对整个项目的技术指导和协调。
一、需求分析
架构师须要和产品经理常常沟通,把需求明确下来,而且对需求可否实现进行评估,反复进行,确保需求的完整性和需求的可实现性,以及实现的难度。
2.系统分解
在肯定完需求以后,就要对完成需求的系统进行架构设计。把完整的系统分解为多个子系统,各个子系统的功能职责;不只要进行横向的分解,还要进行纵向的分解,系统分层,以及每一个层之间数据接口,层与层之间的关系。这时候就有不少设计思想体现出来,也有不少架构模型,领域模式、AOP等等。
3.技术选型
肯定完系统的架构以后,就要根据架构进行技术的选择,架构过程其实也是一个个的决策过程,须要分析各个选择的优劣。好比选择服务器是选择windows仍是unix?数据库是ms sql server 仍是mysql?服务接口是采用 WCF仍是restfull api?网站是用asp.net form 仍是 asp.net mvc开发? 缓存服务器选择什么?是否须要图片服务器?还有更详细的选择,好比数据库ORM框架使用哪一种?网站前端使用什么JS框架,JQuery仍是zepto?这些都要看架构设计的详细程度,若是这些方面开发团队有较高的水平,可让他们作出较为合适的选择。
同时这些技术的选择,架构是没有最终的选择权,架构师提供建议并分析实现难度以及工做量,项目经理根据项目预算、人力资源、时间进度等进行评估,和架构师一块儿作出较为合适的选择。
4. 制定技术规格说明
架构师须要和开发人员进行积极的沟通,在开发过程当中是否按照架构设计进行实现和一些新的状况须要作出修改的地方,可是架构师没有过多的时间精力时时关注。这时须要一个技术规格说明书,一方面对开发实现进行指导和规范,另外一方面也能够节省沟通成本。
一个技术规格说明书,须要包括系统背景介绍、用例图、时序图、架构图等,也能够保证开发者可以从不一样角度去观察、理解各自承担的子系统或者模块。
2.2架构师须要的基本技能
从大的方面说,架构师须要有良好的软件技术知识,包括深度和广度;良好的沟通能力;抽象思惟分析能力;领导能力。
进行软件架构设计,面向对象的思想和设计模式的知识是必须的。面向对象的思想OO,是通过漫长的软件开发历程和不少人的实际经验总结,发展而来的软件设计开发的一种指导思想。这种思想相对于面向过程(OP)的思想,有许多好处,好比说开发效率高,因为其高内聚、低耦合的目标,使得软件系统的个子系统、模块能够分解并行开发,也可使用之前开发的模块快速开发;软件系统的可维护性和可扩展性也在抽象和封装下使得修改和扩展更加局部化。可是并非说面向过程的编程没有优于OO的地方,在效率要求很高的系统级的应用或准实时系统中,依然采用面向过程的编程。
架构师在设计系统的时候,会综合考虑系统的性能、可靠性、可维护性、可扩展性,作出均衡的选择。
2.3 互联网架构师必须掌握的知识
1. 网络知识
不只仅是互联网系统,不少软件也不仅是单机运行的,愈来愈多的须要网络功能。网络知识不只仅包括tcp/ip,http等经常使用的协议,也包括网络规划,好比解决不一样用户离服务器距离不一样产生的访问速度问题的CDN(Content Delivery Network内容分发网络),解决电信和网通网络访问速度问题的“双线”机房方案。
2.硬件知识
了解硬件的极限以及最新的硬件会对程序的运行形成的影响。
3.软件知识
软件知识包括不少内容,这也是软件架构师知识体系的很重要的一块。像操做系统、数据库、应用服务器等方面的知识。操做系统的兼容性、性能等;数据库的分库以及分表、日志、性能优化等;虚拟主机和非虚拟主机对程序的影响等。
4.其余知识
分布式系统、负载均衡、网络安全、运维监控等知识也要有所了解,包括最新的产品是什么,运用更普遍的技术什么,有什么优缺点?
3.架构师之路
成为架构师是一个慢慢积累的过程,所须要的知识体系比较庞大,可是若是你在coding了一段时间以后,多少会接触到这些知识。而你若是在编程的过程当中,常常思考程序的可靠性、性能、可维护性、可扩展性,再学习下面向对象、设计模式的知识,并在编程的过程当中试着运用这些知识;当你试着考虑系统应该分红几个子系统,系统运用哪些框架更能提升性能和可维护性,系统应该有数据库,数据库表如何设计才能更优,如何分布式部署这些系统的时候,你已经走上了架构师之路......