查看原文
其他

用过那么多评估开发工作量的指标,还是它最好用!

👆点击“博文视点Broadview”,获取更多书讯

“业界有很多度量生产力的指标,比如可执行文件大小、机器指令、代码行数、语句数量、功能点分析、圈复杂度、操作符数量、令牌数量等。为什么最终LOC(代码行数)度量指标成功了呢?

作为软件工程师,你需要了解团队或个人在项目中的生产力情况。你尝试通过团队或个人过去在类似项目中的表现来预测生产力,但是一个新的项目出现时,过去的表现就没有那么具有参考性。

这时,你需要一个比整个项目粒度级别更小的度量系统。一个理想的度量指标能跨多个项目使用,以便在项目间进行比较。

作为软件工程师,你用过不少的度量指标,直到出现更好的。



01

那些你用过的度量指标

可执行文件大小度量指标:计算方法简单并且无须访问原始的源代码。不过,由于可执行文件包含未初始化的数据,因此虽然它们增加了文件大小,但是与系统的复杂性几乎没有或者根本没有关系。除此之外,库函数会增加可执行文件的大小,但是它们实际上降低了项目的复杂性。

机器指令度量指标:它的主要缺陷是某些可执行文件格式包含了未初始化的静态变量空间,这意味着对源文件的微小更改可能会极大地改变可执行文件的大小。

语句数量度量指标:它衡量的是工作量而不是完成的工作,它不像我们希望的那样与语言无关,并且它会假设程序中每条语句需要的工作量都是相同的。

功能点分析(Function Point Analysis,FPA):与代码行数或者语句数量度量指标不同,它不能直接计算出程序中“功能点”的数量。FPA从未能够成功地实现自动化。它无法分析一个程序在哪里算作结束,并且人工分析相当耗时、代价昂贵。

McCabe圈复杂度度量指标:这个指标很有用,因为它是一个客观的度量指标,而且可以通过编写程序来计算这个值。它的缺点是与程序的多少没有关系,也就是说,它对待一条printf语句就像对待一行1000条printf语句一样。



02

为什么LOC(代码行数)度量指标如此受欢迎

你发现,不管使用什么样的度量指标,它都有缺点。

许多人尝试使用多个度量指标的组合(例如,使用代码行数乘以圈复杂度和操作符的数量)来创建更加“多维”的指标,以便在代码量较少时更好地评估工作量。

遗憾的是,随着度量指标越来越复杂,其会变得越来越难以在指定的项目中应用。

那么,为什么最终LOC(代码行数)度量指标成功了呢?

因为它有以下优点:

  • 无论使用何种编程语言,编写一行源代码所花费的时间都是相同的。

  • LOC度量指标不受项目中使用的库(或者其他重用的代码)影响(当然,假设你不会统计依赖库的源代码行数)。

  • LOC度量指标与CPU无关。

而这些优点都来源于,它“采用LOC度量指标,统计极其方便,使用现成的工具(比如UNIX下的wc)就可以完成,而采用其他度量指标,通常需要编写一个依赖于某种编程语言的应用程序。”

因此,既然现行的各种度量指标都不能完全有效地反映出程序员的生产力,选择一个“更好的”度量指标也不会有更好的结果,这就使得大家更愿意采用易用的指标,即LOC。


度量指标是做软件开发和研发管理极重要、极难讲清楚,因而极易被忽略的内容。

据说程序员刚开始做软件开发时的工作思路一般是这样的:心无旁骛写代码,代码之外的事情是额外开销,浪费时间。

在写了几年代码以后,参与的项目越来越复杂,尤其是做了软件研发经理以后才会意识到:编程只是软件开发众多环节中的一环,仅仅完成它,距离顺利交付完整的软件系统,还有十万八千里的距离。

一本好的软件工程类图书能道尽软件工程师软件开发过程中的痛难点。

Randall Hyde 的《编程卓越之道(卷3):软件工程化》,凝聚了作者多年的软件工程实践经验和深刻认知,可以给你系统的指导,帮助你找到属于自己的最佳实践,应对此起彼伏的问题。

通过本书,你将学习到:为什么遵循软件匠艺模型可以让你做到最好;如何利用可追溯性来加强文档的一致性;如何通过用例分析来创建自己的UML需求;如何利用IEEE文档标准开发出更好的软件。

作者简介

Randall Hyde

  • The Art of Assembly Language(《汇编语言的编程艺术》)和Write Great Code(《编程卓越之道》)第1~3卷(均由No Starch Press出版),以及Using 6502 Assembly Language和P-Source(由Datamost出版)的作者。

  • Microsoft Macro Assembler 6.0 Bible(由Waite Group出版)一书的合著者。

在过去的40年里,Hyde一直从事嵌入式软件/硬件工程师的工作,为核反应堆、交通控制系统和其他电子设备开发相关指令集。他还在加州理工大学波莫纳分校和加州大学河滨分校教授计算机科学课程。

译者简介

张若飞

曾任多家互联网金融公司CTO,在宜人贷、雅虎北研、金山云等知名公司担任架构师。

十余年互联网研发及技术管理经验,对搭建海量数据、大型分布式系统有丰富经验。

著有十余本技术译著,包括《Grails权威指南》《给大忙人看的JavaSE 8》《代码不朽:编写可维护软件的十大原则》《面向可伸缩架构》《云原生Java》等书,总计400余万字。

精彩书评

这本来自拥有行业 40 多年经验的大咖 Randall Hyde 的书是一本非常优秀的软件工程领域著作,既有坚实的理论基础,也有作者丰富经验的思考总结,还给出了很多具有参考价值的工程设计、文档实例,对不同读者的偏好都有一定的覆盖。如果你有志于成为一名优秀的软件工程师,希望设计开发出历久弥新、持续为业务场景产生价值的软件系统,为国家的软件产业进步贡献一份自己的力量,那么将此书常备案头,勤加实践会是一个很好的选择。

——周远 观远数据联合创始人兼首席科学家


软件开发是一项系统工程,绝非很多初学者想象的那样,把自己关在房间里埋头捣鼓代码就完事儿了,而是涉及方方面面与很多不同的人和事打交道。如果你之前没有参与过大型商业软件的开发,立志要成为一名专业的产品经理、软件工程师、测试工程师、SCM 或项目经理,那么千万别错过《编程卓越之道(卷 3):软件工程化》这本书。通过本书,你可以快速掌握涵盖软件开发全生命周期的关键知识点,对面临的挑战准确评估,与他人的沟通也会事半功倍。

——高宇翔 《Scala 编程》译者,资深软件开发工程师和系统架构师


自敏捷运动以来,在软件开发中编写源代码之外的工作似乎越来越被人嫌弃,编写文档尤其如此。然而,真正有经验的人可不这么想——他们考虑的是如何适时写出适当的文档。让我们一起来看看 Randall Hyde 这个“老江湖”是怎么想、怎么做的。

——董越 《软件交付通识》作者,DevOps 资深专家


我参与开发过从零开始的项目,也维护过有将近三十年历史的遗留代码,在项目的推进过程中多次经历需求、人员等的变更。这些年我一直在学习和思考,什么样的软件开发模型能够有效应对软件生命周期里的各种不确定性,如何提高代码以及文档的可读性和可维护性并确保它们之间的一致性。最近我有幸阅读了《编程卓越之道(卷 3):软件工程化》,作者 Randall Hyde 在书中对这些问题进行了深入的探讨。我相信其他读者和我一样,都能从这本书中汲取软件工程的宝贵经验,为以后的职业发展奠定基础。

——何海涛 畅销经典《剑指 Offer》作者,美国微软前资深开发专家


本书为卓越的职业软件工程师提供了一份翔实的“硬技能”指南。本系列的书虽然称为《编程卓越之道》,但内容已经远远超出编程本身。本书提供了一份完整的卓越软件工程师知识技能大纲,让你从软件工程的角度重新认识编程,帮助你快速了解并掌握当今世界上卓越软件工程师必备的专业技能和知识体系。虽然本系列书都是“大部头”,但每个章节的内容都不容错过。

——顾宇 《卓有成效的工程师》译者,腾讯 T11 专家


本书对软件工程的概念和领域做了精彩的介绍,详略得当,重点集中在最为经典与实用的软件工程知识上,在此基础上论述了如何平衡团队合作上的考虑、程序员个人的卓越贡献,以及程序员自身的成长之路,是对软件工程体系在更广阔层面上的重新思考与理解。本书文字简练,译文准确、流畅,十分值得细读。

——苏丹(网名 su27) 《Python 一行流》译者,豆瓣用户产品后端负责人


《编程卓越之道(卷 3):软件工程化》对程序设计流程的基本范式和最佳实践做了系统性的归纳,对项目管理中的人员配备、度量指标、进度安排、文档设计等进行了深入探讨,并配有详尽用例。软件工程与管理人员可以从中获得有益的参考。

——田渊栋 Meta(原美国“脸书”公司)人工智能研究院(FAIR)研究员及资深经理


对很多初学编程的人来说,从学会编程语言后,到完成一个真实的软件,整个过程仍然有着巨大的鸿沟。就像那个有名的段子,一个例子程序是可以成功运行一次的,而一个要交付给用户的软件则是要在任何时候都能运行的。把一个例子程序变成可交付的软件,就需要软件工程学的帮助。

《编程卓越之道(卷 3):软件工程化》就是回答这个问题的一本书。

本书从古典软件工程开始,讨论软件开发效率的度量方法、曾经流行的开发方法,一直到现在正在流行的敏捷开发等。使得读者可以一览软件工程的发展史,并了解不同发展阶段的进步。其后的 UML 和软件工程文档,则从可操作层面介绍了各种实用的软件工程技术。人类之间的沟通效率是非常低的,而 UML 和文档就是提高沟通效率、降低重复而无效沟通的便捷手段。相信通过本书,读者可以学习到软件工程领域的诸多方法和技巧,并在未来的软件开发项目中获得更高的效率。

——刘晓明(gashero) 软件开发专家


现代的编程工作早已不是单打独斗的个人英雄主义时代,而是更强调团队集体的输出。这本书将现代软件工程中的经典模型,以及各种细节都讲到了——流程上,如黑客马拉松式的编程、瀑布模型、迭代模型等;细节上,如专注能提高工作效率,站立会能避免无休止地拖延会议时间。除此之外,还介绍了应该如何编写需求文档、软件设计文档、测试文档。无论你是一个技术负责人、项目经理,还是一个普通员工,了解现代软件工程都很重要。只有这样,个人才能更好地在团队中发挥价值。

——张彦飞 《深入理解 Linux 网络》作者,公众号“开发内功修炼”创办人,前搜狗专家开发工程师


这本书是《编程卓越之道》系列的第三卷,主要讲软件工程化。在试读本书后,我把本书推荐给计算机专业的毕业生以及职场里在一线编码的各位程序员。对于刚走入职场的计算机专业学生,这本书不仅仅可以让他们快速了解在企业中软件开发的复杂性,了解软件工程每个环节,还能通过本书对卓越程序员的定义,对照自己的能力,迅速从一个菜鸟程序员成长为卓越的程序员。对于在职场有一定经验的程序员,本书可以为其解决软件工程化中遇到的问题提供参考,例如什么实践是最好的,怎么加强文档一致性等等。

——@桔了个仔 知乎程序员优秀答主 高级算法工程师

京东限时满100减50

发布:刘恩惠

审核:陈歆懿

 


如果喜欢本文欢迎 在看留言分享至朋友圈 三连

 热文推荐  





▼点击阅读原文,了解本书详情~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存