Design
The things about design, including design pattern, system design, module design, optimization design and development specification design.
设计
关于软件设计中各维度议题的笔记合集:设计模式、系统设计、业务设计、模块设计四大主线,辅以优化设计、开发规范、测试、CI/CD、安全等周边维度。每个主线都是「文档 + 可运行代码」的结构。
1. 目录结构
| 目录 | 内容 |
|---|---|
1_设计模式 | GoF 三大类设计模式:创建型、结构型、行为型模式均有 C++ 实现代码,另有 condition-action 等扩展模式(见 0_designPattern.md) |
2_系统设计 | 系统架构设计:通用桌面应用架构(UI、交互、领域、数据、基础设施、质量等维度)与服务器应用架构,见 0_system_design.md |
3_业务设计 | 业务落地设计:从需求到可编程模型的完整流程(3_feature_design.md),附 ATM 完整示例工程(code/atm_example) |
4_模块设计 | 模块内部实现的设计套路:undo-redo、事务、对象池等(transaction.md、pick.md),附命令分发、消息中心、Reactor 等实现代码 |
2. 开发层面的设计
设计,是开发过程中频繁探讨的重要议题。然而,”设计”一词所涵盖的范围极为广泛,涉及多个相似却又不尽相同的领域。清晰地区分这些概念,有助于从不同维度深入理解设计的内涵,明确在不同阶段应当重点考虑哪些因素。
2.1 设计模式
-
定义:设计模式是针对软件系统中反复出现的特定问题而总结归纳出的通用解决方案,其核心目标在于增强系统的灵活性与可扩展性,同时提升系统的可修改性与可维护性。 -
作用:-
避免代码重复:若大量重复代码散布于各处,一旦需要修改就必须改动多处,耗时费力且极易引发错误。例如图形绘制系统中多个函数包含相同的坐标转换代码,规则变化时需逐一修改,增加维护成本和出错风险。 -
降低模块耦合度:过高的耦合度意味着一个模块的改动可能对其他多个模块产生连锁反应。例如商品展示模块与库存管理模块紧密耦合,库存逻辑变化时可能意外影响商品展示。 -
优化模块依赖关系:模块间依赖混乱会给多人协作带来困扰,不同开发人员负责的模块可能因复杂依赖而反复修改提交才能合并,本质上反映了系统扩展性不足。
-
-
示例:经典的设计模式分为三大类共二十三小类,如单例模式、工厂模式、观察者模式等,此外还有condition-action这样针对特定场景的设计方式。
2.2 架构设计
-
是什么:架构设计是功能设计的进一步发展,考虑到业务量、性能、扩展性、维护性等问题,设计一套能够满足业务需求的系统方案。如现代互联网应用的微服务、分布式架构,传统桌面应用的 MVC 都是系统设计的产物。一个架构应抽象出多个功能的共同点,提供统一机制,考虑跨模块的事务与性能层面。 -
要求:满足业务要求;可扩展;简化开发——将复杂性控制在架构底层,降低对开发人员的技术要求;满足性能要求。 -
例子:开发一个电商系统。
2.3 业务设计
-
定义:业务设计从业务角度(需求层面)出发,设计一套能够满足需求的系统方案,关注如何将产品需求转化为可编程的模型。按产品需求的语言,业务设计又可进一步分为功能设计(Feature级别)和架构设计(epic级别),两者层层递进,本质都是将需求转为编码实现,一般需要利用已有模块去完成。 -
要求:相较于架构设计,业务设计更侧重具体功能的实现细节,需要对已有系统比较清楚,能在现有架构下找到合适的切入点。 -
例子:以用户登录功能为例,需考虑登录流程(输入、验证、生成会话)、安全性(防暴力破解、隐私保护)与用户体验(界面设计、错误提示)。又如摇一摇、漂流瓶、扫码登录等功能的业务设计。
2.4 模块设计
-
定义:模块设计聚焦于系统中具体模块的实现方式,处于架构设计的子层级,强调对具体功能的抽象与提炼,探索某一特定功能实现的通用方法。 -
作用:通过精心设计模块的实现方式,提高模块独立性,降低耦合度,使每个模块能相对独立地开发、测试和维护。 -
示例:以 undo-redo 功能为例,需考虑哪些操作需要支持、如何注册操作、采用何种方式存储记录、怎样实现回滚。其他常见模块设计还包括事件队列、命令分发器、消息中心、状态机等,均有对应的实现代码(见4_模块设计/code)。
3. 其他设计
开发之外,还有若干与产品、运维、质量和安全相关的设计维度,同样影响软件的最终效果:
3.1 优化设计
-
定义:基于特定的先验假设,或通过权衡利弊(trade-off)做出的优化改进措施。常见方向是在适当增加系统复杂性的前提下,换取系统在性能、资源利用率等关键指标上的提升。 -
示例:如果能够确定 ABA 问题影响不大,就可以采用 CAS 无锁方式实现线程安全,避免传统锁的性能开销;又如 constexpr 模板元编程(CTRP)将计算开销转移到编译时。
3.2 开发规范设计
-
定义:通过制定静态检查规则以及形成团队共识,对代码编写、项目结构组织等方面进行规范。 -
作用:提升代码质量,减少因风格不一致导致的潜在错误;提高可读性,降低沟通成本。 -
示例:命名规范(变量、函数命名风格)、工程组织方式(目录结构与模块划分)、对外函数与对内函数的区分等。
3.3 用户体验设计(UX Design)
-
角度:从产品角度出发,以用户为中心进行考量。 -
定义:聚焦用户使用产品过程中的全方位体验,涵盖界面设计(布局、色彩、图形元素)、交互设计(操作流程、反馈机制)与信息架构设计(信息分类、组织与呈现)。 -
作用:提升产品的可用性,使用户高效便捷地完成任务,提高满意度与产品竞争力。
3.4 测试设计(Test Design)
-
角度:基于测试角度,以保障软件质量为核心目标。 -
定义:围绕测试用例编写、测试策略制定与测试工具选用展开。用例需全面覆盖功能、性能、边界条件;策略需根据项目特点确定测试方法与优先级;工具选择需考虑功能、便捷性与技术栈兼容性。 -
示例:Web 应用项目可编写单元测试(验证函数正确性)、集成测试(检测模块接口交互)与端到端测试(模拟真实用户场景),并选用 Jest、Selenium 等自动化测试工具。
3.5 持续集成和持续部署设计(CI/CD Design)
-
角度:站在运维角度,着眼于优化软件开发和交付流程。 -
定义:着重自动化构建、测试和部署流程的规划与实施:将代码自动编译打包,每次变更都经过测试验证,通过测试的软件包自动部署到相应环境。 -
示例:在基于 GitHub 的项目中利用 GitHub Actions 配置流水线,代码推送到主分支时自动触发构建(如 Maven 编译打包),运行单元与集成测试,全部通过后自动部署到云服务器。
3.6 安全设计(Security Design)
-
角度:从安全角度出发,由于其专业性和独特性,通常与常规开发区分开来。 -
定义:致力于保障系统安全性,涵盖身份验证(用户名密码、指纹、面部识别等)、授权(根据身份与角色精确控制资源访问权限)、数据加密(防止数据在传输和存储过程中被窃取或篡改)等关键方面。 -
作用:保护系统和数据免受未授权访问、恶意攻击及数据泄露等安全威胁,确保系统的稳定性和数据的保密性、完整性。
99. ref
- https://github.com/checkcheckzz/system-design-interview
- https://github.com/InterviewReady/system-design-resources
- https://github.com/donnemartin/system-design-primer
- 架构,性能和游戏
版权与许可
本项目采用 CC BY-NC 4.0 许可协议授权,完整条款见本目录下的 LICENSE 文件。
- BY(署名):使用、分享、演绎时必须保留原作者署名,并注明原始许可协议。
- NC(非商业性使用):不得将本材料用于商业目的。