第二章  优秀程序的要素

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

----同第一章类似,这一章仍然没有涉及到心理学的内容。主要介绍了优秀程序的几个要素,按温伯格认为的重要次序如下:是否符合技术规范、是否按日程计划完成、适应性以及效率。重要的观点是,世界上并不存在一个绝对的评判程序的标准,但可以从上述几个方面来对程序进行一定程度的好坏评定。

如果准备把程序开发作为一项以人为主体的行为来研究,我们首先就需要确定一些标准,用来衡量程序的性能。尽管我们对这些问题多少有些概念,但是我们将发现,答案并不象想象的那么简单。道理很简单:程序开发不仅是一项人的行为,而且是一项人的复杂行为。

----温伯格首先认为并不存在一种绝对的标准来评判一个程序的好坏,比如称某个程序的优秀程度为80%,这是不存在的。这恐怕是因为程序有其特定的开发环境、开发人员以及不同的使用环境。然而不幸的是,实际上我们也很难找到一对足够相近的程序,从各个层面来对比他们,因而相对标准也并不实用。从几个要素来评判程序的好坏倒还比较可信,毕竟优秀程序必须是正确的,然后才考虑是否按日程完成、适应性以及效率的问题。

优秀程序的要素之一:技术规范

如果程序根本无法正常运转,对其效率、适应性以及生产成本的评估就毫无意义。无论如何,我们需要务实一些,需要承认:也许根本没有哪个完美的程序曾经被写出来过。每一个真正大型和重要的程序“都必然包含很多个纰漏”。所以,程序符合其事先制订的技术规范(可行性)的程度不尽相同,在对程序进行评估时,必须考虑到其不完美的一面。

优秀程序要素之二:日程计划

即使不考虑符合技术规范的问题,效率的问题仍然不是最重要的。有时候程序推迟发布会带来重大损失。一旦开发计划没有按时完成,总会有一大堆令人烦恼的后果。实际上,一般的开发主管宁可先做12个月的计划,然后在12个月内完成,也不愿计划为6个月,但却花费9个月。

----书中提到,这一点在心理学方面大有研究的余地。目前的有关研究只考虑时间的平均值,温伯格提到应该衡量开发时间的方差。期待在后面的章节看到此讨论。

优秀程序要素之三:适应性

温伯格认为,程序的适应性比效率重要,因此先讨论适应性。多数程序在其生命期内都会被修改,但实际上,很少有哪位原作者会考虑到可能的后续修改。文档会在一定程度上使程序易于修改,因而文档的质量也应该在很大程度上决定到对程序的评分。

适应性不是没有代价的。Fisher基本定理告诉我们:一个系统对某一特定环境的适应性越强,他适应新环境的能力也就越弱。为了强调程序的效率,我们往往追求“紧密式”的代码,而如果未来要对这些代码进行修改,那将会非常棘手。

----效率和适应性犹如鱼和熊掌不可兼得。因而往往只能取其一,至少这比哪个都没有强。

优秀程序要素之四:效率

终于讲到效率了,不过衡量程序的真正效率,并不像乍看起来那么简单。

如果我们首要关心的是程序运行的效率,那么第一步工作就应该是检查一下,看看哪些方面的规范改变以后,可以提高计算机的效率—此时,我们并不顾及用户使用是否方便。诚然我们可以把一些交叉结算的工作交给人来汇总,但是通过这种方式来节省计算机运行时间,却可能使人工花费更多的时间。

在多机、多道程序的环境中测量效率的困难比单机、单任务的环境要困难得多。用户所希望的并非程序的平均执行时间最小化,而是其标准偏差的最小化,即程序的运行稳定性最佳。

----最近在看Jeffrey Richer的一本<Applied Microsoft .NET framework>,感觉他对效率非常重视。几乎每讲一个内容,都会提到如何提高效率。比如,值类型的装箱拆箱,他带领我们深入学习其中的原理,查看IL代码来分析程序中装箱拆箱的次数,然后改进程序将他们降至最低以使程序达到效率的最优。而温伯格将程序的效率排在优秀程序要素的第四位,他们俩的观点使我们能够对效率保持一个比较客观的认识,不要走向任何一个极端。

转载于:https://www.cnblogs.com/banian/archive/2004/09/13/42710.html

《程序开发心理学》读书笔记(二)相关推荐

  1. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  2. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  3. 《Introduction To Modern Cryptography》读书笔记二

    <Introduction To Modern Cryptography>读书笔记二 本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得 ...

  4. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  5. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

  6. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  7. 《李元芳履职记》读书笔记二 IT技术管理的沟通与团队建设

    <李元芳履职记>读书笔记二 接一 https://blog.csdn.net/qq_45937199/article/details/103305223 IT技术人员从技术岗走向管理岗,所 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  10. 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过"一个好的东西往往是是说不清楚的",姑且不论这句话的对与错.但我真的很佩服<淘宝技术这十年>这本书的作者子柳,能够通过淘宝的一些故事,按照时间顺序和IT发展的各 ...

最新文章

  1. 转 linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值
  2. python 基本数据类型之字符串功能
  3. sql server schema下拉不到存储过程_mysql数据库字符编码总结--数据存储编码
  4. Road Construction
  5. 麦克风阵列声源定位 GCC-PHAT
  6. js 递归查询所有的叶子结点_浅谈mysql的查询过程
  7. mongodb 启动脚本和配置
  8. 6to5 – 让你即刻体验 ECMAScript 6 编程
  9. Android入门(9)AudioRecord和AudioTrack类的使用【转】http://blog.sina.com.cn/s/blog_6309e1ed0100j1rw.html...
  10. ValidatorUtil验证工具类判断手机、ip地址、邮箱,身份证等
  11. ENVI中对图像监督分类结果的编辑
  12. matlab chi2gof,chi2gof函数里的检验值P为什么总等于NaN呢
  13. 能模仿韩寒小四写作的神奇循环神经网络
  14. 驾驭你的“职场布朗运动” (作者李云)
  15. hive的join,left join,right join,full outer join,left semi join,cross join
  16. Codeforces Round #439C 组合数-The Intriguing Obsession
  17. 【HTM】层级实时记忆脑皮质学习算法 一、当前进度
  18. Pytorch系列笔记(二)
  19. 管道和FIFO概念以及相关函数(pipe、mkfifo)介绍
  20. 一份完整的app产品运营推广方案,app推广运营的方法(一)

热门文章

  1. 基于jquery的ajax聊天室系统,基于jQuery的Ajax聊天室应用毕业设计(含外文翻译)...
  2. java indexof int,int indexOf(String str, int fromIndex)
  3. 获取rawimage的像素点函数_光场相机数据二次开发基础-使用LFtoolbox解码lfp文件
  4. 开发日记-20190530 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  5. python导入模块
  6. EM算法——有隐含变量时,极大似然用梯度法搞不定只好来猜隐含变量期望值求max值了...
  7. 格伦布编码——rice编码无非是golomb编码M为2^x的特例
  8. JDK12下的ArrayList源码解读 与 Vector的对比
  9. 测开之路五:异常处理
  10. PHP NULL 合并运算符