常见的软件开发活动:
-
定义问题(problem definition)
-
需求分析(requirements development)
-
规划构建(construction planning)
-
软件架构(software architecture) ,高层设计(high - level design)
-
详细设计(detailed design)
-
编码与调试(coding and debugging)
-
单元测试(unit testing)
-
集成测试(integration testing)
-
集成(integration)
-
系统测试(system testing)
-
保障维护(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(智慧工具箱) 暗示软件开发时,要把所有的方法技术以及技巧放到脑海,因地制宜地选择正确的工具。
-
-
不同的隐喻之间并不排斥,应当使用对你最有益的某种隐喻组合。
-
隐喻是一种启发式的方法,那么该如何使用它呢?
-
通过它来提高你对编程问题和编程过程的洞察力
-
帮助你思考编程过程中得活动,想出更好的解法
-
代碼即需求,代碼即測試,代碼即設計
架构设计典型组成部分
- 程序组织:各个构造块的组织结构方式,如何拼接在一起为何选择这种结构而不是那种结构;
主要构造块的责任与功能,明确架构的系统构成,各个构造块之间信息隐藏和确定交互通信方式规则;
-
主要的类:每个类的功能应当单一,明确每个主要类的作用和职责,与其他类的交互方式。
-
数据设计:架构应该描述所要用到的主要文件和主要的数据表的设计。顺序表或者链表,Why;数据的访问形式通常提供一个专门用于访问数据的类或者接口。
-
业务规则:依赖于特定的业务时应当详细描述业务的规则以及对系统的影响。
-
用户界面设计:定义与用户交互系统的命令和模型,交互方式。
-
资源管理
-
安全性
-
性能:资源使用情况如内存使用,执行速度。
-
可伸缩性
-
互用性
-
国际化/本地化
-
输入输出
-
错误处理:错误检测,处理机制。
-
容错性
-
架构的可行性
-
过度工程
-
是”买“还是”造“?
-
复用性:可扩展性和重用性,支持变更机制。
-
变更策略
-
架构的总体质量
编程工具不应该决定你的编程思路
“在一种语言上编程(programming in a language) ”
的程序员将他们的思想限制于”语言直接支持的那些构件”,如果语言工具是初级的,那么程序员的思想也是初级的。
“深入一种语言去编程(programming into a language)”
的程序员首先决定他要表达的思想是什么,然后决定如何使用特定语言提供的工具来表达这些思想。