- 推荐序一:架构师真正要学会的事情
- 推荐序二
- 译者序 2.0
- 序
- 关于本书
- Part Ⅰ 什么是软件架构
- 第 1 章 什么是架构
- 第 2 章 架构的种类
- 第 3 章 软件架构是什么
- 第 4 章 敏捷软件架构是什么
- 第 5 章 架构对上设计
- 第 6 章 软件架构重要吗
- 第 7 章 问题
- Part Ⅱ 软件架构的角色
- 第 8 章 软件架构的角色
- 第 9 章 软件架构师应该编码吗
- 第 10 章 软件架构师应该是建造大师
- 第 11 章 从开发者到架构师
- 第 12 章 拓展 T
- 第 13 章 软技能
- 第 14 章 软件架构不是接力运动
- 第 15 章 软件架构要引入控制吗
- 第 16 章 小心鸿沟
- 第 17 章 未来的软件架构师在哪里
- 第 18 章 每个人都是架构师,除非他们有其他身份
- 第 19 章 软件架构咨询师
- 第 20 章 问题
- Part Ⅲ 设计软件
- 第 21 章 架构驱动力
- 第 22 章 质量属性(非功能需求)
- 第 23 章 处理非功能需求
- 第 24 章 约束
- 第 25 章 原则
- 第 26 章 技术不是实现细节
- 第 27 章 更多分层等于更高复杂度
- 第 28 章 协同设计是一把双刃剑
- 第 29 章 软件架构是对话的平台
- 第 30 章 SharePoint 项目也需要软件架构
- 第 31 章 问题
- Part Ⅳ 可视化软件
- 第 32 章 沟通障碍
- 第 33 章 对草图的需要
- 第 34 章 无效的草图
- 第 35 章 C4:语境、容器、组件和类
- 第 36 章 语境图
- 第 37 章 容器图
- 第 38 章 组件图
- 第 39 章 是否包含技术选择
- 第 40 章 你会那样编码吗
- 第 41 章 软件架构和编码
- 第 42 章 你不需要 UML 工具
- 第 43 章 有效的草图
- 第 44 章 C4 的常见问题
- 第 45 章 问题
- Part Ⅴ 为软件生成文档
- 第 46 章 代码不会讲述完整的故事
- 第 47 章 软件文档即指南
- 第 48 章 语境
- 第 49 章 功能性概览
- 第 50 章 质量属性
- 第 51 章 约束
- 第 52 章 原则
- 第 53 章 软件架构
- 第 54 章 外部接口
- 第 55 章 代码
- 第 56 章 数据
- 第 57 章 基础设施架构
- 第 58 章 部署
- 第 59 章 运营和支持
- 第 60 章 决策日志
- 第 61 章 问题
- Part Ⅵ 开发生命周期中的软件架构
- 第 62 章 敏捷和架构的冲突:神话还是现实
- 第 63 章 量化风险
- 第 64 章 风险风暴
- 第 65 章 恰如其分的预先设计
- 第 66 章 初识软件架构
- 第 67 章 问题
- Part Ⅶ 金融风险系统
- 第 68 章 金融风险系统
- Part Ⅷ 附录:技术部落 的软件指南
第 46 章 代码不会讲述完整的故事
我们都知道,编写好的代码很重要,重构迫使我们考虑让方法变得更小、更可复用和自文档化。有人说注释是有害的,自注释的代码才应该是我们的追求。不管你怎么做,我们每个人都应该追求易于阅读、理解和维护的好代码。但是代码不会讲述完整的故事。
让我们想象一下,你新加入一个正在进行中的软件项目。主要的结构单元都到位了,已经交付了一些功能。你启动了自己的开发机,从源代码控制系统下载了代码并加载到你的开发环境中。下一步要做什么,如何变得有效率?
从哪开始
如果没人有时间带你过一遍代码库,你可以根据对这个项目有限的了解、业务领域、你对团队如何构建软件的期望以及你对所用技术的知识,做出自己的假设。
举个例子,你可以通过代码库如何被拆分为子项目、目录、包、命名空间等对软件系统的整体架构做出一些判断。说不定有一些正在使用的命名约定。我们甚至能够从前面的微软Visual Studio屏幕截图判断出软件的一些特征,在这种情况下它是一个(匿名)的网上银行系统。
系统用C#在微软.NET平台上编写。
整个.NET解决方案被分拆为很多个Visual Studio项目,有一个被称为ib.web的.NET Web应用程序,你已经料到了,因为这是一个网上银行系统(IB即“网上银行”)。
系统似乎是由多个架构层组成的。有ib.web和ib.middletier,但我不知道是否有物理或逻辑层。
项目看起来有一个命名约定。如,iib.middletier.authentication.lib 、ib.middletier.messaging.lib和b.middletier.bankingsystem.lib似乎都是中间层相关的类库。这些仅仅是类的一种逻辑分组,还是一些更重要的东西,比如高层次组件和服务?
借助一些技术知识,我能够看到ib.web项目下潜藏了一个“服务引用”文件夹。这是Windows通信基础(WCF)服务的引用,在这个例子中,基本上就是Web服务的客户端。它们的命名似乎对应了中间层的类库,因此我认为我们实际上拥有的是一个分布式系统,它有一个暴露了一些良好定义的服务的中间层。
代码未描绘的设计意图
进一步深入代码会帮助验证你最初的假设正确与否,但也可能留给你一大堆问题。也许你在较高层次明白系统做的事情,但不明白像下面这样的事。
软件系统如何融入已有的系统形态;
为什么会选择正在使用的技术;
软件系统的整体结构;
各个组件在运行时部署在哪里,如何相互沟通;
Web层如何“知道”在哪里找到中间层;
日志/配置/错误的处理/其他采用了什么方法,在代码库中是否一致;
代码库中是否使用了通用的模式和原则;
如何添加新功能,在哪里添加;
栈的安全性是如何实现的;
如何实现可伸缩性;
与其他系统的接口如何工作;
其他。
我曾被要求评审和参与开发没有文档的系统。你当然可以从代码的角度评估大部分问题的答案,但这会很繁重。阅读代码的作用始终有限,但某些时候你可能需要向团队的其他人请教一些问题。如果没有问对问题,你就得不到正确的答案:你不知道你未知的。
辅助信息
任何软件系统,在代码之上都有另一个可以回答这些类型以及更多问题的信息层。
代码之上还有一个额外的信息层
这类信息和代码是互补的,应该在某处被捕获,比如轻量级的辅助文档,它能描述代码自己无法描述的东西。代码会讲故事,但不会讲述完整的故事。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论