陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23196 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

46|软件架构:如何用Rust架构复杂系统?

分享学习收获或感悟
阅读《Fundamentals of Software Architecture》
在业余时间写自己感兴趣的项目
将架构应用于实际项目
脑力训练的必要性
阅读优秀代码的重要性
插件结构的设计
构建流水线结构
使用trait进行接口定义
插件(微内核)结构
流水线结构
分层结构
设计原则:架构的设计原则
决策:架构的硬性规则
特征:架构的主要指标
结构:架构的风格和结构
结构、特征、决策和设计原则
架构、功能、缺陷和技术债的相互作用
架构维护性工作的作用
架构设计对长期回报的重要性
架构和功能对系统的正面作用
缺陷和技术债对系统的负面作用
工程部门关心架构维护和优化
测试部门关心产品缺陷
产品、运营和销售部门关心产品功能
思考题
架构师的素养
架构设计与Rust
架构风格
架构设计的维度
架构设计的考虑因素
软件系统的相互作用
架构设计的重要性
负面作用与正面作用
软件系统的关注点
软件架构与Rust

该思维导图由 AI 生成,仅供参考

你好,我是陈天。
对一个软件系统来说,不同部门关心的侧重点不同。产品、运营和销售部门关心产品的功能,测试部门关心产品的缺陷,工程部门除了开发功能、解决缺陷外,还要不断地维护和优化系统的架构,减少之前遗留的技术债。
从长远看,缺陷和技术债对软件系统是负面的作用,而功能和架构对软件系统是正面的作用。
从是否对用户可见来说,相比可见的功能和缺陷,架构和技术债是不可见的,它们往往会被公司的决策层以各种理由忽视,尤其,当他们的 KPI / OKR 上都布满了急功近利的数字,每个季度或者每半个财年都是生死战(win or go home)的时候,只要能实现功能性的中短期目标,他们什么都可以牺牲。不可见并且很难带来直接收益的架构设计,往往是最先被牺牲掉的
但架构以及架构相关的工作会带来长期的回报。
因为平时我们往系统里添加新的功能,会不可避免地增加系统的缺陷,潜在引入新的技术债,以及扰乱原本稳定的架构。这是一个熵增的过程。缺陷会拖累功能的表现,进一步恶化系统中的技术债;而技术债会延缓新功能的引入,放大已有的和未来的缺陷,并破坏现有的架构。这样一直持续下去,整个系统会进入到一个下降通道,直到无以为继。
为了避免这样的事情发生,我们需要通过对架构进行维护性的工作,来减少缺陷,修复技术债,改善功能,最终将整个系统拉回到上升通道
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了使用Rust构建复杂系统的软件架构。作者指出,软件系统的架构、功能、缺陷和技术债之间相互作用,需要通过维护性的工作来减少缺陷、修复技术债、改善功能,将整个系统拉回上升通道。在软件项目的初期,应采用渐进式的架构设计,从MVP的需求中寻找架构的核心要素,构建一个原始但完整的结构,然后围绕核心要素演进。架构设计需要考虑结构、特性、决策和设计原则四个维度,包括架构的风格、主要指标、硬性规则和设计原则。文章还以KV server为例,介绍了分层结构、架构的主要指标和硬性规则的应用。最后,作者提到了亚马逊的架构决策备忘录,强调了架构的硬性约束的重要性。文章内容丰富,深入探讨了软件架构设计的重要性和方法,以及Rust在构建复杂系统中的应用。文章还介绍了Rust构建典型的架构风格,包括分层结构、流水线结构和插件结构,以及如何在Rust中创建这些结构。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • HiNeNi
    老师,有空的时候能不能出一些宏的教程,声明宏还好,在网上一直没有找到比较好的过程宏的教程。因为之前接触过QT,了解到一些c++框架在用自己的方式(宏加上关键字扩展)对语言或程序的行为进行很有意义的扩展,所以感觉宏这一块还是大有可为的,不知道老师有空时能不能略授一二。

    作者回复: 我考虑一下,回头看看这个需求有多少。最初的计划有宏,但因为这是入门的课程,所以砍掉了。

    2021-12-15
    6
  • 给我点阳光就灿烂
    老师,可不可以具体给一个项目代码,关于插件架构的,特别好奇这种架构是怎样实现的

    作者回复: 如果是内部的 plugin 结构,其实很简单,用 trait 和 trait object 处理即可;如果是外部的 plugin,稍微麻烦,这里有个例子:https://github.com/luojia65/plugin-system-example

    2021-12-15
    4
  • gnu
    没想到 rust 课程还藏有架构设计思想的 bonus!惊喜了

    作者回复: :)

    2022-01-02
    2
  • 幻境之桥
    流水线那个例子 Context 会不会很复杂,所有 Plug 之间感觉只能通过这个 Context 交互

    作者回复: 看具体的应用场景。一般来说,流水线中的 building blocks 处理的是相同的数据,如果结构差异非常大的数据被同一个流水线处理,那么要么这个流水线的粒度太大(可能需要分成不同的流水线),要么这个架构本身不适合流水线

    2021-12-16
    2
    1
  • pedro
    过去二十年时间,敏捷宣言(Agile Manifesto)和精益创业(Lean startup)对软件社区最大的负面影响就是,一大堆外行或者并没有深刻理解软件工程的从业者,过分追求速度,过度曲解 MVP(Minimum Viable Product),而忽视了从起点出发前,必不可少的架构和设计功夫,导致大部分技术债实际上是架构和设计阶段的债务。 不能再认同了~

    作者回复: 👍

    2021-12-15
    1
  • inmo
    努力消化

    编辑回复: 加油,进一步有进一步的乐趣,国庆快乐

    2022-10-02归属地:北京
  • Geek_4ca442
    老师请教个问题:如果在 kvServer 中保存的是一个结构体,value字段是要存储的值。 类似下面的功能该如何实现?传进来的参数val需要用到两次,尽管逻辑上只可能用到一次。 或者在 if ... else 语句中有类似的情况,如何实现比较好?是不是只能clone? pub fn set<T: Any + Send + Sync, K: Into<String>>(&self, key: K, val: T) { self.map.entry(key.into()) .and_modify(|o| { *o.value = val; // ...一些其它相关的处理 }) .or_insert(Value { count: 0, value: val, }); }

    作者回复: 如果同一个数据要被用多次,可以使用引用。如果多次使用都需要所有权,那么只能 clone。如果要减少数据本身的 clone,可以用 Rc/Arc

    2022-01-07
  • 0@1
    老师,有没有出Rust高级课程的计划

    作者回复: 暂时还没有,也许以后有

    2021-12-18
    4
  • 幻境之桥
    插件化设计主要是把系统的核心能力提炼出来,供插件开发者使用,让他们的奇思妙想壮大系统生态

    作者回复: 嗯

    2021-12-16
  • 乌龙猹
    今天这篇更新不仅属于干货 还非常硬 实在是不想结束这段学习之旅 虽然rust 只是刚入门 但老师深入浅出地规划了 rust 的roadmap 日后定当反复研读 以求融会贯通。最后 非常期待老师未来能推出elixir 编程第一课 到时候一定支持 也该有人来向国内开发者推荐推荐 elixir 这门语言了

    作者回复: 谢谢支持!

    2021-12-15
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部