一、软件工程全景 (ALM & SDLC)
ALM(应用生命周期管理)
- 三大活动:治理(Governance)、开发(Development)、运维/维护(Operations/Maintenance)。
- 关键事实:70%以上成本发生在维护阶段。
- 与 SDLC 关系:ALM > SDLC;一个 ALM 周期可包含多个 SDLC。
SDLC(软件开发生命周期)
- 经典 7 阶段:
- 规划(Planning)
- 需求分析(Requirements Analysis)
- 设计(Design & Prototyping)
- 开发(Coding)
- 测试(Testing)
- 部署(Deployment)
- 运维/维护(Maintenance)
- 设计产出:
- HLD(高阶设计):模块、交互、架构图、技术栈。
- LLD(低阶设计):函数逻辑、数据库表、接口细节、错误消息。
- 需求原则:必须可验证(例:“查询在 3 秒内返回”,而非“查询要快”)。
主流模型
- 敏捷(Agile):当前最流行,快速迭代验证想法。
- 其他:瀑布、螺旋、V 模型、CMMI、统一过程(UML)。
UML
- 用途:可视化系统结构与行为(如序列图)。
- 标准化:由 OMG 制定,ISO 采纳。
二、软件构造基本原则
软件构造 = 将设计转化为可工作软件,核心是管理复杂性。
1. 最小化复杂性(Minimizing Complexity)
- 策略:
- 分解:拆分为小模块。
- 编码简洁:函数 <30 行,避免炫技代码。
- 提高可读性:清晰命名(
strFileName)、单一变量单一用途、充分注释。 - 采用成熟模型:OOP、关系数据库。
2. 优先使用组合而非继承(Composition over Inheritance)
- 组合优势:更灵活、易维护、行为定义清晰。
- 实现:类 A “has-a” 类 B,通过委托调用功能。
3. 为验证而构造(Construction for Verification)
- 实践:
- 遵循编码标准。
- 代码审查(Code Review)。
- 支持自动化测试(单元测试、集成测试、冒烟测试)。
- 谨慎使用递归等复杂结构。
4. 拥抱复用(Reuse)
- 资产:库、模块、API、COTS(商业现货)。
- AI 时代:AI 辅助生成 ≠ 替代复用;复用更可靠、一致。
5. 遵循标准(Following Standards)
- 外部:IEEE, ISO, OMG。
- 内部:团队/项目规范。
6. 其他编程原则
- KISS:Keep It Simple, Stupid。
- DRY:Don’t Repeat Yourself。
- YAGNI:You Aren’t Gonna Need It。
- 单一职责:一个类只做一件事。
- 开闭原则:对扩展开放,对修改关闭。
三、并发与并行计算
为何需要并行?
- 单 CPU 速度受光速物理极限制约,无法满足计算密集型需求。
PRAM 模型(并行随机存取机)
- 写冲突处理:
- EREW:独占读写。
- CREW:并发读,独占写。
- CRCW:并发读写(Common / Arbitrary / Priority)。
- 现实映射:多核 CPU ≈ CREW。
性能定律
- 阿姆达尔定律(Amdahl’s Law):
- 固定问题规模。
Speedup ≤ 1 / (s + (1-s)/p),s = 串行部分比例。 - 上限明显(如 s=0.1 ⇒ Speedup < 10)。
- 古斯塔夫森定律(Gustafson’s Law):
- 固定运行时间,扩大问题规模。
Speedup = p - s(p - 1)。 - 更乐观,适合大规模并行。
多处理器架构
- UMA / SMP:统一内存访问,共享总线,CPU 数量受限。
- NUMA:非统一内存访问,本地内存快,远程慢,可扩展性强。
弗林分类法(Flynn’s Taxonomy)
- SISD:单指令单数据(传统 PC)。
- SIMD:单指令多数据(GPU、向量机)。
- MIMD:多指令多数据(多核、集群)。
关键结论
存在线程创建、同步、通信等开销,可能得不偿失。
四、软件开发工具
| 工具类别 | 核心功能与要点 |
| IDE | 集成编码、编译、调试、版本控制,提升效率与质量。 |
| 代码重构 | 不改变行为,改善内部结构(可读性、可维护性)。 |
| GUI 构建器 | WYSIWYG 设计(如 Dreamweaver),自动生成界面和事件处理代码。 |
| 单元测试工具 | 自动化验证模块功能;Copilot 等 AI 可辅助生成测试用例。 |
| 性能分析工具 | - 剖析(Profiling):找性能瓶颈(hot spots)。<br>- 程序切片:定位影响变量的代码,用于调试。 |
| 其他关键工具 | - 版本控制:Git, SVN<br>- CI/CD:Jenkins<br>- 协作:Jira, Databricks<br>- 调试:VS Debugger |