软件架构原则注记 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jatsz
V2EX    编程

软件架构原则注记

  •  
  •   jatsz 2020-09-17 10:21:51 +08:00 3543 次点击
    这是一个创建于 1857 天前的主题,其中的信息可能已经有所发展或是发生改变。

    软件架构

    软件架构的整体目标:降低软件的整体复杂度(Overall Complexity)。

    在这样的基础前提下我们看看软件架构整体原则和手段。在看架构的时候,有些书阐述的是原则,有些书更加着重于手段。从根本上讲是同一个东西的不同侧面。

    模块化

    这个在架构上已经是通识了,也是应对复杂的直接和有力的手段。模块化如果上升到原则层面可以描述为:高内聚和松耦合。通过什么样的指导原则或者手段来划分模块呢?

    • 将相同变化速率的代码放到一起
    • 将概念上同一个东西的代码放到一起
    • 需要放到一起的东西封装在起来,通过接口进行通信
    • 设计接口要简洁有力,只给需要的东西,不多给

    需要注意的就是模块化是有成本的。抽象的成本是会蠕变,其次通信的成本。在应用模块化的时候需要检测这些成本,过犹不及。

    抽象是会蠕变的,有可能让系统剩下的部分变的不那么清晰。这个可以称之为蠕变(creep)或者说是背负(carry on)成本。

    依赖管理-让不稳定的依赖于稳定的

    这里在架构上也是通识,但在实现中花样有点多。也不是很容易理解。常见的依赖管理手段

    • 依赖倒置(DIP)。通过接口在编译期将调用者(caller)依赖于被调用者(callee)的依赖倒过来。让 callee 依赖于稳定的接口。这里面有个假设就是接口比实现稳定,很多时候这是成立的。需要留意接口常常变化的情况,这时候依赖倒置得不偿失。
    • 机制和策略分离。机制是 How to do,策略是是 What to do 。机制受制于基础科学的发展,通常很缓慢。所以相对稳定。而策略是多变的业务规则,通常不稳定。通过机制和策略的分离,提高了机制的复用率。
    • 接口和引擎分离。Interface 随着受众而变化,但是引擎在针对覆盖的业务部分却相当稳定。一个很好的例子就是ffmpeg和其围绕他的一系列 GUI 工具。
    • 通过自动化,生成器来让稳定的元数据(Metadata)可以按需生成的合适数据形式。这也是 DRY 和 SPOT(Single Point Of Truth)的应用。

    透明性

    这一点在架构上没有得到足够的重视,即使是很小的项目,简单的代码,也要保证其透明性。通常通过下面手段来保证架构的透明性

    • 简单的数据结构和算法。
    • 通过日志告诉程序做了什么
    • 通过 telemetry 接口,让我们可以检阅当前应用程序的(数据)状态。
    • 在分布式系统架构,需要有 tracing 功能,方便调试业务问题。这在多用户复用相同逻辑的 Web 应用中特别重要。通过一个唯一 ID 能 Track 到整个业务流。

    数据为王

    在架构中,数据为王。这个被严重低估和忽视了。

    • 在简单的数据结构和复杂的算法之间,选择简单的算法。人对数据有很好的感觉,对算法却没有。
    • 以数据为中心,数据清晰了,算法就清晰了。
    • 业务是数据的流转,程序是个过滤器。
    • 数据跟程序一样,有着不同的变化速率和生命周期,有冷有热。注意冷热数据的隔离。

    程序性能是个功能选项( Performance is a feature )

    • 性能是个 feature,不需要就不考虑。需要的话提前考虑。
    • 在做决定和调整前先测量,验证自己的设。
    • 牛逼的算法在n很小的时候很慢,通常n很小。

    https://www.imzjy.com/blog/software-achitecture-principle-notes

    //有没有啥特别重要被我遗漏的?

    3 条回复    2020-10-14 09:40:42 +08:00
    jones2000
        1
    jones2000  
       2020-09-17 13:15:54 +08:00
    最总要的是代码 review, 把你的这些原则在代码 review 里面体现出来,不符合的退回去重写。 否则都是空谈。
    mightofcode
        2
    mightofcode  
       2020-10-13 22:22:52 +08:00
    从原则怎么落地到实际产品研发,这里面其实还有一段距离
    jatsz
        3
    jatsz  
    OP
       2020-10-14 09:40:42 +08:00
    @mightofcode 赞同。距离相当长,这些原则如果不加思考的使用,可能还不如把精力集中在问题本身来的更直接。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2810 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 06:33 PVG 14:33 LAX 23:33 JFK 02:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86