建筑是什么?昨天下午,我在从西安坐飞机去太原的路上,不由得想了想这个问题。我从事C#开发已有11年了。做过很多项目,在项目开发过程中经历过很多折磨。曾在小公司兼职当过不靠谱的“技术总监”,也曾在大公司做过coder。看过很多他分析过大佬们的代码,还和团队一起设计了OSGi.NET框架和iOpenWorks插件仓库平台。回顾这么多年的软件开发经验,我发现自己一直在追寻如何让软件开发更好,如何让一个团队开发出像样的软件产品,而不是那些丑陋的、经常出现的大多数中国人生产的各种软件产品人们。企业软件的一个古怪问题。目前,我们除了做软件开发平台,还深入到火电、能耗监测等能源监测领域。进入这个领域后,我们发现几个传统大厂做的软件都非常烂。软件丑到不能丑。是的,我什至不想把它给我。这些厂商这么有钱,就不能做出好的软件吗?太不可思议了。所以,我和我的伙伴们大胆的表态,我们要做这个行业最好的软件,做这个领域里最好的。哈哈,说的容易!当我带领一个新的、新成立的团队尝试在特定环境下开发这样一个软件时,我发现我们软件的第一个版本也非常难看。我这才恍然大悟,说不定那些厂商的软件开发也是这样生产的。如果这样生产出来的软件满足了用户的需求,这些开发者要吃多少苦,才能把一个不靠谱的软件鼓捣得靠谱一点。于是,我开始反思,一个新的团队如何开发出好的软件产品?答案与我的标题相同,我将依赖架构。那么什么是架构?建筑是一种约定俗成,一种规则,一种共识,每个人都知道如何遵守。那么这是一个什么样的协议,什么样的规则,什么样的共识呢?让我以包为例。我经常旅行,背包里装了很多东西。笔记本电脑、电源、网卡2张、鼠标、USB线、大名片一盒、小名片一盒、口香糖、Mini-DisplayPort转VGA接口、U盘、笔若干、小螺丝刀、洗漱用品、清洁用品衣服、袜子、香水、老婆带来的洗面奶(她嫌我最近累了,脸有点黄)、钱包、Token卡、耳机、纸巾、USB线、U盘等。这个包有很多格子,最外面的格子我放了常用的,比如笔,纸,一小盒名片等等;中间格子一般放衣服、袜子、洗漱用品、香水等;笔记本电脑,类似笔记本电脑的小隔层有两块网卡,Mini-DisplayPort转VGA接口,一大盒名片,记事本,类似笔记本电脑的大隔层有电源,鼠标,口香糖等.我可以闭着眼睛从包里拿出东西,闭着眼睛也可以把东西塞进包里!但是,非常不幸的是,一旦我妻子帮我收拾行李,我就很痛苦,而且总是因为找不到东西而抓狂!更倒霉的是,要是我这个还不到两岁的“小可爱”翻身,那就更可怕了。这个包就是我放所有物品的“结构”,每一个物品的位置就是我的“约定、规则、共识”。如果我的妻子也知道我的“结构”和我的“约定、规则、共识”,那么无论她如何移动我的包,我仍然可以轻松拿取或放东西。此外,如果我的同事也知道我的“架构”和我的“协议、规则和共识”,那么他们什么时候动我的包我就不知道了!恍然大悟!在我之前的公司Sybase,所有的产品都是基于一个统一的插件开发平台。DataAccessor),定义PropertyPage、PropertyDialog、Wizard。记得当时确定工作角色的时候,拿到了一份开发文档,上面描述了这些目录的规则,名称,UI文本语句规则,文本大小规则等等,一周之内就可以修复bug,经过月我可以做新功能,但是,我现在对我们的平台和框架还一无所知。一年过去了,产品依然按照约定不断改进,在维护过程中我们一点也不觉得累。基于这样的框架做产品,我发现无论是谁,开发风格都是一模一样的。之前我一点都不惊讶!在公司工作了两年,有点老鸟了,做了一个《Flex UI Composition SDK》,是一个基于Flex的界面组合组件。很漂亮,代码漂亮,文档正规。而且这个小巧的SDK功能强大且灵活。老板很给面子,让我看看美国建筑团队。我非常热情地在半夜与电话会议和那些了不起的架构师和专家工程师一起展示我的SDK。完成工作后,我印象非常深刻。一位很资深的老外架构师提到,他觉得SDK有点复杂。之前不太明白他为什么说复杂。原因很简单。以他的技术,我觉得用这个SDK问题不大,只要稍微学习一下就可以了。后来终于慢慢想通了。这个SDK的缺点是过于灵活,灵活到无法建立一个统一的标准和易于遵循的“协议、规则、共识”。没有“共识”的支撑,这样的系统,几个人维护之后,肯定就完蛋了,变成“万人坑”。谁改了代码谁就骗谁,以后什么事都可能发生。于是,我想通了一点,架构就是这么一个共识。当共识普遍传播时,结构消失,开发好的软件成为一种习惯。这就是为什么有专家提出要“消灭建筑”的原因!天哪,这帮人太变态了,想的这么早!说到这里,我还需要继续分享我是如何在新团队中淘汰架构的。方法很简单,向以前的Sybase同事学习!第一步:使用插件架构第二步:定制统一界面框架界面框架如下。框架规定了统一的界面风格,如按钮、磁贴、标签、导航栏、进度条、表单等。第三步:自定义插件的统一架构。每个插件创建5个目录:Controllers、DataAccessors、Models、ViewModels和Views,如下图。存储在每个目录中的代码通过名称知道它是什么。第四步:定制开发模板(升华,这一步不是必须的,是为了提高易用性,让傻瓜也能开发插件,仅供参考)在主程序模板中可以保护统一的数据访问,统一安全管理等功能模块。哈哈,这个方法终于可以让新团队开发出风格更统一、质量更高的软件产品了!这时候你会发现大家不需要关心架构,大家只有一个共识。这样架构就成功消除了,架构的目标就是消除架构!但是,如果架构被淘汰了,架构师不也被淘汰了吗?我把这个有趣的问题留给读者。附:关于建筑的官方定义,推荐参考《Java应用架构设计》,很经典的一本书。本文中“架构即共识,淘汰架构”的说法出自本书。我不喜欢“架构是共识,摧毁架构”的论点。
