我们一直在上演“混乱大都市”的神话传说
    我们一直在上演“混乱大都市”的神话传说。呵呵,在这里工作了将近一年半了吧,在公司认识了数以百计的人,但是现在在公司还是没几个能叫上名字的。真正关系好的还是没几个。苦恼,为什么这里的药水换的这么快呢?

我第一次接触“混乱大都市”,是在我加入了创建它的公司时。初看上去这是一份有前途的工作。我将加入一个团队,参与基于web的银行服务系统代码集开发,已有的代码集已经开发几年了。如果你像我一样拥有特殊的技术崇拜,就会觉得很兴奋。
    工作起初并不顺利,但是你不能指望在加入一个新团队、面对新的代码集时会觉得很轻松。然而,日复一日(周复一周),情况却没有任何好转。这些代码要花极长的时间来学习,没有显而易见的进入系统中的路径。这是个警告信号。从微观的层面来说,也就是从每行程序、每个方法、每个组件来看,代码都是混乱而粗糙地垒在一起的。不存在一致性、不存在风格、也没有统一的概念能够将不同的部分组织在一起。这是另一个警告信号。系统中的控制流让人觉得不舒服,无法预测。这又是一个警告信号。系统中有太多的“坏味道”,整个代码集散发着腐烂的气味,是在大热天里散发着刺激性气体的一个垃圾堆。这是一个清晰的警告信号。数据很少放在使用它的地方。经常引入额外的巴罗克式缓存层,目的是试图让数据停留在更方便的地方。这又是一个警告信号。
当我试图在大脑中建立“大都市”的全图时,没有人能解释它的结构;没有人知道它的所有层、它的藤蔓,以及那些黑暗、隔离的角落。实际上,没有人知道它究竟有多少部分是真正能工作的(它实际上靠的是运气和英雄式的维护程序员)。人们知道他们面对
的那一小部分区域,但没人了解整个系统。很自然,没有任何文档。这也是一个警告信号。我需要的是一份地图。
这是一个悲伤的故事,我曾是其中的一部分:“大都市”是城市规划的恶梦。在你开始整治混乱之前,先要理解混乱,所以我们花了很大的精力和毅力,得到了一份“架构图”。我们标出了每一条公路、每一条主干道、每一条很少人了解的小路、所有灯光昏暗的辅路,并将它们画在一张主图上。我们第一次看到了这个软件的样子,并不令人赏心悦目。它是一些混乱的区块和线条。为了让它更好理解一些,我们用颜色标出了控制路径,突出了它们的类型。然后我们后退一步看着它。
它令人吃惊。它令人目眩神迷。它就像一只喝醉了的蜘蛛,跌进了一些海报颜料罐里,然后在一张纸上织成了一张彩色的网。

实际上,它与伦敦地铁的相似性让人印象深刻:从系统的一端到另一端有很多条路线,哪条路最好通常是不明显的。地理位置很近的目的地常常很难到达,你希望能在两点之间再挖掘一条隧道。有时候,走出地铁换乘巴士实际上是更好的选择。或者干脆步行。
无论从哪个角度来看,这都不是一个“好的”架构。“大都市”的问题超出了设计的范畴,它涉及开发过程和企业文化。这些问题实际上导致了许多架构腐烂。代码经过几年的“有机”生长,没有人进行过任何架构设计,而且各个部分是随着时间推移,没有经过太多思考就栓在一起的。我们这么说真的算是客气的了。没有人停下来为代码建立一个理智的结构。它增长、膨胀,成为绝对没有任何架构设计的系统的一个典型。代码集从来不会没有架构。这个系统只是拥有一个很糟糕的架构。
如果我们回顾创建“大都市”的公司的历史,它所处的状态是可以理解的(但是不可宽恕):这是一个初创的公司,快速提供许多新版本的压力很大。延期是不可容忍的—这会带来财务灾难。软件工程师被迫尽其极限,快速交付。所以代码是以一系列疯狂冲刺的方式垒在一起的。

注意:不好的公司结构和不健康的开发过程将在糟糕的软件架构中得到反映。

正如你已经看到的,“大都市”的架构以及缺乏强制的结构,导致了一个很难理解的软件系统,实际上几乎不可能修改。新加入项目的团队成员(譬如我)会被复杂性惊呆,不能够搞清楚状况。
坏的设计确实会招致在它上面叠加坏的设计(实际上它简直就是迫使你那样做),因为没有一种明智的方式可以扩展该设计。在所有能解决手上工作的方法之中,阻力最小的总会被采用,没有明显的办法来修复这些结构问题,所以只要能减少麻烦,就会扔进去新的功能。

功能和数据都放在了系统中错误的地方。许多你认为是“核心服务”的部分却没有在系统的核心部分实现,而是由边远的模块来模拟实现(非常痛苦并且代价很大)。

注意:开发团队中健康的工作关系将直接有益于软件设计。不健康的关系和个性膨胀会导致不健康的软件。

软件设计的关键品质是内聚和耦合。这不是什么新奇的“面向对象”概念;自从20世纪70年代出现结构化设计开始,开发者对这一概念已经谈论了许多年。我们的目标是通过设计使系统的组件具备下列品质:
. 高内聚(Strong cohesion)内聚是一个测量指标,说明相关的功能如何聚集在一起,模块内的各部分作为一个整体工作得如何。内聚性是将模块粘成一个整体的胶水。弱内聚的模块是不良分解的信号。每个模块都必须具有清晰定义的角色,而不只是一堆不相关的功能。

. 低耦合(Low coupling)耦合是模块之间独立性的测量指标—它们之间进出“电线”的数量。在最简单的设计中,模块几乎没有什么耦合,所以彼此间的依赖关系较少。显然,模块不能够完全解耦,否则它们将根本不能够一起工作!模块之间的联系有多种方式,有的是直接的,有的是间接的。模块可以调用其他模块中的函数,或被其他模块所调用。它可能使用其他模块提供的Web 服务或设施,可能使用其他模块的数据类型,或提供某些数据让其他模块使用(可能是变量或文件)。好的软件设计会限制通信的线路,只提供那些绝对需要的。这种通信线路是确定架构的一部分因素。
“大都市”最微妙而又最严重的问题是重复。由于没有清晰的设计,也不清楚功能应该处于的位置,所以轮子在整个代码集中不断重新发明。一些简单的东西,如通用算法和数据结构,在许多模块中重复出现,每种实现都带有自己的一些未知的缺陷和怪异的行为特征。更大范围的关注点,如外部通信和数据缓存,也实现了许多次。
更多的软件历史考察揭示了原因:“大都市”开始是从一系列独立的原型拼起来的,这些原型本该抛弃。“大都市”实际上是偶然形成的城市群。当代码组件缝合在一起时,组件之间匹配得不好。随着时间的推移,这种随意的缝合开始破裂,所以组件互相拉扯,导致代码集破碎,而不是和谐地协作。
注意:松弛而模糊的架构将导致每个代码组件编写得不好,并且相互之间匹配得不好。它也会导致重复的代码和工作。
代码以外的问题
“大都市”内部的问题已经超越了代码集,在公司中其他的地方导致了混乱。不仅开发团队中有问题,而且架构的腐烂也影响到了支持和使用该产品的人。
开发团队项目的新成员(例如我)被复杂性惊呆了,不能够搞清楚状况。这很好地解释了为什么很少有新人能在公司里待下来—员工流失率非常高。那些留下来的人非常努力地工作,项目的压力非常大。规划新的功能会导致极大的恐惧。
缓慢的开发周期由于维护“大都市”是一项恐怖的任务,所以即使是最简单的变更或“很小的”缺陷修复都不知道要花多少时间。管理软件开发周期非常难。客户只好等着实现重要的特征,管理层对开发团队不能满足业务目标感到越来越沮丧。
支持工程师在支持这个极不寻常的产品时,产品支持工程师度过了可怕的时光,他们要设法弄明白很小的软件版本差异之间错综复杂的行为差异。
第三方支持项目开发了一个外部支持协议,支持其他设备远程控制“大都市”。由于它只是软件内部结构上面薄薄的一层,所以它反映了“大都市”的架构,这意味着它也是巴罗克式的、难以理解的、容易偶尔出错的、不可能使用的。第三方工程师的生活也被“大都市”的可怕结构搞得一团糟。
公司内部政治开发问题导致了公司内部不同“种族”的分裂。开发团队与营销销售团队之间关系紧张,每次新版本要推出时,制造部门总是要承受巨大的压力。经理们已经绝望了。
注意:不良架构的影响不仅限于代码。它会进一步影响到人、团队、过程和时间表。

软件历史考察凸显了“混乱大都市”之所以混乱的一个重要原因:在项目开始之初,团队并不知道要构建的是什么。
本来的初创公司知道它要占领哪个市场,但不知道哪种产品能占领这个市场。所以他们两面下注,要求一个可以做许多事情的软件平台。噢,我们昨天就想得到它了。所以程序员们急急忙忙创建了一个毫无希望的总体基础设施,它具有做任何事情的潜力(但做得不好), 而不是创建一个把一件事情做好的架构,并能够在将来进行扩展,做更多的事情。
注意:重要的是要在开始设计系统之前知道你打算设计什么。如果你不知道它是什么,也不知道它将做什么,暂时不要开始设计它。只设计你知道需要的东西。
在规划“大都市”的早期阶段,有太多的架构师。面对糊涂的需求,他们都拿着一块拼不起来的拼图,试图独自工作。他们在工作时没有考虑到整个项目,所以当他们试图将这些拼图拼在一起时,就拼不起来了。没有时间进一步思考架构,软件设计的各个部分有一些重叠,于是开始了“大都市”的城市规划灾难。

那么我们学到了什么?不良的架构会产生深远的影响和严重的反弹。在“混乱大都市”中缺少预见性和架构设计,导致了下面的问题:

. 低品质的软件和漫长的版本发布周期。
. 系统没有弹性,不能够适应变更或添加新的功能。
. 无处不在的代码问题。
. 员工问题(压力大、士气低、跳槽等)。
. 大量混乱的公司内部政治。
. 公司不能成功。
. 许多痛苦和面对代码深夜加班。

架构的教训:

架构几乎会影响所有与之相关的人和事,它决定了代码集的健康,也决定了相关领域的健康。就像一个繁荣的城市会为当地带来成功和声望,好的软件架构将帮助项目获得发展,为依赖于它的人带来成功。
好的架构是很多因素的结果,包括以下方面(但不限于此):
. 确实进行有意为之的前端设计。(许多项目甚至还没开始,就因为这一点而失败了。)
. 设计者的素质和经验。(以前犯过一些错误是有帮助的,这能在下一次为你指出正确方向!“大都市”项目肯定教会了我一些东西。)
. 在开发过程中,保持清晰的设计观点。
. 授权团队负责软件的整体设计,而团队也承担起这一责任。
. 不要害怕改变设计:没有什么是一成不变的。
. 让合适的人加入到团队中,包括设计者、程序员和经理,确保开发团队的规模合适。确保他们具有健康的工作关系,因为这些关系将不可避免地影响代码的结构。
. 在合适的时候做出设计决定,当你知道所有必要信息时再做出决定。延迟那些暂时不能做出的决定。
. 好的项目管理,以及合适的最后期限。

\t\t我们一直在上演“混乱大都市”的神话传说相关推荐

  1. 架构师必看-架构之美第14章-两个系统的故事:混乱大都市(一)

    你们修筑.修筑,预备道路,将绊脚石从我百姓的路中除掉.                                        -<以赛亚书>第57章14节 我们要看的第一个软件系统 ...

  2. 架构之美(china-pub全国独家首发)

    架构之美(china-pub全国独家首发) [作 者]Till Adam [同作者作品] [作译者介绍]  [译 者] 王海鹏;蔡黄辉;徐锋[同译者作品]  [出 版 社] 机械工业出版社     [ ...

  3. 成为“能打”的二次元游戏《明日方舟》做对了什么?

    在讨论<明日方舟>及他所带来的影响与启示前,先说点有关故事背景的题外话. 作为一个P社玩家,罗德岛这三个字就会自然而然的想到医院骑士团(前期的根据地),提起骑士团就不得不说"Ar ...

  4. 35 岁之前不应该错过的 30 本书

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. PS:在这个书目中,我不偏好的书会直接放到最后,所以不是按原文顺序来. 1.<目送> 作 ...

  5. 社会生活中的著名法则(一)

    http://blog.csdn.net/cellbird/article/details/447386 一.马太效应 <新约?马太福音>中有这样一个故事,一个国王远行前,交给三个仆人每人 ...

  6. 对“巴洛克式“(巴罗克式)的理解

    最近在读架构之美这本书,其中在第二章的时候,讲到混乱大都市的故事的时候提到了巴罗克式缓存层,当时对于这个说法不是特别的理解.于是用百度百科搜索了一下, 地址如下:http://baike.baidu. ...

  7. 寂静岭:理性与心魔的拔河

    寂静岭长子 姓名:Silent Hill 出生时间:1999年1月 "Silent Hill(寂静岭)"是Konami公司在PS主机上发售了一款恐怖冒险游戏.在这款游戏中,Kona ...

  8. 万卷书 - 欧洲的门户[The Gates of Europe]

    欧洲门户 Wu克蓝的历史 作者:谢尔盖-普洛克希 概要 <The Gates of Europe>(2015年)对Wu克蓝的历史进行了深入的阐述.这个国家横跨欧亚之间,由于这一独特的地理位 ...

  9. 混沌、无序、变局?探索之中,《拟合》开启

    从无序中寻找踪迹,从眼前事探索未来 在东方的神话里,喜鹊会搭桥,银河是条河,两端闪耀的牵牛星和织女星,则是一年一相会的佳偶,他们彼此间的惦念,会牵引彼此在七夕那天实现双星聚首. 在西方的世界观里,繁星 ...

最新文章

  1. MySQL绿色版的安装
  2. 微信小程序从oracle取数,微信小程序 取随机数
  3. CISCO IP nat 常用命令及原理详解
  4. 对比两个表中,字段名不一样的SQL
  5. 有时间窗车辆路径问题(VRPTW)解决方案合集,[CW节约算法,TS(硬约束版),TS(惩罚函数版),LNS四种方法对比(附MATLAB代码)]
  6. 【KVM系列02】KVM的CPU 和内存虚拟化
  7. 自定义方法中英文字符截取
  8. nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress
  9. 22 FI配置-财务会计-定义收益留存科目(Retained Earning Account)
  10. mysql编号用什么类型_mysql 之编码配置、引擎介绍、字段操作、数据类型及约束条件...
  11. 1007.422通信问题
  12. idea mysql删除_IntelliJ IDEA 配置Mysql5.7 带图文详解 视频讲解
  13. vue-json-editor实现json编辑器并且可以正常输入中文
  14. 怎么减小照片大小kb?
  15. 塑胶产品规格书范本_塑胶产品结构设计--卡扣 - 范文中心
  16. php 统计uv,简单网站统计功能的实现 PV IP 真实访客数(UV) | 学步园
  17. 使用TIBCO Rendezvous发送hello world,实现监听和发送
  18. Android流行框架大全
  19. 常见股票代码开头说明大全
  20. arista eos系统从零开始研究(1)

热门文章

  1. Tomcat 3、4、5、6、7、8、9 各版本下载地址
  2. mysql解决模糊查询包含关系
  3. 蛮荒搜神记服务器在维护,蛮荒搜神记法宝洗练图文教程 蛮荒搜神记如何提升战斗力?-游侠网...
  4. 大型语言模型的推理演算
  5. web网页端 微信 登录 内嵌 二维码 方法
  6. 传智播客创始人张孝祥因病去世(转)
  7. js中isNaN、Number.isNaN,isFinite、Number.isFinite的区别
  8. Windows 微信3.3.0内测如何申请,附报名及下载地址
  9. 行政人员与固定资产管理的爱恨情仇
  10. 60020:not allow to access from your ip