C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 编程语言与技术

    • Effective C++: 改善程序与设计的55个具体做法

      • 第2章 - 构造/析构/赋值运算(一)
      • 第2章 - 构造/析构/赋值运算(二)
      • 第2章 - 构造/析构/赋值运算(三)
      • 第3章 - 资源管理
      • 第4章 - 设计与声明(一)
      • 第4章 - 设计与声明(二)
      • 第5章 - 实现(一)
      • 第5章 - 实现(二)
      • 第6章 - 继承与面向对象设计
      • 第7章 - 模板与泛型编程
    • 深度探索C++对象模型

      • 第1章 - 关于对象
      • 第2章 - 构造函数语意学
      • 第3章 - Data 语意学
    • STL源码剖析

      • 第1章 - STL概论和版本简介
      • 第2章 - 空间配置器
      • 第3章 - 迭代器(iterators)概念与traits编程技法(一)
      • 第3章 - 迭代器(iterators)概念与traits编程技法(二)
      • 第4章 - 序列式容器 vector
      • 第4章 - 序列式容器 list
      • 第4章 - 序列式容器 deque
      • 第4章 - 序列式容器 stack和queue
      • 第4章 - 序列式容器 heap
      • 第4章 - 序列式容器 priority_queue
      • 第4章 - 序列式容器 slist
      • 第5章 - 关联式容器 RB-tree
      • 第5章 - 关联式容器 set和map
      • 第5章 - 关联式容器 hashtable
      • 第6章 - 算法
      • 第6章 - 算法之set
      • 第7章 - 仿函数
      • 第8章 - 配接器
  • 系统与架构

    • 深入理解计算机系统

      • 第1章 - 计算机系统漫游
      • 第2章 - 信息的表示和处理
      • 第3章 - 程序的机器级表示
      • 第5章 - 优化程序性能
      • 第6章 - 存储器层次结构
      • 第7章 - 链接
      • 第8章 - 异常控制流
      • 第9章 - 虚拟内存
      • 第10章 - 系统级I/O
      • 第11章 - 网络编程
      • 第12章 - 并发编程
    • 大型网站技术架构——核心原理与案例分析

      • 第1章 - 大型网站架构演化
      • 第2章 - 大型网站架构模式
      • 第3章 - 大型网站核心架构要素
      • 第4章 - 瞬时响应:网站的高性能架构
      • 第5章 - 万无一失:网站的高可用架构
      • 第6章 - 永无止境:网站的伸缩性架构
      • 第7章 - 随需应变:网站的可扩展架构
      • 第8章 - 固若金汤:网站的安全架构
    • 从零开始学架构

      • 架构基础
      • 架构设计原则
      • 高性能架构
      • 高可用架构
    • 程序员的自我修养————链接、装载与库

      • 第1章 - 简介
      • 第2章 - 静态链路
      • 第3章 - 目标文件里有什么
      • 第4章 - 静态链接
      • 第7章 - 动态链接
      • 第8章 - 共享库版本
      • 第10章 - 内存
      • 第11章 - 运行库
      • 第12章 - 系统调用与API
      • 第13章 - 运行库实现
  • 软件开发实践

    • 重构改善既有代码的设计

      • 第1章 - 重构,第一个示例
      • 第2章 - 重构的原则
      • 第3章 - 代码的坏味道
      • 第5章 - 重构列表
      • 第6章 - 重新组织函数
      • 第7章 - 在对象之间搬移特性
      • 第8章 - 重新组织数据
      • 第9章 - 简化条件表达式
      • 第10章 - 简化函数调用
      • 第11章 - 处理概括关系
      • 第12章 - 设计之大型重构
    • 代码大全2

      • 第1章 - 欢迎进入软件构建的世界
      • 第2章 - 用隐喻来更充分地理解软件开发
      • 第3章 - 三思而后行: 前期准备
      • 第4章 - 关键的构建决策
      • 第5章 - 软件构建中的设计
    • Linux多线程服务端编程——使用muduo C++ 网络库

      • Buffer类的设计
      • 设计与实现
      • 定时器与TimerQueue
      • Protobuf网络传输和Protobuf编解码器与消息分发器
      • EventLoop类剖析
      • EventLoopThread和EventLoopThreadPool剖析
      • TCP网络库和核心类
      • Connector剖析
      • TcpClient剖析
      • 学习总结
      • timing wheel
      • 消息广播服务
      • 线程安全的对象生命期管理
  • 数据处理与应用设计

    • 数据密集型应用系统设计

      • 第1章 - 可靠、可扩展与可维护的应用系统
      • 第2章 - 数据模型与查询语言
      • 第3章 - 数据存储与检索
      • 第4章 - 数据编码与演化
      • 第5章 - 数据复制
      • 第6章 - 数据分区
      • 第7章 - 事务

第3章 三思而后行: 前期准备

  • 准备不周全的诱因
  • 前期准备重要性的依据
  • 迭代开发法对前期准备的影响
  • 构建期间处理需求变更
  • 架构的典型组成部分

前期准备的重要性

使用高质量的实践方法是能够创造高质量软件的前提。

准备工作的中心目标就是降低风险:一个好的项目规划者能够尽可能早地将主要的风险清除掉,以使项目的大部分工作能够尽可能平稳地进行。

准备不周全的诱因

  1. 人员能力不具备: 项目规划、需求分析全面准确、创造高质量的架构等都需要一定的经验。
  2. 知道却不去做: 很多程序员陷入了尽快开始编码的误区,事先规划分析清楚逻辑,才能加快后续的开发
  3. 管理者不理解: 很多管理者不懂程序员前期分析的重要性,只要求尽快写出代码

前期准备重要性的依据

  1. 诉诸逻辑

    • 管理角度: 制定计划,规定时间、人数和资源
    • 技术角度: 构建的目标、正确性
  2. 诉诸类比

    • 程序员作为软件食物链的最后一环(架构师吃掉需求,设计师吃掉架构,而程序员则消化设计)
    • 针对需要构建的每一个片段,弄清楚哪些是最关键的需求和架构要素,按照正确的顺序去做事情。
  3. 诉诸数据

    • 发现错误的时间要尽可能接近引入该错误的时间。
    • 修复缺陷的成本随着“从引入缺陷到检测该缺陷之间的时间”变长而急剧增加。

分辨从事软件的类型

迭代开发法对前期准备的影响

  • 序列式开发:仅仅依赖测试来发现缺陷。
    • 适用场景:需求稳定,设计直截了当,而且理解透彻;开发对于应用领域非常熟悉;项目风险小;长期可预测性很重要;后期变更需求设计代价比较高
  • 迭代式开发:随着项目开发不断找出错误,进行修正。
    • 适用场景:需求没有理解透彻;设计复杂且具有挑战性;开发对于应用领域不熟悉;长期可预测性不重要;后期变更需求设计代价较低

问题定义

只定义问题是什么,不涉及具体的解决方案。

采用客户的语言来书写,从客户角度描述问题。

需求

需求详细描述软件系统具体应该做什么。

稳定需求是个神话 ———— 一旦需求稳定,项目就能以有序、可预测、平稳的方式,完成从架构、设计、编码以及测试等一系列工作。

但是,随着项目的推进,客户对项目的理解深入,能够更加清楚理解自己的需求,进而触发需求变更。

构建期间处理需求变更

  • 根据需求核对表(checklist)来评估需求的质量
  • 确保每一个人都知道需求变更的代价
  • 建立一套变更控制程序
  • 使用能适应变更的开发方法
  • 放弃项目 —— 需求特别糟糕、且极不稳定
  • 注意项目的商业价值

需求核对表

架构

软件架构(software architecture)也称系统架构(system architecture)、高层设计(high-level design) 或 顶层设计(top-level design)。

架构的典型组成部分

  • 程序组织

    • 在架构中,列出多种方案,并阐述最终方案的理由
      • 需要定义程序的主要构造块(可能是类或多个类组成的子系统),
      • 明确构造块的责任,且明确区别于其他构造块。
      • 架构应该详细阐述当前构造块,能直接或间接使用哪些构造块,不能使用哪些构造块。
  • 主要的类

    • 类的责任,以及与其他类的交互。
    • 对于那些构成系统80%行为的20%的类进行详细说明。
  • 数据设计

    • 主要文件和数据表的设计。
  • 业务规则

    • 详细描述架构依赖的特定的业务规则
      • 例如,保持客户端与服务端信息及时同步(30s 心跳检测)
  • 用户界面设计

  • 资源管理

    • 对系统资源进行统一管理:数据库连接池、线程池、句柄等。
  • 安全性

    • 建立威胁模型,包括处理缓冲区方法、处理非受信数据、错误消息的处理等。
  • 性能

    • 需要关注性能,则要给出详细的性能目标。
  • 可伸缩性

    • 系统增长以满足未来需求的能力。
    • 描述系统应该如何应对用户数量、服务器数量、网络节点数量、数据库记录数等增长。
  • 互用性

  • 国际化/本地化

    • 国际化(Internationalization,I18n):以支持多个地域的技术活动。
    • 本地化(Localization,L10n):翻译一个程序,以支持当地特定的语言工作。
  • 输入/输出

  • 错误处理

  • 容错性

    • 系统使用表决算法,后台存在多种计算方法,可以取多个计算结果的均值、中值或众数来作为最终结果
  • 架构可行性

  • 过度工程

    • 健壮性:系统在检测到错误后继续运行的能力。
    • 系统的健壮程度由各个部分组成,取决于所有薄弱部分的乘积。
Last Updated:
Contributors: klc407073648
Prev
第2章 - 用隐喻来更充分地理解软件开发
Next
第4章 - 关键的构建决策