software-strategy-book/Ch2-9-SoftwareEcosystem.tex

149 lines
35 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% !TEX root = main.tex
\section{引言}
“人-机-物”三元融合的新型应用模式, 通过综合应用物联网、移动互联网、通信、大数据计算、人工智能等技术,使人类社会(人)、信息空间(机)、物理世界(物)之间实现互联,形成以人为中心的新社会形态\cite{赵兰香等主编2013科技发展新态势与面向}。其中,软件是关键要素;而围绕软件的各类元素之间也存在着复杂的依赖关系,并最终形成了软件生态。软件生态\index{软件生态}是指各类软件制品(包括开发态和运行态)、软件涉众(包括开发者、使用者和维护者等)和软件设施(包括承载软件制品开发与运行的物理设施及其作用的物理设施),围绕软件相关的各种活动(包括开发、使用、服务、维护、演化等),形成的相互依赖和相互作用的网络系统,如图\ref{fig:fig1}所示。随着互联网的发展和软件技术的发展,这些依赖关系使得软件制品越来越依赖于其所存在的软件生态,逐渐推动软件生态化,成为软件产业的未来发展趋势。
\begin{figure}[ht]
\centering
\includegraphics[scale=0.3]{fig2-9/fig1-new.pdf}
\caption{软件生态系统}
\label{fig:fig1}
\end{figure}
在软件作为基础设施、软件定义一切的背景下,软件学科的内涵呈现出四个新视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以人为中心的价值观、以及以群体协作平衡为关注点的生态观。这四个视角对软件生态既提供了新的观察内容,又提出了新的挑战。从系统观来说,生态系统是复杂系统(各类软件及软件活动所涉及到的社会角色彼此交互),适合采用系统论驱动的复杂软件系统的观察和度量方法、以及各种模型表示方法及其工具支持。从形态观来说,软件泛在服务化和软件应用的持续成长趋势不仅是软件生态的驱动力,而且增进了其复杂性。从价值观来说,软件生态体现了从单个元素到复杂系统的价值转变,并且因其所涉及的浓厚社会因素从以使用质量为核心的价值观发展到以人为中心的价值观。从生态观来说,软件开发、使用(工具观或客体观的表述)或服务(主体观的表述)的复杂性体现在参与到软件开发、维护、使用、应用及市场的各个环节的广大社会群体,还体现在软件活动所处环境的开放性及其彼此交互和依赖所带来的不确定性等。总的来说,软件制品、软件涉众、以及软件设施日益复杂化,同时在经济力量不断将国家市场转变为国际市场的前提下,全球化软件活动已经发展成为一种不可逆转的趋势\cite{Herbsleb2001Global}。全球分工不断精益化,各种供应链关系形成和发展,软件生态化成为趋势,并可能形成常态。
软件生态化的时代趋势催生出了许多软件学科的重要研究内容。例如,如何理解并利用大规模代码和项目的供应链行为;个体如何快速学习并加入复杂项目和生态;群体如何高效高质地协作完成各类软件活动相关的任务;涵盖公司、个体开发者及用户在内的广泛社会力量如何围绕软件构建可持续性演化的生态系统等。在本章中,我们将围绕这些问题从三个层次理解软件生态。
\section{重大挑战问题}
研究软件生态的挑战问题集中在如何刻画、抽象和分析复杂的软件生态网络。具体来说,如图\ref{fig:fig1}所示,软件生态网络分为三个层次的依赖关系网。首先,软件制品之间存在的相互依赖关系(无论是开发态还是运行态)构成了供应链网络。软件制品(特别是大型商业软件)之间的依赖关系非常复杂,其挑战表现在如何理解并利用大规模代码和项目的供应链行为(§\ref{sec:se-complexity})。其次,在这个网络上叠加软件涉众(开发者、使用者和维护者等)、软件涉众与这些软件制品形成的相互关系、以及由此带来的软件涉众之间的关系网络,从而形成相互联系的软件制品生态网络与其之上的软件涉众生态网络。由此带来的挑战例如包括个体如何学习并加入复杂项目和生态(§\ref{sec:se-difficulty})、复杂生态中群体如何协作以及协作行为如何发展(§\ref{sec:se-control})等。最后,在这个网络上叠加软件设施、软件设施与这些软件制品形成的相互关系、以及由此带来的软件设施之间的关系网络(也就是物联网)。在理解了三层软件生态网络的基础上,带来的核心挑战问题是生态如何形成以及如何可持续发展(§\ref{sec:se-continuous})。
\subsection{软件供应链的复杂性}
\label{sec:se-complexity}
\begin{figure}[ht]
\centering
\includegraphics[scale=0.85]{fig2-9/fig2.png}
\caption{CRAN 运行时的依赖关系}
\label{fig:fig2}
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[scale=0.8]{fig2-9/fig3.png}
\caption{软件供应链示意图}
\label{fig:fig3}
\end{figure}
随着软件技术的不断发展和软件应用领域的不断深入软件项目越来越多样化和复杂化。一些大型项目例如Linux内核项目的代码规模几乎呈现指数级的增长。与此同时软件项目之间的依赖关系多种多样而这种依赖关系也在不断复杂化。
例如,一个软件项目可能同时依赖数千个其它软件项目。图\ref{fig:fig2}展示了CRANComprehensive R Archive Network复杂庞大的运行时依赖关系其中节点是软件包Package连线是软件包之间的运行时依赖关系。不同于围绕同一软件项目形成的生态系统这种由于项目之间的互相依赖例如软件的构建或运行时依赖、开发者同时参与多个软件项目、软件代码的复制粘贴、软件项目的定制化等形成的复杂关系网络被称为软件供应链\cite{Mockus2019Keynote}
例如一个企业可能将开源平台当作上游对其进行定制化形成企业自研平台例如很多企业将OpenStack作为上游定制了自有云平台、将Android作为上游定制了自有手机操作系统等并在此基础上开发各类应用。与此同时开源构件在开源平台、企业自研平台、以及各类应用中被广泛使用。开源平台、企业自研平台、各类应用、以及开源构件之间存在着互相依赖但又可以独立演化。
\ref{fig:fig3}以开源软件为例展示了软件供应链\index{软件供应链}的技术栈的可能组成成分(闭源软件生态或开源闭源软件一体的生态也是同理),涉及了底层硬件固件、系统软件、平台软件、以及与用户最息息相关的应用软件。大型的软件供应链几乎囊括了开发、运行过程中涉及到的所有软硬件及其生态。数以万计互相依赖的软件项目形成的供应链为软件开发和使用带来了前所未有的困难;同时,规模指数级增长的软件项目及其之间庞杂的依赖关系使得供应链的复杂度激增。因此,如何理解并利用大规模代码和项目的供应链行为是一个亟待解决的重要问题,可以帮助开发者及时发现供应链中的脆弱点并尽早避免由此带来的潜在风险、更高效地找到高质量的软件依赖并避免重复造轮子。
\subsection{个体参与生态的困难性}
\label{sec:se-difficulty}
个体(主要包括开发者、维护者等)作为软件生态中的参与者,是影响软件质量和效率的关键因素,是软件生态中最核心的角色之一。近年来涌现的一些软件趋势及现象,诸如软件开发全球化、越来越多的高层次认知任务外包、互联网新媒体将软件活动改造成了社会化活动等,正在改变人们思考、学习、工作、以及协作的方式。同时,软件生态系统的复杂性不断增强,使得新人加入生态非常困难。因此,个体如何学习和加入复杂软件生态系统成为了一个亟待解决的问题。另外,以互联网为媒介的各种应用蓬勃发展,各种新的技术和新的应用方式层出不穷,这也给开发者如何快速学习并适应变化带来了很大的挑战。这方面问题都引起了工业界和学术界的广泛关注。。
“个体学习”包含了两层含义。第一,学习什么?一些复杂的大型软件项目,除了要求个体掌握必要的编程技能,项目所涉及的领域知识也需要开发者理解。除此之外,他们还需要学习如何与社区沟通(根据研究\cite{Astromskis2017Patterns},开发者近乎一半的工作时间都花费在沟通上),需要熟悉使用各种开发支持工具——这些工具及其积累的数据也是分布式环境下传播知识和学习项目的重要媒介\cite{Manikas2013Software}。第二如何学习一个开发者如何从初学新手成长为专业行家如何从初进社区的新手角色变为核心团队成员他怎么获取各种知识和信息又是以一种什么顺序掌握等这些都是理解个体学习的关键挑战。特别是在开源项目中并无层级组织、训练计划、集中式的环境给予初学者必要的熏陶和培育更多的是“边干边学”Learning by Doing。研究那些高产的开发者的学习轨迹看他们如何获得技能、解决关键而复杂的任务了解是什么激励了他们也许能够将他们获得技能的方法具体化并进一步地用于训练其他人同时高手和新手解决问题的心理模型不一样因而在其指导新手时可能会出现失配问题Zone of Proximal Development认知科学的一个重要发现\cite{Vygotsky1978Interaction})。如何理解项目中失配问题的本质,并建立相应技术和工具来更好适配新手的需求和高手的指导不仅能帮助个体成长,也将帮助软件项目和社区的发展;另外,对于要处理各种复杂编程任务的程序员,如何应对人类本身的认知局限性,例如工作记忆系统容量有限,认知负荷等问题,也是软件工程领域要考虑的问题。总的来说,我们需要对个体如何学习一个软件项目、如何使项目更具可读性(更容易被理解和学习)、如何创造革命性的资源和工具来提高新人的学习能力和生产力有更深入的理解。
\subsection{群体协作的不可控性}
\label{sec:se-control}
在经济力量不断将国家市场转变为国际市场的前提下,全球化软件活动已经发展成为一种不可逆转的趋势。分布在世界各地的软件涉众需要协同发布一个可用的高质量软件,甚至需要运行时群智迭代反馈,这将面临大规模的通信、协调和合作。软件活动中涉及到的众多角色能否积极地参与、良好地协作这些社会性的问题同样影响到软件生态中各类活动的效率以及产品的质量。
基于互联网的软件生态中的活动以开源开发为代表基本都在开放透明的分布式环境下合作实施具有沟通媒介形式多样化例如版本控制系统和缺陷追踪系统等软件开发支撑工具、以及StackOverflow等技术问答社区、协作内容和信息碎片化的特点。此外软件项目的上下文千差万别使得找到通用的可复现的最佳实践非常困难从而导致群体社会化软件活动的可知与可控难题有加剧的趋势。因此在复杂软件生态系统中群体如何协作以及协作行为如何发展是一个亟待解决的问题。
\subsection{生态的可持续性}
\label{sec:se-continuous}
开源软件在目前的全球软件生态中扮演了非常重要的角色,但因为参与的开放性以及集中意志/管理的缺乏,开源软件生态的可持续性发展在可见的未来存在很大挑战,主要表现在如下三个方面。
首先随着支持分布式软件活动的开放式现代平台的出现和不断完善如GitHub、Bitbucket和GitLab等软件项目正在以前所未有的速度增长而软件涉众也相应地增长。开源软件生态中的软件系统、软件涉众、软件设施、以及软件技术会随时间持续演化、不断更新新老系统的兼容新旧技术的融合用户使用习惯的变迁都会不断挑战生态的可持续性。
其次软件制品之间生态内部或外部存在广泛依赖关系并且一般都有广泛的社会参与全生态很难采用单一集中的管理控制这都使得生态的管理控制复杂性激增。同一生态中有越来越多的组织和机构参与。例如175个公司在OpenStack最近发布的 Rocky版本中贡献了近90\%的代码,来自各个行业、出于不同目标和动机的商业公司,对生态的参与方式也千差万别\cite{zhangtse19}。参与到同一生态系统的组织和机构之间又会存在(或者产生)合作或竞争等关系。总的来说,不断增加的各种组织、其差别迥异的参与方式以及相互间错综复杂的关联关系,都使得生态系统控制和管理的难度迅速且持续增加。
第三,生态系统中的商业参与具有很大的不稳定性。商业公司始终需要在“开放”与“盈利”之间权衡,一旦确定其目标无法完成或参与战略发生转变等,将有可能直接停止(撤走)对软件的所有投入。例如,在开源社区占据主导地位的公司的离开,将可能直接导致该开源生态走向失败\cite{Zhou2016Inflow}。IBM取消了对开源项目Aperi的支持后该项目被迫关闭。对于开源生态来说商业文化与自由开源精神可能存在冲突。商业公司传统的软件开发经验习惯如组织安排、任务分工等可能伤害那些崇尚“黑客文化”、“自由软件精神”的个体开发者。这是因为这类开源开发者更加倾向于自发参与、按照个人意愿选择任务例如目前世界第一大开源JavaEE应用服务器JBossAS的创始人Marc Fleury在RedHat收购JBoss之后离开\cite{CIO2018}
\section{主要研究内容}
为了应对上述挑战,相关研究需从以下几个方面开展。首先,为了理解和度量复杂的生态网络,前提是需要建立一套数据驱动的软件度量和分析方法(§\ref{sec:se-measurement})。其次,围绕软件生态的三个层次,还有以下三方面主要研究内容。第一,为了应对复杂软件供应链所带来的挑战,需要理解并度量大规模代码和项目的供应链模式,从中挖掘可借鉴的成功经验,同时及时识别潜在风险(§\ref{sec:se-supply})。第二,基于软件供应链,开发者之间也形成了相互协作的关系网,如何帮助他们顺利加入复杂项目,提高团队协作效率也是软件生态领域所关注的主要研究内容之一(§\ref{sec:se-cooperation})。第三,基于以上研究内容,我们期待能够深入理解生态系统的形成机理和可持续机理,从而帮助软件生态可持续发展(§\ref{sec:se-ecosystem})。
\subsection{数据驱动的软件度量和分析方法}
\label{sec:se-measurement}
随着开发支撑技术的成熟,近年来软件项目广泛使用版本控制系统、缺陷追踪系统、邮件列表和论坛等工具,大型软件工程的数字轨迹被普遍地保存起来。软件生命周期的数据,包括每一次代码变更、每一个缺陷报告、每一个评论和每一个邮件等,都被完整保存在软件仓库中。这种大规模的多源异构数据为研究软件生态带来重大契机,为人们认识软件开发的本质、提高开发效率和保证软件质量开启了一扇新的大门。如何更好地利用这些数据并让数据发挥最大价值是进行相关研究的基础。首先,应该关注数据的收集、以及组织与存储。其次,由于软件开发活动数据被广泛应用于科学研究和开发实践,数据质量对相关的研究和实践有重大影响,因而需要得到足够的重视。第三,因为大规模数据的存在,面向海量软件制品的分析和度量也成为潮流。。
\subsubsection{数据的收集}
构建数据基础设施的第一步是数据的收集工作。研究者所面临的基本挑战是数据的可得性问题。随着开源运动的不断发展网络上累积了越来越多的公共开放的软件活动数据这使得大规模的数据的收集成为可能。然而长时间、高频率的数据访问将产生类似DoS攻击的不良影响妨碍项目的正常运转。因此很多开源项目的组织都对数据的访问频率做出了限制。因此大量数据的收集通常需要消耗大量的时间才能完成。如果研究者各自重复地进行收集这不仅会给项目带来成倍的数据访问负担而且还造成了时间、人力、物力的浪费这也是建立数据基础设施的必要性之一。目前由于越来越多的研究兴趣投向一些组织所拥有的数据这些组织也开始与学术界进行接触和合作开放他们的数据。例如Stack Exchange公司已经若干次公开发布其问答网站的数据存档\footnote{https://archive.org/details/stackexchange} Mozilla社区也在北京大学软件研究所的数据分析小组的请求下发布了其Bugzilla Dump\cite{Zhou2015Who}。如今,数据可得性的问题已经得到了极大的缓解。
在数据可得的前提下开发和采用对应于不同数据源的数据收集技术是收集过程的核心研究问题这其中包括数据源的定位和数据的处理及下载。在数据源的定位上收集的范围决定其难度。对于单一项目数据源的定位较为简单通过项目的wiki提供的各种在线工具的URL链接人工定位即可对于单一组织管理的项目集合通常会有项目列表其中包含了每个项目各类资源的URL链接对于没有特定的目标要进行普查式的收集需要借助人的知识与经验从一些经典及大型的组织入手按照单一组织下项目的数据源的定位方式进行检索其次利用检索工具进行更大范围的检索例如Mockus在全面收集开源项目版本控制数据的工作中便先从SourceForge、GoogleCode、Savannah、Tigris等知名的软件项目门户、以及Linux kernel、FreeBSD、NetBSD等社区入手之后借助文献、Google代码检索工具等进行补充\cite{mockus2009amassing}。对于数据的下载不同类型的访问方式决定了不同的下载方式。对于问题追踪等来自Web应用的数据通常可以通过网络爬虫技术对页面进行检索和下载如果该应用提供了数据访问的API可以直接通过API来下载。这两种下载方式的缺陷包括两个方面一方面是下载的伸缩性受到应用本身对数据访问频率的限制对于大规模的数据需要投入更多的IP地址及下载时间另一方面是无论用户接口还是编程接口会发生版本的迭代数据下载的逻辑可能需要变更所下载的数据格式可能改变。对于版本控制等可以直接克隆或者镜像后台数据库的系统的数据使用相应的工具或者命令进行下载。对于官方提供工具后台数据库dump的情况研究者只要简单地进行下载即可但数据的提供方需要做一定的处理工作包括去除隐私、安全及其他敏感数据才能对数据进行公开。未来研究的重点将是针对不同应用场景如何高效高质量的定制数据集。
\subsubsection{数据的组织与存储}
数据的组织与存储主要服务于后续的数据访问与分享。数据组织通常包括两个方面数据格式的转换和数据模型的建立。一方面某些原始数据的格式例如Web页面、版本控制库等需要较为复杂的解析程序来进行数据的解析从而提取相应的信息。可以先将此类特殊格式的数据转换为较为通用、解析容易的格式如CSV、JSON、XML等然后进行存储。另一方面为了便于数据的检索和分析有些数据基础设施会对数据进行建模抽象出其中的实体与实体间的关系按照定义的模型进行存储例如Gousios\cite{gousios2013ghtorent}将通过GitHub API所收集到的非关系型的数据按照其定义的关系模型存储在MySQL数据库中。根据数据组织方式的不同数据一般会采用文件系统、数据库系统或者其他工具特定的方式如版本控制系统来进行存储。采用何种方式进行数据的存储取决于原始数据的类型和数据收集者所设计的应用场景。此外多源异构数据的存在使得如何建立不同数据源间的联系成为了其中的重要研究问题之一。
\subsubsection{数据的质量}
高质量的数据是对软件活动进行分析、预测、推荐的基础。确保软件数据质量主要从两个角度出发。首先是数据清洗。数据清洗的目的在于去除影响数据分析结果的“脏数据”。例如,在问题追踪系统中,某个问题报告的评论中可能含有广告等无关软件开发活动的数据,他们会影响基于评论数量、评论时间等度量的准确性从而威胁到分析得出的结论。一般而言,去除“脏数据”的过程更多地体现在具体的数据分析中,在目前大多数数据基础设施的建立过程中,由于没有针对特定的研究问题,数据清洗的工作涉及较少。其次,应该关注数据与上下文是否相匹配\cite{tu18fse}。如果不匹配,可能使得基于问题数据的方法、软件产生的结果存在偏差,甚至无效。例如,在许多利用问题追踪数据智能化预测任务完成时间的工作中,将问题报告被标记为“已解决”的时间点视为该任务完成的时刻,然而任务完成的时间存在问题——开发者在完成任务后可能并不会及时将问题报告标记为“已解决”,而是在之后清理问题追踪系统时,通过脚本进行批量处理,即“任务完成时间”并不能真正代表任务被解决的时刻。鉴于软件生态相关研究对于数据的依赖,随着人们对软件生态的认识逐渐深入,数据质量问题会得到越来越多的关注。同时,需要研究人员构建出可靠的数据集、或者构建相应的方法来产生可靠的数据集。此外,用自动化的方法来检测和修正问题数据也应是未来研究应关注的重点内容之一。
\subsubsection{基于软件大数据的分析}
软件生命周期\index{软件生命周期}的各种数据蕴含了软件开发与维护的大量知识。因此,基于软件大数据的分析可以有效地挖掘这种知识,并服务于软件开发与维护过程。例如,海量软件项目包含大量的代码数据(包括产品代码和测试代码)。因此,可以研究代码的深度表示与理解,完成代码与代码注释的自动生成、方法名与变量名的自动推荐、类型的自动推断、代码搜索、代码分类等软件工程任务。海量软件项目的开发历史积累大量的代码变更数据。因此,可以研究代码变更的深度表示与理解,完成代码表更提交日志的自动生成、代码变更模式的自动挖掘等任务。海量软件项目的开发历史还包括大量的故障数据,例如,软件项目的变更提交中包含着大量的开发人员犯错和纠错数据,软件项目的缺陷跟踪管理系统中蕴涵着大量的缺陷报告和修复数据,软件项目的持续集成构建日志中蕴藏着大量的静态分析规则违反数据与测试失败数据。因此,可以研究故障及其修复的深度理解,完成故障检测、定位与修复、测试用例自动生成等任务。
\subsection{软件供应链的度量与分析}
\label{sec:se-supply}
为了应对复杂软件供应链所带来的挑战,需要理解并度量大规模代码和项目的供应链模式,从中挖掘可借鉴的成功经验,同时及时识别潜在风险。
\subsubsection{软件供应链的风险分析}
软件供应链在为开发人员提供便利的同时也引进了新的风险和不确定性。一方面供应链上任何一个节点的问题都可能波及到链条上其它节点使得损失被放大例如月下载量千万的npm包就曾被黑客篡改大量开发者的权益可能会被侵犯或已经被侵犯\footnote{https://github.com/dominictarr/event-stream/issues/116}。另一方面,任何一个节点需要承受链条上所有其它节点的问题,使得问题定位与解决变得困难。因此,对于软件生态供应链风险的评估就变得愈发重要,很多企业(尤其是大企业)在这方面的需求也不断增加。具体而言,需要对形成软件供应链的软件之间的功能性、组织性依赖关系进行大规模分析,需要对软件供应链中的脆弱点进行识别与分析,从而尽早避免由此带来的潜在风险。值得一提的是,随着软件活动数据越来越丰富,研究软件供应链的理论基础开始从原来的数据少、基于定性的方法向数据丰富、基于量化的方法转变。这提供了更好的方法来量化供应链中的风险及其传递,进而为降低这些风险及其影响力提供了契机。但需要指出的是,由于软件供应链几乎囊括了开发、运行过程中涉及到的所有软硬件,涉及项目众多,项目间关系极其复杂,该方面的研究目前还处于初始阶段。
\subsubsection{开源软件分类、评测与新特性分析}
\label{sec:se-open}
鉴于开源软件\index{开源软件}的广泛使用,需要研究开源软件的自动分类与打标签、以及开源软件之间的图谱化关系,使得开源软件能够被更快速地了解和使用;需要研究多个类似开源软件的自动评测与对比,使得开源软件能够被正确而高效地使用;需要研究开源软件中核心特性的识别与分析,理解各个特性在开源软件中扮演的角色及其重要性,从而避免重复造轮子,同时使得新的有价值的特性能够及时得到应用;需要研究开源软件中优质代码的评价方法,对优化代码搜索的结果排序以及提升开发人员素质等方面都有重要作用。
\subsection{个体学习与群体协作的研究}
\label{sec:se-cooperation}
软件涉众中的开发者在软件生态中扮演者非常重要的角色。如何帮助新开发者快速加入复杂生态以及提高群体协作效率是一大关键研究内容。
\subsubsection{个体学习}
随着软件生态变得越来越复杂,个体如何学习并加入生态存在诸多障碍。为了向他们提供有效帮助,相关研究应重点关注两个方面:如何利用数据来度量个体学习能力、以及如何借鉴社会学的研究方法和洞见来研究软件生态中的社会性特征及相关问题。
软件活动最根本问题在于开发者个体的复杂性,主要挑战在于个体(学习)能力的度量和评估——无法度量也就无法揭示问题所在,进而难以控制其复杂性。海量的软件活动历史数据和先进的分析方法和工具使得探索并解决该问题成为可能。例如,通过对软件活动中的多源数据(包括版本控制、任务追踪、人力资源等数据)进行融合来度量开发者的开发任务随时间的变化,对任务的价值和难度、所体现的开发者人际关系进行多维度的刻画,建立程序员成熟度的度量框架,以此来评估开发者经验的成长轨迹\cite{Zhou2015Who}。用数据来建立对个体和群体行为的度量并以此来观察软件生态的特征和问题,是未来的核心挑战之一。探究软件项目个体的学习和能力成长是期中的重要问题。未来研究工作需要在下述方面深入开展,包括更好支持评估项目中程序员的技能与效率,支持对程序员成长轨迹的精确分析,为初学者选择合适的开发任务等。
社会科学领域的诸多学科,例如认知学、发展心理学、组织管理学,已经对人类学习有许多研究。更确切地说,意识和脑、思考和学习的方式、解决问题过程中神经的行为和能力的提升都被集中地研究。此外,多个分支学科发现的证据存在交集\cite{national2000people}。这些都使得多学科交叉发展以追求对人类学习的更全面的认识成为一个重要趋势。因此,如何借用这些学科的视角去理解开发者的学习是主要研究内容之一。这方面已有很多研究值得借鉴,认知学就是这样一个范例\cite{curtis1984fifteen},它提供了很好的方式去理解影响项目表现的最重要因素,管理科学的框架可以用来表征开源贡献者进入社区的初始行为特征\cite{Zhou2015Who}。此外,我们还能基于对开发者学习的研究结果普适性地理解人类学习。
\begin{figure}[ht]
\centering
\includegraphics[scale=0.8]{fig2-9/fig5.png}
\caption{开发者行为特征的理论框架与相关量度\cite{Zhou2016Inflow}}
\label{fig:fig4}
\end{figure}
\subsubsection{群体协作}
群体协作在软件活动中主要体现为各种微过程,微过程是项目在完成各项特定任务(例如解决缺陷、提交代码、沟通需求、指导新手等)时所采用的方式方法或活动流程,对微过程的度量是获取细粒度可复制最佳实践的关键。从大规模数据挖掘细粒度的微过程,是找到可复现群体协作活动的可能途径。具体来说,对群体协作的研究可以从广度和深度两个方面来开展,如图\ref{fig:fig5}所示。
广度研究是指从尽可能广阔的视角上例如覆盖尽可能多的项目去探索问题。例如对拥有大量开发人员和项目的大型在线社区SourceForge.net进行分析发现开发者群体协作关系呈现无尺度网络Scale-free Network特征\cite{ohira2005supporting}。例如以GitHub中海量软件项目为样本研究项目中文件目录的使用模式及其对项目流行度的影响等。通过对开发者社交网络的构建有助于帮助开发者定位沟通对象识别有经验的开发者从而提高群体协作的效率和质量。深度研究是指以典型案例为研究对象进行深入探索。例如针对软件项目缺陷追踪工作流中的一个微过程产品定位设计工具用于预测缺陷报告是否被准确定位或者以某个项目为例来定位错误或修正错误。
总的来说,需要围绕软件生态中的各种相关活动,从深度和广度,并从多个特征维度对群体协作进行度量,以期为复杂的群体社会化软件活动提供相关技术支撑和建议。
\begin{figure}[ht]
\centering
\includegraphics[scale=0.3]{fig2-9/fig4.png}
\caption{微过程研究模式图}
\label{fig:fig5}
\end{figure}
\subsection{软件生态机制机理的研究}
\label{sec:se-ecosystem}
探究生态系统构建及其持续发展的理论、方法与技术是未来软件领域的一项关键研究内容。软件生态在近十多年的发展中得到了学术界和产业界的广泛关注,取得了一定进展,需要研究的内容主要包含以下三个方面。
\subsubsection{软件生态系统的形成和可持续性}
此类研究的主要目的是通过分析生态系统的历史数据、度量生态的健康状态,并建立可持续发展机制机理等。需要研究软件生态系统健康度的评价指标;研究软件生态系统的形成机制;研究软件生态系统的成熟理论,用来评估软件的进化,例如生存能力,增长潜力等;研究核心社区的工作负载与协同工作机制;研究生态多样性对演化的影响等。总之,寻找降低软件生态管理复杂度的解决方案将是未来工作的一个重点。
\subsubsection{软件生态系统中的商业参与}
商业公司在软件生态中扮演越来越重要的角色,但其对各种生态的各个维度的影响尚不可评估。此类研究的主要目的是探究商业参与模式及其对软件生态的影响并寻找可能的有效实践。具体内容涉及:研究商业主持或参与软件生态的动机(例如,在开源生态中的盈利模式),不同的商业组织参与到同一个生态中彼此的竞争和协作模式,商业参与的程度对生态中其他角色的影响、对生态效率和质量的影响等。特别地,很多研究案例折射出了目前开源生态系统在商业与开源混合时的困局,这其中各种利益如何综合、生态如何可持续发展,需要综合多领域知识予以回答。未来的挑战还在于从各个角度探索以深入并全面地刻画生态系统中的商业参与。
\subsubsection{软件生态的演化问题}
在开源和商业混合软件生态中,企业对开源平台进行定制化形成企业自研平台,并在此基础上开发各类应用。与此同时,开源构件在开源平台、企业自研平台、以及各类应用中被广泛使用。开源平台、企业自研平台、各类应用、以及开源构件之间存在着互相依赖,但又可以独立演化,导致了同步演化与升级的困难。因此,需要研究软件生态中的同步演化与升级问题。具体而言,需要研究开源构件的变更影响分析,确定开源构件的代码变更对于使用该开源构件的软件的影响范围及影响程度;需要研究开源构件变更的测试用例生成,保障开源构件与使用该开源构件的软件之间的兼容性;需要研究开源代码中安全漏洞的自动预警与修复,确保软件的安全性;需要研究开源构件的版本自动升级与热替代,保证使用了开源构件的所有软件都能够可靠地在运行时实现版本升级;需要研究开源平台与企业自研平台的同步演化,保证开源平台上的新特性能够及时得到应用,而自研平台上的特性能够回馈给开源社区。
服务化是目前许多软件系统的一个发展方向和趋势,是软件生态需要考虑的一个重要方面。因此,需要研究大规模软件系统的服务化改造与治理问题,包括传统的单体应用系统或者遗留系统的微服务化/Serverless化自动改造从而提高微服务化/Serverless化改造速度并缩短大规模软件系统上云的过程遗留代码的自动迁移和规范化管理从而提高遗留资产的治理水平。相应地服务化系统的监控与运维不同于传统的软件系统。因此需要研究服务化系统的智能化监控和运维问题实现服务化软件系统中基于海量运行数据的智能监控和运维方法提供精确的异常报警与根源检测、以及快速的故障修复与恢复帮助开发者节省时间帮助高层提供决策支持。
\section{本章小结}
现如今全球化的软件开发面临复杂性不断扩张的问题:软件规模急剧增长、代码依赖错综复杂;开发者个体差异大、群体协作难以控制;广泛的社会参与形成复杂生态等。这些问题为研究软件生态带来了巨大挑战。在这一章中,我们从软件生态的三个层次出发,指出了软件生态面临的几大挑战问题。同时,我们也围绕这几大挑战问题,列出了一些重要研究内容,期待能帮助人们更好的理解和构建软件生态,也希望能为相关研究人员带来一些新观点和新视角。
%\printbibliography[heading = bibintoc]