常见的软件开发活动: 

  1. 定义问题(problem definition)

  2. 需求分析(requirements development)

  3. 规划构建(construction planning)

  4. 软件架构(software architecture) ,高层设计(high - level design)

  5. 详细设计(detailed design)

  6. 编码与调试(coding and debugging)

  7. 单元测试(unit testing)

  8. 集成测试(integration testing)

  9. 集成(integration)

  10. 系统测试(system testing)

  11. 保障维护(corrective maintenance)

 

软件构建

构建就是创建事物的过程中动手的那部分。

软件构建的主要活动包括:详细设计,编码,调试,集成,开发者测试(包括单元测试和集成测试)。

 

软件构建的质量直接影响软件的质量和生产效率:

  • 构建活动是软件开发的主要组成部分。构建活动在整个项目开发期中占据了30%~80%的时间;

  • 构建活动是软件开发中得核心活动。

  • 提高程序员的生产率。在构建活动期间,不同程序员的生产率差率可达10~20倍。是不是好奇为什么你总是很忙么?好奇为什么大神的开发效率总是那么高么?后面会讲到。

  • 构建活动的产物——源代码,是对软件的唯一精确描述。文档只是参考,代码才是硬道理。

  • 构建活动是唯一一项确保会完成的工作。

 

用隐喻来理解软件开发

  • 重要的研发成果往往来自类比,通过把你不理解的东西和一些你比较理解又很类似的东西作比较,你可以对这些不理解的东西产生更深刻的理解。这种使用隐喻的方法也叫建模。

  • 我们常见的软件术语,如virus,bug,crash,worm,Trojans horse,bomb等都是隐喻的良好示例。通过隐喻我们能更加充分的去了解一个事物。

  • 隐喻和算法可以比较一下,算法是解决问题的步骤,而隐喻的作用是启发,是一种帮你寻找答案的技术。算法就像是参考答案,很标准规范;而隐喻就像是指路明灯,常常有一点随意。

  • 常见的软件隐喻:
    • Writing Code(写作代码) 仅仅暗示了软件开发是一种代价昂贵的试错,对复杂的软件开发不适用。

    • Growing a System(培植系统) 类似耕作技术,暗示“一次做一点”,但不是很恰当。

    • System Accretion(系统生长) 指的是软件的生长,暗示软件是通过外在的增加或吸收而逐渐的生长或者变大。与软件工程中的“增量式开发”不谋而合。

    • Building Software(建造软件) 它与软件生长的概念是相通的,但这个隐喻更加恰当。他可以用来解释大型项目和小型项目之间的区别。例如制造一个狗屋,如果不慎采用了错误的设计,虽是的仅仅是一个下午的时间和一些木料,但如果制造的是帝国大厦,那错误的代价就太高了。建造帝国大厦一样庞大的软件,需要有和其不相上下的技术水准及管理水平。
      The Intellectual Toolbox(智慧工具箱) 暗示软件开发时,要把所有的方法技术以及技巧放到脑海,因地制宜地选择正确的工具。

  • 不同的隐喻之间并不排斥,应当使用对你最有益的某种隐喻组合。

  • 隐喻是一种启发式的方法,那么该如何使用它呢?

    • 通过它来提高你对编程问题和编程过程的洞察力

    • 帮助你思考编程过程中得活动,想出更好的解法

代碼即需求,代碼即測試,代碼即設計

 

架构设计典型组成部分

  1. 程序组织:各个构造块的组织结构方式,如何拼接在一起为何选择这种结构而不是那种结构;

    主要构造块的责任与功能,明确架构的系统构成,各个构造块之间信息隐藏和确定交互通信方式规则;

  2. 主要的类:每个类的功能应当单一,明确每个主要类的作用和职责,与其他类的交互方式。

  3. 数据设计:架构应该描述所要用到的主要文件和主要的数据表的设计。顺序表或者链表,Why;数据的访问形式通常提供一个专门用于访问数据的类或者接口。

  4. 业务规则:依赖于特定的业务时应当详细描述业务的规则以及对系统的影响。

  5. 用户界面设计:定义与用户交互系统的命令和模型,交互方式。

  6. 资源管理

  7. 安全性

  8. 性能:资源使用情况如内存使用,执行速度。

  9. 可伸缩性

  10. 互用性

  11. 国际化/本地化

  12. 输入输出

  13. 错误处理:错误检测,处理机制。

  14. 容错性

  15. 架构的可行性

  16. 过度工程

  17. 是”买“还是”造“?

  18. 复用性:可扩展性和重用性,支持变更机制。

  19. 变更策略

  20. 架构的总体质量

 

编程工具不应该决定你的编程思路

“在一种语言上编程(programming in a language) ”
的程序员将他们的思想限制于”语言直接支持的那些构件”,如果语言工具是初级的,那么程序员的思想也是初级的。

“深入一种语言去编程(programming into a language)”
的程序员首先决定他要表达的思想是什么,然后决定如何使用特定语言提供的工具来表达这些思想。