完成21日讨论的一些关于摘要、历史的问题,同时修复了一些文件的mode -- Ch1-2, Ch2-2 文件内容没改。

This commit is contained in:
Xiaoxing Ma 2020-02-21 14:25:48 +08:00
parent 1b2e214184
commit 67a7bf9061
4 changed files with 26 additions and 18 deletions

8
Ch0-1-Abstract.tex Executable file → Normal file
View File

@ -74,7 +74,6 @@
%其带来的是一种人类思维的创新,以人机共融方式延伸了单纯人脑思维,形成了一种前所未有的创造力。
%
\xxm{看这样简化是否能够接受}
尽管软件学科的内容一直在不断深化、边界一直在不断扩展,
作为一门方法论学科其焦点始终是如何驾驭用计算为手段解决应用问题的复杂性,而合适的软件抽象是驾驭此复杂性的关键。
可将计算平台集合看作是平台空间,可能的软件集合看作是解空间,而将应用需求归入问题空间。
@ -174,7 +173,6 @@
这是由软件学科的方法论学科本质所决定的。
\xxm{本节以下部分已更新请审读}
换言之,如何深入软件开发所涉及的问题空间、平台空间和解空间,并在其间有效协同,是软件学科的``元'' 主题,
而随着问题空间和平台空间的拓展,如何以更好的软件抽象帮助驾驭软件开发的复杂性 --- 即尽量避免引入附属的复杂性,更好理解和应对本质的复杂性~\cite{Brooks:1987} --- 是学科发展的``元'' 规律。不同层次的抽象(集中体现在软件语言等表达设施)、抽象的计算实现(集中体现在系统软件)和使用(集中体现在软件工程)组成了软件学科的主体内容,而给出体系化的抽象的软件范型的迭代更新则展现了学科发展的脉络。
@ -206,7 +204,7 @@
但面临非结构化、海量数据的应用问题后,数据库不再采用严苛的关系模型,转而使用更为灵活的键值对结构、文档模型、图模型等更为契合问题空间的抽象,
同时给出这些抽象在大规模分布计算平台上的高效实现。
\subsection{我国的软件学科与产业 \xxm{需要更新,教育+产业?} }
\subsection{我国的软件学科与产业}
我国软件学科起步较早在几代科学家的不懈努力下取得了一系列的成果。例如在上世纪60 年代中期就自主研发了ALGOL等语言的编译系统70年代初研发了XT系列操作系统
80-90年代在银河系列巨型机上配备了操作系统、高级语言编译程序等系统软件。
在软件相关的基础研究方面,我国在程序理论、算法理论等方面取得了一批基础性的成果,提出了以时序逻辑作为软件开发的统一基础。
@ -464,9 +462,9 @@
\subsection{主要挑战与研究问题}
软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成的有机整体,其中软件范型是软件学科的核心内容,范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而对软件的整体生态与教育方面产生深刻的影响。
软件学科主要涵盖软件语言与软件理论、软件开发方法、软件运行支撑、软件度量和质量评估四方面的内容,而软件范型贯穿其间,使之相互配合形成方法论意义上的有机整体。软件范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而对软件的整体生态与教育方面产生深刻的影响。
软件理论和软件语言方面将着力解决适应人机物融合的软件范型这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在异构多态的新硬件架构和量子计算等新计算平台下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
软件语言与软件理论方面将着力解决适应人机物融合新软件范型的抽象建立这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在异构多态的新硬件架构和量子计算等新计算平台下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
软件构造方法将面向人机物融合场景的“软件定义”,软件需要在万物互联的平台上开发、运行、并持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。

36
Ch1-1-History.tex Executable file → Normal file
View File

@ -88,20 +88,30 @@ EDSAC作为第一台存储程序结构的电子计算机给出了通用图灵
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件也从批处理式、交互式、网络化发展到云边端融合等模式去支撑从少量集中到海量分布异构的资源管理和利用。
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,拓展到商业计算、个人计算、网络计算、云计算,到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件学科的一大重要挑战,软件语言从机器语言、汇编语言、高级语言、发展到领域特定语言,成为描述软件的基本方式。
在此之上形成所谓的软件方法学\index{软件方法学}主要涉及指导软件设计的原理和原则以及基于这些原理、原则的方法和技术。狭义的软件方法学也指某种特定的软件设计指导原则和方法体系。从ALGOL~\cite{Naur:1960:ALG:1061146.1061147}诞生至今,软件方法学从结构化方法~\cite{Dahl:1972:SP:1243380}、对象化方法~\cite{Booch:1986:OD:9794.9797, Meyer:1997:OSC:261119}、构件化方法~\cite{Heineman:2001:CSE:379381},向服务化~\cite{Huhns:2005:SCK:1053547.1053596}、智能化\todo{add references}和网构化~\cite{Mei:2016:INS:3086926}的方向发展。%,形成一系列的支撑软件。
在此之上形成所谓的软件方法学\index{软件方法学}主要涉及指导软件设计的原理和原则以及基于这些原理、原则的方法和技术。狭义的软件方法学也指某种特定的软件设计指导原则和方法体系。从ALGOL~\cite{Naur:1960:ALG:1061146.1061147}诞生至今,软件方法学从结构化方法~\cite{Dahl:1972:SP:1243380}、对象化方法~\cite{Booch:1986:OD:9794.9797, Meyer:1997:OSC:261119}、构件化方法~\cite{Heineman:2001:CSE:379381},向服务化~\cite{Huhns:2005:SCK:1053547.1053596}、智能化和网构化~\cite{Mei:2016:INS:3086926}的方向发展。%,形成一系列的支撑软件。
\subsubsection{以抽象为主线的软件学科发展\xxm{这一段的逻辑看不明白}}
\subsubsection{以抽象为主线的软件学科发展\xxm{改了下组织,请审阅}}
软件学科本质上是一门方法论学科。以计算手段解决问题的过程是从应用需求的问题空间到计算平台约束的解空间的映射过程,包括从解空间到平台空间上的计算实现\footnote{本质上,平台空间属于解空间中可直接计算执行的部分,其中计算平台形成了对解空间的约束。}。软件可以看成是现实世界中的问题及其求解方案在计算机上的一系列的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题~\cite{Booch:2007:ooadwa, Kramer:2007:AKC:1232743.1232745}。软件模型组成了解空间,是将现实世界问题空间映射到计算机世界平台空间的“桥梁”;从人工科学的角度看,软件模型的集合构成问题空间到平台空间的界面。
软件抽象是理解软件学科及其发展的关键。
一方面,软件抽象是软件开发者认识问题、表达并实现解决方案的语汇,是软件科学的核心研究对象和软件工程的主要工具。软件抽象影响乃至决定了软件认知和表达的边界。
另一方面,作为一门方法论学科,帮助开发者驾驭软件开发的复杂性始终是中心问题,而抽象是驾驭复杂性的主要手段。
软件抽象是软件学科知识沉淀的载体和发展进步的标志;无论是系统软件还是工程方法,均以其支撑或使用的软件抽象为主要特征。
Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite{Lucy:1997:LinguisticRelativity}。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。软件的语汇就是软件的各种抽象设施,是建立软件模型的基本元素。认识软件的切入点是认识各种软件抽象,宏观地说,软件方法学的核心是探讨如何建立、实现和使用抽象。
细言之,以计算手段解决问题的过程是从应用需求的问题空间到计算平台约束的解空间的映射过程,包括从解空间到平台空间上的计算实现\footnote{本质上,平台空间属于解空间中可直接计算执行的部分,其中计算平台形成了对解空间的约束。}。软件可以看成是现实世界中的问题及其求解方案在计算机上的一系列的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题~\cite{Booch:2007:ooadwa, Kramer:2007:AKC:1232743.1232745}。软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示。
软件模型组成了解空间,是将现实世界问题空间映射到计算机世界平台空间的“桥梁”;从人工科学的角度看,软件模型的集合构成问题空间到平台空间的界面。
构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换,建立抽象和抽象之间的关系。
抽象是驾驭复杂性的基本手段。软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示。
软件范型为软件工程师(或程序员)提供 一套具有内在一致性的软件抽象体系,具化为一系列软件模型及其构造原理~\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}。而构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换,建立抽象和抽象之间的关系。软件抽象设施集中体现在各种软件语言,特别是以程序设计语言和建模语言,也包括程序框架、编程接口等。从结构上看,基于认知程度的不同,高层抽象可以分解为低层抽象,底层抽象可以组合或聚集为高层抽象,抽象之间还有不同语义保持度的转换。在问题空间、解空间和平台空间表述时,都可以建立或者定义所需的抽象,也可以使用已定义的抽象表述对象或者实现一个新定义的抽象。
Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite{Lucy:1997:LinguisticRelativity}
其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。
这一原理也突出地表现在软件学科。认识软件的切入点是认识各种软件抽象,宏观地说,软件方法学的核心是探讨如何建立、实现和使用抽象。
软件抽象设施集中体现在各种软件语言,特别是以程序设计语言和建模语言,也包括程序框架、编程接口等。
从结构上看,基于认知程度的不同,高层抽象可以分解为低层抽象,底层抽象可以组合或聚集为高层抽象,抽象之间还有不同语义保持度的转换。
在问题空间、解空间和平台空间表述时,都可以建立或者定义所需的抽象,也可以使用已定义的抽象表述对象或者实现一个新定义的抽象。
软件范型为软件工程师(或程序员)提供 一套具有内在一致性的软件抽象体系,具化为一系列软件模型及其构造原理~\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}
换个角度看,软件抽象的重要性也体现在它是驾驭软件复杂性的基本手段。可以说软件是人类制造的最复杂的一类制品。
%而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软件。不同层次的抽象、抽象的计算实现和使用组成了软件发展的脉络。我们试图以软件各种抽象为主线来梳理和汇聚软件发展的基本历程。
%例如在典型的大数据处理系统如Google搜索引擎我们可以看到接口与服务、方法与设施、虚拟化与实现等不同层次组成的抽象栈它们分别对应着Web服务、MapReduce、Dryad、Pregel、BigTable、集群调度、分布式文件、操作系统等抽象层。
%弥补着从计算平台形成的解空间到应用目标的问题空间语义鸿沟,软件驾驭复杂性的抽象能力不断提高。
高度灵活性使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”。这就使得整个人工系统的复杂性向软件集中。驾驭复杂性的能力(复杂性的种类、程度的提升)体现了软件发展的水平。
从以算法复杂性为主,到结构复杂性,再进入网络化时代的交互复杂性和规模复杂性,直至今日,数据复杂性、社会复杂性也将纳入软件需要驾驭的复杂性之中,建立、实现、使用抽象的循环迭代不断往复,推进着软件技术的发展。
@ -157,13 +167,13 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
%\subsubsection{基于抽象构建应用解决方案的软件工程}
\subsubsection{软件工程}
软件工程把工程化的思想应用于团队化的复杂软件系统构造活动,促进了软件开发方法与软件开发过程的发展。\xxm{加一句主题句}
软件工程把工程化的思想应用于团队化的复杂软件系统构造活动,促进了软件开发方法与软件开发过程的发展。
%随着软件工程思想的出现,逐渐发展起来。
%面向应用建立问题解决方案的抽象成为软件开发方法的共识。
软件开发可以看作是使用各种抽象构建并实现新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路,信息隐藏是其基本原则。
程序设计语言影响着甚至决定着软件范型\xxm{逻辑上似乎应该是倒过来的}。软件开发试图在问题空间中建立有更强表达能力、并易于向平台空间抽象高效映射的一系列抽象。因而软件开发的诸多基本抽象往往力求与程序设计语言的抽象尽可能相容或一致使得软件工程模型不同阶段、不同层次的抽象有着较好的对应保持较好的可跟踪性和平滑的实现映射。例如70年代的结构化分析和设计方法对应于结构化程序设计、80年代的面向对象分析和设计对应于面向对象程序设计等等。另一方面在程序设计语言抽象的基础上为了与人们应用问题求解思维过程的一致在软件的需求和设计上也出现了含有高层的抽象设施的软件语言也称软件建模语言。它们具有面向问题空间描述的抽象形式例如在面向对象方法学中的统一建模语言UML~\cite{Booch:1999:UML:291167}用Use Case对需求进行抽象建模用Message对需求和设计中类交互进行抽象。
软件开发可以看作是使用各种抽象构建并实现新抽象获得问题解的过程。
分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路。%,信息隐藏是其基本原则。
程序设计语言提供了基本的抽象在其基础上软件开发试图在问题空间中建立有更强表达能力、并易于向平台空间抽象高效映射的一系列抽象。因而软件开发的诸多基本抽象往往力求与程序设计语言的抽象尽可能相容或一致使得软件工程模型不同阶段、不同层次的抽象有着较好的对应保持较好的可跟踪性和平滑的实现映射。例如70年代的结构化分析和设计方法对应于结构化程序设计、80年代的面向对象分析和设计对应于面向对象程序设计等等。另一方面在程序设计语言抽象的基础上为了与人们应用问题求解思维过程的一致在软件的需求和设计上也出现了含有高层的抽象设施的软件语言也称软件建模语言。它们具有面向问题空间描述的抽象形式例如在面向对象方法学中的统一建模语言UML~\cite{Booch:1999:UML:291167}用Use Case对需求进行抽象建模用Message对需求和设计中类交互进行抽象。
更进一步,随着软件抽象粒度和层次的提升,软件开发方法和软件语言的发展愈加紧密。例如,基于复用思想的软件构件化方法中提出了软件体系结构,构件和构件间的连接子成为其重要组成;服务化方法定义了服务和服务间的流程编排;以及网构化方法提供了自主实体和实体间的按需连接,等等。
软件生命期不同阶段有不同抽象,由抽象间的(使用/实现)关系复合构建映射成为软件开发的重要任务。
@ -172,7 +182,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
%如图结构化抽象与THE OS、C与UNIX、面向对象与CORBA和EJB、服务化与Docker虚拟机交相辉映形成了以计算为手段的解平台提升并与结构化、对象化、构件化、服务化等软件开发方法携手同行。
软件开发方法从制品的角度来认识、构造和演进软件。而另一方面软件作为人类的智力产品其质量存在不确定性同时其产生和发展过程中蕴含着复杂的协作。因此从工程化的角度看软件度量和质量保证以及软件开发和演化的动态过程也是必不可少的。以软件开发方法为基础软件工程必然延伸到了度量、质量和过程。例如UML软件工程不仅支持面向对象的分析与设计还支持从业务建模、需求获取、分析、设计、实现、测试到部署的迭代化软件开发活动在此基础上形成了所谓统一软件开发过程Unified Process。软件过程模式从早期的手工作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式方面的里程碑主要有软件过程的提出1970、能力成熟度模型CMM1988、SCRUM过程框架1995、统一软件开发过程RUP2000、外包2001、敏捷和极限编程2001、个人软件过程PSP2005而社会化生产方式的重要模式和工具有开源软件运动1997、分布式版本管理工具与开源代码托管平台如Git2005与Github等以及相应的开发社交平台Stack Overflow2007\xxm{这一句稍展开了些}
软件开发方法从制品的角度来认识、构造和演进软件。而另一方面软件作为人类的智力产品其质量存在不确定性同时其产生和发展过程中蕴含着复杂的协作。因此从工程化的角度看软件度量和质量保证以及软件开发和演化的动态过程也是必不可少的。以软件开发方法为基础软件工程必然延伸到了度量、质量和过程。例如UML软件工程不仅支持面向对象的分析与设计还支持从业务建模、需求获取、分析、设计、实现、测试到部署的迭代化软件开发活动在此基础上形成了所谓统一软件开发过程Unified Process。软件过程模式从早期的手工作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式方面的里程碑主要有软件过程的提出1970、能力成熟度模型CMM1988、SCRUM过程框架1995、统一软件开发过程RUP2000、外包2001、敏捷和极限编程2001、个人软件过程PSP2005而社会化生产方式的重要模式和工具有开源软件运动1997、分布式版本管理工具与开源代码托管平台如Git2005与Github等以及相应的开发社交平台Stack Overflow2007等。
%DevOps2008放到学科构架里面去说。
@ -195,7 +205,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
纵观软件学科发展历史,随着计算时代从数字化时代发展到网络化,再到目前人机物融合、智能化时代,软件和软件学科在继承中发展;变化成为常态,正所谓“变是不变的真理”。我们从两个方面来认识软件学科发展的规律:第一,本学科发展的驱动力是什么;第二,本学科的研究方法论是什么。
\subsubsection{发展的驱动力}
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。作为一门面向人工制品的方法论学科,软件学科发展的驱动力主要来自于两个方面:外在驱动力来自于应用范围的扩张和计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀到系统软件平台中,同时更好地满足用户对易用性的需求。\xxm{易用性和人本属性是何关系?} 此外,软件发展驱动力还来自人本属性,包括人的认知规律和人力资源管理的深化与提高。
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。作为一门面向人工制品的方法论学科,软件学科发展的驱动力主要来自于两个方面:外在驱动力来自于应用范围的扩张和计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀到系统软件平台中,同时更好地满足用户对易用性的需求。此外,软件发展驱动力还来自面向开发者的人本属性,包括人的认知规律和人力资源管理的深化与提高。
\textbf{外在驱动力}

0
Ch1-2-ProgrammingLanguage.tex Executable file → Normal file
View File

0
Ch2-2-SoftwareTheory.tex Executable file → Normal file
View File