- 健壮的Python
- (美)帕特里克·维亚福尔
- 2839字
- 2024-04-12 19:12:40
1.1 健壮性
每本书都需要一个术语定义,所以我将尽早地解决这个问题。Merriam-Webster提供了许多关于健壮性的定义(https://oreil.ly/2skKO):
1.具备或表现出强壮或健康的。
2.具备或显示出活力、力量或坚固的。
3.架构或结构强有力的。
4.能够在广泛的条件下无故障地执行的。
这些都是对于目标的精彩描述。我们想要一个健康运行的系统,一个能满足人们多年期望的系统。我们希望我们的软件展示出实力,代码很明显地能经得起时间的考验。我们想要一个结构坚固的系统,一个建立在坚实基础之上的系统。至关重要的是,我们想要的是一个能够无故障执行的系统,并且不应该因为引入变化而变得脆弱。
人们通常会把软件想象成摩天大楼——一些矗立在那里的宏伟结构,是对抗所有变化的堡垒,是不朽的典范。不幸的是,事实要更加混乱。软件系统会持续演进,缺陷被修复,用户界面得到调整,功能被添加、删除,然后重新添加。框架转移,组件过时,安全漏洞出现,软件在不断发生变化。开发软件更类似于处理城市规划中的扩张,而不是建造一个静态的建筑。在不断变化的代码库中,如何使代码更加健壮呢?要如何建立一个对于缺陷具备弹性的强大基础?
事实上,你必须接受变化的发生。你的代码会被分割、拼接,然后再重新编写。新的用例将需要改变大量的代码——这没关系,拥抱它。要明白,仅仅简单地修改代码是不够的。当它过时的时候,最好将它删除并重写。这并不会降低它的价值,它仍会在聚光灯下长期存在。你的工作是使重写系统的某些部分变得容易。一旦开始接受代码的短暂性,你就会开始意识到,编写就当下而言无缺陷的代码是不够的,你需要使代码库的未来开发者能够有信心地更改你的代码。这就是这本书的主题。
你将会学习构建强大的系统。这种强度不是像是一根铁棒所表现的那样取决于它的硬度如何,而是取决于它的灵活性。你的代码需要像一棵高大的柳树一样强壮,在风中摇摆,弯曲但不折断。你的软件将需要处理很多意想不到的情况。你的代码库需要能够适应新的环境,因为维护它的人并不总是你。那些未来的维护者需要知道他们的代码库是健康稳定的。你的代码库需要传达它的力量。所以你必须以一种减少缺陷的方式编写Python代码,即使将来的维护者会将其拆分并重新构建。
编写健壮的代码意味着要谨慎地考虑未来。你希望未来的维护人员能够轻松地查看你的代码并理解你的意图,而不会在深夜的调试会话中诅咒你。你必须传达你的想法、理由和注意事项。未来的开发人员将需要将你的代码改变成新的样子——并且不希望担心有任何改动可能导致它会像一个摇摇欲坠的纸屋一样倒塌。
简单地说,你不希望你的系统出现故障,尤其是当意外发生的时候。测试和质量保证是其中的重要部分,但两者都不能完全保证质量。它们更适合揭示预期中的差距,并提供安全网。相反,你必须让你的软件经得起时间的考验。为了做到这一点,你必须编写整洁和可维护的代码。
整洁代码按照顺序清晰而整洁地表达了它的意图。当你看到一行代码并对自己说“啊,这个写法非常有意义”时,就是整洁代码的标志。你越是逐步调试代码,就越需要查看大量其他代码来理解程序,此时你将掉进代码漩涡,代码就越不整洁。如果一些技巧会使代码对其他开发人员来说不可读,那么这些技巧也不是使代码整洁的方法。就像C.A.R.Hoare所说的,你不想让你的代码变得很晦涩,以至于在检查时难以理解。
整洁代码的重要性
整洁的代码对代码健壮性至关重要。对于任何有意义的项目,都可以将其视为筹码。通常有一些与编写整洁代码相关的具体实践,包括:
•以粒度适当的方式组织代码。
•提供良好的文档。
•正确命名变量/函数/类型。
•保持函数短小简单。
虽然整洁代码这个主题会贯穿全书,但我不会用大量的篇幅介绍这些具体的实践。有一些其他的书更好地描述了整洁代码的实践。我推荐Robert C.Martin的Clean Code(Prentice Hall)、Andy Hunt和Dave Thomas的The Pragmatic Programmer(Addison-Wesley),以及Steve McConnell的Code Complete(Microsoft Press)。这三本书都极大地提高了我作为开发人员的技能,对任何想要成长的人来说都是很好的资源。
虽然你绝对应该努力写出整洁的代码,但你也必须准备好在不整洁的代码库中工作。软件开发是一项混乱的工作,有时会因为各种各样的业务和技术因素而牺牲整洁代码的纯粹性。使用本书中给出的建议,通过讨论可维护性来帮助推动代码变得更整洁。
可维护的代码是指可以很容易维护的代码。维护在第一次提交后立即开始,并一直持续到没有一个开发者再关注这个项目为止。开发人员将修复缺陷,添加特性,阅读代码,提取代码以在其他库中使用,等等。可维护的代码让这些任务没有了障碍。软件的寿命长达数年,甚至数十年,所以从今天起就要关注可维护性。
为了不让系统失败,你需要积极主动地让你的系统经得起时间的考验,需要一个测试策略作为你的安全网,但你也需要能够在一开始就避免失败。因此,考虑到所有这些,我从代码库的角度给出了健壮性的定义:
尽管一直处在不断变化的环境中,但健壮的代码库是有弹性和没有缺陷的。
为什么健壮性很重要
让软件做它应该做的事情花费了我们大量的精力,但要知道什么时候完成并不容易。开发里程碑不容易预测。用户体验、可访问性和文档等人为因素只会增加复杂性。现在添加测试以确保你已经覆盖了已知和未知行为的一部分,并且你正在考虑较长的开发周期。
软件的目的是提供价值。尽早交付全部的价值符合全部利益相关者的需求。考虑到一些开发计划的不确定性,满足预期往往存在额外的压力。我们都曾在一个不现实的项目计划或截止期限中犯过错误。不幸的是,许多使软件变得健壮的工具只是短期加入了我们的开发周期。
确实,在立即交付价值和使代码健壮之间存在着内在的矛盾。如果你的软件足够好,为什么还要添加更多的复杂性呢?要回答这个问题,请考虑该软件的迭代频率。交付软件价值通常不是一个静态的工作,很少有系统因为提供了价值而不再被修改。软件的本质是不断发展的,代码库需要做好频繁、长期地交付价值的准备。这就是健壮的软件工程实践发挥作用的地方。如果你不能快速而轻松地交付功能并且不降低质量,则需要重新评估技术以使你的代码更易于维护。
如果你的系统交付延误或损坏了,就会产生实际成本。仔细研究你的代码库,问问你自己,如果一年后你的代码因为有人无法理解而崩溃了,会发生什么?你会损失多少价值?这些价值可以用金钱、时间甚至生命来衡量。问问自己,如果没有按时交付,会发生什么?后果是什么?如果这些问题的答案会令人感到恐惧,那么好消息就是,你所做的工作是有价值的,同时这也强调了消除未来会出现的缺陷的重要性。
许多开发人员会同时在一个代码库上工作。许多软件项目将比大多数开发人员的寿命还长。所以,你需要找到一种方法与现在以及未来的开发人员沟通,而不是在亲自在现场解释。未来的开发人员将以你的决定为基础。每一次错误的追踪、每一个兔子洞和每一次牦牛递须冒险[2]都会减慢他们的速度,从而阻碍他们交付价值。你需要共情那些追随你脚步的人,所以你需要换位思考。这本书是你思考合作者和维护人员的途径。你需要考虑可持续的工程实践。你需要编写持久的代码。第一步,使你的代码能够持续沟通,确保未来的开发人员能够通过代码理解你的意图。