我打算如何成为一名更好的软件开发人员
我对计算机科学文献的调查显示,只有两种经济实惠的方法可以实现极低的缺陷率(每千行代码少于 1 个缺陷)。第一种方法是遵循卡内基梅隆大学 (CMU) 的 Watts S. Humphrey 创立的个人软件开发流程 (PSP)。第二种方法是使用一些语言和工具,这些语言和工具从一开始就能使代码中引入错误变得困难,即使代码中确实存在错误,也能更容易地检测到错误。在本文中,我将简要讨论这两种选择,以及我计划如何探索它们,从而成为一名更优秀的软件开发人员。
但首先,我为什么要这么做?因为我构建和维护软件的经验大致与这项研究得出的数据相符:充满缺陷的代码以及随之而来的所有测试、调试、修正和返工都极其浪费时间。我们的行业充斥着失败。一定有更好的方法。
我已经写了很多关于“做最重要的事”、“避免浪费”、“代码审查清单”、“最佳拉取请求大小”等等的文章。所以,在这篇文章中,我将专注于如何开发出缺陷率极低的软件。
个人软件过程
PSP 或许可以被更好地描述为将精益生产原则应用于个人开发人员的活动。程序员往往对自己犯错和造成浪费的各种方式缺乏洞察力。他们一遍又一遍地犯同样的错误,并自以为是(包括我自己)。但事实上,你才是那些把所有这些错误都写进代码里的人,你写出了复杂的代码,你写出了难以维护的代码,等等。
PSP 教会程序员如何追踪他们的工作和错误。它还为程序员提供了一些策略,帮助他们逐步提升绩效。据我所知,遵循这一流程的人可以取得显著的进步。
更好的语言和工具
在大多数语言中,编写正确的代码非常困难。它们含义模糊,允许程序员执行几乎肯定会出错的操作。当你切换到更安全的语言,例如 Ada 和/或其超安全子集 SPARK 时,事情会变得更加有趣。这非常符合我的观点:如果我们要提高软件安全性,编程语言就需要默认变得更加安全。
艾达
我们先来聊聊 Ada。强类型、范围类型、契约以及一个非常智能的编译器能帮你避免那些 C/C++ 及其衍生语言会忽略的愚蠢错误。所以,如果你选择用 Ada 编程,你将更容易地发现和定位那些用其他语言根本察觉不到的缺陷。
火花
如果您想将事情提升到另一个层次,您可以考虑使用 SPARK,它是 Ada 的一个子集,可以将形式化方法应用于您的代码。
我知道这听起来有点吓人,但我一直在用 SPARK,觉得它很棒。首先,你不需要了解或做任何复杂的数学运算就可以使用 SPARK。SPARK 可以自动证明(或者至少尝试证明)你的 Ada 接触和类型约束。如果你就此打住,SPARK 基本上就像你见过的最好的静态分析器一样。
但你可以更进一步。你可以在代码中添加断言,SPARK 会尝试静态证明这些断言永远不会被违反。具体到什么程度由你决定,但你可以让你的代码(或者其中的一些重要部分)达到 SPARK 能够证明没有运行时错误的程度。这意味着它不会因为溢出、除以零等原因而崩溃。
你为什么要这么做?四个原因:
- 就像 TDD 一样,以 SPARK 可以证明的方式编写代码可以得到设计精良、简单且易于阅读的代码。
- 如果 SPARK 保证不会发生所有类型的错误,那么您就不需要为代码中的多条路径编写测试。
- 运行时错误和逻辑错误之间存在很强的相关性。这意味着经过 SPARK 验证的代码往往比未经 SPARK 验证的代码包含更少的逻辑错误。
- 一旦你理解了SPARK的功能,你在写代码时就不用再考虑这些事情了。这就像你写邮件时不用再纠结拼写问题,因为拼写检查器会帮你处理好。当你亲眼看到它的实际效果时,你会觉得非常震撼。
只是一句警告
网络上关于 Ada/SPARK 的信息并不多(与更流行的语言相比)。而且很多现有的信息要么已经过时,要么就是完全错误。Ada 和 SPARK 在最新版本中都进行了重大改进,解决了一些实际的痛点。此外,摩尔定律使得软件的编译和正确性验证速度比以往快了几个数量级。
我的计划
我已经在尝试使用 Ada 和 SPARK 了。这种编程方式与我习惯的略有不同,但我找到了一些不错的资源,并且开始有所进展(请参阅下面的资源)。我计划用 Ada/SPARK 构建一些小应用程序来巩固我的学习成果。
由于种种原因,我在这里就不赘述了,Ada 不太可能成为主流语言。所以,我并不幻想很快就能用它编写生产代码。但我已经发现,其中一些概念可以毫不费力地应用于任何编程语言。我期待着在日常工作中运用这些想法来改进我的代码。
至于 PSP,我订购了Watts S. Humphrey 的《PSP:软件工程师的自我提升过程》 ,并计划立即完成这本书和配套的编程练习。PSP 不依赖于任何语言,所以如果你想立即提升你的水平,不妨先从 PSP 开始,之后再探索 Ada/SPARK。
更新:2018-09-03:
过去几个月我一直在学习 PSP,并写了迄今为止所学内容的总结。
总结
PSP 和 Ada/SPARK 在我们这个行业的安全关键、任务关键和高安全性领域都更为突出。我从未听过任何 Web 开发专家提到过这些,所以我不知道这些工具在我作为后端电商开发人员的日常工作中能有多大用处。我猜,几乎所有能防止缺陷进入代码库的事情都是值得做的。
研究清楚地表明,在开发生命周期的后期阶段修复缺陷的成本会不断上升。因此,我可以放弃一些编码速度,以节省测试、调试和计划外返工的时间。关键在于找到一个最佳平衡点。
你会考虑学习 PSP 或 Ada/SPARK 吗?我很想在评论区听听你的想法。
资源
如何实现超低缺陷率:
论文:Rod Chapman 的《笨拙的程序员》
视频:Rod Chapman 的《墨菲与撒旦:为什么编写安全系统仍然很难》
我们应该信任计算机吗?(视频或Word 文档)Martyn Thomas 的
《通过构造使软件正确》(视频或Word 文档)Martyn Thomas 的
《安全关键系统》(视频或Word 文档)
学习 PSP:
书籍:PSP:软件工程师的自我提升过程,作者:Watts S. Humphrey
视频:PSP 简介,作者:Watts S. Humphrey
学习 Ada/SPARK:
Pluralsight 课程:Jacob Sparre Andersen 编写的Ada 2012 简介
Ada 2012 中的基于契约的编程(视频或幻灯片
) 网站:Ada 嵌入式编程简介 书籍
:John W. McCormick 和 Peter C. Chapin 编写的《使用 SPARK 构建高完整性应用程序
》 网站:Ada 信息交换所