今天终于看完了«零缺陷程序设计»,这可能是我看的计算机书中,按时间/页来算时间最长的一本了.薄薄200页看了一个半月.期间主要是因为放假了就懒得翻书了.不过更长的时间间隔可以让我有充足的时间去体会净室工程的实质.
净室工程的核心思想是在软件生产的过程中制造出几乎没有缺陷的程序.对改进软件质量这种方法是非常有效的,通常每千行错误不超过10个,已有的项目一般做1个左右,甚至还有0.5的. 【程序编程相关:性能微调提示】
"净室软件工程",作为程序员应该都听说过这个名字吧,但真正了解他的却真的不多(有点像我喜欢的python).不了解同时还带来了偏见,这个随笔的最后我打算就别人的一些见解发表一下自己的看法. 【推荐阅读:TOMCAT笔记(一)之 目录、虚拟主机】
[code][y>x -> x,y := y,x|true-> i]if (y > x) [x,y := y,x] { int temp; temp = x; x = y; y = temp; }[/code] 【扩展信息:把rpm包转成deb包的工具】
实现这点用的核心方法就是"验证":证明代码是正确的,而不是通过测试去debug.要使软件可验证,就要将代码一定程度(注意不要过度)得形式化.在所有论述之前先要建立这个观点:代码(也是程序)是对输入状态进行变换得到输出状态的一个函数.程序设计基于预期函数,程序必须"匹配"对应的预期函数.对大的预期函数可以分解为几个简单的部分分别验证(就是自顶向下的分解),随后根据替换原则在验证大的预期函数(自底向上得归约).具个小例子:(p32)
在验证的时候跟踪表是一个很重要的公正,它让你轻松应对比较复杂的情况.
关于被验证的程序与预期函数的关系,应该叫"匹配",被验证的程序的处理能力不一定要完全与预期函数相同.通常如果预期函数是f(),程序所作的变换是f*()那么:通常是d(f)是d(f*)的子集,程序的处理能力大于预期函数,要验证的函数在预期函数的定义域内与预期函数相等,形式得表示:f*|d(f)=f.
验证中最麻烦的应该是迭代(还有递归)的验证,不过好在所有的迭代都可以转为递归,而递归函数的验证有一套数学方法了.书中讲了一大堆,实质就是数学归纳法. 1. 验证带头性(我们讲高等代数的老师喜欢这么叫,就是归纳的时候第一个元素的验证,一般是不证自明的,比如在0时的情况)
2. 验证在假设成立的时候,原来的命题成立.
说得有点模糊,不过知道归纳法的人都明白我在讲什么.书上对程序的验证也就是分这两步的.
... 下一页