`
lvwenwen
  • 浏览: 953320 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

十个有争议的编程观点

阅读更多

 

你的代码写得怎么样?如果你不属于平庸的80%,我敢打赌你的代码一定写得很棒。也许你正在维护遗产代码(不再被广泛支持的系统相关的源代码),这些代码究竟能有多糟糕?情况会有所好转吗?虽然有一套方法可以帮助评估你的代码,然而并非每个人都对此表示认可。

优点

我个人认为评估数据非常有用。通过类似Emma这样代码覆盖率计算工具,能够让你彻底了解你的代码中究竟哪些已经被测试覆盖,还有哪些没有被测试到。在开始着手某个包进行大规模代码重构之前,目标代码的覆盖率究竟如何?这些信息会告诉我,也许应该在改动代码前先提高一下这部分的代码覆盖率。

代码行数是另一个种有意思的数据。当你在遗产代码上工作的时候(谁不是在这样的代码上工作呢),如果你既能够保持开发速度(你肯定还在开发新的功能),又能保持与过去相同甚至更少的代码,那么你不但能够在交付价值而且同时还能让代码变得不那么糟糕。任何一个傻瓜都能够写出成堆的新代码以完成新功能,但是真正的高手能够在交付新功能的同时减少原有的代码。

缺点

任何数据都会面对一个问题,那就是利用这些数据的人。你最不想看到的恐怕就是过度渴望监控这些数据的经理了。

不能度量就无法控制。– Tom DeMarco

在你得到数据之前,报告缺陷数量就已经和奖金挂钩了。还有可能大家都希望代码覆盖率能够达到某个“期望值”。

只要管理层用数据作为目标,聪明人就会利用系统作 弊。我已经数不清有多少次看到人们对代码覆盖率造假了。虽然初衷很好,但经理们受到错误思想的误导。为了讨经理开心,开发者会不断编写没有断言的测试。当然,代码依然能够运行而且不会出什么大问题。但这种行为有意义吗?天知道!当你的代码引入了新bug,那些测试能够检测到吗?见鬼,当然不会!因此,这种代码覆盖率毫无用处。

尽管达到了指标,但是潜在的目标即改进软件质量却被忽视了,而且未来也不会达到。

丑陋之处

任何评估的目标都是评测代码并从中得出有意义的数据。以代码覆盖率为例,我们真正感兴趣的是缺陷覆盖率。也就是代码中的所有可能的缺陷,有多少缺陷能够在测试中被发现?我们想知道,能够在怎样的程度上能够避免重写代码。

问题在于,我怎样才能衡量一个系统中“所有可能的缺陷”?基本上这是不可能知道的。为此,我们使用代码覆盖率作为近似。考虑到测试能够保证代码运行得到正确的结果,因此被执行代码率是对能够捕捉到bug数量的一个很好的预测。如果我的测试执行了50%的代码,最好的情况下我们能够捕捉到50%的bug。如果bug出现在另外50%的代码中,那么通过我的测试捕捉到这些bug的几率为0.代码覆盖率是测试覆盖率的一个上限。但假如你的测试代码很差,那么相应的测试覆盖率也会降低。至于没有断言的测试代码,它们基本上毫无用处。

这就是测量数据困难之处:测量那些真正管用的数据即我们的软件的质量。即便有可能,也是非常困难的。因此,我们要尽可能地进行测量,但并不总是能够清晰地知道哪些内容与我们真正目标相关。

这些数据意味着什么?

有很多类似Sonar这样的优秀工具能为你的代码进行各种常用的数据评测。通常的问题在于,开发者并不了解(或者在意)这些数据的含义。类的复杂度是17.0是好还是坏?我的代码关联系数是5.6%,但是也许有更好的理由这么做。怎样的数据对这段代码而言才算是合理的?LCOM4(缺乏内聚性的方法指标)是好事还是坏事?坦率的说,这听起来更像是治疗癌症。

当然,如果我足够积极主动的话,我应该能够深入并且了解每种数据的含义,并且试着达成合理的目标,等等等等。拜托,我正忙着给客户交付有价值的工作,没有时间扯淡。这些数据是在让人难以捉摸,索性忽略掉好了。当然,领导们不这么认为。

一种更好的办法

一定有一种更好的办法来评估“代码质量”。

1. 达成一致

无论你评估的是什么,评估的内容一定要得到团队成员的赞同和理解。如果团队中有一半的人表示反对,那么评估的结果一定不会很好。一些人努力想要改进,而其余的人则会让事情变得糟糕。实际效果一定会让人大失所望。

2. 评估最重要的部分

不必评估“标准”的内容,像是代码覆盖率或者圈复杂度。只要团队成员一致认为这是一项有用的数据,每个人都认为需要在这个方面改进并且做出承诺,那么评估它就是有用的。

我在youDevise的一个同事,花了10%的工作时间构建了一个可以跟踪评估数据并能够以图形的方式展示结果的工具。然而,非常特别的是,这个工具并没有计算很多大型静态分析工具给出的那些常见评估数据,而更多地统计了更加常见和具体的问题。那么,哪些是更贴近自己且更容易评估的呢?

• 如果你有一个上帝类,那么可以统计文件的代码行数,行数越少越好

• 如果你有一个想要避免使用的第三方函数库,那么可以统计使用它的次数

• 如果你有一个想要移除的类,那么可以统计引入这个类的次数

这些简单的测量代表了我们真正想要摆脱的技术债务,通过减少技术债务我们能够改进自己代码的质量。与此同时,评估的方法也会异常的简单,最直接的方式只需要执行grep和wc命令就可以。

评估什么并不重要,只要团队相信你评估这些内容会得到改进。通过评估你们关心的内容,你会真正了解到你的代码质量。

3. 让结果更直观

最后,请把评估结果贴到显示器上,与实际构建状态越接近越好。这样每个人都能够看到你正在做什么,并且能够不断提醒人们质量的重要性。反馈是非常重要的,你能够看到事情正在朝着更好的方向发展;同样重要的是,当质量开始滑坡时,数据图能够把问题上升的趋势展示出来。

简单,明了

代码质量是一个非常抽象的概念,因而很难测量。因此,你应当转而关注那些容易评估的东西。评估内容越简单、越容易理解,改进起来也越容易。如果你需要花时间解释这些评估的意义,那么这里肯定有问题。尝试一次只关注一部分内容,如果你同时关注100项不同的数据,让这些方面都能够得到改进几乎是不可能的。如果我们只关注其中的几项,我就能记住他们,至少不会让它们变得更差。我有可能把它们清晰的记下来,这样才能够改进它们。

你在评估自己的代码吗?如果是的,你评估的内容是什么?如果不是,你认为可以评估哪些方面呢?

 

英文原文:David Green 编译:伯乐在线 – 唐尤华

转载自【http://blog.jobbole.com/18042/

分享到:
评论

相关推荐

    编程和年龄的关系

    在探讨编程与年龄之间的关系时,我们必须提到关于专业技能与年龄相关性的争议。长久以来,这一问题一直困扰着程序员群体,特别是中国的IT从业者。大家倾向于探讨,究竟是年轻程序员更易于吸收和掌握新技术,还是年长...

    编程高手箴言_完整PDF.rar

    《编程高手箴言》是一本深受争议...虽然书中的一些观点可能引发争议,但无疑它提供了一条通向编程高手之路的思考路径,对提升个人技术水平和职业发展大有裨益。无论你是初学者还是资深开发者,都能从中找到启发和收获。

    程序员偷偷深爱的个不良编程习惯.pdf

    然而,著名计算机科学家 Edsger Dijkstra 在论文《Goto 语句有害》中提出反对 `goto` 的观点,这使得它在结构化编程中被视为禁忌。尽管如此,有时 `goto` 可以简化某些特定场景下的代码,比如在 `case` 语句中,相比...

    unix 编程应用问答中文版

    - **文档性质**: 该文档带有“半地下”性质,因为其中包含了一些可能存在版权争议的内容。 - **文档完整性**: 文档并未完全整合,有些散落的部分需要用户自行收集整合。文档的大部分内容已经在特定论坛上发布过。 - ...

    第一门编程语言--希望有所帮助.pdf

    【C语言作为第一门编程语言的争议】 在国内,C语言通常是首选的入门语言,但许多教材过于侧重语法细节,导致学生在应付填空式考试中无法真正理解和掌握编程。上机实践也往往局限于简单的练习,缺乏实际应用价值,这...

    强人工智能技术背景下机器人道德地位争议研究.pdf

    一方面,有学者坚持机器人行为的自主性并不意味着它们具有独立的道德地位,因为这些行为还是基于人类的设计和编程。另一方面,也有学者认为,随着技术的进步,自主学习型机器人展现出的意识和理性行为可能为机器人...

    Structured Programming with go to Statements

    在计算机科学领域,关于结构化编程(Structured Programming)与goto语句的争议堪称经典,它不仅是编程语言设计史上的一个重要篇章,也深刻影响了软件工程的发展方向。唐纳德·克努特(Donald Knuth)于1974年末发表...

    2021届福建省厦门双十中学高三上学期历史期中考试试题.doc

    提供的文件描述的是历史考试试题,涉及的是历史学科的多个知识点,包括古代的地亩制度、自耕农经济、古代思想家的观点、中外历史事件、晚清时期的外交政策、近代科技传播、民族工业的发展、历史人物争议等。...

    易语言百度博客访问流量源码.rar

    【标题】"易语言百度博客访问流量源码.rar"指的是一个使用...对于学习易语言和理解网络流量机制的人来说,这是一个有价值的案例研究。然而,应当注意,使用此类工具可能违反平台规定,因此在实际操作中需谨慎对待。

    WikiKNNControversyDetection:SIGIR16“改善网络上的争议检测”的新体现

    总结来说,WikiKNNControversyDetection是SIGIR16年会上的一个创新尝试,它利用KNN算法和Java编程语言,为网络争议检测提供了一种实用且高效的解决方案。这一工作不仅加深了我们对网络争议的理解,也为未来的信息...

    WINCE-IP.zip_wince ip

    描述中提到的“是否要发送ip地址的点”是一个有争议的技术细节。在TCP/IP协议中,IP地址通常以点分十进制的形式表示,例如192.168.1.1。在编程中,有时会遇到是否需要将这些点分隔符一同传输的问题。点分十进制仅是...

    关于goto使用的争论

    在计算机编程领域,goto语句一直以来都是一个备受争议的话题。本文将深入探讨goto语句的优缺点,以及它在程序设计中的应用,帮助程序员们更好地理解和运用这一语句。 历史背景: goto语句的历史可以追溯到早期的...

    智能手机应用软件 社会网络.docx编程资料

    - **改善交通流动性的观点**:MonkeyParking则辩称,他们的服务并非买卖停车位本身,而是提供停车位信息,从而减少车辆在街上寻找停车位的时间,进而改善交通状况。 3. **法律与伦理考量**: - **法律角度**:...

    思科SDN战略ONE

    该战略强调了三个关键要素:可编程性(Programmable)、灵活性(Flexible)和应用感知(Application-Aware)。这三者构成了思科SDN战略的核心,目的是实现网络的自动化、简化网络服务的创建过程、提供虚拟网络支持,...

    程序员的呐喊,完整扫描版

    《程序员的呐喊》的作者是业界知名的程序员——来自Google的Steve Yegge,他写过很多颇富争议的文章,其中有不少就收录在本书中。《程序员的呐喊》是他的精彩文章的合集。  《程序员的呐喊》涉及编程语言文化、...

    程序员的鄙视李安

    然而,这种观点也引发了许多争议。实际上,每种编程语言都有其适用场景和优势,并不存在绝对意义上的“最好”。例如: - **Python**因其简洁的语法和强大的数据处理能力而在科学计算、机器学习等领域受到欢迎。 - **...

    Bjarne Stroustrup语录.rar

    Stroustrup可能在这个文件中阐述了他对C++不断演进的思考,包括模板元编程、智能指针、RAII(Resource Acquisition Is Initialization)原则等,这些都是C++保持竞争力的关键因素。 最后,"《Bjarne Stroustrup的...

Global site tag (gtag.js) - Google Analytics