《C++代码整洁之道:C++17 可持续软件开发模式实践》 —1 简  介

举报
华章计算机 发表于 2020/02/09 12:07:20 2020/02/09
【摘要】 本节书摘来自华章计算机《C++代码整洁之道:C++17 可持续软件开发模式实践》 一书中第1章,第1.1节,作者是[德]斯蒂芬·罗斯(Stephan Roth),连少华 郭发阳 陈涛 译。

第1章

简  介

如何去做和做到同样重要。

—Eduardo Namur

目前大部分软件项目的开发形势依然很严峻,甚至有些项目处于严重的危机之中。其原因是多种多样的,有的项目是由项目管理的糟糕导致的,有的项目则是由于开发过程中需求的不断变化,而开发方式不能适应导致的。

在某些项目中,导致这一结果的只是单纯的技术原因,即代码质量不高。但这并不意味着代码的功能没有实现,相反代码的外部质量看似很高,能够通过质量保证部门的黑盒测试、用户测试以及验收测试。代码能够完美地通过QA,并且在测试报告上找不到任何错误。软件用户对软件也很满意,甚至软件能够按时交付并且不超出预算(当然,这种情况极少)。一切看起来很美好,但事实真的如此吗?

真相是这份能够正常工作的代码的内部质量实际上很低。通常代码可读性不高,维护和扩展困难。软件的组成单元,如类、函数非常臃肿,有的甚至会达到上千行的代码量。太复杂的依赖关系导致的结果就是,改变其中某一小部分内容所造成的影响将是难以预估的。软件的架构不具有前瞻性,其结构可能是由开发人员的临时“拍脑袋”决定的,也就是一些开发人员常说的“历史衍生软件”或者“随意的架构”。类、函数、变量、常量命名不规范,含义不明确,并且代码被大量无用的注释包围,有些注释已经过时了,有些注释只描述了显而易见的东西,甚至是完全错误的。不少开发人员害怕修改或扩展软件,因为他们知道自己的软件很脆弱,单元测试覆盖率很低甚至没有单元测试。在这样的项目中,“不要碰已经能够运行的系统”的声音不绝于耳。一个新的特性从开发到部署上线,通常不是几天就能完成的,这需要几周甚至几个月的时间才能完成。

这种糟糕的软件通常被称作“a Big Ball Of Mud”。这个术语由Brian Foote和Joseph W. Yoder在第四次模式编程语言会议上的一篇论文中第一次提到。Foote和Yoder将其解释为“……结构随意的、笨拙的、草率的、盘根错节的代码杂糅在一起”。这种软件系统维护起来是一个噩梦,不仅代价高昂还会花费大量时间,它通常会拖垮整个开发团队。

上述现象在整个编程领域中都客观存在着,与使用哪种编程语言没有关系,不管使用的是 Java、PHP、C、C#、C++,还是其他任何语言,都有可能产生“a Big Ball Of Mud”。那么,产生这一问题的根源是什么呢?

1.1 软件熵

首先,有些东西就好像是一种自然规律,就像其他一些封闭和复杂的系统,软件会随着时间的推移而变得混乱,这种现象称为软件熵。这个词借鉴了热力学第二定律,意思是指,一个封闭系统的总混乱度不会减小,只能保持不变或增加。软件的表现看起来就是这样的,每次添加一个新功能或者改变一些原有功能,代码都会变得更加混乱,有很多影响因素能够提高软件熵,举例如下:

不切实际的项目进度安排会给程序员增加压力,进而迫使开发人员以一种糟糕和非专业的方式处理开发工作。

当今,软件系统大都庞大而复杂。

开发人员拥有不同的技能水平和开发经验。

全球分布的、跨文化差异的团队,执行和交流方面存在的问题。

开发人员主要关注软件的功能性方面(功能性的需求和系统的用例),以致质量要求(例如非功能性要求),如性能、可维护性、可用性、可移植性、安全性等被忽略甚至被完全忘记了。

不当的开发环境和糟糕的开发工具。

管理层专注于眼前利益,而不了解可持续软件开发的价值所在。

快速而糟糕的程序开发以及软件设计与实现的不一致(例如破窗理论)。

破窗理论

破窗理论是在美式犯罪研究中发展起来的。该理论指出,一幢被遗弃的建筑物中的一个被破坏的窗户,可能是整个周边地区开始破败的一个触发器。破碎的窗户给环境发出了致命的信号:“看,没人在乎这幢大楼!”,这引起了进一步的腐化、破坏和其他反社会行为。破窗理论一直是刑事政策学的很多改革的基础,特别是发展出零容忍策略。

在软件开发中,该理论被采用并应用于代码质量。对程序不适当的开发和糟糕的实现称为“破窗”。如果这些不好的实现没有被修复,那么会有更多不适当的代码出现在它们周围,因此,代码的混乱就开始了。

不要容忍“破窗”出现在你的代码中—及时地改正它们。

然而,似乎C和C++项目特别容易出现混乱,而且比其他编程语言更容易陷入一种糟糕的状态。即使是在互联网上,同样也充斥着大量的、糟糕的C++代码的例子,它们看起来快速且高度优化,但实际上是使用了高技巧的语法,并且完全忽略了设计良好和易维护的代码的基本准则。

导致本节问题的原因之一可能在于C++是一个中等层次的多范型编程语言,即它包含了高级和低级语言的特点。使用C++编程语言,你可以编写庞大且复杂的用户界面的分布式业务软件系统,也可以编写小型的嵌入式实时响应系统,这要求与底层硬件密切关联。多范型编程语言意味着你能够编写程式化、功能化或面向对象的程序,甚至三种范型的混合体。此外,C++支持模板元编程(Template Metaprogramming,TMP),这种技术用到了一种被称作模板的东西,模板被编译器用于生成临时使用的源代码,而这些临时的源代码会和其余的源代码合并在一起,并进行编译。自从ISO发布了支持C++11标准以来,更多的方法被加入到C++中,例如,具有匿名函数的函数式编程现在能通过lambda表达式以一种非常优雅的方式完成。由于这些多样性能力,C++同时也具有非常晦涩难懂、复杂和烦琐的名声。

开发出糟糕软件的另一个原因可能是很多程序开发者并没有IT背景。如今,任何人都可以开始开发软件,不必管他是否获得了大学学位或者是否是任何其他计算机科学方面的人才。绝大多数C++开发者都是(或曾是)非专业人员,特别是在汽车、铁路运输、航空航天、电气/电子或机械工程等技术领域。许多开发工程师在投入编程之前的几十年里并没有受到过计算机科学方面的教育,随着复杂度的增加以及技术系统包含了越来越多的软件,世界对程序员的需求很迫切,这种需求被现存的其他劳动力所补充了,电气工程师、数学家、物理学家,还有很多人严格来讲并非是经专业训练过而开始开发软件的,他们主要通过自学和实操而简单地进行开发,并且他们已经尽了最大的努力。

基本上来看,这绝对是无可厚非的,但有时只知道开发工具和编程语言是不够的!软件开发与编程不一样,世界上很多的软件是由没有经过培训的软件开发人员在一起开发和维护的,开发人员要在抽象层次考虑很多的事情,以便创建一个可持续的系统,例如架构和设计。如何构建高质量达到某些目标的系统?面向对象的东西有什么好处?我如何有效地使用它呢?某个框架或库的优点和缺点是什么?各种算法之间的差异是什么?为什么同一个算法不适合所有类似的问题?到底什么是有限状态机,为什么它有助于处理复杂性问题?

不要灰心!一个软件的持续健康需要有人去关注它,而整洁的代码就是处理的关键所在!


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。