读程序员的README笔记16_构建可演进的架构(上)

这篇具有很好参考价值的文章主要介绍了读程序员的README笔记16_构建可演进的架构(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读程序员的README笔记16_构建可演进的架构(上)

1. 行为准则

读程序员的README笔记16_构建可演进的架构(上)文章来源地址https://www.toymoban.com/news/detail-760153.html

2. 需求的不确定性

2.1. 不断变化的客户需求

2.2. 软件项目无法避免的挑战

2.3. 产品需求和环境会随着时间的推移而改变,你的应用程序也必须随之改变

2.4. 不断变化的需求会导致不稳定性,使开发工作偏离轨道

2.5. 通过构建可演进的架构来适应不断变化的需求

2.5.1. 可演进的架构可避免复杂性,复杂性是演进性的敌人

2.5.2. 矛盾的是,在软件中实现简洁性会很困难

3. 复杂性

3.1. 复杂系统的特点

3.1.1. 高依赖性

3.1.1.1. 致软件依赖于其他的API或代码行为

3.1.1.2. 依赖性显然不可避免,甚至是可取的,但必须取得平衡

3.1.1.3. 高依赖性的系统很难修改

3.1.1.3.1. 它们有紧密的耦合性和高度的变更放大效应
3.1.1.3.2. 紧密的耦合性是指那些严重依赖彼此的模块,它们导致了更高的变更放大的倍率,即某项单一的变更也需要修改依赖关系

3.1.1.4. 深思熟虑的API设计和有节制地使用抽象模型将最大限度地降低紧耦合性和变更放大效应

3.1.2. 高隐蔽性

3.1.2.1. 使得程序员很难预测某项变更的副作用、代码的行为方式,以及需要修改的地方

3.1.2.2. 晦涩的代码需要更长的时间来学习,开发人员更有可能在无意中破坏某些东西

3.1.2.3. 症状

3.1.2.3.1. “知道”太多的对象
3.1.2.3.2. 鼓励副作用的全局状态
3.1.2.3.3. 掩盖代码的过度间接寻址
3.1.2.3.4. 影响程序远程行为的远距离操作

3.1.2.4. 采用具有明确的约定和标准模式的API可以减少隐蔽性

3.1.3. 高惯性

3.1.3.1. 指软件保持之前的使用习惯

3.1.3.2. 用于快速实验且很容易被丢弃的代码具有低惯性

3.1.3.3. 一项为十几个关键业务应用提供驱动力的服务具有高惯性

3.1.3.4. 复杂性的成本随着时间的推移而增加,所以高惯性、高变化的系统应该被简化,而低惯性或低变化的系统可以保持复杂(只要你抛弃它们或继续让它们保持不变)

3.2. 复杂性不总能被消除,但你可以选择把它放在哪里

3.2.1. 向后兼容的变更可能使代码使用起来更简单,实现起来却更复杂

3.2.2. 用于解耦子系统的间接层可降低依赖性,却会提高隐蔽性

4. 可演进的设计

4.1. 面对未来未知的需求策略

4.1.1. 试图预判未来的需求

4.1.2. 建立抽象模型作为逃生舱门,使后续的代码修改更容易

4.1.3. 都会导致复杂性提高

4.2. KISS的原则

4.2.1. 要保持事情简单一些

4.2.2. 使用KISS记忆法,记住要以简单性为核心原则构建系统

4.2.3. 简单的代码可以让你在未来增加系统的复杂性

4.3. 保持代码简单的最简单的方法之一是避免什么代码都要写出来

4.3.1. 告诉你自己,你不是真的需要(You ain’t gonna need it,YAGNI)

4.3.2. 要使用最小惊讶原则和封装原则

4.4. 不要构建你不需要的东西

4.4.1. 靠猜测而编写出来的代码会继续使事情陷入困境,它需要被维护,开发人员需要理解它,它必须被构建和测试

4.4.2. 避免过早优化,避免不必要的灵活抽象模型,以及避免最小可行产品(minimum viable product,MVP)所不需要的产品特性

4.4.3. 过早优化是指开发人员在证明需要优化之前就对代码进行性能优化

4.4.4. 灵活的抽象模型——插件式架构、封装接口和通用数据结构(如键值对)是另一种诱惑

4.4.4.1. 抽象自有代价:它把实现的代码框在僵硬的边界里,而开发者最终会与之抗争

4.4.4.2. 灵活性也使代码更难以阅读和理解

4.4.4.2.1. 保持代码灵活性的最佳方法之一是减少代码的总量
4.4.4.2.2. 蒙茨法(muntzing),将使你的软件保持“苗条”和适应性

4.4.5. MVP允许你先测试一个想法,而不必押宝在某项成熟的实施上

4.4.5.1. 在你怀疑可以插入优化的地方放置接口填充程序,但不要真正实现它们

4.5. 最小惊讶原则

4.5.1. 不要让用户感到惊讶,构建特性表现得要像用户最初期望的那样,具有上扬的学习曲线或奇怪表现的特性会使用户感到沮丧

4.5.2. 不要让开发者感到惊讶,令人惊讶的代码通常晦涩难懂,这会导致复杂性

4.5.3. 通过保持代码的针对性、避免隐性知识,以及使用标准类库和模式来消除惊讶

4.5.4. 凡是开发者在调用API时需要知道的但又不属于API本身的不明显的知识,都被视为隐性知识

4.5.5. 排序需求决定了某些动作必须按照某种特定的顺序进行

4.5.5.1. 使用文档来说明某些排序需求是种好办法,但最好是一开始就没有这个排序需求

4.5.6. 当一个方法的签名暗示了比该方法实际可以接受的有效输入范围更广时,就会出现隐藏的参数需求

4.5.7. 切记让参数需求具体化和可视化

4.5.7.1. 使用可准确适配约束的特定类型,当使用灵活的类型如JSON时,考虑使用JSON schema来描述预期的对象

4.5.8. 使用标准类库和开发模式

4.5.8.1. 请使用惯用的代码风格和开发模式

4.6. 封装专业领域知识

4.6.1. 将软件组件映射到业务领域,将使代码的变化保持专注和干净

4.6.1.1. 会计、计费、运输等

4.6.2. 封装的领域自然会倾向于高内聚和低耦合

4.6.2.1. 理想的特征

4.6.2.2. 高内聚和低耦合的软件更容易演进,因为变更的“爆炸半径”往往更小

4.6.2.3. 解耦的代码是自成一体的,对其逻辑的改变不需要对其他软件组件也进行改变

4.6.3. 开发人员经常以“层”为单位来思考软件:前端、中间层和后端

4.6.3.1. 每一层都有独立的团队,会增加协调成本,因为每一项业务逻辑的变化都会影响到所有的软件分层

4.6.4. 识别领域边界和封装领域知识既是一门科学又是一门艺术

4.6.4.1. 领域驱动设计(domain-driven design,DDD),它定义了一套广泛的概念和实践,将商业概念映射到软件上

4.6.4.2. 只有在最复杂的情况下才需要全覆盖的DDD

4.6.4.3. 熟悉DDD将有助于你做出更好的设计决策

到了这里,关于读程序员的README笔记16_构建可演进的架构(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读程序员的README笔记09_代码评审

    4.4.1.1. walk-through 4.4.1.2. 一种面对面的会议,开发人员在会上共享他们的屏幕,并引导队友了解正在进行的修改内容 4.4.1.3. 是启发想法和让你的团队适应代码修改的好方法 5.1.2.1. 如果紧急度不明确,请询问提交者 5.4.4.1. SQL注入攻击、敏感数据泄露和跨站脚本攻击的漏洞

    2024年02月05日
    浏览(49)
  • 读程序员的README笔记08_依赖管理

    2.6.1.1. 版本不应该被重复使用 2.6.1.2. 永远不要在现有版本下重新发布更改的代码 2.6.2.1. 版本应该帮助人们和工具对版本的优先顺序进行推断 2.6.3.1. 版本信息区分了预先发布的代码和已发布的代码,将构建流水号与构件相关联,并设置了稳定性和兼容性的合理预期 6.2.5.1

    2024年02月05日
    浏览(48)
  • 读程序员的README笔记11_软件交付(下)

    1.3.5.1. 通过持续交付,人力被完全从部署环节中移除 1.3.5.2. 打包、测试、发布、部署,甚至展开环节都是自动化的 1.3.6.1. Puppet、Salt、Ansible和Terraform等现成的解决方案可以与现有的工具集成,并且它们是专门为了自动化部署而设计的 1.4.4.1. 只需再次指向旧的版本 1.5.1.1. 

    2024年02月04日
    浏览(59)
  • 读程序员的README笔记04_防御式编程

    1.2.1.1. 切记让你的代码安全而有弹性 1.2.1.2. 编写拥有良好防御性的代码是一种对那些运行你的代码的人(包括你自己!)富有同情心的表现 1.2.1.3. 防御性的代码较少发生故障,就算它发生故障,也更有可能恢复 1.2.1.4. 安全的代码利用编译时的校验来避免运行时的故障,使

    2024年02月05日
    浏览(56)
  • 读程序员的README笔记01_学习如何学习

    6.3.2.1. 错误是不可避免的。成为一名软件工程师的路途艰辛,我们有时会失败 6.5.4.1. 代码从不说谎。注释有时却会。 6.5.4.1.1. Code never lies. Comments sometimes do 6.5.4.1.2. 去读源代码,因为它并不总是与设计文档相吻合 6.5.4.1.3. 不要只读你自己的代码库,还要去阅读高质量的开

    2024年02月05日
    浏览(50)
  • 读程序员的README笔记10_软件交付(上)

    3.1.1.1. 打包一个构件称为发布 3.1.3.1. 部署的软件还不能被用户访问 3.1.3.1.1. 只是被安装了而已 3.1.3.2. 一旦部署,软件就会通过将用户转移到新的软件上而进行展开 3.1.4.1. 交付过程是更大的产品开发周期中的一部分 6.10.2.1. 每季度或每年发布一次

    2024年02月04日
    浏览(156)
  • 读程序员的README笔记14_技术设计流程(下)

    1.4.2.1. 该项目将需要至少一个月的工程时间 1.4.2.2. 变更将对软件的扩展和维护产生长期的影响 1.4.2.3. 变更将显著影响其他团队 1.5.2.1. 设计文档是一种工具,可以帮助你思考、获得反馈、让你的团队了解情况、培养新的工程师,并推动项目规划 1.5.5.1. 阅读大量的设计文档

    2024年02月04日
    浏览(40)
  • 读程序员的README笔记18_职业生涯规划

    3.1.5.1. 他们的工作职责之一是管理他们的团队,而管理的一部分就是对你投入时间 3.1.5.2. 对管理者而言,反复取消一对一面谈可以是一个有价值的信号 3.3.2.1. 每个目标都附有3到5个关键结果,它们是标志着目标达成的具体指标 3.3.2.2. 不要把关键结果变成待办事项清单 3.

    2024年02月04日
    浏览(50)
  • 读程序员的README笔记05_日志、监控与配置

    6.1.1.1. 测量的是某个事件发生的次数 6.1.1.2. 通过使用计数器获得缓存命中数和请求总数,你就可以计算出缓存命中率 6.1.2.1. 一个基于时间点的测量值 6.1.2.2. 既可以上升又可以下降 6.1.3.1. 根据事件的大小幅度分成不同的范围 6.1.3.2. 每一个范围都会有一个计数器,每当某

    2024年02月05日
    浏览(51)
  • 读程序员的README笔记13_技术设计流程(上)

    3.4.1.1. 外界干扰是深度工作的“杀手” 3.4.1.2. 避免所有的交流方式 3.4.1.2.1. 关闭聊天 3.4.1.2.2. 关闭电子邮件 3.4.1.2.3. 禁用电话通知 3.4.1.2.4. 换个地方坐 3.4.2.1. 有形产出是一份设计文档 4.2.3.1. 如果有一个以上的问题,询问哪些问题是最优先的 4.3.7.1. 注意与外人交流时不

    2024年02月04日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包