从工程师到系统架构设计师的成长

人们通常把系统架构设计师类比为建筑师,其共同点都是做好顶层设计,充当需求方和实施者的桥梁。但是系统架构设计师和建筑师存在许多不同,对于建筑师而言,在成为建筑设计师之前,是不会成为建筑工人或工程师的;而系统架构设计师一定是从工程师成长起来的。
工程师和架构设计师的本质区别主要体现在技术、组织和个人成长上。
在技术上,架构设计师的首要工作是抽象建模,而比首要工作更重要的是要了解自己所处的业务领域。只有对业务足够了解,才能更好地抽象和建模,也更能沉淀通用的设计方法论。另一方面,架构设计师需要了解甚至精通业务领域所涉及的技术领域,譬如对于互联网行业的架构设计师,小到语言、算法、数据库,大到网络协议、分布式系统、服务器、中间件、IDC等等都需要涉猎。一句话,架构设计师是技术团队的对外接口人,也应该是外部团队技术问题的终结者。除广度之外还要有深度,对于关键技术模块的设计,架构设计师需要有技术的权威性。而工程师则属于开发团队成员,主要负责项目的具体实现工作,在架构设计师的指导和帮助下,要熟悉相关业务流程,懂得建模方法,使用已确定的开发方法进行设计、编码和测试等工作,从掌握专用技术知识层面来讲,工程师必须熟练掌握详细的设计方法、编程语言、工具和环境。
架构设计师要成为业务和技术的桥梁,因此需要精通业务和技术的语言,要锻炼沟通能力,不只是口头沟通能力,也包括用标准化的图表表达设计思路的能力。架构设计师需要一种学会掌握“中庸之道”的方法。不管是技术的选型,团队的协作、培养和分工,商业诉求和成本控制,产品需求和技术诉求的匹配,很多时候都是在做权衡。可以说,架构的工作主题就是权衡,这可能也是工程师成长为架构设计师的最大挑战。工程师经常是完美主义的,程序也总是精准而精确的,但是架构设计师要习惯于不完美和一定条件下的不精确。工程师主要是追求产品的完美形态,通过自己设计出的漂亮程序以充分展示自我能力,很少考虑团队与协同,开发团队相互间为了提升,往往存在相互竞争。
系统架构设计师一般都具备计算机科学或软件工程的知识,由工程师做起,然后再慢慢成长为架构设计师。
成为系统架构设计师的关键是要培养自己的判断力、执行力和创新力。判断力是能够准确判断系统的复杂度在哪里,能准确地看出系统的脆弱点;执行力是能够使用合适的方案解决复杂度问题;创新力是能够创造新的解决方案解决复杂度问题。因此,要成为一个系统架构设计师,就需要不断地锻炼自己的内功,这些内功来源于经验、视野和思考。因此,要从工程师成长为架构设计师,应遵循积累经验,拓宽视野和深度思考的原则。下面说明从工程师到架构设计师的成长过程。
1.工程师阶段
要从一名技术员(助理工程师)成为一个合格的工程师需要参加相关工作1~3年时间,其典型特征是“在别人的指导下完成开发”,这里的“别人”主要是“高级工程师”或者“技术专家”。通常情况下,高级工程师或者技术专家负责需求分析、讨论和方案设计,工程师负责编码实现,高级工程师或者技术专家会指导工程师进行编码实现。工程师阶段应该是原始的“基础技能积累阶段”,主要积累基础知识,包括编程语言、基本数据结构、开发环境、操作系统、数据库以及相关软件开发流程等。
2.高级工程师阶段
从工程师成长为高级工程师需要3~5年时间,其典型特征是“独立完成开发”,包括需求分析、方案设计和编码实现,其中需求分析和方案设计已经包含了“判断”和“选择”,只是范围相对来说小一些,更多是在已有架构下进行设计。高级工程师主要需要“积累方案设计经验”,简单来说就是业务当前用到的相关技术的设计经验。
高级工程师阶段相比工程师阶段有两个典型的差异:其一是深度,如果说工程师是要求知道How, 那高级工程师就要求知道Why了。例如 Java的各种数据结构的实现原理,因为只有深入掌握了这些实现原理,才能对其优缺点和使用场景有深刻理解,这样在做具体方案设计的时候才能选择合适的数据结构。其二是理论,理论就是前人总结出来的成熟的设计经验,例如数据库表设计的三范式、面向对象的设计模式、 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小时持续不断的练习,例如小提琴、足球、国际象棋、围棋等领域,无一例外都遵循这个定律,而技术人员的成长也基本遵循这个定律。系统架构设计师的成长其实最关键的还是技术人员对技术的热情以及持续不断地投入,包括学习、实践、思考和总结等。

