- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.6 面对规模问题,我们仍未能超越前人的思想:结构化
从计算机应用的历史来看,我们在语言中加入新的元素,其本质的原因正是旧的语言特性在应对规模(而非仅仅是计算)的时候显得力不从心,尤其是在 应用 与 系统 这两个规模级别中,(在语法与语义上的)语言特性体现出来的代码组织能力,相当大的程度上决定了这门语言所适用的开发规模。
最后,我们用表 5 总结一下不同视角对这些规模的认识。
表 5 不同视角对四种开发规模的认识
* 关于 软件工程师 这个开发者类型:使用这个有争议的名字原因在于,(基于一些历史的、习惯性的因素,)程序、应用和系统被我们统称为软件,因而“软件工程师”它们统一的基础角色。当然,在此前,他还必须是一个程序员。
在继续讨论之前,我们先来明确一下将要讨论的对象。
首先,我们要讨论编程(programming),一些场合中也被称为程序设计(program design)。可惜在不太严格的场合下,几乎所有编写软件的活动都被称为程序设计——这是相当可怕的事实。因此,必须明确地对它做一个定义,即我们用 程序设计 来特指在功能与程序这两个级别上编写软件;相应地,我们将其后的两个规模分别称为 应用开发 与 系统构建 。程序设计、应用开发和系统构建这三种规模下的软件开发活动,是我们后续四篇中将要分别讨论的话题。
这几类活动有着显著的区别。 程序设计 主要应对计算要素问题,产出是一般含义上的 程序 ; 应用开发 主要应对程序组织问题,产出是有产品化概念的 软件 ; 系统构建 主要应对跨领域问题,产出是可持续进化的 系统 ——例如平台,如图 6 所示。
图 6 两种“结构化”方向的本质差异
- 这个著名的论断出自尼古拉斯•沃斯(Niklaus Wirth)。沃斯是 Pascal 语言之父,1984 年图灵奖获得者。《Algorithms + Data Structures = Programs》是他最有名的一本著作。 ↩
- 原文是“考虑一个算法和它所能引起的各种计算:从这些计算开始,抽去……”。如下一个脚注所谈到的,这里的计算过程是指 procedure,现在则常称为 function,也因此这里使用s(f)这个描述形式。 ↩
- 这里确实也可以表达为s’(f, d),但考虑到这里的f是必然作用于d的,因此无疑是说该s’()必然实现为
return s(f(d))
。 ↩ - 在 Dijkstra 的叙述中,函数是偏向数学计算、有计算结果的;过程只是一段计算机处理,并不表明有计算数据返回。现在我们通常用函数来概含了二者,以 C 语言为例,过程是指返回值声明为 void 的函数。循此惯例,此后的讨论中将仅仅使用 函数 这一个名词。 ↩
- “程序比较(程序验证、测试)”以及渐进优化的思想基础。 ↩
- “自顶向下”的结构化设计的思想基础。 ↩
- “架构”以及框架、流程等产出的思想基础。 ↩
- 另外的原因在于,对于许多开发人员来说,在这个级别上的开发才是他们心目中的、(被院校教育所圈定的)计算机科学领域中的“编程”。以其后的例子来说,“写出一个操作系统”可能是许多开发人员心中的巨作。 ↩
- 我并不确定 Dijkstra 所述的“组织和编排程序”究竟在何种程度上影响了后两种等级的语言出现,但我确信这种思想是导致它们出现的原因之一。 ↩
- 这里指的是 Pascal 语言中的单元(unit) 概念。具体到其它语言的实现上,它也可能被称为模块(module) 等等,例如 Erlang。 ↩
- 这一观点的得来决非易事,它是 20 世纪 70 年代多个程序设计流派之间的主要争端。David Parnas 的“信息隐藏”的观点取得了最终的胜利,即模块内部的数据与过程,应该对不需要了解的信息予以隐藏。Brooks 最初持不同的观点,但在 1995 年的《人月神话》二十周年版中,他坦承“关于信息隐藏的观点,David Parnas 是对的,我是错的”。 ↩
- 这个功能基本上可以概括为:基于存储地址、用于限制访问边界、纯粹的线性计算(分配)的过程。 ↩
- 这可能是一个有 150 多个可选配置项的命令行程序,除了
--help
参数就再也没有其他任何称得上文档的东西。 ↩ - 作为产品的用户,他还期望在个人需要与应用环境都发生变化时,仅支付少量的代价即可应对,而非重新购置。 ↩
- 但凡一切可以抽象为可计算对象,并通过计算系统来解决问题的领域。 ↩
- 最简单而又直白的说法就是:隔行如隔山。 ↩
- 我们可以将能在产品最终用户的环境中实现的需求称为本地需求,将不能在该环境中实现的称为 非本地需求 。 ↩
- REST(Representational State Transfer,表述性状态转移)是一种面向远程服务提供的架构方法,JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种数据交换语言/规格。从这个角度来看,SOAP 与 XML 并不是复杂的方案。 ↩
- 这里讨论的是语言,因此限定这些特性是通过语法元素来实现的。尽管在开发包中,用第三方工具来提供支持也是解决这一问题的通常手段,但并不是我们主要讨论的话题。 ↩
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论