如何成为一名好的系统架构师
- 一、了解系统架构师
- 1.作为技术领导者
- 2.作为开发人员
- 3.聚焦系统
- 4.具备企业家思维
- 5.权衡策略思维与战术思维
- 6.良好的沟通
- 二、成长为架构师
- 1.工程师阶段
- 2.高级工程师阶段
- 3.技术专家阶段
- 4.系统架构设计师(初级)
- 5.系统架构设计师(中级)
- 6.系统架构设计师(高级)
抓紧时代的机遇,成就心中那个弱小的自己,变强变强再变强,雄起!
一、了解系统架构师
对于系统架构设计师而言,其优劣无 法用统一的标准去衡量,优秀与否实际上是 相对的,但是,根据架构设计师的能力可以 进行评价。架构设计师是一个充满挑战的职 业,需要关注很多维度和技术。 Pat Kua (原 ThoughWorks 咨询师)提出:一个好的架构设 计师是技术全面的,并给出了成为一个技术全 面的架构设计师必须具备的6个角色
1.作为技术领导者
一名好的软件架构设计师需要明白,作为领导者并不一定要告诉开发人员做什么。相反, 好的架构设计师就像一个导师,能够带领开发团队向同一个技术愿景前进。好的架构设计师会 借助讲故事、影响力、引导冲突和构建信任等领导技能,将他们的架构愿景变成现实。一个好 的领导者,同时也是一个好的架构设计师。他/她会仔细听取每个参与者的意见,通过与团队 的互动调整他们的愿景。
2.作为开发人员
一个架构设计师同时又是一个好的开发人员。通常,做出一个良好的架构选择需要权衡理 想的架构状态与软件系统的当前状态。例如,如果一个问题更适合采用关系型数据库来解决, 那么将文档数据库引入到系统中的做法是毫无道理的。一个架构设计师如果不考虑技术选型与
问题域之间的匹配度,会很容易受到各种技术的诱惑——这也就是常见的“象牙塔式架构设计 师”行为模式。
缓解这种情况的最佳方法是让架构设计师多与开发人员待在一起,花一些时间在代码上。 了解系统的构建方式及系统的约束,这将帮助架构设计师在当下环境中做出正确的选择。
3.聚焦系统
经验丰富的开发人员明白代码只是软件的一部分。为了让代码可运行,他们还需要了解代 码在生产环境中运行良好所需的其他重要质量属性。他们需要考虑部署过程、自动化测试、性 能、安全和可支持性等多个方面。开发人员可能以临时的方式来实现这些质量属性,而架构设
计师不仅需要专注于了解代码,还要了解并满足不同利益相关者(如支持、安全和运营人员) 的需求。一个好的架构设计师需要专注于寻找那些能够满足不同利益相关者需求的解决方案, 而不是选择针对某一个参与者的偏好或风格进行优化的工具或方法。
4.具备企业家思维
所有技术选型都有相关的成本和收益,一个好的架构设计师需要从这两个角度考虑新的技 术选型,就如成功的企业家是愿意承担风险的,他不但会寻求快速学习的机会和方法,也要学 会做好接受失败的心理准备。架构设计师可以用类似的方式做出技术选型,收集真实世界中有
关短期和长期成本的信息,以及他们可能意识到的好处。 这方面一个很好的例子是,架构设计师避免承诺立即使用一个在阅读新文章时看到或在某
一会议上听到过的工具。相反,他们试图通过架构调研来了解工具在其环境中的相关性,以收
集更多信息。他们对于工具的选择不是基于销售量,而是考虑他们需要什么以及这个工具所提 供的价值。他们还会寻找这些工具背后的隐性成本,例如工具的支持情况(如文档化程度、社 区使用情况),工具可能带来的约束或长期来看可能带来的额外风险。
5.权衡策略思维与战术思维
许多团队由一些独立的开发人员一起构建软件,而每个人都倾向于选择自己最舒适或最有 经验的工具和技术。好的架构设计师会持续关注可能有用的新技术、工具或方法,但不一定立 即采用它们。技术采用往往需要长期的考量。架构设计师将在团队和组织层面寻求敏捷度(允 许团队快速采取行动)和一致性(保持足够的一致性)之间的良好平衡。建立自己的技术雷达 进行练习是用战略思维探索技术的一个有用工具。
6.良好的沟通
架构设计师需要知道,有效的沟通是建立信任和影响团队以外成员的关键技能。他们知道 不同群体使用不同的术语,而使用技术术语的描述语言与业务人员沟通将会变得比较困难。与 其谈论模式、工具和编程概念,架构设计师需要使用听众熟悉的术语与之交流,诸如风险回报、 成本和收益等。这比单纯使用技术词汇进行沟通来得更好。架构设计师还需要认识到团队内部 沟通与外部沟通同样重要,可以使用图表和小组讨论的方式来建立和完善技术愿景,并进行书 面记录(如架构决策日志或 Wiki 等),从而为将来留下可追溯的历史。
总之,做一个技术全面的架构设计师并不容易,因为有很多方面需要关注,而每个方面都 有很多作为开发人员经常不会专注并练习的技能。其实最重要的不一定是一个架构设计师的能 力,而是他们在每个不同的领域都有足够的专业知识。有价值的架构设计师需要在上述6个方 面都具备良好的专业知识。
二、成长为架构师
尽信书不如无书,实践才能出真理,样样通样样松,先深入再扩展
人们通常把系统架构设计师类比为建筑师,其共同点都是做好顶层设计,充当需求方和 实施者的桥梁。但是系统架构设计师和建筑师存在许多不同,对于建筑师而言,在成为建筑 设计师之前,是不会成为建筑工人或工程师的;而系统架构设计师一定是从工程师成长起
来的。
工程师和架构设计师的本质区别主要体现在技术、组织和个人成长上。 在技术上,架构设计师的首要工作是抽象建模,而比首要工作更重要的是要了解自己所处
的业务领域。只有对业务足够了解,才能更好地抽象和建模,也更能沉淀通用的设计方法论。 另一方面,架构设计师需要了解甚至精通业务领域所涉及的技术领域,譬如对于互联网行业的 架构设计师,小到语言、算法、数据库,大到网络协议、分布式系统、服务器、中间件、 IDC 等等都需要涉猎。一句话,架构设计师是技术团队的对外接口人,也应该是外部团队技术问题 的终结者。除广度之外还要有深度,对于关键技术模块的设计,架构设计师需要有技术的权威 性。而工程师则属于开发团队成员,主要负责项目的具体实现工作,在架构设计师的指导和帮 助下,要熟悉相关业务流程,懂得建模方法,使用已确定的开发方法进行设计、编码和测试等 工作,从掌握专用技术知识层面来讲,工程师必须熟练掌握详细的设计方法、编程语言、工具
和环境。 架构设计师要成为业务和技术的桥梁,因此需要精通业务和技术的语言,要锻炼沟通能力,
不只是口头沟通能力,也包括用标准化的图表表达设计思路的能力。架构设计师需要一种学会 掌握“中庸之道”的方法。不管是技术的选型,团队的协作、培养和分工,商业诉求和成本控 制,产品需求和技术诉求的匹配,很多时候都是在做权衡。可以说,架构的工作主题就是权衡, 这可能也是工程师成长为架构设计师的最大挑战。工程师经常是完美主义的,程序也总是精准 而精确的,但是架构设计师要习惯于不完美和一定条件下的不精确。工程师主要是追求产品的 完美形态,通过自己设计出的漂亮程序以充分展示自我能力,很少考虑团队与协同,开发团队 相互间为了提升,往往存在相互竞争。
系统架构设计师一般都具备计算机科学或软件工程的知识,由工程师做起,然后再慢慢成 长为架构设计师。
成为系统架构设计师的关键是要培养自己的判断力、执行力和创新力。判断力是能够准确 判断系统的复杂度在哪里,能准确地看出系统的脆弱点;执行力是能够使用合适的方案解决复 杂度问题;创新力是能够创造新的解决方案解决复杂度问题。因此,要成为一个系统架构设计 师,就需要不断地锻炼自己的内功,这些内功来源于经验、视野和思考。因此,要从工程师成 长为架构设计师,应遵循积累经验,拓宽视野和深度思考的原则。下面说明从工程师到架构设 计师的成长过程。
1.工程师阶段
要从一名技术员(助理工程师)成为一个合格的工程师需要参加相关工作1~3年时间,其 典型特征是“在别人的指导下完成开发”,这里的“别人”主要是“高级工程师”或者“技术专 家”。通常情况下,高级工程师或者技术专家负责需求分析、讨论和方案设计,工程师负责编码 实现,高级工程师或者技术专家会指导工程师进行编码实现。工程师阶段应该是原始的“基础 技能积累阶段”,主要积累基础知识,包括编程语言、基本数据结构、开发环境、操作系统、数 据库以及相关软件开发流程等。
2.高级工程师阶段
从工程师成长为高级工程师需要3~5年时间,其典型特征是“独立完成开发”,包括需求 分析、方案设计和编码实现,其中需求分析和方案设计已经包含了“判断”和“选择”,只是 范围相对来说小一些,更多是在已有架构下进行设计。高级工程师主要需要“积累方案设计经 验”,简单来说就是业务当前用到的相关技术的设计经验。
高级工程师阶段相比工程师阶段有两个典型的差异:其一是深度,如果说工程师是要求知 道How, 那高级工程师就要求知道W h y了。例如Java的各种数据结构的实现原理,因为只有 深入掌握了这些实现原理,才能对其优缺点和使用场景有深刻理解,这样在做具体方案设计的 时候才能选择合适的数据结构。其二是理论,理论就是前人总结出来的成熟的设计经验,例如 数据库表设计的3个范式、面向对象的设计模式、 SOLID 设计原则、缓存设计理论(缓存穿透、 缓存雪崩和缓存热点)等。
3.技术专家阶段
成长为技术专家需要4~8年时间,其典型的特征是“某个领域的专家”,通俗地讲,只要 是这个领域的问题,技术专家都可以解决。例如: Java 开发专家、嵌入式开发专家、操作系统 开发专家等。通常情况下,“领域”的范围不能太小,例如我们可以说 “Java开发专家”,但不 会说 “Java 多线程专家”或 “Java JDBC 专家”。技术专家与高级工程师的一个典型区别就是: 高级工程师主要是在已有的架构框架下完成设计,而技术专家会根据需要修改、扩展和优化架 构。从高级工程师成长为技术专家,主要需要“拓展技术宽度”,因为一个“领域”必然会涉及 众多的技术面。
需要注意的是,拓展技术宽度并不意味着仅仅只是知道一个技术名词,而是要深入去理解 每个技术的原理、优缺点以及应用场景。
4.系统架构设计师(初级)
成长为初级架构设计师需要5~8年时间,其典型特征就是能够“独立完成一个系统的架构 设计”,可以是从0到1设计一个新系统,也可以是将架构从1.0重构到2.0。初级架构设计师 负责的系统复杂度相对来说不高,例如后台管理系统、某个业务下的子系统等。初级架构设计 师和技术专家的典型区别是:初级架构设计师是基于完善的架构设计方法论的指导来进行架构 设计,而技术专家更多的是基于经验进行架构设计。简单来说,即使是同样一个方案,初级架 构设计师能够清晰地阐述架构设计的理由和原因,而技术专家可能就是因为自己曾经这样做过, 或者看到别人这样做过而选择设计方案。但在实践工作中,技术专家和初级架构设计师的区别 并不很明显,事实上很多技术专家其实就承担了初级架构设计师的角色,因为在系统复杂度相 对不高的情况下,架构设计的难度不高,用不同的备选方案最终都能够较好地完成系统设计。
从技术专家成长为初级架构设计师,最主要的是形成自己的“架构设计方法论”。形成自 己的架构设计方法论的主要手段有:系统学习架构设计方法论,包括订阅专栏或者阅读书籍等;
深入研究成熟开源系统的架构设计;结合架构设计方法论,分析和总结自己团队甚至公司的各 种系统的架构设计的优缺点,尝试思考架构的重构方案。
5.系统架构设计师(中级)
成长为中级架构设计师需要8~10年以上时间,其典型特征是“能够完成复杂系统的架构设 计”,包含高性能、高可用、可扩展、海量存储等复杂系统,例如设计一个总共100人参与开发 的业务系统等。中级架构设计师与初级架构设计师的典型区别在于系统复杂度的不同,中级架 构设计师面对的系统复杂度要高于初级架构设计师。以开源项目为例,初级架构设计师可能引 入某个开源项目就可以完成架构设计,而中级架构设计师可能发现其实没有哪个开源项目是合 适的,而需要自己开发一个全新的项目,事实上很多开源项目就是这样诞生出来的。从初级架 构设计师成长为中级架构设计师,最关键的是“技术深度和技术理论的积累”。
6.系统架构设计师(高级)
成长为高级架构设计师需要10年以上时间,其典型特征是“创造新的架构模式”,例如: 谷歌的分布式存储架构、分布式计算 MapReduce架构和列式存储架构等开创了大数据时代;在
虚拟机很成熟的背景下, Docker创造了容器化的技术潮流。高级架构设计师与中级架构设计师 相比,典型区别在于“创造性”,高级架构设计师能够创造新的架构模式,开创新的技术潮流。
总之,关于如何在专业领域内提升,有个著名的“10000小时定律”,简单来说要成为某个 领域顶尖的专业人才,需要10000小时持续不断的练习,例如小提琴、足球、国际象棋、围棋 等领域,无一例外都遵循这个定律,而技术人员的成长也基本遵循这个定律。系统架构设计师 的成长其实最关键的还是技术人员对技术的热情以及持续不断地投入,包括学习、实践、思考 和总结等。