返回介绍

5.6 面对规模问题,我们仍未能超越前人的思想:结构化

发布于 2024-12-15 23:01:45 字数 3470 浏览 0 评论 0 收藏 0

从计算机应用的历史来看,我们在语言中加入新的元素,其本质的原因正是旧的语言特性在应对规模(而非仅仅是计算)的时候显得力不从心,尤其是在 应用系统 这两个规模级别中,(在语法与语义上的)语言特性体现出来的代码组织能力,相当大的程度上决定了这门语言所适用的开发规模。

最后,我们用表 5 总结一下不同视角对这些规模的认识。

表 5 不同视角对四种开发规模的认识

* 关于 软件工程师 这个开发者类型:使用这个有争议的名字原因在于,(基于一些历史的、习惯性的因素,)程序、应用和系统被我们统称为软件,因而“软件工程师”它们统一的基础角色。当然,在此前,他还必须是一个程序员。

在继续讨论之前,我们先来明确一下将要讨论的对象。

首先,我们要讨论编程(programming),一些场合中也被称为程序设计(program design)。可惜在不太严格的场合下,几乎所有编写软件的活动都被称为程序设计——这是相当可怕的事实。因此,必须明确地对它做一个定义,即我们用 程序设计 来特指在功能与程序这两个级别上编写软件;相应地,我们将其后的两个规模分别称为 应用开发系统构建 。程序设计、应用开发和系统构建这三种规模下的软件开发活动,是我们后续四篇中将要分别讨论的话题。

这几类活动有着显著的区别。 程序设计 主要应对计算要素问题,产出是一般含义上的 程序应用开发 主要应对程序组织问题,产出是有产品化概念的 软件系统构建 主要应对跨领域问题,产出是可持续进化的 系统 ——例如平台,如图 6 所示。

图 6 两种“结构化”方向的本质差异

  1. 这个著名的论断出自尼古拉斯•沃斯(Niklaus Wirth)。沃斯是 Pascal 语言之父,1984 年图灵奖获得者。《Algorithms + Data Structures = Programs》是他最有名的一本著作。
  2. 原文是“考虑一个算法和它所能引起的各种计算:从这些计算开始,抽去……”。如下一个脚注所谈到的,这里的计算过程是指 procedure,现在则常称为 function,也因此这里使用s(f)这个描述形式。
  3. 这里确实也可以表达为s’(f, d),但考虑到这里的f是必然作用于d的,因此无疑是说该s’()必然实现为 return s(f(d))
  4. 在 Dijkstra 的叙述中,函数是偏向数学计算、有计算结果的;过程只是一段计算机处理,并不表明有计算数据返回。现在我们通常用函数来概含了二者,以 C 语言为例,过程是指返回值声明为 void 的函数。循此惯例,此后的讨论中将仅仅使用 函数 这一个名词。
  5. “程序比较(程序验证、测试)”以及渐进优化的思想基础。
  6. “自顶向下”的结构化设计的思想基础。
  7. “架构”以及框架、流程等产出的思想基础。
  8. 另外的原因在于,对于许多开发人员来说,在这个级别上的开发才是他们心目中的、(被院校教育所圈定的)计算机科学领域中的“编程”。以其后的例子来说,“写出一个操作系统”可能是许多开发人员心中的巨作。
  9. 我并不确定 Dijkstra 所述的“组织和编排程序”究竟在何种程度上影响了后两种等级的语言出现,但我确信这种思想是导致它们出现的原因之一。
  10. 这里指的是 Pascal 语言中的单元(unit) 概念。具体到其它语言的实现上,它也可能被称为模块(module) 等等,例如 Erlang。
  11. 这一观点的得来决非易事,它是 20 世纪 70 年代多个程序设计流派之间的主要争端。David Parnas 的“信息隐藏”的观点取得了最终的胜利,即模块内部的数据与过程,应该对不需要了解的信息予以隐藏。Brooks 最初持不同的观点,但在 1995 年的《人月神话》二十周年版中,他坦承“关于信息隐藏的观点,David Parnas 是对的,我是错的”。
  12. 这个功能基本上可以概括为:基于存储地址、用于限制访问边界、纯粹的线性计算(分配)的过程。
  13. 这可能是一个有 150 多个可选配置项的命令行程序,除了 --help 参数就再也没有其他任何称得上文档的东西。
  14. 作为产品的用户,他还期望在个人需要与应用环境都发生变化时,仅支付少量的代价即可应对,而非重新购置。
  15. 但凡一切可以抽象为可计算对象,并通过计算系统来解决问题的领域。
  16. 最简单而又直白的说法就是:隔行如隔山。
  17. 我们可以将能在产品最终用户的环境中实现的需求称为本地需求,将不能在该环境中实现的称为 非本地需求
  18. REST(Representational State Transfer,表述性状态转移)是一种面向远程服务提供的架构方法,JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种数据交换语言/规格。从这个角度来看,SOAP 与 XML 并不是复杂的方案。
  19. 这里讨论的是语言,因此限定这些特性是通过语法元素来实现的。尽管在开发包中,用第三方工具来提供支持也是解决这一问题的通常手段,但并不是我们主要讨论的话题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文