Spiga

“外部质量”还是“内部质量”

2011-02-14 16:45 by Colin Han, 1845 visits, 收藏, 编辑

这几天看了看《硝烟中的Scrum和XP》,其中作者将产品质量分为两种——“外部质量”和“内部质量”。作者认为,在项目工期紧的时候,外部质量是可以妥协的。而内部质量是不容妥协的。但是,哪些问题属于内部质量呢? 
作者并没有详细的论述这个问题。下面,我列出了一些常见的场景和划分。 你怎么看待这个问题呢?

外部质量

  • 可扩展性
    我一直认为,一个没有明确的目标的可扩展性设计往往会变成过度设计。因此,我觉得可扩展性相关的质量问题应该作为外部质量看待。敏捷中强调 做的刚够就好
  • 功能不完整的实现
    有些时候,对某个功能模块的实现中存在 明显的 功能不完整。这一点我认为也是外部质量。因为,我们采用迭代式开发的目的就是可以逐渐的完成这个功能。但是,我认为这种功能不完整应该是 显而易见 的。否则,我认为就属于内部质量中的“逻辑严整性”和“语义清晰性”的问题了。
  • 性能
    性能优化往往会牺牲架构的简单性和代码的可维护性。而且,我个人认为从实际的产品角度来看,性能只有“能够接受”和“不能接受”的差别,而没有“好”和“不好”的差别。因此,我认为它是产品是否能够验收的一个重要指标。但不是一个我们应该时刻关注的质量问题。

内部质量

  • 代码规范
    混乱的代码意味着更加难以维护。划分外部质量和内部质量的一个重要标准是:对产品的可维护性有很大影响的质量问题应该称之为内部质量。因此,我认为代码规范为“内部质量”。
  • 设计和实现的逻辑严整性
    例如:你设计了一个集合类,就应该确保集合的基本增删改操作正确。你可以在集合的删除操作中抛出“NotSupportException”或断言错误以标示该集合是一个只增集合。但是,你不能通过忽略删除方法的实现来达到同样的目的。
    另外一个逻辑严整性问题的例子是:Equals方法和GetHashCode方法实现上。你可以同时不实现这两个方法。如果实现,就一定要实现正确。不能因为目前没有需求将该对象作为Hashtable的Key,而忽略GetHashCode的实现。
    一个逻辑上不严整的设计往往会对将来使用该模块的开发人员造成误导。 最终造成可维护性问题。因此参考上面的原则,我认为这一条应该归为“内部质量”。
  • 语义清晰性
    这一条和“逻辑严整性”类似。不能在方法命名等地方出现语义上的不清晰。对将来的使用者造成误导。

关于划分原则的思考

  • 对产品未来可维护性有影响的点应该归为内部质量
    正因为“可维护性”往往是一个不易被觉察的问题,我才觉得可维护性是团队最应该关注的质量问题。是不能够放弃的底线。相对而言,“可扩展性”和“可维护性”如此相似,却恰恰相反,它看起来如此美妙。但,过度设计往往都是因为对“可扩展性”的追求而导致的。它反而是我们程序员应该时刻警惕的东西。
  • 内部质量往往比较虚,而那些清晰明确的问题或目标个人认为归为“外部质量”比较好。
    人的精力是有限的,正因为这种有限性,让我们需要建立一些简单的原则来帮助我们将精力放在更重要的问题上。尽可能减少我们关注的范围,会让我们在这个范围内做的更好。因此,我觉得应该尽可能的将那些显而易见的问题排除出“内部质量”问题之外。这样,我们才能够更好的控制“内部质量”。那些显而易见的问题,其实,往往都不是问题。
  • 性能
    这一点我一直很犹豫,因为往往一个不好的架构会导致难以修复的性能问题。但是,就这个话题而言。我还是更加倾向于将性能看做是外部质量。因为它往往是显而易见的。产品的Master,Customer等等很多人会关注与这个问题上。很多时候,在产品前期准备的时候就已经提出了明确的性能要求。因此,它是一个重要的产品测量点,但是,不是“内部质量”
Add your comment

11 条回复

  1. #1楼 金色海洋(jyk)      2011-02-15 11:57
    还是没有回复呀,本来想写回复的。但是又不敢。
     回复 引用 查看   
  2. #2楼 卡通一下      2011-02-15 12:17
    引用金色海洋(jyk):还是没有回复呀,本来想写回复的。但是又不敢。

    这有啥不敢的?呵呵!

    我就是觉得“外部质量”是指客户的感受;“内部质量”是指架构、编码的水平。哈哈...
     回复 引用 查看   
  3. #3楼[楼主] Colin Han      2011-02-15 13:07
    @金色海洋(jyk)
    呵呵,是啊,看起来这个话题还是太虚了。大家都没有感觉。谢谢捧场
     回复 引用 查看   
  4. #4楼[楼主] Colin Han      2011-02-15 13:11
    引用卡通一下:
    我就是觉得“外部质量”是指客户的感受;“内部质量”是指架构、编码的水平。哈哈...

    嗯,我觉得更准确的说法,应该是“外部质量”是客户能够把握的东西。这样就符合关注点分离的原则。外部质量由客户(或其代表)负责,内部质量由开发团队负责。每个人努力去维护自己的利益。最终实现利益的最大化。
     回复 引用 查看   
  5. #5楼 卡通一下      2011-02-15 16:06
    引用Colin Han:
    引用卡通一下:
    我就是觉得“外部质量”是指客户的感受;“内部质量”是指架构、编码的水平。哈哈...

    嗯,我觉得更准确的说法,应该是“外部质量”是客户能够把握的东西。这样就符合关注点分离的原则。外部质量由客户(或其代表)负责,内部质量由开发团队负责。每个人努力去维护自己的利益。最终实现利益的最大化。

    也许你有你的道理,但我还是不主张分什么“外部质量、内部质量”的,呵呵!

    我个人认为,对于一个系统来说,易用性、可维护性、可升级性、安全性等等,才是实实在在的品质。
     回复 引用 查看   
  6. #6楼[楼主] Colin Han      2011-02-15 16:50
    引用卡通一下:
    我个人认为,对于一个系统来说,易用性、可维护性、可升级性、安全性等等,才是实实在在的品质。

    是的,但是,往往一个人的精力有限,关注点太多反而不利于做出一个高质量的产品。
    通过对外部质量和内部质量的分割,让团队可以分工协作,实现人员专注于内部质量,客户(或代表)专注于外部质量。减少每个人的专注面。通过大家的沟通和妥协,从而达到产品质量的最大化。
     回复 引用 查看   
  7. #7楼 道无名      2011-03-16 15:04
    外行看热闹,内行看门道~~~
    客户到的到的就是外部质量,看不到的就是内部质量。
    像我们给企业内部做ERP开发,没办法在外部质量上妥协。所以只能在代码质量上做好把关,在框架的可扩展上做好把关,实时修正。
     回复 引用 查看   
  8. #8楼[楼主] Colin Han      2011-03-17 12:23
    @道无名
    我理解中的敏捷项目,应该是尽可能的在外部质量上和客户沟通寻求妥协。而死守内部质量不放。
     回复 引用 查看   
  9. #9楼 道无名      2011-03-17 12:30
    现在软件项目类型主要分为3种类型:项目型开发、产品型研发、企业内部信息化建设。
    无论哪种,内部质量肯定要一个把关。
    但是在外部质量上项目型应该让客户妥协,产品型的话看产品经理的把关了,企业型内部研发的话就更没的商量了(不成熟的东西不要上线)。
    看来不同类型公司里,都有压力,看怎么的主顾了~~~
     回复 引用 查看   
  10. #10楼[楼主] Colin Han      2011-03-18 10:26
    @道无名
    嗯,你的划分标准很有意思。只是最后一条没有太看懂。为什么企业内部系统反而对外部质量要求更高了呢?我理解,自己人更好商量嘛 :)
     回复 引用 查看   
  11. #11楼 道无名      2011-03-18 12:18
    @Colin Han
    项目型驱动的研发团队,每个人面临的压力是项目成功或失败
    产品型驱动的研发团队,每个人面临的压力是产品什么时候稳定上线
    企业内部研发面临的压力就更大,因为系统耽误了生产就是大事了。(所以时间上可以商量,但是内部质量和外部质量上没的商量)
    所以,给企业做业务和生产管理系统,未成熟就不要上线。
    我经历过一次失败的系统上线(涉及到3个独立子系统对接,却在最后一个子系统那边出现了问题),导致生产蒙受了巨大损失,害很多生产部门的同事在那等待我们将数据恢复到老系统中。这样的经历,我会写篇博文分享的:)
     回复 引用 查看