一、修改软件的起因及其本质。

修改软件是任何一个开发人员所面对的问题,软件是否容易修改,被修改后的软件是否变得更好,是每一个开发人员都知道必须关注但是在实际开发过程中却往往忽视的问题。有多少人在接手一个新项目时抱怨新项目的遗留代码质量太低?又有多少人愿意或者说有能力去将一个让人崩溃的代码逐步改善?

  假如你面对着一份只能考虑修改,不能考虑重写的,但是混乱不堪的代码,需要将其逐步改善,可能需要细致的研究《修改代码的艺术》这本书,它的目的就在于:希望能够将一个已经非常庞大而且混乱不堪的项目从现状中摆脱出来,让为这个程序做开发的人员对开发感到安心,而不是担忧。

  这里从书中列出的软件修改的四个主要起因开始:

    1.添加新特性。

    2.修正bug。

    3.改善设计。

    4.优化资源使用。

  添加新特性和修正bug的含义不难理解,但是有时候因为对需求的理解不同,表面上看上去是修正bug的行为实际对于开发人员来说确实添加一个新特性。关于这一点,这里把这样一种行为划分到添加新特性的范围中,而不认为是修正bug。

  改善设计指的是改变程序的结构,令软件更加容易维护,通常也意味着,我们希望改善设计的过程中不应该改变程序的行为。这种不改变程序行为而改善设计的举动称为重构。(书中指出重构背后的理念:如果我们编写测试确保现有行为不变,并在重构的每一步中小心验证其行为的不变性,我们就可以在不改变程序行为的前提下通过重构使其更具维护性)

  优化和重构类似,但是目的却不同,重构的目标是程序的结构更容易维护,而优化的目标却是针对程序所使用的资源,比如CPU时间和内存占用等。

  一般而言,当对一个系统做修改之后,有三个方面可能会发生改变:结构、功能以及资源占用。为了把上述的bug修改和添加新特性区分出来,我们把功能也分为对旧有功能的修改和新功能。于是综合起来,我们可以得到一个表格:

  添加特性 修正bug 重构 优化
结构 改变 改变 改变 ——
新功能 改变 —— —— ——
功能 —— 改变 —— ——
资源使用 —— —— —— 改变

  当然,准确来说,前三种举动也可能会导致资源使用的改变,但是因这三种情况下资源使用的变化往往只是副作用,所以表中还是列为不变。

  在这所有的情况里面,有一点是非常重要的:我们对程序的改动相比我们希望保持的程序行为相比,我们希望保持的程序行为要多得多。所以在对程序修改中,如何保证不导致不想改变的东西被改变,是重中之重。

二、修改中存在的问题

  对大部分的开发人员来说,一般并不愿意对软件进行修改。有了新的需求,需要添加新特性;有了bug,需要做修正;这样的修改不得不做。但是改善设计提高维护性,大部分人是不愿意的做的。

  为什么会这样?当然不是因为开发人员懒,那么多的代码都写了,没道理不愿意为了以后维护方便,多写一些。关键在于,我们都担心只是为了改善结构的修改行为,对系统造成了严重的破坏。

  “避免修改”算是我们对于已经跑在线上的程序的一种降低软件问题的策略。“既然跑的好好的,那还是别改了”。如果一个程序永远不用改动,那或许这种策略有一定的可行性。但是,除非对于一个已死的项目,改动总是不可避免的。当团队每次都以看上去最简单的方式将新代码添加到系统中,原有的方法、原有的类就会越来越庞大,修改的难度也会越来越大,最终造成质量不断下滑。

转载于:https://www.cnblogs.com/ustc-huomiao/p/8830264.html

《修改代码的艺术》读书笔记一相关推荐

  1. 卓有成效的程序员 阅读笔记 第一部分

    第一部分 机制 第二章 加速法则 加载器(Launcher)允许你输入应用程序或文档名称的第一部分来加载它:一个应用程序列表的有用程度与它的长度成反比 花点时间来学习你手边所有隐藏的快捷键 命令提示符 ...

  2. ThoughtWorks(中国)程序员读书雷达

      软件业的特点是变化.若要提高软件开发的技能,就必须跟上技术发展的步伐.埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识.世界上并不存在速成的终南捷径,但阅读好的技术书籍 ...

  3. 张逸:ThoughtWorks(中国)程序员读书雷达

    2013/06/20 ·  书籍与教程, 开发· 6.6K 阅读·  书籍, 架构设计, 编程, 领导力 原文出处: 简单文本-张逸   欢迎分享原创到伯乐头条 软件业的特点是变化.若要提高软件开发的 ...

  4. 张逸: ThoughtWorks(中国)程序员读书雷达

    原文出处: 简单文本-张逸 软件业的特点是变化.若要提高软件开发的技能,就必须跟上技术发展的步伐.埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识.世界上并不存在速成的终南 ...

  5. 程序员的共鸣 - 读《卓有成效的程序员》

    最近读了<卓有成效的程序员>,感觉收获颇大.这是一本写给程序员的难得的好书.书中大都是一些浅显的道理,但作者将这些东西加以收集.归纳.总结,并最终成书.作者为了收集各种提高效率的工具和方法 ...

  6. 读《卓有成效的程序员》-----我的一些题内和题外的感想

    读<卓有成效的程序员>-----我的一些题内和题外的感想 本文出自:http://hi.baidu.com/xiaonan33309/blog/item/c708c901a50d940b7 ...

  7. 卓有成效的程序员(影印版)

    卓有成效的程序员(影印版) 一本揭示高效程序员的思考模式,一本告诉你如何缩短你与优秀程序员的差距 定价 : ¥42.00会员价 : ¥31.50(75折) 详情查看:http://www.china- ...

  8. [黑马程序员C++笔记]P72-P83通讯录管理系统

    目录 系统需求 1.菜单功能 2.退出功能 3.添加联系人 (1)​​​​​​​设计联系人结构体 (2) 设计通讯录结构体 ​​​​​​​(3)main函数中创建通讯录 (4)封装添加联系人函数 (5 ...

  9. [黑马程序员C++笔记]P72-P83通讯录管理系统总体概览

    系统需求 通讯录是一个可以记录亲人.好友信息的工具. 本教程主要利用C++来实现一个通讯录管理系统 系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名.性别.年龄.联系电话.家 ...

  10. php末尾友链,与php程序员的笔记网站交换友链的原则

    很抱歉,由于本网站首页友链已满,目前停止交换首页友链,内页仍可交换友链!(2013年2月24日) 随着本站友链的数量不断增多,本人不得不对本站的友链申请的原则进行郑重的申明一下,希望各位申请本站友链的 ...

最新文章

  1. 玩转Excel系列-SUMIFS函数使用及实例
  2. 11_less中的条件判断
  3. jQuery使用规范总结
  4. Google浏览器清除缓存快捷键
  5. 计算机硬盘图标ico,LaCie 硬盘图标
  6. 百度Unit 2.0平台学习理解
  7. 计算机网络原理优秀视频
  8. CUDA 编程学习
  9. 数据,源码防泄密解决方案
  10. python3 获取整分钟数的时间,如间隔半小时
  11. ffmpeg中的av_pix_fmt_descriptors
  12. 河南单招计算机专业专科学校排名2015,河南省单招大专学校排名榜 哪个学校好...
  13. 【EXP】导出数据库dmp文件,只有几张表有数据,剩下的所有表只有表结构没有数据
  14. 国家气象局提供的天气预报接口(完整Json接口)
  15. 微信JSSDK之添加微信卡券
  16. 老男孩培训python学费
  17. kubectl查看node状态_全栈之路:使用pm2自动化部署node项目
  18. vc2010c语言阶乘程序,我在C语言贴吧的第一个C(或C++)程序:可以计算10000阶乘的程序...
  19. 判断GPS坐标是否在中国
  20. 验证码: 如下,在进行自动化测试,遇到验证码的问题,一般有两种方式

热门文章

  1. 笔记本电脑关机后指示灯还亮_汽车仪表常见指示符号之清洗液指示灯,灯亮了怎么办?...
  2. div获取第一个子节点jquery_【antd】Tree组件子节点不完全勾选获取父节点的值
  3. plotcylinder matlab,Matlab在任意两点之间绘制三维圆柱
  4. java 对象的态_Java面向对象-------多态总结
  5. 接口入口在什么地方_弱电工程施工图审查要点?有哪些地方需要审核?审核要求是什么?...
  6. Python3求最后一个单词长度
  7. python+robotframework_python+robot framework接口自动化测试
  8. 计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧
  9. 日照职业技术学院计算机怎么样,日照职业技术学院宿舍条件怎么样 住宿环境好不好...
  10. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)