@Lenciel

如何干好架构师(1)

在很多技术团队里,「架构师」好像是一个「岗位」或者「职称」。

甚至有些地方把它作为职级:你从「初级工程师」干到「高级工程师」,再往上就是「架构师」了。

所以,在简历里经常可以看到某位同学在某个公司担任「架构师」或者「首席架构师」。

很多研发也就自然把「架构师」当成职业通道的下一站,花很多时间甚至报培训班,想要成为「架构师」。

从我过往的经验来看,这样的岗位或者职级设置通常带来的问题比收益多。

就连这个流量很小的 blog,也可以在评论里里看到一些对架构师的吐槽。

本系列面向所有「架构师」或者希望成为「架构师」的同学,聊聊怎样干好这个似乎是「码农」的进阶,却又不太容易讨巧的角色。

第一篇我们争取先说清楚什么是我心里面的「架构师」。

目录

「师」在中文里的意思很多。

「架构师」里的「师」是掌握某领域专门的技术或知识,可以作为其他人学习对象的人,和「医师」或者「巫师」的「师」类似。

因此,就跟要讲清楚如何成为「巫师」得先定义我们在说的「巫」是什么一样,我们得先定义「架构」,才能说清楚,「架构师」是什么。

什么是「架构」

不幸的是,对于「架构」的定义没有一个标准意见。大体上,我把它分成「学界定义」和「业界定义」两大分支。

学界定义

「学界」主要是指「计算机科学」里面有一个专门的分支「软件工程(Software Engineering)」。在它的定义里,主要强调「架构」要说清楚:

  • 系统由哪些要素构成
  • 这些构成要素之间的关系

比如你搜索「Software Architecture」,排名靠前的维基百科的解释如下:

Software architecture refers to the fundamental structures of a software system and the discipline of creating such structures and systems. Each structure comprises software elements, relations among them, and properties of both elements and relations.

这很明显是从《Documenting Software Architectures: Views and Beyond》 里面摘抄的。这本书不那么好读,它的两位作者在另一本从名字看就好读多了的《Software Architecture in Practice》里有一个类似的定义:

The software architecture of a system is the set of structure needed to reason about the system, which comprises software elements, relations among them, and properties of both.

如果你注意到这本书是属于一个叫 SEI Collections 的系列的话,就很容易发现,CMU 的 Software Engineering Institute(SEI)对这些软件工程领域的方法论和术语定义很用心。它们还有一个官方的「数字图书馆」,检索「架构」的定义可以找到一个和前面的定义非常类似,但是打了 IEEE 龙标的定义:

Architecture is the fundamental organization of a system embodied in its components, their relationships to each other, and to the environment, and the principles guiding its design and evolution. –IEEE 1471

学界的这些定义,最大的问题是,系统里组件怎么定义,它们之间的关系怎么形成,现实中其实并没有真正「工程化」的方法可以干好1

业界定义

业界进行实际生产作业的人,对「架构」的定义强调的是因为问题域的复杂多变,做了什么「决策」或者说「选择」。

比如,在我自己还很热衷于成为一个架构师,同时也是软件工程的各种方法论走红的年代,十八摸那本著名的《The Rational Unified Process: An Introduction》里,Kruchten 做了如下的定义:

An architecture is the set of significant decisions about the organization of a software system, the selection of structural elements and their interfaces by which the system is composed, together with their behavior as specified in the collaborations among those elements, the composition of these elements into progressively larger subsystems, and the architectural style that guides this organization – these elements and their interfaces, their collaborations, and their composition.

再比如 Jan Bosch 和 Anton Jansen 在那篇著名的论文里说的:

We do not view a software architecture as a set of components and connectors, but rather as the composition of a set of architectural design decisions.

这种看法影响了很多人,比如 UML 它爹 Grady Booch 就说过:

All architecture is design but not all design is architecture. Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change.

既然「架构」是「决策」,那么「架构师」就是「做决策的人」。因此,这个定义被「架构师」们欢迎几乎是人性上无法避免的。

于是,在这些「架构师」定义的「架构」里,你几乎完全看不到跟系统实际功能或者模块有关的描述,主要是围绕一些系统的体系特征进行的设计:

  • Availability
  • Scalability
  • Reliability
  • Maintainability
  • *bility

它导致的问题不仅仅在于公司里面开始出现「架构师」这样的职位,并且编码的同学把有朝一日成为「做决策」的人当成自己的奋斗目标。

更重要的是,很多不真正理解问题域也不参与编码的人,以「架构师」的特权进行各种各样的「决策」,迷恋「UML」或者「Design Pattern」这样的方法论,导致大量的资源浪费甚至是项目失败。

因此 Martin Fowler 在他那篇《Who needs an architect》里面引用 Ralph Johnson 的话有些嘲讽地说:

Architecture is the decisions that you wish you could get right early in a project, but that you are not necessarily more likely to get them right than any other.

问题出在哪里

「架构」两个字,无论「学界定义」还是「业界定义」都带来了问题,为什么?

我觉得本质上是因为我们尝试「工程化」软件开发。

在其他的工程领域,我们依赖数学或者物理的理论体系,构建领域内的理论体系。

软件世界比数理世界要「软」。

一方面,我们的问题域在不断的变化,你今天觉得地球上有 50 万人拍视频,明年就 5 个亿了。

所以我们面对的其实是一个动态平衡的系统: 在任何给定的时间点它可能处于一个平衡状态,但长期看,它只会不断演进,前往下一个不平衡的状态。

另一方面,我们打算拿来构建理论体系所依赖的「公理」,在不断地,快速地失效2

许多关于软件架构的书籍都是在一个与当今世界几乎完全不同的时代写成的。新的实践、工具、度量方法、模式和大量其他变化在时时刻刻发生。我们必须根据改进的工程实践、操作系统生态、软件开发过程等等,去不断地质疑「基本公理」。

作为一个软件开发人员,和其他工匠一样,很容易迷恋某种特定的,自己熟悉的技术或方法,然后因为手里拿着这把锤子,看什么都是个钉子。

合格的架构师,必须清醒地理解现实世界在变,软件技术也在变,因此几乎没有任何方便的,拿来就用的,非错即对的二元选择:要把软件开发看成一个对需要解决的问题和解决的技术进行学习的过程,把架构和代码都当成这个过程的副产品

那究竟什么是「架构」

我最喜欢的定义也来自 Ralph Johnson:

In most successful software projects, the expert developers working on that project have a shared understanding of the system design. This shared understanding is called ‘architecture’ .

我喜欢这个定义的地方是:

  1. 它强调了「架构」是为了体现大家的「共同理解」而不是体现某个智者的「决策」;
  2. 它暗示了不用说大家也可以共同理解的东西,就没有必要写到「架构」里;
  3. 它还暗示了「架构师」的职责是和所有涉众沟通,让大家达成「共同理解」。

关于最后一点,成功的「架构」不是「架构师」自己想好写出来的,而是跟所有涉众沟通之后形成的「共同理解」,我觉得可以多说几句。

在每个公司里面,其实一般有四个话语体系:

  • 宏观层面
  • 设计层面
  • 构建层面
  • 商业化层面

架构师要做好「架构」,就涉及跟这四个层面的人做好沟通。

怎么理解?

软件开发常常被类比成建筑行业,「architecture」这个词就这么用起来的,所以我用做门来打个比方。

第一个层面主要是跟客户、公司管理层或者业务负责人聊的。你们聊的可能是「门是空间的联通」这样有些凡尔赛的话,哪怕到细节,也是柯布为什么老用大旋转门,Zumthor 在老年公寓里做的门柜结合多么厉害,Bienefeld 那些古典比例的现代门如何引领了潮流。

第二个层面,主要是你在跟平级部门,深化产品、交互、系统等各个层面的设计细节。你开始说这是一道「防盗门」还是一扇「厕所门」,为了防火又美观中庭要不要有一扇卷帘,Lindt 博物馆里怎么做出来那么干净的大堂,罗氏、诺华那些精致的技术解决方案。基本上,在这块儿你能聊什么样的天,决定了你的整体段位:如果你轻易就被产品、设计等其他部门的人聊得无话可说,可能你的段位就还没有到。

第三种是构建工艺层面的,主要是对部门内部的沟通了。你这门,是无框的,隐框的,全玻璃的,平移的,下沉的,还是啥样的?柯布在萨伏依里面的大平移玻璃门,密斯在图根哈特别墅搞的大下沉窗,关门器、气密条、折页五金件,你得一清二楚。基本上,你这部分的基本功既决定了和下面同学们配合的愉快程度,其实也决定了你上面两个层面能到什么高度。比如下沉窗为什么会出现在图根哈特这么一个古典内核的建筑里,比如英国建筑师如何系统性的通过开窗与欧洲建筑师慢慢做出区分,没有搞明白,你去聊上面的那些天,容易穿帮露怯。

第四种是商业落地层面的,主要是对项目经理的沟通了。比如门窗就用旭格的,霍曼的,还是双流陈家的。是买过来装,还是需要二次开发局部定制。这部分,虽然往往不是你直接去找货给钱,但是往往你得脑子里面有方案:同样的门,粗野怎么做,极简怎么做,高技怎么做,低技怎么做,有钱怎么做,没钱怎么做。

所以,什么是「架构」?

架构不是最后那张设计图纸,而是你,怎么打通各个话语体系——从想法到落地,从前期到后期,从学术到实践,得到最后这张图纸。

所以,什么是「架构师」?

就是前脚标准构造尺寸倒背如流,后脚又开始聊建筑史观,左手柯布密斯怎么流畅,右手防火门该咋画还咋画的,这个能用一张嘴聊四套语言最后让大家形成共识的人。

因此,在我的团队,一直推行把「架构师」作为一个「角色」而不是一个岗位。

Summary

要说清楚「如何干好架构师」,我决定先说清楚我定义的「架构」是什么。这里主要说了三点:

  1. 架构在学界的定义围绕「系统的构成部分和这些构成部分之间的关系」展开,这个定义的问题是没有什么实操的工程办法可以真正设计和定义好系统由什么构成,它们的关系应该是怎样;
  2. 架构在业界的定义围绕「系统的构建过程中做了什么选择和决策」展开,这个定义的问题是让架构师往往无视问题域的不断演进和软件技术的不断发展,倚仗自己角色的权威,做出脱离实际的「决策」;
  3. 我觉得,「架构」就是在和四个不同层面的人进行充分沟通后,形成的对系统关键部分的「共同理解」。它是一个快照,会随着时间的变化变化。因此,「架构师」就是推动沟通并记录结论的一个角色,不是一个「岗位」或者「职称」。只不过你要进行这样的沟通,往往需要足够的经验和影响力,而已。
  1. 这也是我自己对「软件工程」的态度比较那啥的原因。它一直希望将软件开发从一门手艺转变为一个工程学科,这意味着可以清晰定义,严格执行,不断优化的可重复的流程。 但虽然有了一些进展,整体来看,软件开发离一个「工程学科」还有很大差距。 

  2. 一个很好的例子是容器技术带来的变化,它对软件的设计、开发、测试和部署的方方面面都带来了很多变化,有些变化是颠覆性的。 

2020年终总结

年底事儿挺多,《红楼梦》还没读完1

很多朋友也觉得今年过得特别快。

其实,以「年」计算的时间,对成年人来说通常都是在不知不觉中,一晃而过的。

反倒是一天,往往很漫长

再说,在这史蒂芬金编剧周星驰导演的一年里,很多人没有扛过去234

能够一晃而过,应该觉得幸运。

所以,艾师兄说,「活着,就够了」。

疫情给我最大的触动是,人的注意力其实是人拥有的最有流动性,最有价值的资产。

移动互联网时代,很多产品抓住人类的弱点来诱惑我们,把注意力作为商品来攫取。

但即使你像我一样,不装头条的产品5,不逛购物网站,不玩游戏,也扛不住疫情后,远程办公在线开会,各种通知提醒在各种工具里飞来飞去。

Aldous Huxley 在他的乌托邦小说《》里,描绘了一种名为「Mynahs」的鸟,它们周期性地飞来飞去,嘴里叨叨着「注意注意」,来帮助做白日梦的居民回到他们自己的现实生活中。

我们今天的问题是大家哪怕想要集中注意力,社会制度和结构也释放了太多「Mynahs」,迫使我们频繁快速地切换上下文,以至于没有人可以集中注意力。

要怎么守住注意力这项资产,不同的人大概是有很多不同办法的。

我好像找到了自己的办法,今年单位时间的产出略有提高。

一开始,我很羡慕那些可以把日程表维护得规规整整并且严格执行的人,认真研究和使用了很多时间管理的方法,发现对我来说都不太有用。

这可能有点像刚开始创业时,我总是想 工作生活怎么平衡,也研究了各种方式方法,然后放弃了

一路下来,我形成了一个观念:你如果在找「平衡」,这个多了,那个就少了,心理上就很容易进入博弈。

可以把工作看成生活的一部分。

投入地去工作也是一种美好的生活。

如果你需要 8 个小时睡眠,需要有假期去世界各地旅行,才能保持投入的工作,就去找这样的工作,但保证在工作时全力以赴6

寻求「平衡」比心理博弈更负面的影响是,你让自己陷入了一个「零和」的游戏。

认为做某件事情就影响了其他事情,这很「零和」。

对我来说,保持注意力的方式不是固执地对某些想要去做的事情说不,而是允许自己的注意力在某段时间里因为探索这些选择而非常「涣散」。

我从来没法靠日程表上的一个会议提醒,或者某个信念,在接下来的几十分钟里立刻变得专注。

人应该去打开自己觉得装着宝藏的门,然后对自己说,「好的,我满足了」,而不应该通过强迫自己选择一个选项来「集中」注意力。

我怀疑这是为什么国外老师或者学生有「gap year」,Google 早期有 20%的自由时间的原因。

如果你写程序的时候想着《红楼梦》,可能是因为你内心真的想要探索一下《红楼梦》。

不要管它,放手去干。

专注是目标,而不是实现路径。

没有人可以通过专注变得专注,只能通过遵从内心去探索,让每个探索都变得专注。

不要管,放手干。

做到不管,既靠觉悟,也靠积累;既是道理,也是功夫。

人总认为自己所思所想所为就是自己,那都是自己的一厢情愿。

还有的人认为自己看过的书讲过的道理就是自己,那就是前人所谓的「百年钻故纸」,这种人最不值得一提。

恰恰因为思想、情感、知识,它们不是你,它们自己有自己的运转,你才能得到它们,你才能使用它们。

你能做的就是不要让这些东西,打扰「真的」你。

  1. 不过我一直是《红楼梦》接受障碍症患者。读起来觉得没《查泰莱夫人的情人》透彻清楚,也没《金瓶梅》坦荡爽利。 

  2. 纪念马拉多纳 

  3. 纪念肖恩康纳利 

  4. 纪念胡萌 

  5. 但是我今天装上了飞书… 

  6. 所以我至今没有办法接受强制加班,因为这影响我全身心投入工作,不是美好的生活。