架构之美笔记

这是一个初创的公司,快速提供许多新版本的压力很大。延期是不可容忍的—
这会带来财务灾难。软件工程师被迫尽其极限,快速交付。所以代码是以一系列疯狂冲
刺的方式垒在一起的。

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

这些后果的影响是很严重的,远远超出了你对不良设计的天真想象 ?

———— 1 不可理解

——正如你已经看到的,“大都市”的架构以及缺乏强制的结构,导致了一个很难理解的软
件系统,实际上几乎不可能修改。新加入项目的团队成员(譬如我)会被复杂性惊呆,
不能够搞清楚状况。

坏的设计确实会招致在它上面叠加坏的设计(实际上它简直就是迫使你那样做),因为没有
一种明智的方式可以扩展该设计在所有能解决手上工作的方法之中,阻力最小的总会被
采用,没有明显的办法来修复这些结构问题,所以只要能减少麻烦,就会扔进去新的功能

注意:重要的是要保持软件设计的品质。坏的架构设计会招致更坏的架构设计。

———— 2 缺乏内聚

系统的组件完全没有内聚性。每个组件本来都应该有一个定义良好的角色,但是它们却
包含了一堆杂乱的、不一定相关的功能。这使我们很难确定组件存在的原因,也很难弄
明白系统中已经实现了哪项具体的功能。
很自然,这让缺陷修复成为了一场噩梦,严重地影响了软件的品质和可靠性

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

• 高内聚(Strong cohesion)
内聚是一个测量指标,说明相关的功能如何聚集在一起模块内的各部分
作为一个整体工作得如何。内聚性是将模块粘成一个整体的胶水
弱内聚的模块是不良分解的信号。每个模块都必须具有清晰定义的角色
而不只是一堆不相关的功能。
• 低耦合(Low coupling)
耦合是模块之间独立性的测量指标—它们之间进出“电线”的数量。在
最简单的设计中,模块几乎没有什么耦合,所以彼此间的依赖关系较少。
显然,模块不能够完全解耦,否则它们将根本不能够一起工作

—— 模块内部谈内聚,模块之间谈耦合

模块之间的联系有多种方式有的是直接的,有的是间接的。模块可以
用其他模块中的函数,被其他模块所调用。它可能使用其他模块提供的
Web服务或设施,可能使用其他模块的数据类型,提供某些数据让其他模
块使用(可能是变量或文件)。

好的软件设计会限制通信的线路,只提供那些绝对需要的。这种通信线路
是确定架构的一部分因素

———— 3 不必要的耦合
“大都市”没有清晰的分层。模块之间的依赖关系不是单向的,耦合常常是双向的。组
件A会到达组件B的内部,目的是完成它的一项任务。在其他的地方,组件B又通过硬编
码调用了组件A。系统没有最底层,也没有控制中心它是整体式的一大块软件

_ 整个软件系统就一团, 没法分开

这意味着系统的各部分之间耦合非常紧密,你想启动系统骨架就不得不创建所有的组件。
单个组件的任何改变都会波及其他组件,需要修改许多依赖它的组件孤立地看代码组
件没有任何意义。

———— 4 代码问题

“大都市”最微妙而又最严重的问题是重复。由于没有清晰的设计,也不清楚功能应该
处于的位置,所以轮子在整个代码集中不断重新发明。一些简单的东西,如通用算法和
数据结构,在许多模块中重复出现,每种实现都带有自己的一些未知的缺陷和怪异的行
为特征

更多的软件历史考察揭示了原因:“大都市”开始是从一系列独立的原型拼起来的,这
些原型本该抛弃。“大都市”实际上是偶然形成的城市群。当代码组件缝合在一起时,
组件之间匹配得不好。随着时间的推移,这种随意的缝合开始破裂,所以组件互相拉扯,
导致代码集破碎,而不是和谐地协作。

代码以外的问题
“大都市”内部的问题已经超越了代码集,在公司中其他的地方导致了混乱。不仅开发
团队中有问题,而且架构的腐烂也影响到了支持和使用该产品的人。—— 所有软件相关人都可能受坏架构引起的麻烦困扰!

开发团队
项目的新成员(例如我)被复杂性惊呆了,不能够搞清楚状况。这很好地解释了为
什么很少有新人能在公司里待下来—员工流失率非常高。

那些留下来的人非常努力地工作,项目的压力非常大。规划新的功能会导致极大的
恐惧。

那些留下来的人非常努力地工作,项目的压力非常大。规划新的功能会导致极大的

恐惧。
缓慢的开发周期
由于维护“大都市”是一项恐怖的任务,所以即使是最简单的变更或“很小的”缺
陷修复都不知道要花多少时间。管理软件开发周期非常难。客户只好等着实现重要
的特征,管理层对开发团队不能满足业务目标感到越来越沮丧。
支持工程师
在支持这个极不寻常的产品时,产品支持工程师度过了可怕的时光,他们要设法弄
明白很小的软件版本差异之间错综复杂的行为差异。
第三方支持
项目开发了一个外部支持协议,支持其他设备远程控制“大都市”。由于它只是软
件内部结构上面薄薄的一层,所以它反映了“大都市”的架构,这意味着它也是巴
罗克式的、难以理解的、容易偶尔出错的、不可能使用的。第三方工程师的生活也
被“大都市”的可怕结构搞得一团糟。
公司内部政治
开发问题导致了公司内部不同“种族”的分裂。开发团队与营销销售团队之间关系
紧张,每次新版本要推出时,制造部门总是要承受巨大的压力。经理们已经绝望了。

__跟我当前所在的网管项目多么相似

—————————— 看来坏的架构的危害是无穷无尽! 上梁不正下梁歪,——

一开始就错了, 后面就很难归正! _ 离这种坏软件越远越好

—— 就像一个国家领导, 坚持一套错误的理论,一些错误的实践,这样导致他的秘书必须围绕他的错误理论不得不做很多一些麻烦的、多余的工作, 他的下级也不得不苦恼的按照他的理论做事,下下级也是,... 直到最底层——“广大的人民群众”,人民群众可以不用按照他的狗p理论是做事了,但是他们可能会时不时的接触相关工程、系统, 最终不得不受他的困扰、苦痛、甚至是叫苦不迭...就像我们的老m

清晰的需求
软件历史考察凸显了“混乱大都市”之所以混乱的一个重要原因:在项目开始之初,团
队并不知道要构建的是什么。
本来的初创公司知道它要占领哪个市场,但不知道哪种产品能占领这个市场。所以他们两
面下注,要求一个可以做许多事情的软件平台。噢,我们昨天就想得到它了。所以程序员
们急急忙忙创建了一个毫无希望的总体基础设施,它具有做任何事情的潜力(但做得不好),
而不是创建一个把一件事情做好的架构,并能够在将来进行扩展,做更多的事情。

在规划“大都市”的早期阶段,有太多的架构师。面对糊涂的需求,他们都拿着一块拼

不起来的拼图,试图独自工作。他们在工作时没有考虑到整个项目,所以当他们试图将
这些拼图拼在一起时,就拼不起来了。没有时间进一步思考架构,软件设计的各个部分
有一些重叠,于是开始了“大都市”的城市规划灾难  ———— 也是没办法的事情

“大都市”的设计几乎完全是无可救药的—相信我,随着时间的推移,我们也尝试过
修复它。修复工作需要返工、重构、修改代码结构中的问题,这些已经成为不可能的任
务。重写也不是省事的方案,因为支持老的、巴罗克式的控制协议是需求的一部分。

你可以看到,“大都市”的“设计”产生的后果是残酷的,并且会无情地变得更糟。很难
加入新的特性,所以人们只是忙着添加更多不完善的功能、救急补丁和编造的谎言。没
有人在面对代码时感到愉快,项目正盘旋着向下栽缺乏设计导致了不良的代码,从而
又导致了不良的团队精神和不断变长的开发周期。这最终导致了公司严重的财务问题。

最后,管理层宣布“混乱大都市”已经不盈利了,它被抛弃了 !!!!!!!!!

对于任何组织机构来说,这都是勇敢的一步,特别是这个公司一直都眼高手低,同时又试图避免沉沦

时间: 2024-10-05 12:55:16

架构之美笔记的相关文章

架构之美阅读笔记01

初识架构,什么是架构,架构美在何处?不同领域的设计师对架构的理解大相径庭:软件架构师对一个好的架构的要求诸如对用户友好,响应及时,易维护,没有重大错误,易安装,可靠性高,可通过标准的方式同其他系统通信等等特点.通过进一步深入了解,更加深了对架构和架构之美的了解. "建造的艺术或科学,特别是设计和建造人类使用的建筑时的艺术或实践,同时考虑到美学因素和实用因素."架构是提供一种特定的方式来解决共同的问题,这种方式具有实用性和美学性:架构是美观.坚固.实用三个方面的平衡配合.好的系统架构展示

《架构之美》阅读笔记一

对于我们学习软件工程的学生来说,怎样来设计软件是一个非常重要的问题,通过阅读<架构之美>这本书,了解到了什么是架构,什么样的架构能够使软件更加的合理. 架构是系统设计的一部分,它突出了某些细节,并通过抽象省略掉了另一些细节.软件系统的架构包括行为上的和结构上的.外部行为描述展示了软件如何与用户.其他设备和外部设备进行交互,也就是需求.结构描述展示了软件如何被划分为多个部分,以及这些部分的关系. 在大多数人的谈论中,架构是一个目标产物,而作为架构师的责任就是去生产它.所以无论如何,架构是可以&q

架构之美阅读笔记之五

今天我学习的是架构之美的第五章--面向资源的架构:在web中.这一章,作者讲述说明了,企业中聚焦信息的架构展示了雨web一样的特点:伸缩性,弹性,架构歉意策略,信息驱动和访问控制等. Web服务的目标是提供建立可复用的业务服务基础的架构,希望能在不影响客户的情况下在各个地方以不同的编程语言异步地访问所有的功能,但是为了实现这个目标所用的技术组合使人感到迷惑,而且没有真正解决实际中组织机构的架构所面临的问题,,出现了一些服务恶化的问题. 面向资源的架构的标识是向命名的资源发起逻辑请求的过程,这些请

《架构之美》阅读笔记四

今天我阅读了<架构之美>第五章面向资源的架构在web中,这一章讲到现在我们过分强调了软件和服务,而却忽视了数据,现在大多数组织机构更容易在web上找到信息,而不是在他们自己的系统中.web在很大程度上是因为它增大了信息共享的可能性,同时也降低了门槛. 面向资源的架构的标识是向命名的资源发起逻辑请求的过程.这种请求由某种引擎解释,转成该资源的物理表现形式,面向资源的架构方法很优雅的实现了一些折中,一方面,对于传统的方法来说,这些方法可能看起来有些奇怪,而且没有尝试过.另一方面,它代表了人们设想和

架构之美阅读笔记之三

今天我学习的是架构之美的第三章--伸缩性架构设计.这一张也是涉及到了第二部分,企业级用用架构.首先我们要引出,伸缩性架构设计,也就是为什么要伸缩性的架构.主要原因是,我们在设计系统架构Ⅹ,要确保系统在伸缩时的弹性.为了适应使用软件架构的不同应用程序,使用该架构的程序员等,软件系统架构必须要具有伸缩性. 要是系统架构是伸缩性的,则系统应该是分布式的,并发的.就像书中讲到的Darkstar项目,由于在线人数,不同时间等的影响,游戏的负载情况也会不同,服务器的数量,连接方式,为了应对这些不同的情况,也

《大型网站技术架构》读书笔记之七:随需应变之网站的可扩展架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 一.可伸缩与可扩展-傻傻分不清楚 上篇笔记我们学习了可伸缩架构,但在实际场合中,包括许多架构师也常常混淆可伸缩和可扩展,用可扩展表示伸缩性.那么在此,跟随作者我们来理清这两个概念,避免我们以后对其傻傻分不清楚. (1)扩展性(Extensibiltiy) 指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力.我们不禁想到了面向对象中一大原则:开闭原则,对扩展开放,对修改封闭.也就说,当系统新增一个功能时

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 首先,所谓网站的伸缩性,指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力.在整个互联网行业的发展渐进演化中,最重要的技术就是服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力. 一.网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩 (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性: (2)横向分离:将不同的业务模块分离部署

《大型网站技术架构》读书笔记之八:固若金汤之网站的安全性架构

此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. 一.网站应用攻击与防御 二.信息加密技术与密钥安全 三.信息过滤与反垃圾 四.电子商务风险控制 五.学习总结 转眼之间,<大型网站技术架构>的读书笔记到此就结束了.最近时间非常紧,因此本篇没有详细对笔记进行介绍(本篇涉及太多内容,而且都是安全相关的).通过本书的学习,我们从高性能.高可用.伸缩性.可扩展性.安全性五个方面的架构学习了每个方面经典的技术方案,虽然以理论偏多,但还是可以从中管中窥豹,一览

架构漫谈阅读笔记

<架构漫谈>读后感 经过一个寒假对<架构之美>的解读,其实我已经对什么是架构有了一个初步的认识,但是还是有一些不太明白的地方.今天,我仔细地阅读了由资深架构师王概凯Kevin执笔的系列专栏--架构漫谈,让我对什么是架构.怎样做好架构.软件架构如何落地.如何写好程序等问题有了更深刻的认识. 正如文章开篇所说的那样:一直以来,在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解.那么究竟什么是软件架构呢?其实,把一个整体(完成人类生存的所有工作)切分成不同的部分(分工),由