软件开发相关的读书笔记 问题与方法
https://www.zybuluo.com/UDvoid/note/45720
标签: 读书笔记 软件开发
关于银弹的讨论
[No Silver Bullet: Essence and Accidents of Software Engineering][1]
作者在全文主要讨论了软件开发过程中许多难以解决的问题和当下出现的一些致力于使软件开发更加敏捷高效的方法;
用作者的话来说,当下的许多软件项目具有人狼的特性,往往看似简单的项目却会在开发过程中出现许多难以预料的问题,人们渴求类似银弹的大杀器可以对所有的问题给出一个通用的解决方案,但至今为止依旧没有任何突破性的进展,可以说,这样的银弹是不存在的;
软件工程中问题有两个部分,一部分是在软件固有的困难,如软件的概念结构的设计、算法、模块间的相互联系等;另一部分是在软件生产过程中的一些问题,如语言本身局限性导致的实现上的复杂度的升高、团队见的合作问题导致的时间开销的增大等;
对于固有困难,作者从复杂度、一致性、可变性和不可见性4个方面进行了分析,这些特性也是相互影响的;
软件和硬件不同,硬件的很多部分是不断重复的组件,而软件却是必须由一个个不同的模块构成,即使有重复的需求也可以通过模块调用的方式去除。因此,软件本身就具有复杂性这一本质属性。这是软件的的优点也是其问题的源泉:软件的复杂性导致了开发人员间沟通的问题、软件的拓展也变得困难;
在很多情况下,软件开发必须保证接口的一致,或者说一致性的维护就是开发的目标,而这样的需求背后是复杂度的增大,这是任何再设计都没有办法简化的;
随着计算机平台以及操作系统等的飞速发展,往往需要软件开发者被动地去适应,不断维护软件与相应平台的一致性;而人们对于软件功能的不断变化的需求也给软件本身造成了不断拓展的压力;
除此之外,软件概念结构的复杂性和内部各种相互依赖关系使得我们难以将其完整地可视化,这限制了软件结构的设计和理解;
以上问题都是软件本质上的困难,而那些次要的、生产环节上的问题却在优化解决方面有了许多进展;
高级语言简化了实现功能和设计的难度,成倍提升了软件开发的效率;统一的编程环境使得概念设计中的相互调用等变得相对易于实现;面向对象编程的方法,允许采用较高层次的方式表示设计;
现在我们所不断探求的是针对固有困难的解决方案,比较可行的是增量开发的模式。增量开发模拟自然界中的逐步发育成长,采用自顶向下的开发方法,快速进行原型的开发,并不断保证系统的可运行与有机成长,不断地迭代需求使功能逐步发展成型。
[There Is a Silver Bullet][2]
本文讨论了当前的一些先进的解决软件行业本质性问题的方案,面向对象编程方法和增量开发的模式算是软件行业的一次变革。
和从前过程式的设计方式不一样,面向对象编程方法更好地把问题中的实体抽象成一个个类,把过程模块化,模块之间的联系变得易于描述,有效降低了软件复杂度带来的设计和理解的困难;
增量开发的方法,是面向对象思想的拓展,快速构建原型,成长式地根据需求不断维护各个功能模块,有效分割了问题,开发者不用关心其他部分的具体功能。这样使得开发更加高效敏捷,节省了开发的时间成本;
大泥球
[Big Ball of Mud][3]
大泥球,指杂乱无章、错综复杂、邋遢不堪、随意拼贴的大堆代码。
大泥球往往会有代码数据的不当暴露、或者在运行过程中会进入其他模块的内部等等问题,导致模块间的混乱的调用关系以及大量的冗余;
大泥球的成因主要有:
- 一次性代码
- 碎片式增长
- 为了简单解决问题
- copy/paste导致问题代码扩散
一次性代码大多是没有考虑设计的,代码本身就有一定的架构上问题,而由于大部分开发者的惰性或是为了降低开发成本,直接将这些实际已被放弃的代码进行复用,反而使得自己的代码更加臃肿和杂乱无章。
另一方面,当用户的需求更新过快时,由于开发者的应对过晚和前期设计的不足,现有代码架构更新的成本相对难以接受,导致代码开始出现大泥球,并随着碎片式增长扩大;
大部分大泥球的产生更多地来自开发迭代过程中遇到的问题,这就需要我们在设计的初期尽可能考虑到可能的变化并预留拓展的空间;同时,在软件质量下降时,简单的重构是必要的。在我看来,这是“好的设计”的重要部分。
[1]: http://www.cs.umd.edu/class/spring2003/cmsc838p/General/NoSilverBullet.html
[2]: http://www.drdobbs.com/there-is-a-silver-bullet/184407534/
[3]: http://www.laputan.org/mud/