#Software Construction
##软件开发平面图
####构建活动中的具体任务
- 验证有关的基础工作已经完成.因此构建活动才得以顺利的进行下去。
如,需求分析 - 确定如何测试所写的代码
- 编码实现
- 代码的单元测试,代码的集成测试,已经代码评审
- 代码格式化合注释
- 调整代码,让他更快,更省资源
##软件构建活动与非构建活动
###非构建活动
####1.1 管理
####1.2 需求分析
####1.3 用户界面设计
####1.4 系统测试
####1.5 维护###构建活动
####2.1 详细设计
####2.2 编码实现
####2.3 调试
####2.4 集成
####2.5 开发者测试
##你对如何进行构建的理解程度,决定了你这名程序员的优秀程度。
明确需求分析,关键点,在未开始构建之前,就已经知道构建之后是什么样子了(包括如何使用,如何扩展等等).
构建之中,系统核心功能为主干,需要先明确以及验证是否达到需求目标。而后完善功能细节。
- 存在于世界上的任何逻辑,都依托于某种最基本的东西。
- 比如,盖房子需要先打地基,研发汽车需要合适的发动机,等等。软件模块间的数据流动,需要先明确接口。
- 一个软件模块,必定基于某种技术为主干。而后在此主干上细化和实现功能分支。及需要开发一个最小原形来验证,设计的合理性以及可行性。
- 基于以上验证,进行功能的开发,so easy.
- 随着开发,如果感觉到,实现越来越复杂,以及不确定性。此刻需要考虑到重构。软甲结构的调整。
构建中的哲学,无论什么模块或系统,在编码和调试过程中,需要的是
- 随着时间的推移,随着整个模块/系统的完成度越来越高,程序员会感到各种功能实现越发容易。而非越来越难.
如果越来简单,开发越容易,那么至少软件架构合理,易于维护。
如果越到越难,开发越艰难,那么我么是时候重构代码.重新设计一下模块结构.
- 随着时间的推移,随着整个模块/系统的完成度越来越高,程序员会感到各种功能实现越发容易。而非越来越难.
##软件中的隐喻
####你对隐喻有多理解,也决定了你对软开发有多理解
####常见隐喻
- Software Penmanship: Writing Code 软件中的书法:写作代码
- Software Farming: Growing a System 软件的耕作法:培植系统
Software Oyster Farming: System Accretion 软件的牡蛎养殖观点: 系统生长
- 你需要学会如何一次为软件系统增加一个小部分
增量的(incremental),迭代的(iterative),自适应的(adaptive),演进的(evolutionary) - 在进行增量式开发时,我们先做出软件系统的一个尽可能简单的,能够运行的版本,它不必接受真实
的输入,也无须对数据进行真正的处理,更不用产生真实的输,它仅仅需要构建一个足够强壮的骨架
支撑起未来开发的真实系统。对于你标志出来的每一个真实功能,可能仅仅需要调用虚假类(dummy classes). - 这个最基本的起点,就像牡蛎开始孕育珍珠的那颗细小沙粒。
在骨架形成之后,你要一点点在其上附着肌肉和皮肤。将骨架中虚假的类,一点点替换。完成整个构建。
你一次次增加一小段代码,直到得到一个完全可以工作的系统.
- 你需要学会如何一次为软件系统增加一个小部分
Software Construction: Building Software 软件构建:建造软件
- 更复杂的结构,需要更加仔细的规划
在2.3的基础上,增加更详尽的计划。体检计划,运筹帷幄,然后在行动 - 精心的计划,并非意味着事无巨细的计划或者过度计划,你可以把房屋机构性的支撑(structural support)
规划清楚,而在日后再决定使用木地板还是地毯。
- 更复杂的结构,需要更加仔细的规划
Applying Software Techniques: The Intellectual Toolbox 应用软件技术:智慧工具箱
- 技术并不是规矩,它只是分析工具。
Combining Metaphors 组合各个隐喻
- 隐喻是一种启发式方法而不是算法,因此他们彼此并不排斥。
- 使用隐喻有是件说不清楚的事情,你需要适当的引申它的含义,才能从其蕴含的深刻启发中受益。
KeyPoints
- 隐喻是启示不是算法,因此他们往往有一点随意。
- 隐喻把软件开发过程和你熟悉的活动联系在一起,帮助你更好的理解。
- 有些隐喻别其他一些隐喻更加贴切。
- 通过把软件的构建过程比喻成房屋的建设过程,我们可以发现,仔细的准备是必要的,而大型项目和
小型项目之间也是有差别的。 - 通过把软件开发中的实践比作是智慧工具箱中的工具,我们有发现,每位程序员都有许多
工具,因地制宜的选择正确工具,但并不存在于一个能适应所有工作的工具,因地制宜的选择正确工具,
是成为能有效变成的程序员的关键。 - 不同隐喻彼此并不排斥,应当使用对你最有益处的某种隐喻组合。
Software is like a War.逐步推进,知己知彼,关键节点打通。
然而,战争关键节点往往是地理位置,它是已知的。软件开发的关键节点需要经验和反复验证。
引用书籍:
###1. CODE COMPLETE 代码大全