update for Haodan

This commit is contained in:
Xin Peng 2020-03-04 12:40:12 +08:00
parent a1749020d0
commit f3e4b17e9a
36 changed files with 251 additions and 173 deletions

View File

@ -85,7 +85,7 @@
软件语言的核心任务是建立通用的抽象机制,包括抽象的表示和抽象之间的关系,为问题空间、解空间和平台空间建模。
软件语言包括程序设计语言、各类建模语言以及编程模型等。
其中程序设计语言用于描述软件的计算行为,提供了基础软件抽象。%承载着软件的范型。
其中程序设计语言用于描述软件的计算行为,提供了基础软件抽象。%承载着软件的范型。
一方面,程序设计语言需要提供更有效、有力、更符合人类思维方式的语言设施,以降低软件开发的难度、提高软件制品的质量;
另一方面,这些语言设施又需能被高效地实现以保证软件的执行效率。
@ -111,7 +111,7 @@
\begin{figure}[htbp]
\centering
\includegraphics[width=.45\textwidth]{figs/以范型抽象为中心.pdf}
\includegraphics[width=.45\textwidth]{figs/framework.pdf}
\caption{软件学科基本架构}
\label{fig:1-6}
\end{figure}
@ -121,14 +121,14 @@
%由于应用范围的迅速拓展,软件抽象中用于表述现实世界的数据抽象日益重要,数据量及其复杂性迅猛增长,数据管理逐渐从上述三个子领域中分离出来成为一个单独的子领域。
\subsection{软件学科的重要地位}
软件学科在整个计算机学科中占有举足轻重的核心地位。从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主的有22次获奖还有4次数据库获奖。
软件学科在整个计算机学科中占有举足轻重的核心地位。从1966年首届图灵奖至2019年的54次颁奖中属于软件领域的有37次68.5\%其中以程序设计语言、编译和操作系统为主的有22次获奖还有4次数据库获奖。
从目前我国人才培养一级学科划分看,软件学科横跨了计算机科学与技术、软件工程、网络空间安全等三个一级学科,特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。
与国际本科计算教育学科划分相比软件学科横跨了ACM/IEEE Computing Curricula的五个学科即计算机科学、计算机工程、软件工程、信息技术、信息系统。
随着信息技术及信息化的快速发展,软件学科也逐渐成为一门基础学科,并向其他学科渗透。
所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代的知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。
软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的的科学研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。
软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的综合性的科学研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。
以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
@ -174,7 +174,7 @@
换言之,如何深入软件开发所涉及的问题空间、平台空间和解空间,并在其间有效协同,是软件学科的``元'' 主题,
而随着问题空间和平台空间的拓展,如何以更好的软件抽象帮助驾驭软件开发的复杂性 --- 即尽量避免引入附属的复杂性,更好理解和应对本质的复杂性~\cite{Brooks:1987} --- 是学科发展的``元'' 规律。不同层次的抽象(集中体现在软件语言等表达设施)、抽象的计算实现(集中体现在系统软件)和使用(集中体现在软件工程)组成了软件学科的主体内容,而给出体系化的抽象的软件范型迭代更新则展现了学科发展的脉络。
而随着问题空间和平台空间的拓展,如何以更好的软件抽象帮助驾驭软件开发的复杂性 --- 即尽量避免引入附属的复杂性,更好理解和应对本质的复杂性~\cite{Brooks:1987} --- 是学科发展的``元'' 规律。不同层次的抽象(集中体现在软件语言等表达设施)、抽象的计算实现(集中体现在系统软件)和使用(集中体现在软件工程)组成了软件学科的主体内容,而给出体系化的软件范型迭代更新则展现了学科发展的脉络。
%软件的计算平台给出了解决方案所依赖的平台空间,而应用问题域形成了软件的问题空间。
%在平台空间和问题空间之间,构成了软件所需具有的功能、目的和适应能力构成的解空间。解空间受制于问题空间和平台空间。
@ -187,15 +187,14 @@
\begin{figure}[htbp]
\centering
\includegraphics[width=.52\textwidth]{figs/学科发展.pdf}
\includegraphics[width=.52\textwidth]{figs/progress.pdf}
\caption{软件泛型的发展}
\label{fig:swdcpldev}
\end{figure}
\ref{fig:swdcpldev} 展示了在应用范围扩张和计算平台发展驱动下主要软件范型的发展历程。
例如结构化软件范型乃是由于上世纪60年代计算机基础能力(计算、存储与外设)的快速发展和软件危机的出现而导致人们对基础的程序设计方法与语言的科学思考而产生的,
它以结构化的程序抽象较好地协调了软件开发的平台空间与解空间,解空间和平台空间匹配较好,但问题空间和解空间差距大。
例如结构化软件范型乃是由于上世纪60年代计算机基础能力(计算、存储与外设)的快速发展和软件危机的出现而导致人们对基础的程序设计方法与语言的科学思考而产生的。它以结构化的程序抽象较好地协调了软件开发的平台空间与解空间,解空间和平台空间匹配较好,但问题空间和解空间差距大。
而面向对象软件范型则进一步发展了从宏观角度控制复杂性的手段, 如关注点分离、信息隐蔽、多态等, 并强调将问题空间纳入软件设计的范畴,
提出与问题结构具有良好对应关系的面向对象程序抽象与支撑机制, 从而协调了软件开发的问题空间和解空间,平台空间也发展出中间件和容器等技术以支持对象抽象在计算平台的实现。
@ -209,23 +208,19 @@
80-90年代在银河系列巨型机上配备了操作系统、高级语言编译程序等系统软件。
在软件相关的基础研究方面,我国在程序理论、算法理论等方面取得了一批基础性的成果,提出了以时序逻辑作为软件开发的统一基础。
八十年代后,我国学者在大规模综合性的软件工程环境、软件自动化技术方面做了一系列的工作。
进入新世纪以来,提出面向开放互联网环境的新软件范型网构软件及其支撑技术体系。
进入新世纪以来,提出面向开放互联网环境的新软件范型——网构软件及其支撑技术体系。
\dan{请审读本段}
%当前,从软件领域相关的重要学术期刊和会议上发表的论文及其引用的计量指标来看,
%近年来我国软件学科在总量上进步迅速,已仅次于美国。
%在软件工程、数据处理等子领域已接近美国。
%但在基础理论、系统软件和程序设计语言等方面仍有明显差距。
从软件领域相关的重要学术期刊和会议上发表的论文及其引用的计量指标来看,
一方面,软件学科研究迅速发展进步,论文、引文的数量以及国际合作的规模呈现出持续增长的态势,部分指标已经位于世界前列。
比如在2008-2017的10年之间我国软件学科领域SCI期刊论文数量增长了2.7倍于2017年超越美国位于榜首
2013-2017年中国软件学科SCI论文的被引频次以0.4\%的微弱劣势落后于美国,位列世界被引频次排行榜的第二位。
另一方面,细分领域之间、以及期刊/会议之间发展不平衡的问题也较为突出。
比如,数据库、软件工程、交叉/新兴领域的研究论文呈现出高速发展态势,但计算机理论、系统软件、程序设计语言等领域尚有较大提升空间。
尽管从软件领域相关的重要学术期刊和会议上发表的论文及其引用的计量指标来看我国论文、引文的数量以及国际合作的规模呈现出持续增长的态势部分指标已经位于世界前列。例如在2008-2017的10年之间我国软件学科领域SCI期刊论文数量增长了2.7倍于2017年超越美国位于榜首
2013-2017年中国软件学科SCI论文的被引频次以0.4\%的微弱劣势落后于美国,位列世界被引频次排行榜的第二位。但是,另一方面,我国具有重大影响的成果和具有引领性的研究缺失;细分领域之间、以及期刊/会议之间发展不平衡的问题也较为突出。
例如,数据库、软件工程、交叉/新兴领域的研究论文呈现出高速发展态势,但计算机理论、系统软件、程序设计语言等领域尚有较大提升空间。
\todo{请审读以下两段}自上世纪80年代初以来我国的软件教育尤其是软件工程教育迅速发展先后开展了开设软件工程课程、试办软件工程专业、培养软件工程硕士研究生等一系列的建设工作。2001年国家开展示范性软件学院的建设全国共有37家首批35家重点高校试办示范性软件学院。2010年教育部软件工程教指委编制了“高等学校软件工程本科专业规范”以指导我国软件工程专业建设2011年国家增设软件工程一级学科。截止目前我国已有300多所高校成立了软件学院或开设了软件工程专业形成本、硕、博多层次成系统的软件工程教育体系。2019年软件工程教指委推出了中国软件工程知识体系C-SWEBOK。2019年教育部出台的《2019年教育信息化和网络安全工作要点》指出要在中小学阶段逐步推广编程教育。根据“中国软件产业年鉴2017我国软件产业从业人数达到600多万人。
自上世纪80年代初以来我国的软件教育尤其是软件工程教育迅速发展先后开展了开设软件工程课程、试办软件工程专业、培养软件工程硕士研究生等一系列的建设工作。2001年国家开展示范性软件学院的建设全国共有37家首批35家重点高校试办示范性软件学院。2010年教育部软件工程教指委编制了“高等学校软件工程本科专业规范”以指导我国软件工程专业建设2011年国家增设软件工程一级学科。截止目前我国已有300多所高校成立了软件学院或开设了软件工程专业形成本、硕、博多层次成系统的软件工程教育体系。2019年软件工程教指委推出了中国软件工程知识体系C-SWEBOK。2019年教育部出台的《2019年教育信息化和网络安全工作要点》指出要在中小学阶段逐步推广编程教育。根据“中国软件产业年鉴2017我国软件产业从业人数达到600多万人。
随着软件地位和需求的增长及软件技术的发展,软件学科教育日益受到重视,社会对软件人才的数量和质量提出了更高的要求,这既给软件学科教育带来了机遇,也对软件学科教育提出了严峻的挑战软件学科教育滞后于软件学科的整体发展,软件学科的教育界需要加大与产业界、学术界的合作,需要与时俱进地更新和完善其知识体系,提高人才培养的质量。
随着软件地位和需求的增长及软件技术的发展,软件学科教育日益受到重视,社会对软件人才的数量和质量提出了更高的要求,这既给软件学科教育带来了机遇,也对软件学科教育提出了严峻的挑战软件学科教育滞后于软件学科的整体发展,软件学科的教育界需要加大与产业界、学术界的合作,需要与时俱进地更新和完善其知识体系,提高人才培养的质量。
%经过数十年的发展,我国软件产业已经取得长足发展。
@ -233,12 +228,11 @@
%在电子商务、社交网络、安防监控、民用无人机等方面的软件应用进入世界先进行列。
%然而,总体来看,我国软件产业大而不强的问题仍然十分突出。在操作系统、程序设计语言、数据库管理系统和大数据处理平台等关键系统软件方面受制于人;
%在不依赖市场区隔的关键软件服务技术创新方面仍落后于发达国家。
\xxm{以下两段请审读}
基于软件学科发展的技术和人才积累,我国的软件产业伴随着改革开放的东风起步。
20世纪80年代初原国家电子计算机工业总局颁布试行《软件产品计价收费办法》,原电子工业部计算机局软件登记中心、北京软件工程研究中心和中国软件行业协会先后成立,推动了软件产业的形成和发展。
此后,随着计算机的日益普及带来的需求增长、国家法律法规和产业政策的不断完善,我国软件产业迅速壮大。
尤其是进入21世纪以来其发展尤为迅猛。据国家有关部门统计软件与信息技术服务业产值从2000年的560亿增长至2018年的6.3万亿元且近年来保持每年10\%以上的增速。
尽管面临国际软件企业巨头的竞争,国内软件企业通过自主创新,逐渐探索出符合中国国情的发展道路。近年来,阿里、腾讯、华为等企业软件研发投入和产出持续增长,技术水平不断提高,市场影响力日益扩大。
尽管面临国际软件企业巨头的竞争,国内软件企业通过自主创新,逐渐探索出符合中国国情的发展道路。近年来,CEC、华为、阿里、腾讯等企业软件研发投入和产出持续增长,技术水平不断提高,市场影响力日益扩大。
在迅速发展的同时,我国软件产业也存在一些问题。
首先在总量上我国软件产业占电子信息产业的比重约30\%显著低于发达国家的50\%-70\%,仍有巨大发展空间。
@ -260,7 +254,7 @@
所谓“计算的泛在化”是指计算变得无处不在而又无迹可寻。万物数字化、万物互联使得计算无处不在,形成了“人-机-物” 三元融合的发展趋势。计算自然融入人类 生产、生活活动的环境和过程之中,无需关注,不着痕迹。
所谓“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。而“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源,包括各种数字化机电设备和可传感物体对象在内的各类物理资源,乃至可通过激励机制调配的人力资源。
软件的基础设施地位具体表现为两个方面。一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑。另一方面,软件正在 “融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着以互联网和其他网络(包括电信网、移动网、物联网等)的不断交汇融合,软件正在对传统物理世界基础设施和社会经济基础设施进行重塑和重构,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式升级、生产关系变革、产业升级、新兴产业和价值链的诞生与发展的重要引擎。从经济社会整体发展的角度,计算成为了人类与物理世界互动的中介,软件对人类社会的运行和人类文明的发展进步起到重要支撑作用。
软件的基础设施地位具体表现为两个方面。一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑。另一方面,软件正在 “融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着以互联网和其他网络(包括电信网、移动网、物联网等)的不断交汇融合,软件正在对传统物理世界基础设施和社会经济基础设施进行重塑,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式升级、生产关系变革、产业升级、新兴产业和价值链的诞生与发展的重要引擎。从经济社会整体发展的角度,计算成为了人类与物理世界互动的中介,软件对人类社会的运行和人类文明的发展进步起到重要支撑作用。
%首先,一大批基础软件本身就是信息基础设施,支撑各种应用软件的运行。其次,一大批嵌入式软件已成为掌控并支撑物理基础设施运行的关键系统。第三,一大批应用软件及其所提供的服务已成为信息社会不可或缺的基础资源与设施。最后,从软件产业整体的角度看,随着传播和互联的渗透发展,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
@ -282,7 +276,7 @@
从软件方法技术发展的角度看,软件的基本形态从计算机硬件的附属品到独立的软件产品,转变到云化和泛在的软件服务,%,转变为无处不在而又无迹可寻的泛在服务。
软件形态的耦合边界趋于模糊,开发运维一体化成为趋势;
面向计算平台和应用需求变化和拓展的软件演化成为软件的常态,元级结构以及在基于规则的演绎之上发展出数据驱动的归纳,将成为超大规模软件体系结构的重要元素,各种场景的适应和成长是软件运行支撑发展焦点;
软件开发经历了从实现数学计算到模拟物理世界,将拓展到虚实融合创造的转变,人类社会和赛博空间的虚实互动促进着软件方法技术向社会-技术系统Socio-technical System发展对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上,转换为考虑软件及其利益相关者群体的竞争、协作等社会性特征;软件度量和质量评估的科学观察对于技术的发展和软件生态的发展具有显著意义。
软件开发经历了从实现数学计算到模拟物理世界,将拓展到虚实融合创造的转变,人类社会和赛博空间的虚实互动促进着软件系统向社会-技术系统Socio-technical System发展对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上,转换为考虑软件及其利益相关者群体的竞争、协作等社会性特征;软件度量和质量评估的科学观察对于技术的发展和软件生态的发展具有显著意义。
%在元级方法论层面,正从以还原论为主向系统论发展,软件作为解决方案越来越多地被视为开放环境中的复杂适应系统,而不是封闭规约下的确定行为系统。
\subsection{软件科学的新理解}
@ -334,7 +328,7 @@
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据驱动(代码也可以看作一种数据)的方式进行表示,并实现自演化和自生长。
最后,软件与人将在不断汇聚的群体智慧中实现融合发展。软件的覆盖面越来越广、渗透性越来越强,最终用户对于软件的依赖也越来越强。由此,软件所能获得的关于用户行为和反馈的数据越来越全面和丰富,并在此基础上形成越来越强的群体智慧。这种群体智慧注入软件后又将服务于每个最终用户,使得他们能够在各种应用场景中以更加智能化和个性化的方式满足自身的需求,从而使得软件在使用中越来越有“灵性”和“人性”。未来的软件学科及相关研究需要摈弃“人”与“软件”二元分离的思维定式,更加自觉的考虑人机共融,不仅考虑“人因”,更要考虑“群智”。
最后,软件与人将在不断汇聚的群体智慧中实现融合发展。软件的覆盖面越来越广、渗透性越来越强,最终用户对于软件的依赖也越来越强。由此,软件所能获得的关于用户行为和反馈的数据越来越全面和丰富,并在此基础上形成越来越强的群体智慧。这种群体智慧注入软件后又将服务于每个最终用户,使得他们能够在各种应用场景中以更加智能化和个性化的方式满足自身的需求,从而使得软件在使用中越来越有“灵性”和“人性”。未来的软件学科及相关研究需要摒弃“人”与“软件”二元分离的思维定式,更加自觉地考虑人机共融,不仅考虑“人因”,更要考虑“群智”。
%
\subsubsection{价值观}
@ -371,8 +365,7 @@
%
% 安全性要求软件为人类活动和生存环境提供必要的安全保障包括系统安全Safety和信息安全Security。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害信息安全是指能有效防控各类信息的非法获取、传播和使用。
\dan{和白晓颖老师商量了一下本书不再使用系统安全和信息安全来指代Safety和Security并且不用下定义的方式因为无法保证其经得起推敲}
安全性是指避免给人员、设施、环境、经济等造成严重损失。安全性设计通过主动冗余、失效安全等机制,降低系统失效导致灾难性后果的概率;安全性防护防止信息以及系统软硬件设施被非法获取、传播和使用。
安全性,既包括了功能安全,也包括了信息安全。功能安全是指避免给人员、设施、环境、经济等造成严重损失。其安全性设计通过主动冗余、失效安全等机制,降低系统失效导致灾难性后果的概率。信息安全性防护防止信息以及系统软硬件设施被非法获取、传播和使用。
%软件信息安全保障失效的后果之一就是系统安全故障因此本书将两种安全性合二为一统称为安全性Safety\&Security。传统软件质量观将安全视作系统质量的一部分强调软件个体的安全性。随着人机物融合软件系统已融入人类社会并与人类无缝交互。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播
软件作为基础设施,描述并掌控了很多关键领域的资源,其安全性威胁会给整个系统带来致命的威胁。因此,安全性这一质量属性随着软件成为基础设施的趋势而变得愈发重要。
@ -389,7 +382,7 @@
%
%作为人类价值载体,软件行为体现了人类价值观;由于软件无迹可寻,导致人类价值观又通过软件影响人类社会。因此,
软件系统的行为应符合社会道德标准,不对个人和社会产生负面结果,这种规范称为软件系统的伦理观。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终在软件系统的具体行为中体现。因此,软件系统的伦理观,体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
软件系统的行为应符合社会道德标准,不对个人和社会产生负面结果,这种规范称为软件系统的伦理观。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终在软件系统的具体行为中体现。因此,软件系统的伦理观,体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
%软件支撑的基础设施服务,为满足各类应用快速增长、新技术不断涌现的需求,需要具有开放扩展能力,即能集成各种异构的技术及系统,支持各类软件制品的即时加载/卸载,对内部状态及外部环境变化的感应、自主响应以及调控机制,以及个性化服务的定制等。显然,这种开放体系架构常常引入系统设计的脆弱性和质量隐患,从而给持续提供服务带来挑战。
@ -426,7 +419,7 @@
% 开源是一类典型生态系统。开源以燎原之势渗透到了软件产业各个领域,目前80\%的软件开发都是开源模式几乎100\%的IT企业都借鉴开源代码故而代码片段、软件包、软件以及技能、知识和上下游项目等的依赖无处不在生态以一种自然的方式呈现于软件、开发者、开发社区和企业中。一些大规模复杂软件尤其是基础软件例如Linux内核OpenStack等因其基础性和流行度涉及到众多厂商的利益因此也会吸引庞大的群体企业和个体在其开发和应用市场中扮演不同的角色形成生态。
%
% 总的来说,软件生态系统指参加软件活动(开发、运行、维护、应用等)的一组实体及其环境组成的、彼此交互的社区体系(系统之系统)。
生态系统可以从下述几个维度来刻画。
生态系统可以从下述维度来刻画。
%
首先,多元素交互(开发者、用户、制品及相关组织和企业,以及软件基础设施等)是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性(例如核心参与者——开发者和用户——都是社会体)。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
@ -460,9 +453,9 @@
%
%
\subsection{主要挑战与研究问题}
\subsection{学科研究的主要问题}
软件学科主要涵盖软件语言与软件理论、软件开发方法、软件运行支撑、软件度量和质量评估四方面的内容,而软件范型贯穿其间,使之相互配合形成方法论意义上的有机整体。软件范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而对软件的整体生态与教育方面产生深刻的影响。
软件学科的学科内容主要涵盖软件语言与软件理论、软件开发方法、软件运行支撑、软件度量和质量评估四方面的内容,而软件范型贯穿其间,使之相互配合形成方法论意义上的有机整体。软件范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而对软件的整体生态与教育方面产生深刻的影响。
软件语言与软件理论方面将着力解决适应人机物融合新软件范型的抽象建立这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在异构多态的新硬件架构和量子计算等新计算平台下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
@ -497,7 +490,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{政策建议 \wj{等后面改好回头更新}}
\section{政策建议}
%\section{资助机制与政策建议}
%在当前人机物三元融合往纵深发展、软件定义一切成为大势所趋的新时代,往为促进我国软件学科和软件产业的健康

View File

@ -14,7 +14,7 @@
软件已经成为人类认识和改造世界的关键工具,承载着信息时代人类的文明。
软件科学与工程学科以下简称软件学科是以软件为基本研究对象的人工科学或曰“人工制品科学”Science of Artificial~\cite{Simon:1996:SA:237774}, 包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统等。
回顾计算机科学技术的发展历史从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主获奖的有22次还有4次数据库获奖。
回顾计算机科学技术的发展历史从1966年首届图灵奖至2019年的54次颁奖中属于软件领域的有37次68.5\%其中以程序设计语言、编译和操作系统为主获奖的有22次还有4次数据库获奖。
在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。
作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、主要线索、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略研究提供背景。
@ -53,12 +53,12 @@
\caption{Babagge分析机的第一个程序}
\label{fig:Babagge分析机程序}
\end{minipage}
\end{figure}\todo{图需要对齐}
\end{figure}
Computer一词历史上最早出现在1613年用来指完成演算或计算的人员。
这种用法一直持续到19世纪末第二次工业革命时期产生了用来演算的机器为止\footnote{https://www.computerhope.com/issues/ch000984.htm}
著名的哈佛大学天文台在1877年至1919年期间雇佣了一批妇女作为处理天文数据的技术工人。
在电子计算机出现之前的人力和机械计算时代Mathematic Tables项目是最大最复杂的计算项目该项目的关键思想就是利用编程完成特定函数的计算。Gertrude Blanch女士作为“数学的导演”和“计算的经理”设计了人力计算团队执行的“算法”其算法设计成为此后数十年超越函数的标准计算思路。逐渐地人们发明了表达编程的记号和方法例如1921年Lillian和Frank Gilbreth的过程图Process Charts参见图1-5后来的程序流图与之形式十分类似又如1940年IBM的W.J. Eckert提出的打孔卡参见图1-6\xxm{这两个图在哪里?}。我们可以看到,计算和编程是紧密相关的,而编程的结果事实上是给出了一种计算应用(数学计算)的解决方案,它可以由人力计算或机械计算完成。然而,在人力/机械计算时代,还未形成通用计算设备编程的思想。
在电子计算机出现之前的人力和机械计算时代Mathematic Tables项目是最大最复杂的计算项目该项目的关键思想就是利用编程完成特定函数的计算。Gertrude Blanch女士作为“数学的导演”和“计算的经理”设计了人力计算团队执行的“算法”其算法设计成为此后数十年超越函数的标准计算思路。逐渐地人们发明了表达编程的记号和方法例如1921年Lillian和Frank Gilbreth的过程图Process Charts后来的程序流图与之形式十分类似又如1940年IBM的W.J. Eckert提出的打孔卡。我们可以看到计算和编程是紧密相关的而编程的结果事实上是给出了一种计算应用数学计算的解决方案它可以由人力计算或机械计算完成。然而在人力/机械计算时代,还未形成通用计算设备编程的思想。
\subsection{电子计算时代}
@ -90,10 +90,10 @@ 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}、智能化和网构化~\cite{Mei:2016:INS:3086926}的方向发展。%,形成一系列的支撑软件。
\subsubsection{以抽象为主线的软件学科发展\xxm{改了下组织,请审阅}}
\subsubsection{以抽象为主线的软件学科发展}
软件抽象是理解软件学科及其发展的关键。
一方面,软件抽象是软件开发者认识问题、表达并实现解决方案的语汇,是软件学的核心研究对象和软件工程的主要工具。软件抽象影响乃至决定了软件认知和表达的边界。
一方面,软件抽象是软件开发者认识问题、表达并实现解决方案的语汇,是软件学的核心研究对象和软件工程的主要工具。软件抽象影响乃至决定了软件认知和表达的边界。
另一方面,作为一门方法论学科,帮助开发者驾驭软件开发的复杂性始终是中心问题,而抽象是驾驭复杂性的主要手段。
软件抽象是软件学科知识沉淀的载体和发展进步的标志;无论是系统软件还是工程方法,均以其支撑或使用的软件抽象为主要特征。
@ -107,7 +107,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
软件抽象设施集中体现在各种软件语言,特别是以程序设计语言和建模语言,也包括程序框架、编程接口等。
从结构上看,基于认知程度的不同,高层抽象可以分解为低层抽象,底层抽象可以组合或聚集为高层抽象,抽象之间还有不同语义保持度的转换。
在问题空间、解空间和平台空间表述时,都可以建立或者定义所需的抽象,也可以使用已定义的抽象表述对象或者实现一个新定义的抽象。
软件范型为软件工程师(或程序员)提供 一套具有内在一致性的软件抽象体系,具化为一系列软件模型及其构造原理\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}
软件范型为软件工程师(或程序员)提供 一套具有内在一致性的软件抽象体系,具化为一系列软件模型及其构造原理~\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}
换个角度看,软件抽象的重要性也体现在它是驾驭软件复杂性的基本手段。可以说软件是人类制造的最复杂的一类制品。
%而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软件。不同层次的抽象、抽象的计算实现和使用组成了软件发展的脉络。我们试图以软件各种抽象为主线来梳理和汇聚软件发展的基本历程。
@ -142,7 +142,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
与命令式程序设计语言不同50年代末人们还探索了声明式程序设计语言其代表是基于$\lambda$~演算的函数式语言LISP~\cite{McCarthy:1978:HL:800025.1198360}、基于Horn子句的Prolog~\cite{Colmerauer:1993:BP:154766.155362}、基于关系演算的SQL~\cite{Chamberlin:2012:EHS:2420618.2420665}等。以LISP为例它提供了用于问题求解的函数抽象首次在语言中支持递归函数定义。LISP的设计思想深刻地影响了ML~\cite{Gordon:1978:MIP:512760.512773}、Haskell~\cite{Hudak:2007:HHL:1238844.1238856}等函数式程序设计语言~\cite{Backus:1978:PLV:359576.359579}的发展。
随着人们对程序设计安全可靠、便捷有效等要求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范的融合例如面向对象语言和函数式语言相融合并支持并发、安全计算出现了Scala、Rust等程序设计语言展现了强劲的势头另一方面是面向特定领域的语言受到了重视它们针对领域应用提供高效便捷的抽象例如面向大数据处理的Map\-Reduce~\cite{Dean:2008:MSD:1327452.1327492}、面向区块链智能合约的Solidity~\cite{SolidityDoc2020}等。
随着人们对程序设计安全可靠、便捷有效等要求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范的融合例如面向对象语言和函数式语言相融合并支持并发、安全计算出现了Scala、Rust等程序设计语言展现了强劲的势头另一方面是面向特定领域的语言受到了重视它们针对领域应用提供高效便捷的抽象例如面向大数据处理的Map\-Reduce~\cite{Dean:2008:MSD:1327452.1327492}、面向区块链智能合约的Solidity~\cite{SolidityDoc2020}等。
程序设计语言向上要表达问题求解方法向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和围绕问题求解的计算理论成为了软件理论的重要部分。从ALGOL 60开始关于程序构造的理论研究就开始了其基本内容是在计算理论的基础上建立程序的形式语义并对程序及其性质进行推理其本质是基于数学的方法来建立抽象及抽象之间的联系~\cite{floyd:1967:assigning, 陆汝钤:2017:计算系统的形式语义}。在上世纪60年代到70年代人们建立了程序设计语言的操作语义、公理语义、指称语义和代数语义。
%程序语言与形式语义的研究紧密联系例如1974年Barbara Liskov提出了抽象数据类型的程序设计思想~\cite{Liskov:1974:PAD:800233.807045},建立了现代面向对象语言的核心特征,包括强类型检查和通用类型支持,支持了对象化方法语言中的类抽象。
@ -159,7 +159,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
%例如用多层次的软件栈来定义复杂系统。
%为了应对操作系统设计中可靠性、安全性、可配置、可扩展和多处理器程序设计等挑战微软的Singularity OS的首要任务开发新的抽象包括平台的抽象指令集、操作系统和应用统一可扩展的体系结构和一阶的应用抽象特别是应用抽象可递归地应用到操作系统自身包括内核和其他OS构件。Singularity OS的后继Midori OS支持了微软西海岸和亚洲的自然语言搜索服务。Midori表明了合理的抽象和软件栈能在内存、类型和并发安全之上构建系统和应用性能和安全并不是对立的。
20世纪60年代操作系统出现之初主要是解决在计算机上加载和运行程序、以及设备驱动、输入输出控制等工作。随着
20世纪50-60年代操作系统出现之初主要是解决在计算机上加载和运行程序、以及设备驱动、输入输出控制等工作。随着
集成电路的兴起增强了计算机的能力CPU和外设的性能差异突出高效地共享和管理硬件、发挥硬件效能成为操作系统重要驱动力。为此先后产生了多道程序设计、分时、实时等操作系统技术系统设计变得复杂能力也变得强大。著名的系统有IBM S/360的操作系统。以操作系统设计为矛盾焦点之一人们意识到了“软件危机”。软件的复杂性驾驭成为了一个至今仍在的挑战。70年代UNIX操作系统及其家族的发展和成熟成为当今主机操作系统的基础。80年代随着商业计算和微处理器时代到来出现了一批微型计算机和工作站操作系统其代表是MS-DOS、Linux、Solaris和Windows等。90年代在``网络就是计算机"的理念推动下以主机和微机操作系统为基础以桥接异构的互联互通互操作为主要目标的中间件和网络化操作系统成为系统软件的增长点。进入新世纪后以iOS和Android代表的移动操作系统与主机操作系统向数据中心扩展所形成的云操作系统一同构建了云端计算系统软件的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。可见追求充分发挥硬件的能力利用软件抽象技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是驱动着系统软件发展的动力。
由于应用范围的迅速拓展,数据量及其复杂性迅猛增长,数据资源成为了重要管理对象。用于数据资源的抽象、操作和管理的数据库管理系统渐渐分离出来成为系统软件相对独立的部分。
@ -223,25 +223,25 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
\textbf{理论方法}
理论方法首先给出软件对象的定义描述,并假设它们之间可能的联系,通过证明来判断这些联系是否成立,并解释所得到的结果。源于以图灵机为代表的形式化计算模型的奠基性贡献,使得数学一开始就进入了计算机理论研究。通过建立形式理论、推理获得结果并解释结果,形成了软件作为数学对象来研究和开发的方法学。这种方法提供了开发模型并理解模型边界的分析框架,在软件正确性方面发挥了重要作用。理论方法根植于数学,将软件视作数学对象开展研究。
理论方法首先给出软件对象的定义描述,并假设它们之间可能的联系,通过证明来判断这些联系是否成立,并解释所得到的结果。源于以图灵机为代表的形式化计算模型的奠基性贡献,使得数学一开始就进入了计算机理论研究。通过建立形式理论、推理获得结果并解释结果,形成了软件作为数学对象来研究和开发的方法学。这种方法提供了开发模型并理解模型边界的分析框架,在软件正确性方面发挥了重要作用。理论方法将软件视作数学对象开展研究。
\textbf{实验方法}
实验方法属于实验科学方法。它首先基于假设构造一个模型,通过对实验成果的统计/量化度量和分析,来确认所获得的模型。例如,为评价一种软件开发的新方法或者工具,需要通过建立假设条件下的模型,\xxm{不需要进行实际实验吗?} 开展度量和分析,以说明方法和工具较已有方法的先进性。实验方法源自于自然科学和社会科学方法。对于软件学科的研究,可以利用计算的手段开展软件的实验研究,亦即仿真,\xxm{计算机仿真只是实验中的一类吧?}包括用软件模拟软件的模型方法或用数据科学方法来研究软件及其环境的现象和方法。
实验方法属于实验科学方法。它首先基于假设构造一个模型,通过对实验成果的统计/量化度量和分析,来确认所获得的模型。例如,为评价一种软件开发的新方法或者工具,需要通过建立假设条件下的模型,开展实验、度量和分析,以说明方法和工具较已有方法的先进性。实验方法源自于自然科学和社会科学方法。对于软件学科的研究,可以利用计算的手段开展软件的实验研究,亦即仿真,包括用软件模拟软件的模型方法或用数据科学方法来研究软件及其环境的现象和方法。
\textbf{设计方法}
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,源于面向问题,通过系统的设计过程来构造解决方案。
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,面向问题,通过系统的设计过程来构造解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及其之间的联系;实验方法运用实验手段收集数据和实验结果,来预言软件行为并与现实世界比较;设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码逆向到软件抽象模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法\xxm{程序分析应该算理论方法?}。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码逆向到软件抽象模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
%\begin{itemize}
% \item \textbf{举例}:基于大代码的软件自动生成方法就综合软件科学中的理论、实验和设计方法。程序综合是计算机科学的明珠。其理论研究是长期以来的科学问题。演绎推理的理论方法是其重要途径,形式规约开始构造一个正确的程序,自动定理证明和归纳综合是其基本思路,并逐步发展到了归纳推理。近来随着海量代码的累积,实验统计的方法逐步兴起,以实验方法从代码数据中学习,建立程序综合和推理的启发式预言有效地提高了综合效率。以归纳推理和统计推理相结合的程序综合设计方法成为了当前软件自动化研究的重要趋势,在代码自动生成、代码修复、人机协同编程等方面取得了重要进展。
%\end{itemize}
\subsection{软件学科的基本架构\xxm{粗改了一遍}}
\subsection{软件学科的基本架构}
%出于不同目的考虑学科可有不同的划分。从目前我国人才培养一级学科划分看软件学科横跨了计算机科学与技术软件工程、网络空间安全等三个一级学科。特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。与本国际本科计算教育学科相比软件学科横跨了ACM/IEEE计算教程等五个学科即计算机科学、计算机工程、软件工程、信息技术、信息系统。它们的覆盖关系如图1-X所示。
%我们着眼于软件学科发展历程的回顾重新梳理就现状划分了三个子领域即程序设计语言与理论、系统软件、软件工程。其中程序设计语言与理论的核心内容是建立抽象系统软件的核心内容是实现抽象软件工程的核心内容是使用抽象。它们与我国目前一级学科、ACM/IEEE计算学科的关系如图1-X所示。
@ -255,13 +255,13 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
\begin{minipage}[t]{0.48\textwidth}
\centering
% \includegraphics[width=5cm]{fig1-1/1-6.png}
\includegraphics[width=5cm]{figs/以范型抽象为中心.pdf}
\includegraphics[width=5cm]{figs/framework.pdf}
\caption{软件学科基本架构}
\label{fig:1-6}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{figs/学科发展.pdf}%{fig1-1/1-7.png}
\includegraphics[width=5cm]{figs/progress.pdf}%{fig1-1/1-7.png}
\caption{软件范型的变迁}
\label{fig:1-7}
\end{minipage}
@ -275,7 +275,7 @@ Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite
一方面,程序设计语言需要提供更有效、有力、更符合人类思维方式的语言设施,以降低软件开发的难度、提高软件制品的质量;
另一方面,这些语言设施又需能被高效地实现以保证软件的执行效率。
软件语言与软件理论紧密关联。
软件理论包括可计算性理论、算法理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。
软件理论包括可计算性理论、算法理论和程序理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。
软件构造方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型研究大型软件系统高质量高效率开发的方法、技术和工具属于软件工程的范畴。软件构造开发是一项困难的任务而困难可区分为实质性Essential的和附属性Accidental的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不足。软件构造方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件构造技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。

View File

@ -1,7 +1,7 @@
% !TEX root = main.tex
\section{概述}
%概念的界定,怎么展开
软件工程师在开发软件系统时,不可避免地要用到某种程序设计语言。顾名思义,程序设计语言\index{程序设计语言}是程序员用来描述程序的语言为程序员表达基于计算的解决方案提供了通用抽象设施。一般来说每种程序设计语言往往具有某种应用背景、所属的语言范式以及各自的个性特征。程序理论作为程序设计语言的基础提供程序抽象及其之间的推理和构造原理不仅可以用于描述程序设计语言的语法、语义还可以支撑程序的正确性构造、指导程序的高效正确的实现。在计算机科学领域曾出现过数百种程序设计语言。近几年TIOBE\footnote{https://www.tiobe.com/tiobe-index/}、IEEE\footnote{https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019} 等给出了目前常用的程序设计语言排名居于前列的包括Java~\cite{arnold2000java}、C~\cite{kernighan2006c}、Python~\cite{van2011python}、C++~\cite{stroustrup2000c++}、C\#~\cite{hejlsberg2006c}、JavaScript~\cite{crockford2008javascript}、PHP~\cite{lerdorf2002programming}等。Sebesta~\cite{sebesta2012concepts}从高级语言机制的设计角度对程序设计语言进行了深入细致的介绍和比较。大多数程序设计语言的创建都受其之前语言概念的启发,而新出现的程序设计语言提供更强更为自然的抽象设施,使程序员的工作变得更加简单、有效。
软件工程师在开发软件系统时,不可避免地要用到某种程序设计语言。顾名思义,程序设计语言\index{程序设计语言}是程序员用来描述程序的语言为程序员表达基于计算的解决方案提供了通用抽象设施。一般来说每种程序设计语言往往具有某种应用背景、所属的语言范式以及各自的个性特征。程序理论作为程序设计语言的基础提供程序抽象及其之间的推理和构造原理不仅可以用于描述程序设计语言的语法、语义还可以支撑程序的正确性构造、指导程序的高效正确的实现。在计算机科学领域曾出现过数百种程序设计语言。近几年TIOBE\footnote{https://www.tiobe.com/tiobe-index/}、IEEE\footnote{https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019} 等给出了目前常用的程序设计语言排名居于前列的包括Java~\cite{arnold2000java}、C~\cite{kernighan2006c}、Python~\cite{van2011python}、C++~\cite{stroustrup2000c++}、C\#~\cite{hejlsberg2006c}、JavaScript~\cite{crockford2008javascript}、PHP~\cite{lerdorf2002programming}等。大多数程序设计语言的创建都受其之前语言概念的启发,而新出现的程序设计语言提供更强更为自然的抽象设施,使程序员的工作变得更加简单、有效。Sebesta~\cite{sebesta2012concepts}从高级语言机制的设计角度对程序设计语言进行了深入细致的介绍和比较。
%程序设计语言的定义可分为语法、语义等方面。语义表示程序的含义,由静态语义和动态语义组成。静态语义指程序编译时可以确定的语法成分的含义;建立在转换/迁移系统上的动态语义则描述程序如何执行。
%
@ -16,7 +16,7 @@
为了便于使用与推广,程序设计语言的设计与实现通常要遵守一定的规则。同时,不同应用的涌现也推动了多种程序设计语言的提出与发展。
\subsubsection{设计}
一般说来,程序语言的设计应该遵守以下原则\footnote{http://people.cs.aau.dk/$\sim$bt/DAT5E07/PrgLDesign.pdf}
一般说来,程序语言的设计应该遵守以下原则:
\begin{itemize}
\item 程序语言的构造方面:
\begin{itemize}
@ -35,9 +35,9 @@
\item 标准性(Standardability):利于程序在不同机器和系统间的移植。
\end{itemize}
\end{itemize}
语言设计是上述几方面原则的综合权衡,在实践中有不同角度,体现不同的侧重点:从程序设计语言理论角度出发设计的语言如Pascal、Ocaml、X10等十分关注语言语义的清晰性、灵活性、简洁性,往往直接反映了理论领域的创新成果;从系统软件与体系结构角度出发设计的语言如图形处理器支持的CUDA,关注如何充分利用系统结构的特点来优化性能;从应用角度出发设计的语言如XML、PHP、Julia等关注与目标应用的契合度以及编程的便易性。
语言设计是上述几方面原则的综合权衡,在实践中有不同角度,体现不同的侧重点:从程序设计语言理论角度出发设计的语言十分关注语言语义的清晰性、灵活性、简洁性,往往直接反映了理论领域的创新成果如Pascal、Ocaml、X10等;从系统软件与体系结构角度出发设计的语言,关注如何充分利用系统结构的特点来优化性能如图形处理器支持的CUDA;从应用角度出发设计的语言关注与目标应用的契合度以及编程的便易性如XML、PHP、Julia等
某些语言如数据库查询语言SQL简洁地表示数据表格间的代数关系\index{代数关系},大幅简化了对数据库\index{数据库}的查询;深度学习编程框架\index{编程框架}TensorFlow~\cite{abadi2016tensorflow}、PyTorch等辅助编程者方便地生成神经网络结构\index{神经网络结构}并根据学习算法自动生成反向神经网络。这些语言或框架追求编程简单性,虽然简化了循环和递归这样的图灵可计算性的关键语句,但仍然反映了一定的程序设计模型\index{程序设计模型}
某些语言如数据库查询语言SQL简洁地表示数据表格间的代数关系\index{代数关系},大幅简化了对数据库\index{数据库}的查询;深度学习编程框架\index{编程框架}TensorFlow~\cite{abadi2016tensorflow}、PyTorch等辅助编程者方便地生成神经网络结构\index{神经网络结构}并根据学习算法自动生成反向神经网络。这些语言或框架追求编程简单性,虽然简化了循环和递归这样的图灵可计算性的关键语句,但仍然反映了一定的程序设计模型\index{程序设计模型}
\subsubsection{实现}
@ -74,7 +74,7 @@
\item 声明式语言\index{非过程化语言}:使用这种语言编码时只需说明“做什么”,不需描述算法细节。数据库查询语言是其中的一种,用户可以对数据库中的信息进行复杂的操作。
\end{enumerate}
在程序设计语言发展最初阶段,程序设计语言按照主要编程范式\index{编程范式},可以被归类为过程式、面向对象、函数式~\cite{hu2015functional}、逻辑式等。随着C++、C\#等语言的出现,传统分类之间的界限逐渐变得模糊。现代的编程语言往往具有若干种类编程语言的元素,这就是所谓的多范式编程语言。而多范式程序设计语言\index{多范式程序设计语言}也是一个越来越明显的趋势。
在程序设计语言发展最初阶段,程序设计语言按照主要编程范式\index{编程范式}可以被归类为过程式、面向对象、函数式、逻辑式等。随着C++、C\#等语言的出现,传统分类之间的界限逐渐变得模糊。现代的编程语言往往具有若干种类编程语言的元素,这就是所谓的多范式编程语言。而多范式程序设计语言\index{多范式程序设计语言}也是一个越来越明显的趋势。
%一个成功的程序设计语言从探索到推广、接受和最终成为行业标准往往经历以下四个阶段:第一阶段,在应用与系统的软件开发过程中不断完善;第二阶段,为提高软件生产率,提供方便灵活的开发工具;第三阶段,行业的积累有助于产生相应的遗产代码资源,并推广资源;第四阶段,随着大量遗产代码开始积累,行业标准成型,行业倾向于使用成熟的程序设计语言。分析程序设计语言所处的发展阶段有助于我们了解甚至预测其发展趋势。
@ -208,7 +208,7 @@ Java语言具有平台独立及可移植性等特点被广泛用于Web应用
%\end{lstlisting}
%其中loop、out是标号从loop到loop、loop到out是描述程序执行的迁移系统中的状态转换关系。\note{迁移规则?}
由操作语义描述串行程序的语义中,状态是一些简单的数据结构,迁移规则一般都是确定的、离散的,也不需要考虑标号间的通信和同步。为了定义复杂程序的操作语义,例如面向对象程序、并发程序、实时程序、概率程序\index{概率程序}、混成系统\index{混成系统}等,人们对迁移系统进行了各种扩充,或扩充它的状态,或扩充它的迁移关系,亦或两者同时扩充。例如,为了定义面向对象程序,人们对程序状态进行扩充,引入堆和栈等复杂数据结构;为了处理并发程序,人们对标号迁移关系进行扩充,使用标号描述通信和同步;为了描述概率和随机程序\index{随机程序},允许以给定的概率或者随机选取迁移规则等。
在描述串行程序语义操作语义中,状态是一些简单的数据结构,迁移规则一般都是确定的、离散的,也不需要考虑标号间的通信和同步。为了定义复杂程序的操作语义,例如面向对象程序、并发程序、实时程序、概率程序\index{概率程序}、混成系统\index{混成系统}等,人们对迁移系统进行了各种扩充,或扩充它的状态,或扩充它的迁移关系,亦或两者同时扩充。例如,为了定义面向对象程序,人们对程序状态进行扩充,引入堆和栈等复杂数据结构;为了处理并发程序,人们对标号迁移关系进行扩充,使用标号描述通信和同步;为了描述概率和随机程序\index{随机程序},允许以给定的概率或者随机选取迁移规则等。
基于抽象机的操作语义易于描述实现方面的执行细节,操作性比较强,适合于语言编译器的开发与编译的优化。此外,操作语义中的状态是显式的、可操作的。在基于状态搜索的模型检验\index{模型检验}方法中,操作语义比较适合描述模型的语义,即状态的变化序列。然而,抽象机上的推理系统比较弱,不易对大规模或无穷状态的系统进行基于演绎推理\index{演绎推理}的形式验证。

View File

@ -11,7 +11,7 @@
\item 系统软件是驱动计算系统有效运转的控制器/协调者。一方面系统软件与计算系统中各类硬件资源直接交互管理、调度和使用这些资源使之可以高效协同另一方面系统软件也直接管控上层应用的运行从而达到提高程序装载和调度的自动化程度、提高资源利用率等目标。例如操作系统可以通过批处理、分时共享等方法来实现计算系统的任务切换因此早期也被称为“监督程序”Supervisory Program或“控制程序/例程”Control Program/Routine\cite{bullynck2018operating}
\end{itemize}
系统软件并不是与计算机一起诞生的它的出现有内因和外因两个方面。早期的计算机如ENIAC编程采用接线和开关等手工操作方式并没有系统软件的概念。即使存储程序计算机出现之后除了汇编器等带有系统软件思想的工具外操作系统等主流系统软件并未马上出现应用软件仍是直接在裸机上运行。但是人们很快认识到将应用与硬件机直接绑定,无论是编程效率、应用管理/切换效率还是底层资源利用率都十分低下。特别是早期CPU速度和I/O速度之间的巨大差异基于时分复用的“虚拟化”成为客观需求推动了系统软件、尤其是操作系统的快速发展。系统软件出现的外因则是软件复杂性增长所导致的分工细化特别是上个世纪50-60年代面向底层硬件资源的系统程序设计System Programming和面向领域的应用程序设计Application Programming的分化以及系统程序员和应用程序员的分工直接推动了系统软件这一概念的广泛接受。
系统软件并不是与计算机一起诞生的它的出现有内因和外因两个方面。早期的计算机如ENIAC编程采用接线和开关等手工操作方式并没有系统软件的概念。即使存储程序计算机出现之后除了汇编器等带有系统软件思想的工具外操作系统等主流系统软件并未马上出现应用软件仍是直接在裸机上运行。但是人们很快认识到将应用与硬件机直接绑定,无论是编程效率、应用管理/切换效率还是底层资源利用率都十分低下。特别是早期CPU速度和I/O速度之间的巨大差异基于时分复用的“虚拟化”成为客观需求推动了系统软件、尤其是操作系统的快速发展。系统软件出现的外因则是软件复杂性增长所导致的分工细化特别是上个世纪50-60年代面向底层硬件资源的系统程序设计System Programming和面向领域的应用程序设计Application Programming的分化以及系统程序员和应用程序员的分工直接推动了系统软件这一概念的广泛接受。
\section{操作系统}
从功能定位的角度而言,操作系统\index{操作系统}是负责管理硬件资源、控制程序运行、改善人机界面和为应用提供支持的系统软件,是计算机软件生态链的基础核心。在一个计算系统中,操作系统向下是最靠近硬件的一层软件,它通过调用硬件驱动程序、固件等方式实现对硬件的管理;向上屏蔽硬件细节,为应用软件提供功能更为完善、灵活可编程的“虚拟机”,实现对各类应用软件的运行管理。因此,操作系统兼具“承上启下”和“管家”两类作用。由于操作系统的特殊地位,其发展与上层应用需求和底层硬件形态的演化都有着密切联系。从最初与硬件和应用场景高度绑定,到之后逐渐独立于硬件,操作系统向上提供的服务越来越多、向下针对硬件的抽象程度越来越高,其内涵和外延不断拓宽,并在积累一段时间后产生质变,呈现出主机计算、个人计算、互联网和移动计算等明显阶段性特点(图\ref{fig:3-1})。

View File

@ -10,9 +10,9 @@
随着信息技术的发展软件技术的应用范围不断扩大应用领域不断深入50年前的软件和现代软件已经不可同日而语在最初出现软件的时候没有人能预计到现在人们对软件的期望也没有人能想象出通过互联网\index{互联网}和物联网\index{物联网},未来人机物融合\index{人机物融合}系统将会在各类场合服务于广大民众。50年前的核心挑战仍然还是软件工程当前的核心挑战问题的表述几乎没有变化只是被赋予了不同的内涵。“软件开发没有银弹” 的预言仍是软件工程研究者和实践者不可逾越之“墙”。
\section{软件工程内涵和知识结构}
什么是软件工程?如何理解软件工程?软件工程Software Engineering 是应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度实现满足用户要求的软件产品的工程,或以此为研究对象的学科~\cite{张效祥2005计算机科学技术百科全书}。其主要强调的是,是用\textbf{工程化}\textbf{系统化}的方法进行\textbf{软件开发}~\cite{Laplante:2007}
软件工程Software Engineering 是应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度实现满足用户要求的软件产品的工程,或以此为研究对象的学科~\cite{张效祥2005计算机科学技术百科全书}。其主要强调的是,是用\textbf{工程化}\textbf{系统化}的方法进行\textbf{软件开发}~\cite{Laplante:2007}
软件工程关注软件生产各个方面的工程学科~\cite{IanSommerville:1982},以下广泛流行的说法从不同的角度表述了软件工程的主要关注点,比如:
软件工程关注软件生产各个方面~\cite{IanSommerville:1982},以下广泛流行的说法从不同的角度表述了软件工程的主要关注点,比如:
\hangafter=1
\setlength{\hangindent}{2.6em}
@ -38,7 +38,7 @@
\setlength{\hangindent}{2.6em}
• 软件工程关注大型程序的构造,协作是大型程序设计的主要机制,中心主题是控制复杂度,管理软件的进化~\cite{van2008software}
从问题求解的角度Dines Bjorner对软件工程有独特的理解。他认为~\cite{Dines2010software}理解软件工程需要同时回答“how”如何进行和“what”要做什么。软件工程应该是艺术、规范、工艺、科学、逻辑、和实践的结合首先需要基于科学的洞察去综合即构建和构造软件其次需要分析即学习和研究现有软件技术以探清和发现可能的科学内容。他特别强调的几个与众不同的关注点包括第一软件工程是一门学科它把数学知识加以判断和优化\xxm{数学知识加以判断和优化 -- 何义?请确认。}成为数学理论的应用方式目的是1理解问题领域2解决现实问题3为这些通过计算来解决的问题开发计算系统建立软件解决方案第二软件工程应包含三个分支1领域工程\index{领域工程}理解问题领域2需求工程\index{需求工程}理解问题及其解决方案的框架3软件设计\index{软件设计}(实现想要的解决方案)。
从问题求解的角度Dines Bj$\phi$rner对软件工程有独特的理解。他认为~\cite{Dines2010software}理解软件工程需要同时回答“how”如何进行和“what”要做什么。软件工程应该是艺术、规范、工艺、科学、逻辑、和实践的结合首先需要基于科学的洞察去综合即构建和构造软件其次需要分析即学习和研究现有软件技术以探清和发现可能的科学内容。他特别强调的几个与众不同的关注点包括第一软件工程是一门学科它把数学知识加以判断和优化成为数学理论的应用方式目的是1理解问题领域2解决现实问题3为这些通过计算来解决的问题开发计算系统建立软件解决方案第二软件工程应包含三个分支1领域工程\index{领域工程}理解问题领域2需求工程\index{需求工程}理解问题及其解决方案的框架3软件设计\index{软件设计}(实现想要的解决方案)。
综上所述,软件工程要解决的问题是\textbf{如何高效高质地开发出符合要求的产品}。其中包含三个方面的含义。第一,软件工程的产出是一类产品,其产品形态是\textbf{软件},这决定了软件工程学科的研究对象。第二,软件工程需要高效高质地开发出这类产品,工程化是使产品开发得以高效高质的手段,一般依赖于管理有序的\textbf{生产过程},其中要依据合适的\textbf{方法},以及可操作的\textbf{质量保障手段}。这构成了窄义软件工程学科的研究范畴。第三,软件产品要用于解决现实世界的\textbf{领域相关问题},它的使用要能为相关领域带来\textbf{价值},进一步地,对领域价值的评判超出狭义软件工程的范畴,其范畴扩展到了应用领域中,因此,\textbf{领域工程}进入广义软件工程学科范畴,同时,\textbf{需求工程}成为领域工程和狭义软件工程之间的桥梁。
@ -55,7 +55,7 @@
\label{fig:se1}
\end{figure}
\ref{fig:se1}还列举了与软件工程有适度交叉的学科领域,包括:计算机科学与技术是软件工程的技术支撑。数学提供了软件工程研究,特别是定量研究中所需的数学工具和理论支撑。管理科学和生态学为复杂软件系统的系统化和工程化管理,以及软件开发和应用生态的建立和可持续发展提供指导。系统科学\index{系统科学}是软件工程应对复杂领域问题的系统方法学。在成为人类社会生活的基础设施后,软件系统还需要遵循或受到各项法律法规的约束。
\ref{fig:se1}还列举了与软件工程有适度交叉的学科领域,包括:计算机科学与技术是软件工程的技术支撑。数学提供了软件工程研究,特别是定量研究中所需的数学工具和理论支撑。管理科学和生态学为复杂软件系统的系统化和工程化管理,以及软件开发和应用生态的建立和可持续发展提供指导。系统科学\index{系统科学}是软件工程应对复杂领域问题的系统方法学。在成为信息社会的基础设施后,软件系统还需要遵循或受到各项法律法规的约束。
\section{软件工程设计和实现}
从研究布局角度看,软件系统设计和实现可以分为软件工程方法、软件工程过程、软件质量保障、以及软件工程工具等四个维度。本节分别从这几个维度进行介绍。
@ -153,7 +153,7 @@
软件是一种人工制品需要有相应的质量保障Software Quality Assurance, SQA机制包括监控软件工程过程以确保质量。软件质量保障涵盖整个软件开发过程包括需求定义、软件设计、编码、源代码控制、代码审查、软件配置管理、测试、发布管理和产品集成等。
\subsubsection{软件质量体系}
软件质量是反映软件系统或产品满足明确或隐含需求能力的特性的总和。有四个方面的含义: 其一,能满足给定需要的特性的全体;其二,具有所期望的各种属性的组合的程度;其三,用户觉得能满足其综合期望的程度;其四,软件的组合特性\xxm{组合特性--何义?另外,本段似乎是翻译而来,不易读,又没参考文献,请确认。},它确定软件在使用中将满足顾客预期要求的程度。软件质量常常用下列特性来评价:
软件质量是反映软件系统或产品满足明确或隐含需求能力的特性的总和。有四个方面的含义: 其一,能满足给定需要的特性的全体;其二,具有所期望的各种属性的组合的程度;其三,用户觉得能满足其综合期望的程度;其四,软件的组合特性,它确定软件在使用中将满足顾客预期要求的程度。软件质量常常用下列特性来评价:
\begin{itemize}
\item 功能性:当软件在指定条件下使用时,软件产品提供满足明确和隐含需求的功能的能力。
@ -175,7 +175,7 @@
还有一系列标准用于监控和评估软件生产过程过程以支持软件质量的提升ISO/IEC 15504\footnote{https://www.iso.org/standard/38932.html}其第一个版本专注于软件开发过程后来扩展到涵盖软件业务中的所有相关流程例如项目管理配置管理质量保障等是成熟度模型的参考模型评估者可以根据模型在评估期间收集证据全面确定所开发产品软件系统和IT服务的能力。其更新版本是ISO/IEC 33000\footnote{https://www.iso.org/standard/54175.html}。其它质量标准还包括ISO/IEC 25000\footnote{https://www.iso.org/standard/64764.html}、ISO/IEC/IEEE 29119\footnote{https://www.iso.org/standard/45142.html}等。
\subsubsection{形式规约和验证}
\subsubsection{形式规约和验证}
除了采用工程方法来组织、管理软件的开发过程,并根据标准检验过程的正确性外。还有一类工作就是深入探讨程序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践,这类工作推动了形式化方法的深入研究,其目标是以严格的数学推演为基础,通过对系统的形式规约、验证和逐步精化来构造并实现软件,从而提高软件设计的可靠性和鲁棒性。其中,形式规约是使用形式语言构建所开发的软件系统的规约,对应软件生命周期不同阶段的制品,刻画系统不同抽象层次的模型和性质。形式化开发就是构造并证明形式规约和形式模型之间的等价转换和精化关系,以系统的形式模型为指导,通过逐步精化,最后开发出满足需要的系统,也称为保证正确性的构造(Correctness by Construction)。
\subsubsection{软件分析和软件测试}
@ -186,7 +186,7 @@
\subsection{软件工程工具}
软件工程工具,或软件工具,是用来辅助计算机软件的开发、运行、维护、管理、支持等过程中活动或任务的一类软件。早期的软件开发所用到的引导程序、装入程序、编辑程序等都可以看作是最早的软件工具。在汇编语言和高级程序设计语言出现以后,汇编程序、解释程序、编译程序、连接程序和排错程序构成了早期的软件工具集。在软件工程出现后,支持软件需求分析、设计、编码、测试、维护和管理等活动的软件工具逐渐发展起来,从各个阶段支持着软件开发过程,并且自然而然出现了工具集成的需要,使得各个工具能够协同操作。
软件开发环境由软件工具和环境集成机制构成,是支持软件产品开发的软件系统~\cite{张效祥2005计算机科学技术百科全书}。软件开发环境在工具集成的需求中开始萌芽上世纪70年代中后期出现了软件工具箱Toolkit的思想在软件开发过程中使用成套的多个软件工具。80年代起出现了支持图形设计方式的第二代软件工具和集成这些工具为一体的软件开发环境采用环境信息库支持软件开发模型和开发方法并且集成机制有了较大发展。90年代开始出现支持面向对象方法和技术的软件开发环境。我国“七五”“八五”科技攻关中研制的青鸟软件开发环境\index{青鸟软件开发环境},是当时先进的软件开发环境,具有较为完善的集成化软件开发支撑能力。
软件开发环境由软件工具和环境集成机制构成,是支持软件产品开发的软件系统~\cite{张效祥2005计算机科学技术百科全书}。软件开发环境在工具集成的需求中开始萌芽上世纪70年代中后期出现了软件工具箱Toolkit的思想在软件开发过程中使用成套的多个软件工具。80年代起出现了支持图形设计方式的第二代软件工具和集成这些工具为一体的软件开发环境采用环境信息库支持软件开发模型和开发方法并且集成机制有了较大发展。90年代开始出现支持面向对象方法和技术的软件开发环境。我国“七五”“八五”“九五”科技攻关中研制的青鸟软件开发环境\index{青鸟软件开发环境},是当时先进的软件开发环境,具有较为完善的集成化软件开发支撑能力。
21世纪以来随着互联网和移动通信的普及软件工具和软件开发环境的用途和种类进一步拓展出现了支持软件国际化、软件开发协同工作、开源软件库和开源社区环境以及支持互联网、物联网和云计算的基础软件和应用测试支撑工具。软件开发环境不仅支持时间上的松耦合开发还支持空间上的分布开发并且开始以协同开发思想为基础更强调多相关方、多工具、多活动的协同开发支撑使得软件产品相关的所有利益相关方能在互动的软件开发协作过程中实现包括需求管理、项目管理、软件部署和运行监控等活动在内的完整的软件生存周期过程支撑。
@ -214,7 +214,7 @@
软件管理工具特指在软件开发过程中使用的不直接产出软件中间制品或最终制品的辅助工具。软件管理工具主要面向软件开发管理人员同时也服务于软件开发活动所有参与者。这些辅助工具包括项目进度管理工具如MS Project、软件版本管理工具如SVN、Git、ClearCase、在线细粒度任务安排和看板工具等对软件开发过程、制品进行。从软件工程概念提出依赖采用工程化的管理手段使得软件的开发过程变得可见、可控、可度量、可预测是这些工具的终极目标之一。这些工具随着软件工程学科发展和研究内容的变化而不断改进新的工具不断涌现体现了软件工程学科的活力。例如随着敏捷方法被软件工程实践逐步接受以软件工具形式出现的看板软件也发展起来开始作为传统的物理看板的补充在异地分布式团队等场景中广泛地使用。尽管目前此类软件仍然存在诸如易用性、可配置性等缺陷但作为新兴的软件工程工具若能通过触摸交互式高分辨率显示等技术改进实现随时随地的交互那么对精准高效地管理团队内部人员的开发进度、协调团队交互沟通都会具有非常重要的价值应用前景非常广阔。
\section{需求工程和领域工程}
当软件变得复杂,需要对软件的需求进行分析,以此构造综合性的问题求解方案,当软件系统变得更加复杂,则需要有一整套的过程和相应技术,指导和帮助软件开发人员系统化地进行用户的需求识别和分析,确定软件能力需求,从而构造问题场景的整体的解决方案。从而出现独立的研究方向:需求工程~\cite{pohl2010requirements}。需求工程有三个关注点:环境(可改进点)、期望需求(关注的改进方面)和软件系统需求(可实现性)。
当软件变得复杂,需要对软件的需求进行分析,以此构造综合性的问题求解方案,当软件系统变得更加复杂,则需要有一整套的过程和相应技术,指导和帮助软件开发人员系统化地进行用户的需求识别和分析,确定软件能力需求,从而构造问题场景的整体的解决方案。从而出现独立的研究方向:需求工程~\cite{pohl2010requirements}。需求工程有三个关注点:环境(可改进点)、期望需求(关注的改进方面)和软件系统需求(可实现性)。
简单说,需求工程就是:现实世界中存在需要解决的问题、可改进的地方、或者可能蕴含的机会等,然后在圈定的范围内认知并明确刻画出想要解决的问题,最后依据当前可行的信息技术手段,设计出问题求解的方案,并认证该解决方案的可行性和有效性。因此需求工程的主要任务就是观察现实世界机会、识别和定位现实需求、分析和建模软件需求、验证和管理软件需求等。
@ -224,7 +224,7 @@
\scriptsize
\caption{代表性需求工程方法}
\label{table:chapter4-1}
\begin{tabular}{|p{0.07\textwidth}<{\centering}|p{0.2\textwidth}<{\centering}|p{0.3\textwidth}<{\centering}|p{0.3\textwidth}<{\centering}|}%
\begin{tabular}{|p{0.07\textwidth}<{\left}|p{0.2\textwidth}<{\left}|p{0.3\textwidth}<{\centering}|p{0.3\textwidth}<{\centering}|}%
\hline
方法& 问题视角& 需求建模原则& 软件需求获取手段\\
\hline

View File

@ -19,7 +19,7 @@
\begin{figure}[ht]
\centering
\includegraphics[scale=0.5]{fig1-5/fig1.png}
\includegraphics[scale=0.4]{fig1-5/fig1.png}
\caption{软件产业生态构成示意}\label{fig:fig1-5-1}
\end{figure}
@ -28,7 +28,7 @@
\begin{figure}[ht]
\centering
\includegraphics[scale=0.4]{fig1-5/fig2.png}
\includegraphics[scale=0.8]{fig1-5/fig2.png}
\caption{软件产业发展历史概览}\label{fig:fig1-5-2}
\end{figure}
@ -100,20 +100,20 @@
\subsection{开发视角的软件产业生态}
软件开发是软件产业的重要环节,软件开发者是软件产业生态的重要参与者。从软件开发的视角来看,软件生产的方式不断演进,带来了软件产业的发展和变革。软件产业的发展离不开软件开发工具与环境以及软件开发过程与方法的进步,同时,软件开发相应的工具、环境、方法、技术也形成了富有特色的子产业,并形成一种推动软件产业本身发展的重要动力。软件开发工具既能用来开发软件产品,同时其自身也是一类软件产品,构成软件产业重要组成部分。本节将从软件开发活动所形成的软件产业的角度,回顾软件工具\index{软件工具}与软件开发方法的产业影响,分析不同阶段软件开发技术对软件产业发展的支撑。
从产业发展规律而言,规模化的软件生产是软件产业产生和发展的重要条件。而软件工具的产生对提升软件开发、运行、维护等过程的效率具有重要的作用,是规模化软件生产的前提。早期的软件工具主要是特定计算机主机上的专用程序。汇编语言和高级程序设计语言出现后,汇编程序、解释程序、编译程序等工具大大提升了软件开发效率\cite{百科全书}。到20世纪六十年代随着软件工程思想的出现和发展软件工具开始覆盖软件开发的各个过程出现了需求分析工具、设计工具、编程工具、测试工具以及项目管理工具、配置管理工具等多种CASE工具并出现了工具箱toolkit的思想。随着工具种类的增加软件开发过程中所用到的工具的单独使用不再能满足复杂软件开发过程的需要工具间的交互和集成需求催生了软件开发环境\index{软件开发环境}。软件开发环境可以看成是通过集成机制集成了多种软件工具的软件在软件开发过程中能极大提升软件开发的效率和质量因此越来越受到业界的重视。各类集成开发环境IDE\index{集成开发环境}与开发套件、插件被研制出来。从20世纪八九十年代起宝蓝Borland、国际商用机器IBM、微软Microsoft等多家软件企业推出了各自的开发工具软件和开发环境以及我国“七五”“八五”国家科技攻关项目研制的集成化开发环境“青鸟”系统不仅包括以编程为中心的开发调试工具还提供软件版本管理、配置管理、团队协作、需求和设计建模、项目管理等特性形成了多种工具和环境在市场中的协同与竞争局面。直至今日各类开发工具以及开发环境软件仍然是软件产业的重要组成部分。可见软件技术的进步推动着软件开发工具产业的持续发展而开发工具产业生态的兴盛也支撑着软件技术的不断提升与改进。
从产业发展规律而言,规模化的软件生产是软件产业产生和发展的重要条件。而软件工具的产生对提升软件开发、运行、维护等过程的效率具有重要的作用,是规模化软件生产的前提。早期的软件工具主要是特定计算机主机上的专用程序。汇编语言和高级程序设计语言出现后,汇编程序、解释程序、编译程序等工具大大提升了软件开发效率\cite{张效祥2005计算机科学技术百科全书}。到20世纪六十年代随着软件工程思想的出现和发展软件工具开始覆盖软件开发的各个过程出现了需求分析工具、设计工具、编程工具、测试工具以及项目管理工具、配置管理工具等多种CASE工具并出现了工具箱toolkit的思想。随着工具种类的增加软件开发过程中所用到的工具的单独使用不再能满足复杂软件开发过程的需要工具间的交互和集成需求催生了软件开发环境\index{软件开发环境}。软件开发环境可以看成是通过集成机制集成了多种软件工具的软件在软件开发过程中能极大提升软件开发的效率和质量因此越来越受到业界的重视。各类集成开发环境IDE\index{集成开发环境}与开发套件、插件被研制出来。从20世纪八九十年代起宝蓝Borland、国际商用机器IBM、微软Microsoft等多家软件企业推出了各自的开发工具软件和开发环境以及我国“七五”“八五”国家科技攻关项目研制的集成化开发环境“青鸟”系统不仅包括以编程为中心的开发调试工具还提供软件版本管理、配置管理、团队协作、需求和设计建模、项目管理等特性形成了多种工具和环境在市场中的协同与竞争局面。直至今日各类开发工具以及开发环境软件仍然是软件产业的重要组成部分。可见软件技术的进步推动着软件开发工具产业的持续发展而开发工具产业生态的兴盛也支撑着软件技术的不断提升与改进。
与此同时开源集成开发环境也在不断发展逐渐形成以开源和协作为特色的软件产业生态并派生出特有的商业模式。Eclipse是一个典型的例子。Eclipse最初由IBM公司主导开发并于2001年开源随后转由非盈利组织Eclipse基金会管理至今。Eclipse项目架构设计灵活其开源引起了广泛的关注并得到上百家大型软件企业的参与与贡献。围绕Eclipse这个开源集成开发环境开源社区的开发者和参与开源社区贡献的软件企业纷纷为该产品开发插件并得到集成和推广。在此基础上Eclipse衍生出了MyEclipse等商用版本以及IBM Rational Software Architect等多种工具软件。此类工具面向软件开发者的不同开发需求提供不同层次的解决方案和开发环境。这类软件生态往往以开源为核心通过良好设计的、具有可扩展性的软件体系结构构展现了软件的良好生命力并且在开源环境下不断发展同时采用合适的开源许可证允许衍生出商业产品并通过商业产品的应用与开源版本实现协同的演进。
从闭源到开源,是软件开发模式的重大革新。软件企业逐步认识到开源以及开源软件在开发模式上的独特优势,越来越多地参与到开源运动中,在贡献开源项目的同时,还建立起商业和开源混合的项目,形成了多种开源协同模式,并通过各类开源许可证\index{开源许可证}规范开源软件的开发、发布和销售。个人开发者和企业开发者共同驱动并搭建了开源软件开发技术框架与平台,建立起开源软件生态系统,在开发模式上体现出“无偿贡献、用户创新、充分共享、自由协同、持续演化”的新特征\cite{梅宏2016开源软件生态_研究与实践}\cite{金芝2016开源软件与开源软件生态}。在软件企业和开发者个人的共同参与下,开源软件给软件产业的所有参与者建立起复杂的利益关联,丰富了软件产业生态,形成了特有的协作模式和商业模式,并推动软件技术的持续发展。
随着软件产品日益复杂开发人员的协同工作更为重要。在协同开发环境下涉及到不同的开发团队、不同的开发资源如何协调的问题。例如对协同开发的软件代码需要有相应的版本控制软件。在版本控制领域除了经典的ClearCase、Perforce等商业工具之外还产生了CVS、SubVersion等开源免费工具。由于软件开发的社会化协作程度越来越高分布式版本管理系统逐渐替代中央控制的版本管理系统成为主流。其中的典型代表是git和mercurial。社会化编程的兴起又对版本控制之外的社会化协作产生了新的需求催生了一大批诸如GitHub、Gitlab、Bitbucket、Coding等国内外的开发者社区及协作服务提供商。同时在线可获取的软件开发技术资料降低了软件开发人员的学习成本也提升了软件开发效率大大繁荣了软件市场。以苹果和谷歌为代表的软件企业建立起应用商店App Store模式为多种软件的发布和销售提供了平台。尽管这两家企业采用了封闭和开放两种不同的商业模式但都极大地丰富了软件的种类简化了软件的使用引来其他软件企业纷纷效仿推动了整个产业生态的扩展。
随着软件产品日益复杂开发人员的协同工作更为重要。在协同开发环境下涉及到不同的开发团队、不同的开发资源如何协调的问题。例如对协同开发的软件代码需要有相应的版本控制软件。在版本控制领域除了经典的ClearCase、Perforce等商业工具之外还产生了CVS、SubVersion等开源免费工具。由于软件开发的社会化协作程度越来越高分布式版本管理系统逐渐替代中央控制的版本管理系统成为主流。其中的典型代表是git和mercurial。社会化编程的兴起又对版本控制之外的社会化协作产生了新的需求催生了一大批诸如GitHub、Gitlab、Bitbucket、Coding、Trustie等国内外的开发者社区及协作服务提供商。同时在线可获取的软件开发技术资料降低了软件开发人员的学习成本也提升了软件开发效率大大繁荣了软件市场。以苹果和谷歌为代表的软件企业建立起应用商店App Store模式为多种软件的发布和销售提供了平台。尽管这两家企业采用了封闭和开放两种不同的商业模式但都极大地丰富了软件的种类简化了软件的使用引来其他软件企业纷纷效仿推动了整个产业生态的扩展。
在协同化和规模化的软件开发中,支持持续集成\index{持续集成}的自动化工具集提升开发测试的效率,大大缩短了复杂软件的集成和发布周期,有助于保证发布软件的质量。
这些自动化工具既有Bamboo等商业工具也有Jenkins等开源免费工具同时还存在以免费为主体、但具有某些收费高级功能或是面向开源社区免费、但面向商业应用收费的产品如Go、Travis等。此外在配置管理、自动化构建和测试、容器和服务平台、日志管理及监控和告警等领域都出现了许多具有竞争力的产品。
随着一系列软件开发技术和工具的引入,业界进一步推动开发运维一体化\index{开发运维一体化}DevOps引发了更为深刻的技术和文化变革。开发和运维不再彼此独立而是建立了更流畅、更紧密的协作关系丰富着软件开发生态的内涵。从工具链角度支持持续集成、持续交付的开发运维一体化工具链具有端到端的特点基本上囊括了软件开发中从开发到集成交付、从基础运行环境配置到软件配置管理等各个子领域的多种工具的集合也促进了相关子领域的各工具软件产业的繁荣以及生态的兴盛。从开发者角度而言大量的开发工具和开发模式为开发者提供了多种提升开发效率和质量的技术途径同时也带来了更多的技术选择成本和学习成本。如何促进相关软件产业生态良性发展辅助开发人员更专注于需求提升开发效率和交付能力降低学习成本是一个重要的研究问题。
从软件投资方或客户的角度来看如何确保软件供应商提供符合质量要求的软件是一个至关重要的问题。由于软件本身的复杂性和不可见性如果没有规范化的软件开发过程和软件开发能力评价标准就无法形成可信的、规模化的软件生产能力也就无法带来软件的产业化发展。卡内基梅隆大学软件工程研究所CMU/SEI于20世纪80年代后期发布的软件能力成熟度模型CMM最初是为了实现客户对软件供应商能力的评估。随后软件企业意识到该模型对于改进自身的软件开发过程和提升企业软件研发能力的重要作用并基于此模型开展软件开发过程规范化建设。2000年发布的能力成熟度模型集成CMMI一度成为全球大中型软件企业的过程质量标杆为软件产业的规范化标准化写下了浓重的一笔。另外国际标准化组织ISO的ISO 9000质量标准体系以及在20世纪90年代末着手制定软件过程评价标准“软件过程改进和能力确定SPICEISO 15504\cite{百科全书}作为推荐业界实施的软件质量和过程改进国际标准并且也在保持相对稳定地同时随着软件技术的发展而更新。近年来随着软件形态的多样化和各类轻量级软件应用的出现软件快速迭代、快速交付的特性催生了轻量级过程light-weighted process的开发方法如敏捷Agile方法。软件企业根据自身软件开发的特点选择适当的软件开发方法提升自身在软件产业生态中的竞争力。这些模型、标准和方法的出现对软件开发的规范化起到了重要的作用是软件产业健康发展的重要组成部分。
从软件投资方或客户的角度来看如何确保软件供应商提供符合质量要求的软件是一个至关重要的问题。由于软件本身的复杂性和不可见性如果没有规范化的软件开发过程和软件开发能力评价标准就无法形成可信的、规模化的软件生产能力也就无法带来软件的产业化发展。卡内基梅隆大学软件工程研究所CMU/SEI于20世纪80年代后期发布的软件能力成熟度模型CMM最初是为了实现客户对软件供应商能力的评估。随后软件企业意识到该模型对于改进自身的软件开发过程和提升企业软件研发能力的重要作用并基于此模型开展软件开发过程规范化建设。2000年发布的能力成熟度模型集成CMMI一度成为全球大中型软件企业的过程质量标杆为软件产业的规范化标准化写下了浓重的一笔。另外国际标准化组织ISO的ISO 9000质量标准体系以及在20世纪90年代末着手制定软件过程评价标准“软件过程改进和能力确定SPICEISO 15504\cite{张效祥2005计算机科学技术百科全书}作为推荐业界实施的软件质量和过程改进国际标准并且也在保持相对稳定地同时随着软件技术的发展而更新。近年来随着软件形态的多样化和各类轻量级软件应用的出现软件快速迭代、快速交付的特性催生了轻量级过程light-weighted process的开发方法如敏捷Agile方法。软件企业根据自身软件开发的特点选择适当的软件开发方法提升自身在软件产业生态中的竞争力。这些模型、标准和方法的出现对软件开发的规范化起到了重要的作用是软件产业健康发展的重要组成部分。
\section{结束语}

View File

@ -50,7 +50,7 @@
\subsubsection{系统观下的软件学科发展}
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化、服务化\cite{cite网构软件书},以及软件基础设施化都触发了计算平台、软件生产方式和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统Socio-technical System。人机物融合的软件系统其复杂性本身就呈现在系统乃至系统之系统的层面上综合性和系统性也愈来愈强。系统观要求软件科学体系需破除传统还原论的思维藩篱。
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化、服务化\cite{Mei:2016:INS:3086926},以及软件基础设施化都触发了计算平台、软件生产方式和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统Socio-technical System。人机物融合的软件系统其复杂性本身就呈现在系统乃至系统之系统的层面上综合性和系统性也愈来愈强。系统观要求软件科学体系需破除传统还原论的思维藩篱。
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件性能优化甚至软件设计辅助初显端倪。通过对软件代码大数据特别是动态运行大数据的分析,软件性能优化在云计算平台等一些特定场景中获得很大成功。对于数据驱动的软件设计,人们不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是采用一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件部件。这种基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。然而,这些研究仍处于方法层次,还未达到方法论的层次,即关于研究问题需要遵循的途径和研究路线,也可视作具体方法的元级层次。
@ -128,7 +128,7 @@
2安全性
安全性要求为人类活动和生存环境提供必要的安全保障,包括防危安全Safety和信息安全Security。防危安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害信息安全是指系统保护自身免于入侵及信息的非法获取、使用和篡改具体包括机密性、完整性和可用性三方面。本书将两种安全性合二为一统称为安全性Safety \& Security。传统软件质量观将安全视作系统质量的一部分强调确定边界之内的系统安全性。在人机物融合的趋势下软件已经广泛并深入渗透到人类社会生活的方方面面与人形成了密切的交互关系。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播。这些也导致了信息安全问题很容易转化为防危安全问题。软件作为基础设施参与并掌控了很多关键领域的资源其安全性威胁会给整个系统甚至人类社会带来致命的威胁。因此安全性随着软件成为基础设施的现状变得愈发重要。
安全性要求为人类活动和生存环境提供必要的安全保障,包括功能安全Safety和信息安全Security。功能安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害信息安全是指系统保护自身免于入侵及信息的非法获取、使用和篡改具体包括机密性、完整性和可用性三方面。本书将两种安全性合二为一统称为安全性Safety \& Security。传统软件质量观将安全视作系统质量的一部分强调确定边界之内的系统安全性。在人机物融合的趋势下软件已经广泛并深入渗透到人类社会生活的方方面面与人形成了密切的交互关系。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播。这些也导致了信息安全问题很容易转化为防危安全问题。软件作为基础设施参与并掌控了很多关键领域的资源其安全性威胁会给整个系统甚至人类社会带来致命的威胁。因此安全性随着软件成为基础设施的现状变得愈发重要。
3伦理
@ -192,9 +192,9 @@
\section{软件学科的发展趋势}
本书在第一篇总结了软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成有机整体,其中软件范型是软件学科的核心内容范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量评估等各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
本书在第一篇总结了软件学科是由软件语言和理论、软件构造方法、软件运行支撑、软件度量和质量评估等四方面形成有机整体,软件范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件语言与理论、软件开发、运行和度量评估等各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
软件理论和软件语言方面将着力解决如何建立适应人机物融合的软件范型这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算平台)下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件范型发展的基础。
软件理论和软件语言方面将着力解决如何建立适应人机物融合的软件范型基础这一基本问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算平台)下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件范型发展的基础。
软件构造方法将“软件定义”人机物融合的“场景计算机”,它要在万物互联的平台上持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。

View File

@ -1,17 +1,20 @@
\centerline{毛新军,魏峻,孙艳春,邓水光}
%\centerline{毛新军,魏峻,孙艳春,邓水光}
~\\
学 科教育基于学科的独立知识体系,宣传和普及学科知识,培养学科专业人才。学科教育是构成学科的要素之一,并受学科的发展、教育理念和方法的进步等因素的影响。近年来,随着软件学科的边界不断拓展,内涵持续变化,地位不断提升,以及对人类社会的影响面日益扩大,软件学科教育的重要性日益凸显。与此同时,随着我国经济结构的调整和升级以及以信息技术为代表的新经济的快速发展\cite{aihua2017fast},软件学科教育需要为国家的经济转型培养高素质的专业人才。如何加强软件学科教育,提高人才培养的质量和水平,让更多的社会大众从中受惠和受益,成为全社会关注的话题。
软件学科的研究主体是人类及其思维活动,客体是软件及其内在规律。在人机物融合时代,“软件无所不在”、“软件定义一切”使得软件成为人类社会的重要基础设施\cite{hong2018everything},软件系统的环境、边界、构成、形态、交互等发生了深刻的变化。这些变化不仅推动了软件学科的发展和进步,而且使得软件学科教育的对象、面临的挑战等也随之发生变化。
首先,随着软件的日益普及,软件对人类社会和现实世界的渗透力越来越强、影响面越来越广,受其辐射和影响的人群也越来越多,并随之产生了一系列新的问题、出现了新的价值取向,如伦理、道德、可信、隐私保护、安全等。越来越多的大众融入到了软件定义的世界(如使用微信来开展社交),甚至通过编程等方式参与软件的构造。总体而言,\textbf{软件学科与人类社会间的关系变得更为紧密,软件学科教育日趋普及化和全民化。}
首先,随着软件的日益普及,软件对人类社会和现实世界的渗透力越来越强、影响面越来越广,受其辐射和影响的人群也越来越多,并随之产生了一系列新的问题、出现了新的价值取向,如伦理、道德、可信、隐私保护、安全等。越来越多的大众融入到了软件定义的世界(如使用微信来开展社交),甚至通过编程等方式参与软件的构造。总体而言,软件学科与人类社会间的关系变得更为紧密,软件学科教育日趋普及化和全民化。
其次,随着计算平台不断向物理世界和人类社会的快速延伸,软件作为“集成器”在连接物理系统和社会系统中发挥着日趋重要的作用,软件泛在化和人机物融合的趋势日益明显,软件成为诸多行业和领域(如机器人、航空、航天、生物医学等)解决其特定问题的核心手段和必不可少的工具。\textbf{这些行业、领域的专业人士需要掌握软件学科的基础知识和核心能力,学会运用软件工具来解决特定领域的问题;与此同时,软件学科的专业人才也需要向特定领域扩展和渗透,软件学科教育呈现出与其他学科教育日益交融的趋势。}
其次,随着计算平台不断向物理世界和人类社会的快速延伸,软件作为“集成器”在连接物理系统和社会系统中发挥着日趋重要的作用,软件泛在化和人机物融合的趋势日益明显,软件成为诸多行业和领域(如机器人、航空、航天、生物医学等)解决其特定问题的核心手段和必不可少的工具。这些行业、领域的专业人士需要掌握软件学科的基础知识和核心能力,学会运用软件工具来解决特定领域的问题;与此同时,软件学科的专业人才也需要向特定领域扩展和渗透,软件学科教育呈现出与其他学科教育日益交融的趋势。
第三,软件系统变得日益复杂,并体现多元价值,传统的还原论开发方法在应对软件日益增长的复杂性方面面临着诸多挑战\cite{huaiming2014complex},需要从生态系统的角度认识软件系统及其开发和演化。随着软件学科外延的拓展和内涵的发展,软件学科需与更多的学科进行交叉。开源软件的成功以及开源文化的流行对人才培养提出了新的要求\cite{hong2017opensource, bandyopadhyay2016ict},使得软件学科教育的知识体系\cite{borque2014swebok}不断的丰富和发展,对软件专业人才的知识、能力、素质和技能等要求也随之发生变化。\textbf{软件学科教育需在知识体系层面与时俱进,需从系统观和系统能力、生态观、多元价值观、伦理等方面加强专业人才的培养。}
第三,软件系统变得日益复杂,并体现多元价值,传统的还原论开发方法在应对软件日益增长的复杂性方面面临着诸多挑战\cite{huaiming2014complex}
,需要从生态系统的角度认识软件系统及其开发和演化。随着软件学科外延的拓展和内涵的发展,软件学科需与更多的学科进行交叉。开源软件的成功以及开源文化的流行对人才培养提出了新的要求\cite{hong2017opensource, bandyopadhyay2016ict}
,使得软件学科教育的知识体系\cite{borque2014swebok}不断的丰富和发展,对软件专业人才的知识、能力、素质和技能等要求也随之发生变化。软件学科教育需在知识体系层面与时俱进,需从系统观和系统能力、生态观、多元价值观、伦理等方面加强专业人才的培养。
最后当前教育理念和技术的发展日新月异教育教学改革非常活跃如MOOC、SPOC、个性化学习、学习路径推荐等计算机软件在教育改革和人才培养中发挥着日益重要的作用。\textbf{软件学科教育需要借鉴当前先进的教育理念和方法\cite{computerEducation},结合自身的特点和人才培养的特殊要求,利用软件学科已经积累的资源,交叉大数据分析、机器学习、数据挖掘等技术手段,研制教育软件工具,以推动软件学科教育和人才培养的改革}
最后当前教育理念和技术的发展日新月异教育教学改革非常活跃如MOOC、SPOC、个性化学习、学习路径推荐等计算机软件在教育改革和人才培养中发挥着日益重要的作用。软件学科教育需要借鉴当前先进的教育理念和方法\cite{computerEducation}
,结合自身的特点和人才培养的特殊要求,利用软件学科已经积累的资源,交叉大数据分析、机器学习、数据挖掘等技术手段,研制教育软件工具,以推动软件学科教育和人才培养的改革。
概括起来,软件学科作为基础学科,其教育的影响面大,面临挑战多,需要推动普及教育,加强跨学科教育,深化专业教育,重视人才培养理念和教育方法的改革,促进软件伦理建设。
@ -24,19 +27,19 @@
在人机物融合时代,软件不仅是人类社会的基础设施,而且正成为承载人类文明的新载体。如何做好现代软件文明的继承者、传播者和创作者,软件学科教育必须顺应这一时代要求,从单一性的专业教育向大众化的通识教育转变,即惠及普通大众,从儿童、少年、青年、中年到老年\cite{xiaoming2019older},人人能用软件,人人能评软件,人人能读软件,人人能写软件。
\begin{itemize}
\item[$\bullet$] \textbf{如何培养以计算思维为核心,融合创新思维的系统性认知能力}
\item[$\bullet$] 如何培养以计算思维为核心,融合创新思维的系统性认知能力
\end{itemize}
软件是人类智力活动的创作结果。软件学科普及教育首先需要解决社会大众(尤其是青少年)针对软件及其开发的系统化认知问题。从系统观的视角上看,软件学科的核心认知能力是计算思维,它是信息社会中现代人的基本素养,也是人类诸多认知能力的核心要素之一\cite{wing2014computational, grover20185th}。从内涵上看,计算思维能力绝不仅仅是编程技能,也不纯粹是掌握某些程序设计语言,而且还包括应用软件来创新解决问题以及由此所需的创新思维能力。现阶段软件已渗透到自然科学、工程技术、社会人文等方方面面,计算思维与其他认知能力(如批判思维、创新思维等)相互作用,相互影响,不可分离。软件学科教育要突出软件作为“集成器”在连接物理系统和社会系统中的关键作用,强化通过软件来解决各种实际问题的思维训练。为此,软件学科的普及教育需要充分揭示计算思维能力与其他认知能力之间的关系,深化以计算思维、创新思维为核心的普及教育,提高大众的系统化认知能力。现阶段,软件学科的普及教育还是以编程技能培养为主,我们对计算思维与创新思维二者相互作用的认识还不够深入,无法满足软件学科普及性教育的需要。
\begin{itemize}
\item[$\bullet$] \textbf{不同教育受众认知能力的成长有何规律,如何构建适应不同受众的普及教育知识体系}
\item[$\bullet$] 不同教育受众认知能力的成长有何规律,如何构建适应不同受众的普及教育知识体系
\end{itemize}
软件学科普及教育受众对象的涉及面广、差异性大,其中青少年教育是核心和关键。他们是一类认知能力正逐步成长的特殊人群,其基本认知能力,如抽象思维能力、表达交流能力、逻辑分析与推理能力、计算抽象能力等正处于逐步形成的阶段。针对不同的受众对象,他们在计算思维等认知能力的成长方面有何规律性?不同认知能力的形成存在怎样的依赖性?计算思维的训练与哪些认知能力密切相关?等等基础性的问题值得去探究。与此同时,计算思维等认知能力的培养需要依托软件学科和非软件学科的诸多相关知识,这些知识需要与实际问题域相结合,以加强计算思维能力的训练和实践。因此,如何以软件学科知识为核心,建立起科学的、层次性的、可满足不同受众和认知能力培养需求的知识体系,是软件学科普及教育亟需解决的关键问题。
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与认知能力和水平相适应且贯穿终身的软件学科普及教育理念与方法}
\item[$\bullet$] 如何构建与认知能力和水平相适应且贯穿终身的软件学科普及教育理念与方法
\end{itemize}
软件学科普及教育对象来自各行各业,知识背景不一样,认知能力千差万别,且需面对从儿童期、少年期、青年期、中年期甚至到老年期等不同时期的人群,因此普及教育模式不能单一化,教育方法不能统一化。对于儿童和少年,游戏编程、可视化和实物编程有利于推动以计算思维为核心的认知能力逐步形成和深化;对于青少年,创新思维与软件核心认知能力的紧密融合可有效推动其认知能力的提升;对于成年人,通过软件创意创作把个人智慧进行沉淀和累积更能发挥其特长;对于老年人,编程成为他们除了琴棋书画广场舞之外的另一个重要兴趣方向。与此同时,随着信息技术的发展,教育的方式和方法也在不断的改变。为此,软件学科普及教育需要寻求适应不同普及对象、不同行业领域、不同认知水平的教育理念和方法。
@ -46,7 +49,8 @@
从形态观的视角,软件对人类社会和现实世界的渗透力越来越强,呈现出泛在化的趋势,与众多的专业和学科联系紧密;从系统观的视角,软件作为“集成器”在连接物理系统和社会系统中发挥关键作用,与诸多的应用领域密切相关。无疑,非软件学科的专业人才越来越多的需要具备软件学科的相关知识和能力,软件学科专业的人才也需要向其他学科渗透,以帮助其他学科解决特定专业和学科领域的相关问题。如何实现软件学科教育与其他学科教育的双向融合成为当前软件学科教育面临的一项重大挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何实现软件学科知识体系与其它学科专业知识体系的融合}
\item[$\bullet$]
如何实现软件学科知识体系与其它学科专业知识体系的融合
\end{itemize}
现有的许多学科与软件学科关系紧密,但在教育层面,它们很少融合软件学科的知识体系。随着软件学科的日趋泛在化以及对各个领域、行业和专业的不断渗透,以及社会对复合型、创新型人才的迫切需求,如何把软件学科的相关知识体系融入到非软件学科(如航空、航天、机器人、新材料等)的知识体系中,或者让软件学科的人才融入到其他学科领域之中,构建跨专业、多学科交叉的融合性知识体系,将成为软件学科教育和其它非软件学科教育面临的一项重大挑战。
@ -57,7 +61,7 @@
\begin{itemize}
\item[$\bullet$] \textbf{如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才}
\item[$\bullet$] 如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才
\end{itemize}
随着行业软件化转型需求的不断增长,诸多学科和专业与软件学科的融合日趋紧密,迫切需要具有软件学科知识的复合型、创新型跨界专业人才。然而,现有的许多专业人才培养尚无法满足这一需求,极大制约了相关行业的转型、专业和学科的发展,导致这种状况的原因是多方面的:一些非软件学科的专业人才培养直接将软件学科中的某些先进软件技术套用到相关专业领域之中,并没有系统地考虑这些技术在跨界专业领域中的实用性以及软件应用需求的特殊性;它们更多地关注于自身专业领域的相关知识和能力,忽视和错失了软件学科的知识和技术给专业领域问题的解决带来的新机遇。因此,如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才,将是诸多专业和学科教育面临的重大机遇和挑战。在现有的人才培养体系下,我们应该深入思考如何在掌握专业基础知识的同时,将软件学科的知识与相关专业学科的知识相交叉和融合,实现从单一专业人才到跨界复合型、创新型人才的转变,满足人机物融合时代对复合型、创新型人才的巨大需求。
@ -67,7 +71,7 @@
在人机物融合时代,软件的环境、边界、构成、形态、交互、复杂性等发生了深刻的变化,软件学科的内涵和外延也在不断的发展,其知识体系不断的丰富,对软件学科专业人才的能力、素质和技能等要求也随之发生变化,进而对软件学科专业教育提出了新的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何认识人机物融合时代对软件学科专业能力提出的新要求?}
\item[$\bullet$] 如何认识人机物融合时代对软件学科专业能力提出的新要求?
\end{itemize}
在人机物融合时代,由于软件系统自身形态、复杂性、价值观等发生了深刻的变化。软件学科教育需要从提升可持续核心竞争力的角度,加强专业人才的能力和素质培养\cite{computerEducation}
@ -81,7 +85,7 @@
在人机物融合时代,软件开发方式和手段也在发生深刻的变化。例如,建设开源生态、借助开源软件、利用群智开发等成为重要的趋势,开源软件已成为信息技术及产业发展的重要方向。然而,当前开源软件人才的培养无论在质或量上均存在较大不足\cite{hong2017opensource}。此外,软件学科教育需要深入地探究如何有效地利用海量、多样、高质量的开源软件和群智资源来培养软件学科人才\cite{xinjun2019software}
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与人机物融合时代软件学科特点相适应的专业知识体系?}
\item[$\bullet$] 如何构建与人机物融合时代软件学科特点相适应的专业知识体系?
\end{itemize}
在人机物融合时代,不仅软件系统的构成、形态和复杂性在变,人们对软件系统的价值观认识也在变(如更加关注软件的可信性、隐私性、安全性、平等性、持续性等),支撑软件系统开发和运维的方法和技术也在不断的变化。软件开发和运维不仅是个体和团队行为,而且延伸到社会层次,表现为一种社会化行为。开源软件的成功实践表明,大规模群体化软件创作成为一种重要的软件开发方式,软件生态变得极为重要。此外,软件学科不断地与其他相关的学科进行交叉,如大数据、人工智能、社会学、系统科学等等。这意味着人机物融合时代的软件学科专业教育知识体系发生了深刻的变化,其知识域在不断拓展,知识点在不断增加。为了满足软件学科教育的新要求,需要建立起支撑系统能力、解决复杂工程问题能力以及创新能力等能力培养所需的知识体系。因此,软件学科专业教育需构建与人机物融合时代软件学科发展相适应、满足软件学科专业人才培养需求的知识体系。
@ -91,19 +95,19 @@
在人机物高度融合的时代,软件学科教育既要根据软件学科的特点、顺应学科的发展趋势,也要充分利用好学科发展的成果,促进学科人才的培养。软件学科教育在教育理念、方法和模式等方面面临着一系列的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何借助软件学科成果来加强软件学科教育?}
\item[$\bullet$] 如何借助软件学科成果来加强软件学科教育?
\end{itemize}
在几十年的发展过程中,软件学科领域积累了丰富、多样和海量的资源,包括代码、模型、文档、数据、开发知识、工具等等。尤其是近年来,随着开源软件、群智开发、软件开发知识分享等的快速发展,互联网上的开源社区汇聚了大量的软件资源和开发数据。这既给软件学科教育创造了条件、提供了机会和奠定了“物质”基础,同时也给软件学科教育提出了新的问题和挑战\cite{xinjun2019software}:如何借助这些软件资源来深入探究软件学科人才(如软件工程师)的成长轨迹和培养路径?如何有效利用这些软件资源来支持软件学科的教育、促进软件人才的培养?
\begin{itemize}
\item[$\bullet$] \textbf{如何顺应教育理念和方法的发展来改革软件学科教育的方式和手段?}
\item[$\bullet$] 如何顺应教育理念和方法的发展来改革软件学科教育的方式和手段?
\end{itemize}
以互联网为基础的信息技术正改变甚至颠覆传统的教学理念和方法以MOOC、SPOC等为代表的大规模在线教育意味着互联网大众不仅是教育的受益者也是教育的参与者。软件学科教育朝着普及化和全民化的方向发展越来越多的大众涉足软件的使用、评价甚至开发因而成为软件学科教育的对象。这就需要为软件学科的大众化和普及化教育投入足够的教育资源、提供有效的方式和手段。以群智软件开发方法为代表的软件开发隐喻给软件学科教育提供了新的启示借助于互联网大众、利用群智力量来推进软件学科教育将是未来的一个重要趋势它不仅可促进软件学科教育的普及化而且还可通过大众的参与和协同共同分享学习的经验和资源。
\begin{itemize}
\item[$\bullet$] \textbf{如何为软件学科教育提供软件工具?}
\item[$\bullet$] 如何为软件学科教育提供软件工具?
\end{itemize}
软件可为特定领域的问题提供基于计算平台的解决方案。软件学科教育也是一个特殊的应用领域,它涉及与教育有关的诸多问题的解决,如教育资源的组织、分享和推荐,学习者的交互和协同,教育成效的考核和评估等等。因此,如何为软件学科教育提供支撑软件成为一个开放性的问题。
@ -129,19 +133,19 @@
\subsection{以“知识普及 + 思维培养”为核心的普及教育}
\label{subsection:10_2_1}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科核心认知能力的成长模型和规律及其知识体系}
\item[$\bullet$] 软件学科核心认知能力的成长模型和规律及其知识体系
\end{itemize}
软件学科的认知能力以计算思维为核心,包含抽象思维、表达交流、逻辑分析和推理、计算抽象等,这些能力有其各自的特殊性,相互间存在依赖性。为此,需要深入研究以计算思维能力为核心的认知能力成长模型,探究不同受众认知能力的成长规律。与此同时,这些能力培养所需的知识潜藏在数学、语文、物理、化学、自然科学等课程的知识体系之中。软件学科认知能力的培养和上述知识之间存在横切关系,代表这些知识体系的课程很少与实际的软件及其开发相关联。因此,需要从横切和纵切二个方面,探究并建立起支撑软件学科核心认知能力培养的知识体系。
\begin{itemize}
\item[$\bullet$] \textbf{以计算思维为核心,融合创新思维的系统化认知能力培养方法}
\item[$\bullet$] 以计算思维为核心,融合创新思维的系统化认知能力培养方法
\end{itemize}
人机物融合时代,软件使能的创新是软件学科辐射影响的主要目标,软件学科教育要在培养计算思维能力的同时,强化基于软件来解决问题的创新思维能力的培养。因此,我们需要研究如何将“计算思维”与“创新思维”二者相结合来深化软件学科的普及教育,探究“计算思维+创新思维”融合培养的学习路径,建立起支撑“计算思维 + 创新思维”培养的方法和手段。
\begin{itemize}
\item[$\bullet$] \textbf{适应不同认知水平且贯穿终生的软件学科普及教育方法}
\item[$\bullet$] 适应不同认知水平且贯穿终生的软件学科普及教育方法
\end{itemize}
普及教育受众的专业和知识背景具有多样化的特点,年龄层次和认知水平有较大的差异性。为此,需要借鉴生态化发展的思路,研究与教育对象的生理、心理和认知相适应的教育教学方法;研究同质生态教育方法和异质生态关联的迁移教育方法;研究如何借助于信息系统(尤其是软件系统)来支持和推广软件学科的普及教育。
@ -149,13 +153,13 @@
\subsection{以“复合型 + 创新型”为目标的跨学科教育}
\label{subsection:10_2_2}
\begin{itemize}
\item[$\bullet$] \textbf{基于“专业学科知识 + 软件学科知识”的跨学科教育知识体系}
\item[$\bullet$]基于“专业学科知识 + 软件学科知识”的跨学科教育知识体系
\end{itemize}
作为基础学科,软件学科教育需要面向其他的学科专业实现外延式的发展。针对不同专业自身的特点,结合软件学科知识在该专业人才培养中所起到的作用,采取“专业学科知识 + 软件学科知识”的方式来拓展专业知识体系,开展适用于自身专业需求的教学改革,使得相关专业人才具备软件学科的知识并能运用它们来解决特定专业问题。为此需要研究如何将软件学科的知识差异化地融入到相关专业的知识体系之中,实现与相关专业知识的有机融合,实现跨学科知识体系的交叉融合和互补,为跨界人才培养奠定基础。
\begin{itemize}
\item[$\bullet$] \textbf{具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法}
\item[$\bullet$] 具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法
\end{itemize}
随着软件学科在其他专业领域的不断渗透,在这些学科专业人才培养方案的设计中,必须解决软件学科知识储备不足的问题。由于专业背景和专业思维的差异性,不同学科专业教育对软件学科知识结构的需求和相关课程衔接也不尽相同,因此跨界的软件学科人才培养需要多元化的知识和课程体系,为此需要探究如何实施“因材施教”的教学理念,分析不同专业对软件学科的“个性化”需求,构建专业软件化的新型课程体系,设计差异化的跨界软件学科人才培养方案,以实现软件学科和其他相关学科专业交叉融合,让非软件专业的学生也具备软件学科的思维能力,以满足社会对复合型、创新型的跨界软件学科人才的需求。
@ -166,13 +170,13 @@
\subsection{以“知识体系 能力培养”为核心的专业教育}
\label{subsection:10_2_3}
\begin{itemize}
\item[$\bullet$] \textbf{面向多学科交叉融合的软件学科专业教育知识体系}
\item[$\bullet$] 面向多学科交叉融合的软件学科专业教育知识体系
\end{itemize}
针对人机物融合时代的软件学科特点和人才培养要求,深入研究软件学科与哪些相关学科发生了交叉、交叉的边界和范围是什么;人们对软件的价值取向发生了什么样的变化,这些变化对学科的知识体系提出了什么样的要求;软件学科自身发展带来哪些方面的变化,这些变化处于知识体系的哪些层次和方面;需要研究如何根据产业界的成功实践以及学术界的研究成果来丰富和完善软件学科的知识体系。另外,还需要从软件学科专业人才能力培养的视点,探讨系统能力、解决复杂工程问题能力的培养对知识体系提出什么要的要求。在上述研究的基础上,建立起人机物融合时代面向多学科交叉融合的软件学科专业教育的知识体系,包括知识领域、知识单元、知识点等。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科专业教育的核心能力及其培养方法}
\item[$\bullet$] 软件学科专业教育的核心能力及其培养方法
\end{itemize}
创新实践能力、系统能力、解决复杂工程问题能力等是人机物融合时代软件学科专业教育的核心能力。这三类能力的关注点和侧重点有所不同,培养方式和手段也不尽相同。实践无疑是专业教育环节中支撑能力培养的主要手段。为此需要在软件学科的范畴中深入研究创新实践能力、系统能力和解决复杂工程问题能力的内涵、构成和模型,分析不同能力之间的内在关联性,探究能力持续性培养和形成的特点和规律性,探究如何通过渐进式、综合性的实践来促进这三类能力的培养,以及针对能力培养的考评方式和方法。
@ -181,31 +185,31 @@
\subsection{以“探寻规律 + 方法创新”为主体的教育理念和方法改革}
\label{subsection:10_2_4}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科人才培养模型及规律}
\item[$\bullet$] 软件学科人才培养模型及规律
\end{itemize}
软件学科教育对象的涉及面广,年龄层次和知识背景差异性大,培养的目的和要求多样化。软件学科教育牵涉多方面的专业和非专业知识,需要强化不同层次的能力和素质培养。这些知识、能力和素质之间存在内在的关联性。为此,软件学科教育需要针对不同的培养对象和目标,深入探究人才培养模型,包括知识体系、能力体系、工程素质等,分析它们在培养过程中所发挥的作用以及相互之间的继承性和依赖性。此外,软件学科人才的成长受多方面因素的影响,包括自身的素质和能力,外在的教育者及合作群体,学习的环境和激励机制,甚至学习过程中所依赖的软件平台(如开源社区)等。为此,需要研究软件学科人才的成长模型,依此来指导教育政策和机制的设计以及平台的建设。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科资源在人才培养中的挖掘和应用 }
\item[$\bullet$] 软件学科资源在人才培养中的挖掘和应用
\end{itemize}
经过几十年的积累,尤其是近年来开源软件、群智软件开发等的发展,软件学科积累了大量、多样、极有价值的软件资源,如以开源社区为载体的开源代码、知识问答、软件开发历史数据等。软件学科教育需要深入挖掘软件学科资源,系统研究如何在课程教学、实践教学和人才培养过程中有效地应用这些资源,如何将抽象的知识与具体的资源相结合来促进知识的讲授、推动实践教学、培养能力和素养,如何建立起支撑软件学科人才培养的开源教育资源。
\begin{itemize}
\item[$\bullet$] \textbf{群体化学习}
\item[$\bullet$] 群体化学习
\end{itemize}
借助互联网平台,通过吸引、汇聚和管理大规模的学习者,使得他们以竞争和合作等多种自主协同方式来开展学习将是未来重要学习方式,我们称之为群体化学习。软件学科教育需要充分借助于互联网大众的智慧和理念,施行群体化学习的思想,以促进软件学科人才的大规模、高质量、普及化的培养。为此,基于群智理论和方法,借助于互联网上的大数据分析,研究支持群体化学习的组织结构和协同模型,分析和设计群体化学习的激励机制,探究不同组织结构、协同模型和激励机制对群体化学习成效、质量和受益面等产生的影响及涌现结果,开展基于群体化学习的教育和教学方法的改革。
\begin{itemize}
\item[$\bullet$] \textbf{大规模在线开放实践MOOP}
\item[$\bullet$] 大规模在线开放实践MOOP
\end{itemize}
能力和素质培养是软件学科教育的一项主要任务。针对软件学科的发展特点需要研究软件学科人才的能力和素质模型建立不同能力和素质之间的关系分析普及教育、专业教育、跨学科教育等分别需要达到什么样的水平和层次探究软件学科内涵的拓展如何影响能力和素质。实践是支撑能力和素质培养的主要教学途径。依托大规模人群的在线开放实践称为MOOP将成为能力和素质培养的重要趋势也是对MOOC在该方面存在欠缺的有效弥补。为此需要研究支撑能力和素质培养的实践体系建设探究如何将诸如游戏化机制等引入到MOOP之中以激励大众参与和贡献分析针对MOOP的量化表示与评测方法建立起针对能力和素质培养的评价体系与指标。
\begin{itemize}
\item[$\bullet$] \textbf{支撑软件学科教育的软件系统}
\item[$\bullet$] 支撑软件学科教育的软件系统
\end{itemize}
针对软件学科教育的特殊需求,借助于软件学科资源大数据,交叉诸如人工智能、大数据分析、移动计算等技术,研究支撑软件学科教育的关键软件技术,包括开源社区中学习资源(如开源软件和软件开发知识)的同步和分享技术,针对学习者个性化特点及需求的教育资源推荐技术,实现教育软件与开源社区间互操作和交互技术,基于教育大数据来构建学习者个性化学习路径的方法,对学习者的学习情况和成长进行跟踪和考评的技术等等,并在此基础上研发软件学科教育软件。
@ -213,13 +217,13 @@
\subsection{以“规范内涵 + 自动检测”为核心的软件伦理建设}
\label{subsection:10_2_5}
\begin{itemize}
\item[$\bullet$] \textbf{规范化和可检验的软件伦理内涵}
\item[$\bullet$] 规范化和可检验的软件伦理内涵
\end{itemize}
国家、软件行业主管部门应与行业主体、学术团体、社会公众等众多利益相关方通力合作,通过多学科交叉的方式,研究软件伦理的规范化内涵;综合人员、过程、行为、制品、法规等多个方面,研究并制定软件伦理的可解释、可检验的条文和准则,制定相关的法律法规和行业标准。
\begin{itemize}
\item[$\bullet$] \textbf{软件伦理的自动化检测技术和监督方法}
\item[$\bullet$] 软件伦理的自动化检测技术和监督方法
\end{itemize}
研究针对软件开发者行为和制品的软件伦理合规检测技术,尤其是自动化检测技术。例如,面向软件版权保护的代码溯源技术、软件许可证违规使用检测技术,软件及软件使用者恶意和危险行为检测技术等;研究并制定软件伦理的合规监督方法,如过程、规范、标准等,形成覆盖全面、导向明确、规范有序、协调一致的检测和监督技术体系,以快速、高效和准确地发现和修正违背伦理的问题。

View File

@ -21,7 +21,6 @@
\section{重大挑战问题}
程序设计语言的挑战问题集中于如何建立、描述和实现抽象。具体来说,其挑战表现在两个方面。首先,在抽象建立和描述方面,主要表现在如何通过对领域和应用问题的抽象,开发有效的领域特定语言\index{领域特定语言}\ref{2_3_1_1})、支持多范式程序设计\index{多范式程序设计}\ref{2_3_1_2}),特别是加强大数据时代语言对数据处理的支持(§\ref{2_3_1_3})。其次,在抽象的实现方面,主要表现在如何开发人机物融合的泛在范式的编译技术(§\ref{2_3_1_4})和构建程序语言的安全性保障机制(§\ref{2_3_1_5})。
\note{人机物同融合的泛在范式的编译技术 请考虑一下}
\subsection{面向泛在计算的语言的定制}\label{2_3_1_1}
随着泛在计算的普及,一方面,专用化的计算设备和运行平台需要软件具备面向不同专用硬件和平台的高效定制能力;另一方面,泛在服务软件需要提供各种特定的编程抽象,支持面向人机物融合的最终用户编程。在泛在计算的环境下,程序员的概念也不断泛化——未来越来越多的人,甚至那些缺乏足够计算机专业知识的领域专家,需要对专用化的设备或特定领域的问题进行程序设计。这就需要我们开发各式各样的领域特定语言。泛在计算对领域特定语言的定义和实现带来了新的挑战。
@ -29,7 +28,7 @@
\begin{itemize}
\item 特定领域语言一般是轻量的,是通用语言的特例。在通用语言的实现已经存在的前提下,我们可以用通用语言的方式来定义和实现领域特定语言。然而,这种方式不仅增加了开发的难度,而且也不经济。我们需要一种高效的特定语言的定义和实现方法。一种思路是设计并实现一种通用元级语言作为特定语言定义和实现的基础,但是什么样的通用语言适合于定义和实现各类特定领域语言是一个必须解决的问题。
\item 对于通用语言,我们已经开发了不少很有用的程序分析、优化、调试、测试方法。对于特定领域语言,我们需要利用这些方法。尽管我们可以用通用语言来实现某种特定领域语言,但是如何能够将这些一般性的方法系统化地映射到特定语言的实现上是一个挑战。例如,假设我们在通用语言上实现了一个测试方法,但是通用语言上的测试结果对于特定领域语言的用户而言是不能理解的。我们需要将通用语言上的测试例子和结果映射到特定语言程序上,特定领域语言的用户才能理解。
\item 在设计特定领域语言时存在的一个选择是应该设计一个小而精的语言还是设计一个大而全面的语言Schema语言的设计者之一的Guy Steele认为既不应该建立一种小语言也不应该建立一种大语言而需要设计一种可以成长的语言。语言设计应该是增长式的——语言必须从小开始能够随着用户集的增长而增长。例如我们可以比较APL语言和Lisp语言APL不允许用户以“流畅”的方式向该语言添加新的原语Premitive)这使得用户难以扩展该语言在Lisp中,用户可以定义与语言基元保持一致的单词,它使语言用户可以轻松扩展语言并共享代码。为此,在设计语言时,我们面临的挑战是,如何保证其具有一定的柔性,支持新的语言构造和特性可以被无缝接入其中,同时,在语言演化过程中,也能保证遗留系统被无障碍地执行。
\item 在设计特定领域语言时存在的一个选择是应该设计一个小而精的语言还是设计一个大而全面的语言Schema语言的设计者之一的Guy Steele认为既不应该建立一种小语言也不应该建立一种大语言而需要设计一种可以成长的语言。语言设计应该是增长式的——语言必须从小开始能够随着用户集的增长而增长。例如我们可以比较APL语言和LISP语言APL不允许用户以“流畅”的方式向该语言添加新的原语Premitive)这使得用户难以扩展该语言在LISP中,用户可以定义与语言基元保持一致的单词,它使语言用户可以轻松扩展语言并共享代码。为此,在设计语言时,我们面临的挑战是,如何保证其具有一定的柔性,支持新的语言构造和特性可以被无缝接入其中,同时,在语言演化过程中,也能保证遗留系统被无障碍地执行。
\end{itemize}
\subsection{多范式程序设计的语言支持}\label{2_3_1_2}
@ -215,4 +214,4 @@
\section{本章小结}
如果说软件是社会的基础,那么程序设计语言就是软件的基础。泛在计算促使我们,设计各式各样的适合某种框架或具有某种特性的领域特定程序设计语言,使得人人能编程;研究语言随着时间和环境的改变而变化的演化和生长机制;并开发一个全新的“基于语言”的软件设计方法和支撑环境。在这一章里,我们指出了新时代程序设计语言的几个挑战性问题,有些问题并不是新的,但是它们被赋予新的内涵。作为参考,本章也列出了一些重要的研究内容,希望能够通过这些具体研究来迎接这些挑战。
如果说软件是社会的基础设施,那么程序设计语言就是软件的基础。泛在计算促使我们,设计各式各样的适合某种框架或具有某种特性的领域特定程序设计语言,使得人人能编程;研究语言随着时间和环境的改变而变化的演化和生长机制;并开发一个全新的“基于语言”的软件设计方法和支撑环境。在这一章里,我们指出了新时代程序设计语言的几个挑战性问题,有些问题并不是新的,但是它们被赋予新的内涵。作为参考,本章也列出了一些重要的研究内容,希望能够通过这些具体研究来迎接这些挑战。

View File

@ -25,7 +25,7 @@
\subsubsection{开放和不确定环境}
传统软件分析和建模方法通常假设软件的工作环境就是设计环境。但人机物融合计算场景与其不同,软件系统将运行在开放和不确定环境中。例如,在未来的大规模无处不在的城市计算系统中,系统将能获取到大量的异构数据,这些异构数据由城市空间中的各类数据采集器从各种数据源中获得,这些异构数据需要集成到软件系统设计中进行统一分析,并构建有的应用。例如,通过气象传感器收集温度、湿度和风向等信息,软件系统可以预测热岛效应并给出应对措施。软件系统可以帮助维护旧的高速公路或道路,并通过部署在旧建筑中的传感器检测旧建筑的安全参数,预测危险。软件系统还可以通过感知人类的生命体征,帮助提供紧急医疗服务和监测慢性病。在所有这些人机物融合计算场景下,软件的交互环境都是动态的,并且可以观察到其不确定性。
传统软件分析和建模方法通常假设软件的工作环境就是设计环境。但人机物融合计算场景与其不同,软件系统将运行在开放和不确定环境中。例如,在未来的大规模无处不在的城市计算系统中,系统将能获取到大量的异构数据,这些异构数据由城市空间中的各类数据采集器从各种数据源中获得,这些异构数据需要集成到软件系统设计中进行统一分析,并构建有价值的应用。例如,通过气象传感器收集温度、湿度和风向等信息,软件系统可以预测热岛效应并给出应对措施。软件系统可以帮助维护旧的高速公路或道路,并通过部署在旧建筑中的传感器检测旧建筑的安全参数,预测危险。软件系统还可以通过感知人类的生命体征,帮助提供紧急医疗服务和监测慢性病。在所有这些人机物融合计算场景下,软件的交互环境都是动态的,并且可以观察到其不确定性。
有很多证据表明在人机物融合计算场景中软件的交互环境也是开放的。例如许多移动电话、掌上电脑、个人电脑、配备RFID的商品等都通过不同规模的网络联网并自主进行动态加入或者移除。可用设备的不断更新又促使系统提供新服务或移除不再有效或已被取代的服务利用网络环境提供新的服务。这些更新后的服务是软件系统设计时不可能预见到的。因此建立在不断变化的服务空间上的人机物融合系统的环境永远不会是封闭的而是开放的。总之运行环境的开放性、变化性和不确定性需要从方法学和技术层面进行支撑。
\subsubsection{情境感知和适应性}

View File

@ -115,7 +115,7 @@
多租户将是未来运行平台的主流应用形态之一。更多的服务被整合在单一平台上这些服务中可能包括了来自不同租户的不同安全等级的信息必须根据用户需求对应用系统的硬件、软件、数据、网络、存储等不同层面资源实现安全隔离。同时为了提高资源利用效率运行平台根据资源使用情况进行动态调度这种动态变化的环境将显著增大了安全隔离的难度。为了提高服务运行性能以Docker为代表的轻量级虚拟化容器技术也被广泛应用相对于虚拟机的强隔离性容器技术则是以弱隔离性换取性能的提高。在应用虚拟化技术的过程中隔离性与性能之间的取舍、动态变化下虚拟计算资源的安全复用、Hypervisor虚拟机监视器层的虚拟机监管、虚拟机逃逸防护等都成为必须要面对的挑战。同时虚拟化技术还需要对软件定义网络在数据中心内部的网络安全管理提供支持通过虚拟网关等技术对虚拟化数据流进行安全监控这些虚拟设备能否安全使用都将对系统安全性产生深刻的影响。
\subsection{基于区块链的新型分布架构运行支撑技术}\label{os-research7}
以区块链为基础的共识与信任机制可以为去中心化、扁平化的分布式应用架构提供支撑,具有驱动未来分布式软件乃至整个软件生态跃升式发展的潜力,将成为新一代操作系统和运行平台的组件之一(参见\cite{os-connection}节)。要实现这一目标,需要在如下一些方面开展研究:首先,区块链技术本身具有可扩展性、去中心化和安全性三者不可兼得的“三元悖论”难题,在区块链成为共性组件后,需要针对应用场景特点突破侧重点不同的共识算法,进而通过机制与策略的分离,实现场景定制的三元平衡寻优;其次,区块链技术在渗透至不同场景后,为了支持价值在不同行业与场景之间流动,支持不同行业与场景群体之间的协作交互,实现区块链的互操作性势在必行,需要针对公证人、侧链、原子交换、分布式私钥控制等为代表的跨链技术深入展开研究;再次,为了保证共识形成,区块链中事务信息需要通过网络传播给大范围节点,需要不断完善链内数据产生、验证、存储和使用整个过程中的隐私保护机制;第四,区块链的匿名性给网络监管机构带来了极大的挑战和威胁,当前对公有链的监管尚无有力技术手段,而如何在保护隐私的前提下实现监管,也是当前联盟链面临的重大挑战;最后,需要深入研究在应用层如何充分发挥区块链的优势和潜力,针对可信计算、共同认知、群体协同等不同场景探索其适用范围。
以区块链为基础的共识与信任机制可以为去中心化、扁平化的分布式应用架构提供支撑,具有驱动未来分布式软件乃至整个软件生态跃升式发展的潜力,将成为新一代操作系统和运行平台的组件之一(参见\ref{os-connection}节)。要实现这一目标,需要在如下一些方面开展研究:首先,区块链技术本身具有可扩展性、去中心化和安全性三者不可兼得的“三元悖论”难题,在区块链成为共性组件后,需要针对应用场景特点突破侧重点不同的共识算法,进而通过机制与策略的分离,实现场景定制的三元平衡寻优;其次,区块链技术在渗透至不同场景后,为了支持价值在不同行业与场景之间流动,支持不同行业与场景群体之间的协作交互,实现区块链的互操作性势在必行,需要针对公证人、侧链、原子交换、分布式私钥控制等为代表的跨链技术深入展开研究;再次,为了保证共识形成,区块链中事务信息需要通过网络传播给大范围节点,需要不断完善链内数据产生、验证、存储和使用整个过程中的隐私保护机制;第四,区块链的匿名性给网络监管机构带来了极大的挑战和威胁,当前对公有链的监管尚无有力技术手段,而如何在保护隐私的前提下实现监管,也是当前联盟链面临的重大挑战;最后,需要深入研究在应用层如何充分发挥区块链的优势和潜力,针对可信计算、共同认知、群体协同等不同场景探索其适用范围。
\subsection{物理和社会资源的抽象和管控技术}\label{os-research8}
操作系统 “资源虚拟化”的能力来自于其对资源的抽象、封装和调度。传统操作系统针对信息空间内部的资源,已经建立了进程/线程、内存页/虚拟内存、文件等相对稳定的抽象实体。未来,在人机物融合系统中,如何表达和管理各类高度异构、动态变化的物理和社会资源,是操作系统领域的开放问题。其中一个核心问题是:在信息、物理和社会(包括人的认知)空间三者之间,如何刻画、检验、保持、校正多模型结构之间定性与定量一致性,进而实现具有“数字孪生”的物理和社会空间资源的调度和管理。此外,未来操作系统的编程接口不仅涉及到计算资源的“软件定义”,可能包括各种可传感物体对象、智能无人系统等各类物理资源,甚至向其他具有“数字孪生”特性的经济、社会和生产生活资源,其接口形式、接口实现机理等都是开放的问题。

View File

@ -2,10 +2,9 @@
近年来,软件定义网络、软件定义存储、软件定义数据中心等的不断出现,揭示了计算系统在能力描述上的趋势,其内在本质是资源虚拟化和功能可编程。未来的现实世界,场景就是计算机,软件系统要在各种各样的现实应用场景中,发挥其核心纽带作用,软件定义的方法和技术将成为其基本手段。
本章选择几个典型的,涉及``人-机''或``物-机''或``人-机-物''紧密交互的典型应用场景下的软件及其所处的系统,从系统体系架构和软件技术挑战等方面分别予以阐述,展示软件系统的发展趋势。
本章选择几个典型的,涉及``人-机''或``物-机''或``人-机-物''紧密交互的典型应用场景下的软件及其所处的系统,从系统体系架构和软件技术挑战等方面分别予以阐述,展示软件系统的发展趋势。本章亦将讨论高性能 CAE 软件系统的技术挑战和研究方向,以更好支撑高端装备、重大工程和重要产品的关键科学技术问题的计算求解和模拟仿真。
%除此之外传统的计算密集为特征的高性能CAE软件系统也是人机物融合系统的重要组成& 马老师写一段文字。
\section{软件定义的卫星系统}
长期以来,卫星的研制模式一直采用``为特定任务定制卫星、为特定卫星定制载荷、为特定载荷定制软件''的技术路线。卫星按功能划分,一种卫星只能完成一种任务,入轨之后无法增加新的功能。随着商业航天时代到来,这种``一星一任务、一箭定终生''的模式显然不能满足商业航天时代的需求。软件定义卫星成为一个新的发展趋势。2018年11月20日中国第一颗软件定义卫星``天智一号''发射升空,是软件定义方法进入卫星领域的成功案例。
@ -47,10 +46,11 @@
\item 软件定义卫星应用的持续演化框架。其涵盖一系列软件系统演化机制和方法需研究包含1领域特定的编程语言及运行时系统2与编程语言系统适配的自适应计算卸载机制以及代码自动生成与修复技术3基于样例的API自动合成4面向场景不确定性的管控逻辑自适应编排5基于自主学习与数据驱动的管控目标自适应演化机制。
\end{itemize}
\section{工业控制系统}
\section{软件定义的工业控制系统}
工业控制系统指专用于或主要用于工业控制领域,为提高制造企业制造、生产管理水平和工业管理性能的系统软件,包括嵌入式工业软件、协同集成类软件、生产控制类软件、生产管理类软件等四大类。工业控制系统利用信息技术将工业过程的控制逻辑化、管理流程代码化,从而驱动装备和管理业务按照既定的逻辑自动高效地运行,并实现预先设定的功能。工业控制系统的应用可以提高产品价值、降低企业成本进而提升企业的核心竞争力,是现代工业装备的大脑,也成为支撑第四次工业革命的核心。
工业控制系统目前呈现如下的趋势1通过智能工厂建设提升数字化竞争力首先是完善的信息化规划但仅仅信息化还远远不够需要实现物理的制造过程、信息化流程和工业控制设备的有机集成2通过协同研发平台优化研发管理体系优化研发管理体系的核心在于数据和流程的标准化以及跨企业研发平台的建设思路3推广工业机器人在垂直行业的应用其核心在于对传统工艺的理解和改造4应用商业智能实现数据驱动企业发展在商业智能系统中实现全员统一查阅企业视图全面预测数据洞察驱动的业务流程最佳化形成统一的基础架构预先构建的分析解决方案演变成企业绩效管理系统。
过去工业领域已有很多信息化工作但在新时代的背景下工业控制系统需通过软件定义的方式完成平台化的重构。这种软件定义的工业控制系统呈现出以下三方面的优势1通过协同研发平台优化研发管理体系以数据和流程的标准化以及跨企业研发平台的建设思路为核心优化研发管理体系2通过对传统工艺的理解和改造推广工业机器人在垂直行业的应用3应用商业智能实现数据驱动企业发展在商业智能系统中实现全员统一查阅企业视图全面预测数据洞察驱动的业务流程最佳化形成统一的基础架构预先构建的分析解决方案演变成企业绩效管理系统。
\subsection{参考体系架构}
工业控制系统的主要特点是:第一,机电仪控设备、生产设备、生产资源的虚拟化;第二,数据采集、过程控制、过程优化、生产调度、企业管理、经营决策的定制化;第三,工业应用开发、数据集成和分析服务的平台化。
@ -81,10 +81,13 @@
\item 高通量时序数据全生命周期管理、传输和利用。工业物联网的数据采集、管理和利用涉及跨越“云-网-端”三层体系架构,终端层需要支持高性能的写入、高压缩比的存储以及简单查询。场控层需要配备高效丰富的时间序列查询引擎。数据中心层需要能与大数据分析平台无缝集成,支持时序数据处理和挖掘分析。
\end{itemize}
\section{智慧城市系统}
\section{软件定义的智慧城市系统}
智慧城市系统利用信息技术,将城市的系统和服务打通并集成,以提升资源运用的效率。智慧城市系统建设已经成为城市治理的必要需求,其驱动力在于需要突破地域、部门或系统的边界,促进城市信息空间、物理空间和社会空间的深度融合,从而向城市管理者提供城市规划管理的支持,优化城市管理和服务,提高城市治理水平,向市民提供泛在、周到的智能服务,改善市民生活质量。
智慧城市系统除了针对具体应用需求的应用系统外,还需要建立为这些应用系统提供共性支撑的基础支撑平台。在该平台的支撑下,具有不同功能的智慧应用系统,以及对智慧城市具有不同诉求和能力的组织和个人,密切协作,形成各展所长、相互支撑的共生生态系统。因此,软件定义的智慧城市系统成为必然的选择。
智慧城市涉及交通出行、环保保护、应急处理、电子政务、医疗卫生、民生服务等众多领域,应用需求丰富,以往采取各个应用系统独立规划、独自建设的方式,造成了硬件``各为其主''、数据``互不往来''、软件``各自为政''的局面,不仅不利于软硬件资源的复用,也限制了跨部门、跨系统业的数据共享与业务系统,成为制约智慧城市发展的瓶颈。
在此背景下近年来软件定义的智慧城市系统成为一个重要的发展趋势。在软件定义的智慧城市系统中原来各自独立的城市应用系统被整合成一个基于统一城市基础支撑平台的应用生态系统。在这个平台中原来服务于不同应用的感知终端、各应用系统中的数据服务、以及云环境中的计算和存储资源都被虚拟化并通过一组API被访问。新的应用系统在构造时不再``从零开始''而是通过访问这些API复用现有的硬件、软件和数据资源从而实现系统的快速构造并自然实现了数据的跨系统流动以及服务的跨界融合。
\subsection{参考体系架构}
从软件定义的角度看,智慧城市的典型体系结构如图\ref{fig3}所示。该结构分为三层,最下层是要打破现有城市信息系统的边界,实现跨域信息系统互连互通,并将现有系统中的数据、功能封装为可复用的信息资源;中间层则是为各种城市智慧应用提供开发、运行支撑和知识萃取等共性服务的基础支撑平台,并要随着城市应用需求、数据、技术的变化而演化;最上层是复用已有信息资源构建的大量应用系统,这些应用的功能和性能在基础平台的支撑下,实现功能和性能的自适应,并由平台统一管理并根据用户的情境与偏好推荐用户使用。
@ -100,8 +103,8 @@
\subsection{主要技术挑战}
智慧城市系统的主要技术挑战包括:
\begin{itemize}
\item 系统边界可伸缩,实现跨域信息系统互操作。在城市信息化建设的初期,城市管理的各个部门独立开展信息化工作,建成了大批“孤岛系统”。建立智慧城市系统的首要挑战就是针对跨部门跨系统的应用场景,如何进行异构信息交换、系统间互操作以及协同问题求解。智慧城市系统的功能重点体现在信息服务上,系统边界体现为信息边界。通过软件定义把信息资源虚拟化,再通过软件系统对虚拟资源进行管理和调度,这是实现跨域信息系统互连互通的技术支撑,也是目前存在重要技术挑战。具体而言,其主要挑战在于,如何进行信息资源的虚拟化,以及如何在信息资源虚拟化的基础上,实现信息服务可编程,通过统一系统调用接口,访问信息资源提供的服务,实现信息资源的灵活管理、调度和更新,以满足对信息服务的多样需求。
\item 满足信息服务的准确一致性要求,提供可信的城市信息服务。智慧城市系统重在为用户提供准确、一致和可信的信息服务,信息服务可信性保障的挑战重点体现在,第一,保证信息服务中信息来源的可信性,比如如何根据信息服务需求,判断并评估需求相关的权威信息来源,并进行可靠的信息挖掘和抽取;第二,对需要推理产生的综合信息服务需求,需要有高置信度的信息源比对、推理和信息融合方法,以保证可以从多信息源中获得所需要的综合信息;第三,如何保证综合信息服务中信息的一致性,也是目前的重要挑战。
\item 系统边界可伸缩,实现跨域信息系统互操作。在城市信息化建设的初期,城市管理的各个部门独立开展信息化工作,建成了大批``孤岛系统''。建立智慧城市系统的首要挑战就是针对跨部门跨系统的应用场景,如何进行异构信息交换、系统间互操作以及协同问题求解。智慧城市系统的功能重点体现在信息服务上,系统边界体现为信息边界。通过软件定义把信息资源虚拟化,再通过软件系统对虚拟资源进行管理和调度,这是实现跨域信息系统互连互通的技术支撑,也是目前存在重要技术挑战。具体而言,其主要挑战在于,如何进行信息资源的虚拟化,以及如何在信息资源虚拟化的基础上,实现信息服务可编程,通过统一系统调用接口,访问信息资源提供的服务,实现信息资源的灵活管理、调度和更新,以满足对信息服务的多样需求。
\item 满足数据的准确一致性要求,提供可信的城市信息服务。在软件定义的智慧城市系统中,不同的业务系统由不同的组织运营,从不同的渠道不断产生和收集数据。跨系统的数据共享,使得系统的运营方不再依靠自身的力量获取本系统所需的所有数据,这在提高效率的同时也带来了新的问题。如何评价从其他部门和系统中获得数据的可信性?当不同来源的数据出现不一致时,如何取舍?因此需要建立智慧城市的可信性管理机制,其重点体现在,第一,保证信息来源的可信性,比如如何根据信息服务需求,判断并评估需求相关的权威信息来源,并进行可靠的信息挖掘和抽取;第二,对需要推理产生的综合信息服务需求,需要有高置信度的信息源比对、推理和信息融合方法,以保证可以从多信息源中获得所需要的综合信息;第三,如何保证综合信息服务中信息的一致性,也是目前的重要挑战。
\item 满足信息服务时变性和场景相关性特征,实现及时个性化信息萃取和挖掘。智慧城市系统需要能满足不同用户不同场景的个性化信息服务需求,但其信息来源多,分布广,信息海量且动态变化,实现需求驱动的信息动态采集,进行场景相关的信息萃取和综合,并实现适时适地适用的信息服务,是智慧城市系统的重要挑战。
\item 在海量信息的基础上建立各种分析机制和决策模型,成为提高城市治理水平的重要支撑。在实现成熟大数据汇聚和信息融合的基础上,一个针对城市管理高层决策的需求凸显出来,需要针对城市治理和应急管理等高层需求,通过软件定义的技术,建立面向城市资源全局调度、重大突发事件管控等的决策模型库,建设支持动态决策支撑平台。
\end{itemize}
@ -110,12 +113,12 @@
智慧城市系统的未来研究方向包括:
\begin{itemize}
\item 城市信息资源互操作与管理。建立城市信息资源互操作与管理系统,一方面需要打破城市各孤岛系统的壁垒,建立数据共享开放、功能协同的机制;另一方面需要实现对城市各类信息资源的统一索引、授权、监控管理,促进基于语义的资源大规模共享与协同。
\item 城市知识萃取与演化。城市信息系统具有“智慧”的前提是必须掌握与城市相关的各种知识。既包括特定应用相关的专门知识的获取和管理,也包括智慧城市的基础支撑平台,以针对跨应用的共性城市知识建立统一的知识萃取与演化机制,为各类应用提供共性支撑,包括三方面能力:一是领域知识模型构造能力,将分散在信息系统和专家头脑中的知识集中抽象成统一知识模型并建立相应的知识库;二是领域知识模型演化能力,随着城市知识的演化更新知识模型,并保持知识库的一致性;三是知识可信性评估能力,从溯源、推理、传播、交叉验证等多种渠道,评估知识的可信性。
\item 城市信息群体感知和协同推荐。智慧城市系统应满足城市全方位感知和多样化信息服务需求,需要研究多人多组织参与的群体感知和服务定义。具体包括三个方面。第一,群体城市感知。将持有智能手机在城市中移动的市民,视为是融合手机的感知、计算、通信能力和人类智能的``综合感知终端'',形成群体城市感知网络;第二,构建基于``云-边-端''计算架构的智慧城市互连和协作架构,使能``综合感知终端''通过移动互联网,实现云平台支撑下的互联和协作,完成大规模、复杂城市感知任务。第三,智慧城市服务定义和推荐。面向智慧城市中信息服务应用的多样化、本地化、个性化的需求,促进人机交互和协作,在基于互联网的信息汇聚平台支撑下,研究信息服务的软件定义方法,实现大规模协同式信息服务的定义、设计和推荐,形成各展所长、相互支撑的共生生态系统。
\item 城市知识萃取、演化和服务化。城市信息系统具有``智慧''的前提是必须掌握与城市相关的各种知识。既包括特定应用相关的专门知识的获取和管理,也包括智慧城市的基础支撑平台,以针对跨应用的共性城市知识建立统一的知识萃取与演化机制,为各类应用提供共性支撑,包括三方面能力:一是领域知识模型构造能力,将分散在信息系统和专家头脑中的知识集中抽象成统一知识模型并建立相应的知识库;二是领域知识模型演化能力,随着城市知识的演化更新知识模型,并保持知识库的一致性;三是知识可信性评估能力,从溯源、推理、传播、交叉验证等多种渠道,评估知识的可信性。同时,从跨系统的数据中萃取的知识也不应该仅服务于某个特定的应用系统,而应该被封装成一组服务,嵌入到城市公共服务平台中,通过即插即用的方式被各个应用系统使用。
\item 城市信息群体感知和协同推荐。智慧城市系统应满足城市全方位感知和多样化信息服务需求,需要研究多人多组织参与的群体感知和服务定义。具体包括三个方面。第一,群体城市感知。将持有智能手机在城市中移动的市民,视为是融合手机的感知、计算、通信能力和人类智能的“综合感知终端”,形成群体城市感知网络;第二,构建基于``云-边-端''计算架构的智慧城市互连和协作架构,使能``综合感知终端''通过移动互联网,实现云平台支撑下的互联和协作,完成大规模、复杂城市感知任务。第三,智慧城市服务定义和推荐。面向智慧城市中信息服务应用的多样化、本地化、个性化的需求,促进人机交互和协作,在基于互联网的信息汇聚平台支撑下,研究信息服务的软件定义方法,实现大规模协同式信息服务的定义、设计和推荐,形成各展所长、相互支撑的共生生态系统。
\item 城市规划仿真和突发事件管控。在城市大数据和多系统互操作的基础上,体系化地构建城市管理,特别是突发事件管控的模型库、预案库、策略库。研究多渠道城市运行管理事件关联分析、预警预报和综合决策技术,研究多系统协同指挥的流程及机制,研究基于跨系统城市功能协同的城市风险预测和推演技术,构建城市智能模拟/预测/推演平台;研究城市风险和灾害等不同情况下的城市危害与次生危害仿真模型,建立能支持突发公共事件风险的网络治理机制和城市群应急管理联动体制的平台。
\end{itemize}
\section{无人自治系统软件}
\section{软件定义的无人自治系统}
无人自治系统UAS是机械装置计算技术传感器和软件的融合包括无人地面车辆、无人飞行器、智能机器人等。其典型特征是能自主感知其周边环境的状态通过其内部搭载的计算部件理解环境状态并作出对下步动作的决策并将决策结果直接实施到其机械装置上其各个部分的工作全部通过软件来协调完成。比如无人地面车辆UGV是在与地面接触且没有人在场的情况下运行的车辆一般配备一组传感器以观察其周边环境并自主决定其行为。
无人自治系统其核心是其环境和情景的可感知性和行为的自治性典型的具有如下能力1环境感知能力能收集其周边环境的信息形成对环境的认知例如获得建筑物内部的结构检测环境中感兴趣的物体如人和车辆2规划和自主行为能力不同功能的无人自治系统有不同的规划和行为能力比如无人地面车辆可以在没有人工导航的情况下自主在航点之间行走无人飞行器可以在没有人工导航的情况下自主在航点之间飞行智能机器人可以在没有人工控制的情况下自主完成为它设定的任务等等3自我维护修复能力自我定期维护对很多故障无需外部协助即可自行修复4环境安全保护能力能在完成设定任务的同时避免对人员财产或自身造成伤害5自主学习能力包括在没有外部帮助的情况下学习或获得新功能根据环境调整自身的行为策略在没有外部帮助的情况下适应环境培养针对完成任务目标的道德意识。
@ -159,13 +162,17 @@
无人自治系统的发展,将推动包括智能制造、智能交通、智能农业、智能医疗、智能城市、国家安全等的重大变革。但无人自治系统的全面应用还需要很多工程性的工作,比如,建立以数据驱动的无人车间/智能工厂的体系架构和标准体系,形成人机协同的无人车间/工业智能系统完整的体系、技术与标准,实现知识驱动的无人车间/智能工厂的广泛应用,攻克以无人自治系统为基础的智能装备全生命周期的高安全性、高可靠性、高实时性、高精确性等难题等。
\section{高性能CAE软件系统}
高性能计算机辅助工程高性能CAE泛指采用计算机辅助手段解决高端装备、重大工程和重要产品的全生命周期设计、研制、生产和使用中关键的科学和技术问题包括对功能、性能与安全可靠性进行计算、优化设计对其工作状态和运行行为的模拟仿真目的是及早发现设计缺陷改进和优化设计方案证实工程/产品的可用性与可靠性。高性能CAE软件系统是高性能计算机辅助工程的载体是计算力学、计算数学、相关工程科学、工程管理学与计算机科学和技术相结合的产物是实现高端装备、重大工程和重要产品的计算分析、模拟仿真与优化设计的工程软件是支持工程科学家进行创新研究和工程师进行创新设计的最重要的工具和手段在提高装备/工程/产品的设计质量、降低研究开发成本、缩短开发周期等方面发挥重要的作用。
高性能CAE软件系统是推动关重装备自主创新发展的核心载体是将装备向精细化设计转化的桥梁与纽带是重大工程实施、核反应堆设计与安全分析、航空发动机优化设计、飞行器优化设计、高端精密仪器装备、重大科学实验装置、复杂电磁环境与防护等关重装备/科学装置研制不可替代的研究手段。高性能CAE软件系统作为工程行业和制造企业信息化的主导技术智能制造的重要基础和核心支撑实现工程/产品创新的主要技术手段。
\section{高性能CAE软件系统}
高性能CAE软件系统是计算力学、计算数学、相关工程科学、工程管理学与计算机科学技术相结合的产物是实现高端装备、重大工程和重要产品的计算分析、模拟仿真与优化设计的工程软件是支持科学家进行创新研究和工程师进行创新设计的最重要的工具和手段在重大工程实施、核反应堆设计与安全分析、航空发动机优化设计、飞行器优化设计、高端精密仪器装备、重大科学实验装置、复杂电磁环境与防护等关重装备/科学装置研制问题领域中具有举足轻重的作用。
高性能CAE软件系统是连接上层丰富多样的应用场景与底层高性能计算硬件平台的桥梁。一方面高性能CAE软件系统应该提供适应特定问题领域的高层抽象建模机制使得应用开发者能够使用领域特定语言进行领域特定应用的高效开发。另一方面高性能CAE软件系统需要能够将应用需求有效地转化为基于高性能计算硬件平台的高并行可扩展性算法实现应用的高效与高质运行。
软件定义为高性能CAE软件系统的可持续发展提供了重要的方法指导。在应对丰富多样的应用场景方面利用软件定义机制可以实现对不用问题领域应用需求的个性化建模以及基于构件定制与组装的需求快速实现。在应对高性能计算硬件平台计算规模的变化性和计算资源的异构性方面利用软件定义机制可以通过对计算资源的抽象建模与动态分配有效提高计算资源的使用效率。
\subsection{参考功能特征}
高性能CAE软件系统在应用上具有广泛性和综合性比如应用于关重装备、核能开发、航空航天、汽车船舶、石油化工、土木建筑、电子制造等领域在研制上具有融合性和协作性是计算力学、计算数学、相关的工程科学、工程管理学与现代计算机科学和技术相结合而形成的一种综合性、知识密集型的信息产品需要工程应用人员、工程科学家、数学家和计算机科学家合作完成。其参考功能特征包括
高性能CAE软件系统在应用上具有广泛性和综合性在研制上具有融合性和协作性,是一种多学科综合、知识密集的复杂软件系统,需要工程应用人员、工程科学家、数学家、计算机软硬件科学家和工程师等利益相关者密切合作才能完成其设计、开发及成功应用。其参考功能特征包括:
\begin{itemize}
\item 大规模复杂几何结构的快速网格生成能力:能处理由众多具有高阶/间断曲面的零部件构造的、空间尺度跨度比大的复杂结构,实现大规模网格的快速生成;
@ -198,5 +205,5 @@
\end{itemize}
\section{本章小节}
本章考察软件定义卫星、工业控制软、无人自治系统、智慧城市系统等4类领域应用软件分别从这类系统的功能需求出发按软件定义的视角勾画出它们的三层体系架构突出其软件系统向下管理和调度资源向上实现应用逻辑编程以满足需求的核心作用目的是建立基于软件定义的泛在软件系统的参考示范。本章另外还讨论了高性能CAE软件的功能特征和关键技术挑战。
本章考察软件定义卫星、工业控制软、无人自治系统、智慧城市系统等4类领域应用软件分别从这类系统的功能需求出发按软件定义的视角勾画出它们的三层体系架构突出其软件系统向下管理和调度资源向上实现应用逻辑编程以满足需求的核心作用目的是建立基于软件定义的泛在软件系统的参考示范。本章另外还讨论了高性能CAE软件的功能特征和关键技术挑战。

View File

@ -98,8 +98,8 @@
在DevOps、持续集成Continuous Integration、持续测试Continuous Testing、持续交付Continuous Delivery、智能运维AIOps等软件开发、集成和动态运行维护框架下研究开发、集成、部署、运维流程中持续迭代的故障检测和质量评价等环节质量历史数据的分析方法确定质量问题、追溯问题来源并评估质量风险从管理角度在软件开发构建、运行维护过程中约束、规范人的行为从改进软件过程、预防不符合预期制品的构建角度保障软件的质量和安全。
\section{本章小}
在“软件成为基础设施、软件定义一切”的背景下,本章基于软件的复杂加剧化、形态服务化、质量价值化、协作生态化的视角,从具有数据驱动、智能化、大规模、高复杂度、人机物融合等特征的角度分析了软件面临的质量和安全保障的重大挑战问题,在此基础上,从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面未来仍需研究的方向和内容。
\section{本章小}
本章基于软件的复杂加剧化、形态服务化、质量价值化、协作生态化的视角,从具有数据驱动、智能化、大规模、高复杂度、人机物融合等特征的角度分析了软件面临的质量和安全保障的重大挑战问题,在此基础上,从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面未来仍需研究的方向和内容。
%
%%\section{参考文献}
%\begin{thebibliography}{7}

View File

@ -1,5 +1,4 @@
% !TEX root = main.tex
%\chapter{政策建议}
@ -35,18 +34,22 @@
软件定义一切,软件已经成为当今社会的基础设施,新时代的软件四观:系统观、形态观、价值观和生态观为软件学科发展提供了方向。软件学科应以建立这四观为基本发展点,立足于网络时代的蓬勃需求,结合点与面、通与专,在基础理论、软件应用模式、新型软件价值和软件生态行为方面不断创新,继往开来。
\begin{enumerate}
\item 将软件工程扩展为软件科学与工程学科。并建立通识、专业、跨学科、继续等多层次的终生教育体系。
\item 大力加强面向泛在计算的程序设计语言以及支撑环境、软件开发方法的基础性研究,以领域特定的程序设计语言的设计原理与高效实现为核心,以程序设计语言的演化和互操作性机理为重点,通过程序设计语言的基础研究,加大程序设计语言的支撑环境和工具链的开发,从而有效而深入地解决计算的泛在和多样性,软件的复杂性和软件的安全性等带来的新时代的挑战。
%
\item 推进对以“连接协调”为核心的新型软件体系结构下的新一代操作系统模型和机理的研究。研究如何为各类新型异构资源建立适当抽象,并按照应用需求进行灵活调度。研究操作系统和运行平台如何充分发挥其“元层”支撑作用,有效驱动和实现“信息-物理-社会”空间的协同持续演化。
%
\item 推进以人为中心的软件价值的研究和规范。面向泛在计算场景下的软件价值,研究各种社会因素带来的突破使用质量的新的软件价值,并建立相关约束和规范,包括提示用户可能存在的风险,制定智能软件的质量标准、检测方法和实施办法等。
\item 重视软件技术研究和应用的价值取向和管理。软件的社会基础设施化使得社会治理现代化与软件密不可分,软件的价值观与社会治理的统一将成为重要的因素。
%\item
推进以人为中心的软件价值的研究和规范。面向泛在计算场景下的软件价值,研究各种社会因素带来的突破使用质量的新的软件价值,并建立相关约束和规范,包括提示用户可能存在的风险,制定智能软件的质量标准、检测方法和实施办法等。
\item 推进对大规模代码和项目的供应链和生态行为的研究和分析。研究个体如何认知复杂项目和生态,群体如何高效高质地协作完成各类软件活动相关的任务,涵盖公司、个体开发者及用户在内的广泛社会力量如何围绕软件构建可持续性演化的生态系统等。%并进一步推进国内软件产业生态系统的建设。
%\item加强各个领域、各种形态、各种应用场景下的软件技术知识产权保护方法和措施的研究,建立公平、公正的环境,持续推动软件技术创新进程。
\end{enumerate}
\section{软件教育政策建议}
软件教育在充分考虑知识体系和教育手段的基础上,需要注意:专业教育与通识教育并重,领域学科知识与软件学科知识结合,原理讲授与开源实践融合。
软件教育在充分考虑知识体系和教育手段的基础上,未来注重专业教育与通识教育并重,领域学科知识与软件学科知识结合,原理讲授与开源实践融合。
\begin{enumerate}
\item 推行以“计算思维 + 创新思维”为核心的普及教育,包括软件学科核心认知能力的成长模型和规律及其知识体系、以计算思维为核心,融合创新思维的系统化认知能力培养方法和适应不同认知水平且贯穿终生的软件学科普及教育方法。
@ -60,8 +63,8 @@
\section{软件产业政策建议}
泛在计算和“软件定义一切”使得软件产业挑战和机遇并存。
我国软件产业虽然有长足的发展,但是鉴于基础相对薄弱,还需要在下述两个方面不断加强和拓展
一是需要为软件产业培育良好的基础环境,另则需要把握泛在计算带来的机会开拓新型应用模式。
我国软件产业虽然有长足的发展,但是鉴于基础相对薄弱,还需要在下述两个方面不断加强和拓展
一是需要为软件产业培育良好的基础环境;二是需要把握泛在计算带来的机会开拓新型应用模式。
如何能抓住时代赋予的机会,在软件技术领域实现颠覆式创新和跨越式发展,对我国实现创新型国家发展战略具有重大意义。
具体来说,建议国家在知识产权和公共数据平台建设方面建立政策法规,培育健康的产业发展环境,并面向热点领域加大投入,为发展新型应用模式和开源生态加强产业政策。
@ -71,8 +74,18 @@
\item 数据开放政策:建立数据开放机制和平台,鼓励围绕大数据聚集、管理、分析和应用的大规模协作制定数据开放的相关政策,开放地理、气候、统计、环境、交通等政府数据,并建立基于互联网的大数据开放共享平台,以及开放的数据分析工具库,鼓励不同的组织和个人基于此平台开展数据聚集、管理、分析和应用的大规模协作,挖掘数据蕴含的价值,提供高附加值的数据类软件产品和服务。
\item 软件资产管理和共享体系: 建立国家软件资产管理和共享体系,构建基础、领域、行业软件生态,发展社会化、群智化、开源化的国家软件生态圈。
\item 发展新型应用:面向智慧城市、移动互联网应用等热点领域加大投入,支持高附加值的新型网络计算操作系统和应用支撑工具平台的技术创新和产品推广,打造针对热点应用领域的高附加值基础软件产品和服务。
\item 培育开源生态:培育基于开源模式的公益性生态环境建设,采取“参与融入、蓄势引领”的开源策略(“参与融入”针对国际成熟开源社区,“蓄势引领”则从中文开源社区建设切入),发展开源软件生态,并以其为抓手提升我国在信息技术领域的核心竞争力和国际影响力。
\section{TBC: 一些执行层面的建议}
\begin{enumerate}
\item 确立软件发展的优先位置,在软件学科发展的基础性和战略性方向上强化科研支撑,在软件应用和产业上确立软件优先的发展思路。例如,在国家重点研发上设立软件专项,并在其他各专项中设立领域或行业软件的递增份额。
\item 机构设置
\item jm融合
\end{enumerate}
\end{enumerate}

0
fig1-1/1-1.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 203 KiB

After

Width:  |  Height:  |  Size: 203 KiB

0
fig1-1/1-2.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

0
fig1-1/1-3.jpg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

0
fig1-1/1-4.jpg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

0
fig1-1/1-5.jpg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

0
fig1-1/3-1.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

0
fig1-1/3-2.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

0
fig1-1/3-3.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

0
fig1-1/3-4.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

0
fig1-1/3-5.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

0
fig1-5/fig1.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

BIN
fig2-2/.DS_Store vendored

Binary file not shown.

0
fig2-5/mmm.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

0
fig2-5/sdn.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

0
fig2-5/tos.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 198 KiB

0
fig2-7/marc.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 162 KiB

0
fig2-8/fig0801.pdf Executable file → Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -3531,6 +3531,51 @@ author = {CIO Staff}
year={2016}
}
@article{xiaoming2019older,
title={“老年编程”的畅想},
author={李晓明},
journal={中国计算机学会通讯},
volume={15},
number={5},
pages={51},
year={2019}
}
@article{aihua2017fast,
title={加快发展和建设新工科:主动适应和引领新经济},
author={吴爱华and 侯永峰 and 杨秋波 and 郝杰},
journal={高等工程教育研究},
number={1},
pages={1-9},
year={2017}
}
@article{huaiming2014complex,
title={复杂软件系统的成长性构造与适应性演化},
author={王怀民 and 吴文峻and 毛新军 and 丁博 and 郭长国 and 李未},
journal={中国科学:信息科学},
volume={45},
number={6},
pages={743-761},
year={2014}
}
@article{hong2017opensource,
title={开源对软件人才培养带来的挑战},
author={梅宏 and 周明辉},
journal={计算机教育},
number={1},
pages={2-5},
year={2017}
}
@article{computerEducation,
title={计算机教育与可持续竞争力},
author={``计算机教育20人论坛''编写组},
journal={高等教育出版社},
year={2019}
}
@article{金芝2016开源软件与开源软件生态,
title={开源软件与开源软件生态:现状与趋势},
author={金芝 and 周明辉 and 张宇霞},
@ -3541,6 +3586,16 @@ author = {CIO Staff}
year={2016}
}
@article{sommerville2012large,
title={Large-Scale Complex IT System},
author={Ian Sommerville and Dave Cliff and Radu Calinescu and Justin Keen and Tim Kelly and Marta Z. Kwiatkowska and John A. McDermid and Richard F. Paige},
journal={Communication of ACM},
volume={55},
number={7},
pages={71-77.},
year={2012}
}
@article{mei2006abc,
@ -3553,6 +3608,13 @@ author = {CIO Staff}
year={2006}
}
@book{xinjun2019software,
title={软工程实践教程: 基于开源和群智的方法},
author={毛新军 and 王涛 and 余跃},
year={2019},
publisher={高等教育出版社}
}
@book{herlihy2011art,
title={The art of multiprocessor programming},
author={Herlihy, Maurice and Shavit, Nir},