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