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

169 lines
34 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
人机物三元融合的新型应用模式, 通过综合云计算、大数据、移动互联网、物联网、人工智能为代表的新一代信息技术,使人类社会(人)、信息空间(机)、物理世界(物)之间实现互联,形成以人为中心的新社会形态\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 NetworkR语言综合档案网络复杂庞大的运行时依赖关系其中节点是软件包Package连线是软件包之间的运行时依赖关系。
例如CRANComprehensive R Archive NetworkR语言综合档案网络在运行时上千个软件包会建立上万个依赖关系。
不同于围绕同一软件项目形成的生态系统这种由于项目之间的相互依赖例如软件的构建或运行时依赖、开发者同时参与多个软件项目、软件代码的复制粘贴、软件项目的定制化等形成的复杂关系网络被称为软件供应链software supply chain\cite{Mockus2019Keynote}
一种常见的软件供应链模式是企业将开源软件\index{开源软件}当作上游对其进行定制化形成企业自研软件并在此基础上开发各类应用。例如很多企业在OpenStack基础上定制开发了自己的云平台或者在Android基础上定制开发了自有手机操作系统等。与此同时开源构件在开源平台、企业自研平台、以及各类应用中被广泛使用。开源平台、企业自研平台、各类应用、以及开源构件之间相互依赖但又在一定程度上独立演化。
\ref{fig:fig3}以开源软件为例展示了软件供应链\index{软件供应链}所涉及的技术栈层次(闭源软件生态或开源闭源软件一体的生态也是同理),包含底层硬件固件、系统软件(包括操作系统和数据库)、平台软件(典型代表是云计算和大数据平台)、以及与用户息息相关的应用软件。大型的软件供应链几乎涵盖了开发、运行、使用过程中涉及到的所有软硬件及其生态。数以万计相互依存的软件项目形成的供应链为软件开发和使用带来了前所未有的困难;同时,规模指数级增长的软件项目及其之间庞杂的依赖关系使得供应链的复杂度激增。
一方面供应链上任何一个节点的问题都可能波及到链条上其它节点使得损失被放大例如月下载量达到千万的npm包就曾被黑客篡改大量软件项目和开发者受到影响\footnote{https://github.com/dominictarr/event-stream/issues/116}。另一方面,任何一个节点都可能受到供应链上其它节点的问题影响,使得问题定位与解决变得困难。
因此,如何理解并利用大规模代码和项目的供应链行为是一个亟待解决的重要问题,其目的是帮助开发者/使用者提高效率并规避风险,包括利用供应链高效地找到可依赖的或可替换的高质量软件构件、工具或平台,及时发现供应链中的脆弱点并避免由此带来的潜在风险,并避免重复造轮子等。
\subsection{个体参与生态的困难性}
\label{sec:se-difficulty}
个体(主要包括开发者、维护者等)作为软件生态中的参与者,是影响软件质量和效率的关键因素,同时也是软件生态中最核心的角色之一。近年来涌现的一些软件趋势及现象(例如软件开发全球化、软件众包、互联网新媒体等)进一步促使软件活动成为一种社会化活动,并改变了软件从业人员思考、学习、工作、以及协作的方式。同时,软件生态系统的复杂性不断增强,使得新人加入生态非常困难。因此,个体如何学习和加入复杂软件生态系统成为了一个亟待解决的问题。此外,以互联网为媒介的各种应用蓬勃发展,各种新的技术和应用方式层出不穷,这也给开发者快速学习并适应变化带来了很大的挑战。这些问题已经引起了工业界和学术界的广泛关注。
\begin{figure}[ht]
\centering
\includegraphics[scale=0.8]{fig2-9/fig5.png}
\caption{开发者行为特征的理论框架与相关量度\cite{Zhou2015Who}}
\label{fig:fig4}
\end{figure}
“个体学习”包含了两层含义。第一,学习什么?参加软件项目除了要求开发者掌握相应的软件技能外,还需要他们理解所涉及的领域知识。他们还需要熟悉使用各种开发支持工具,而这些工具及其积累的数据也是网络化环境下传播知识和学习项目的重要媒介。此外,根据相关研究\cite{Astromskis2017Patterns},开发者将近一半的工作时间都花费在沟通上,因此他们还需要学习如何有效沟通。
第二如何学习一个开发者如何从新手成长为专家如何从一般参与者变为核心团队成员在此过程中如何获取并按何种顺序掌握各种知识和信息等都是理解个体学习的关键。特别是在开源项目中由于没有层级组织、训练计划以及集中式的环境给予必要的熏陶和培育初学者更多采用的是“边干边学”Learning by Doing的模式。如何提供方法和技术让一个新手程序员可以很快展现出一个熟练程序员的生产效率是很经典但仍然很挑战的问题。此过程存在的挑战主要体现在两方面一方面传统的学习手段存在局限性例如专家和初学者解决问题的心理模型不一样因而在其指导初学者时可能会出现失配问题Zone of Proximal Development认知科学的一个重要发现\cite{Vygotsky1978Interaction})。理解项目中失配问题的本质,并建立相应的技术和工具来更好适配初学者的需求和专家的指导,不仅能帮助个体成长,也能帮助软件项目和社区的发展。
另一方面,软件开发是知识密集型活动,尤其软件复杂性还在不断增长,如何高效高质实施软件活动不仅挑战着人类本身的认知局限性,例如工作记忆系统容量有限,认知负荷、学习曲线等问题。这方面需要融合相关学科的方法和洞见,并利用软件大数据提供的机会加以突破。例如,管理科学组织学认为,个人的初始环境对其长期行为有影响,但影响程度难以界定。借鉴这种洞见,利用开源贡献者的初始行为数据,对开源贡献者的意愿、能力和环境进行多维度的刻画,如图\ref{fig:fig4}所示,就可以量化开发者初始行为对长期行为的影响\cite{Zhou2015Who}
总的来说,我们需要对个体如何学习软件项目、如何使项目更容易被理解和学习、如何提供所需要的资源和工具来提高初学者的学习能力和生产效率有更深入的理解。
\subsection{群体协作的不可控性}
\label{sec:se-control}
全球化软件活动已经发展成为一种不可逆转的趋势。分布在世界各地的软件涉众需要协同开发并发布高质量的软件,并需要持续迭代反馈以改进和升级软件,这些都将导致大规模的通信、协调和合作。因此,其中所涉及的社会性问题,例如软件活动中涉及到的众多角色能否积极参与并良好地协作,会影响到软件生态中各类活动的效率以及产品的质量。
以开源软件开发为代表的基于互联网的软件生态活动大多都是在开放透明的分布式环境下开展合作具有沟通媒介和形式多样化、协作内容和信息碎片化的特点。例如常用的沟通媒介包括版本控制系统和缺陷追踪系统等软件开发支撑工具以及Stack Overflow等技术问答社区。此外软件项目的上下文千差万别使得找到可复现的通用最佳实践非常困难导致群体社会化软件活动的可知与可控成为一个挑战。因此在复杂软件生态系统中群体如何协作以及协作行为如何发展是一个亟待解决的问题。
\subsection{生态的可持续性}
\label{sec:se-continuous}
随着时代和环境的变迁,软件生态的可持续性在可见的未来存在很大挑战,主要表现在如下三个方面。
首先随着支持分布式软件活动的开放式现代平台如GitHub、Bitbucket等的出现和不断完善软件项目正在以前所未有的速度增长而软件涉众的规模也在快速增长。软件生态中的软件制品、软件涉众、软件设施、以及软件技术会随时间持续演化、不断更新。在此过程中新老系统的兼容、新旧技术的融合以及用户使用习惯的变迁等问题都会不断挑战生态的可持续性。
其次软件制品之间生态内部或外部存在着广泛的依赖关系并且一般都有广泛的社会参与整个生态很难采用单一和集中式的管理控制这都使得生态的管理控制复杂性激增。例如175家企业在OpenStack最近发布的 Rocky版本中贡献了近90\%的代码,其中来自不同行业、有着不同目的和动机的企业参与生态的方式也千差万别\cite{zhangtse19}。参与同一生态的组织和机构之间又会存在(或者产生)合作或竞争等关系。总的来说,不断增加的各种组织、迥异的参与方式以及相互间错综复杂的关联关系,都使得生态系统控制和管理的难度持续增加。
最后,生态系统中的企业参与具有很大的不稳定性。商业企业始终需要在“开放”与“盈利”之间权衡,一旦确定其目标无法实现或企业战略发生变化,将有可能直接停止(撤走)对所参与的软件生态的所有投入。例如,在开源社区占据主导地位的企业的离开有可能直接导致该开源生态走向失败\cite{Zhou2016Inflow}。例如IBM取消了对开源项目Aperi的支持后该项目被迫关闭。对于开源生态而言商业文化与自由开源精神可能存在冲突。开源开发者更加倾向于自发参与、按照个人意愿选择任务。因此商业企业传统的软件开发习惯如组织安排、任务分工等可能伤害那些崇尚“黑客文化”、“自由软件精神”的个体开发者。例如目前世界第一大开源JavaEE应用服务器JBossAS的创始人Marc Fleury在RedHat收购JBoss之后离开\cite{CIO2018}
值得指出来的是,目前中国也在逐步构建软件产业生态(§\ref{Ch1-5-SoftwareIndustry})。例如在操作系统、数据库和中间件等方面形成了自有产品和上下游应用的依赖,但是如何能够拓展更广阔的市场,并形成可持续的生态,还有待研究。另一方面,国内软件厂商是否能够把握时机,面向未来的人机物融合应用,定位到合适的技术进行发展建立生态,是一个很大的挑战。
\section{主要研究内容}
为了应对上述挑战,需要开展以下几个方面的研究工作。首先,为了理解和度量复杂的软件生态,需要在现有软件数据挖掘的技术和方法的基础上继续发展数据驱动的软件度量和分析方法(§\ref{sec:se-measurement}。其次围绕软件生态的三个层次还需要分别针对各自的问题开展研究工作1应对复杂软件供应链所带来的机会和挑战如何理解并度量大规模代码和项目的供应链模式从中挖掘可借鉴的成功经验同时及时识别潜在风险§\ref{sec:se-supply}2基于软件供应链开发者之间形成了相互协作的关系网如何帮助他们顺利加入复杂项目、提高群体协作效率§\ref{sec:se-cooperation}3在此基础上如何深入理解生态系统的形成和可持续机理从而帮助软件生态可持续发展§\ref{sec:se-ecosystem})。
\subsection{数据驱动的软件度量和分析方法}
\label{sec:se-measurement}
随着开发支撑技术的成熟,近年来软件项目广泛使用了版本控制系统、缺陷追踪系统、邮件列表和开发者论坛等工具,由此也为相应的软件开发过程留下了较为完整的数字化记录。软件生命周期中的各种数据,包括代码变更、缺陷报告、开发者评论和邮件等,都被保存在各种软件仓库中。这种大规模的多源异构数据为软件生态研究带来了重大契机,为人们认识软件开发的本质、提高开发效率和保证软件质量开启了一扇新的大门。
如何更好地利用这些数据使之发挥更大的价值是开展软件生态相关研究的基础。首先,应该关注软件数据的收集、组织与存储。其次,由于软件数据被广泛应用于科学研究和开发实践,其中的数据质量问题需要得到足够的重视。最后,因为大规模数据蕴藏的价值极为丰富,为从点到面、从特定到通用洞察软件活动提供了机会,因此面向海量软件数据的分析也成为潮流。
\subsubsection{数据的收集和处理}
随着开源社区的不断发展网络上累积了越来越多的公共开放的软件活动数据这使得大规模的数据收集成为可能但通常需要消耗大量的时间才能完成。目前一些开源组织已经开始与学术界进行接触和合作开放他们的数据。例如Stack Exchange公司已经持续公开发布其问答网站的数据存档\footnote{https://archive.org/details/stackexchange} Mozilla社区也在研究者请求下发布了其Bugzilla Dump\cite{Zhou2015Who}。Mockus等收集了所有开源Git仓库包括GitHub、BitBucket等建立了一个数据集WorldOfCode\cite{mockus2009amassing}。未来研究的重点将是针对不同应用场景,高效高质量地定制数据集。
并且,多源异构数据(例如数据来源于版本控制系统、缺陷追踪系统、邮件列表、问答系统等)的存在使得如何建立不同数据源间的联系成为了重要研究问题。
\subsubsection{数据质量的研究}
高质量的数据是对软件活动进行分析、预测、推荐的基础。确保软件数据质量主要从两个角度出发。首先是数据清洗。数据清洗的目的在于去除影响数据分析结果的“脏数据”。例如,在问题追踪系统中,某个问题报告的评论中可能含有广告等与软件开发活动无关的数据,它们会影响基于评论数量和时间等度量的准确性从而威胁到分析得出的结论。一般而言,去除“脏数据”的过程更多地体现在具体的数据分析任务中。在目前大多数数据基础设施的建立过程中,由于没有针对特定的研究问题,数据清洗的工作涉及较少。其次,应该关注数据与上下文是否相匹配。如果不匹配,可能使得基于问题数据的方法所产生的结果发生偏差。例如,在许多利用问题追踪数据智能化预测任务完成时间的工作中,将问题报告被标记为“已解决”的时间点视为该任务完成的时刻,这种做法存在问题:开发者在完成任务后可能并不会及时将问题报告标记为“已解决”,而是在之后清理问题追踪系统时通过脚本进行批量处理\cite{tu18fse}。鉴于软件生态相关研究对于数据的依赖,随着人们对软件生态的认识逐渐深入,数据质量问题会得到越来越多的关注。每种软件数据产生的场景、存在的风险及其带来的影响将需要更深入的研究。同时,需要构建出可靠的数据集,并提出相应的方法来产生可靠的数据集。此外,用自动化的方法来检测和修正问题数据也应是未来研究应关注的重点内容之一。
\subsubsection{基于软件大数据的分析}
当数据抵达一定的规模,一方面对其所需要的处理和分析方法会有不同需求,另一方面也为基于海量数据研究活动提供了新的机会。
前者的研究内容涵盖:针对海量软件数据中类型多样、但个体数据之间具有内在逻辑联系的特点,为在数据分析中全面呈现软件开发上下文并构建开发者、过程和制品信息,研究跨阶段、跨版本、跨类型、跨项目和跨组织的软件数据关联方法,以保证不同来源的软件数据具有连续时间的逻辑联系和语义一致性;
针对软件数据存在的大量缺失、噪声和不确定数据,为理解软件数据在质量上的独特性质,研究缺失、噪声和不确定数据的内在产生机制。在此基础之上,研究受限于软件数据质量条件的数据分析方法。针对软件数据在分布、类型和维度上与经典统计数据分布假设的差异,研究特定于软件数据的数据采样和统计实验设计方法。
另一方面,基于软件大数据的分析可以有效地挖掘软件生命周期\index{软件生命周期}中蕴含的大量知识,并服务于软件生态中的各种活动。可以基于海量的代码数据研究代码的深度表示与理解,完成代码与代码注释的自动生成、方法名与变量名的自动推荐、类型的自动推断、代码搜索、代码分类等任务;可以基于海量的开发历史数据研究代码变更的深度表示与理解,完成代码变更提交日志的自动生成、代码变更模式的自动挖掘等任务;可以基于海量的软件缺陷数据研究软件故障及其修复,实现故障检测、定位与修复、测试用例自动生成等目标。
\subsection{软件供应链的度量与分析}
\label{sec:se-supply}
为了应对复杂软件供应链所带来的挑战,需要理解并度量大规模代码和项目的供应链模式,从中挖掘可借鉴的成功经验,同时及时识别潜在风险。
\subsubsection{软件供应链的行为分析}
首先需要研究形成供应链的软件之间的功能性和组织性依赖关系,并进一步通过分析代码提交和软件包依赖等手段获取生态中的各类元素及他们之间的关联,建立包含开发者、项目、软件制品的多维软件供应链模型,并基于供应链建立各个元素的度量。该模型为生态中的软件涉众解决某个问题寻找恰当的代码片段、软件库、开发者等提供有效的帮助。
其次,开源软件是构成软件供应链的重要元素,需要研究其分类、评测与特性识别,以更好支持软件供应链行为。具体来说,需要研究开源软件的自动分类与标注,使得开源软件能够被更快地了解和使用;需要研究相似开源软件的自动评测与对比,使得开源软件能够被正确而高效地使用;需要研究开源软件的核心特性的识别与分析,理解各个特性在开源软件中扮演的角色及其重要性,从而避免重复造轮子,同时使得新的有价值的特性能够及时得到应用;需要研究开源软件中优质代码的评价方法,使其可以用于代码搜索结果的优化排序以及开发人员的能力评价。
开源软件的另外一个重要研究内容是其变更影响,即确定开源软件的代码变更对于使用该开源软件的软件的影响范围及影响程度。需要研究开源软件的版本自动升级与热/冷替代,保证使用了开源软件的所有软件都能够可靠地实现版本升级或替换;需要研究开源代码中安全漏洞的自动预警与修复,确保软件的安全性;需要研究开源平台与企业自研平台的同步演化,保证开源平台上的新特性能够及时得到应用,而自研平台上的特性能够回馈给开源社区。
\subsubsection{软件供应链的风险评估}
软件供应链在为人们提供便利的同时,也引入了新的风险和不确定性,因此需要评估软件生态供应链风险,当前许多企业(尤其是大企业)在这方面的需求也在不断增加。具体而言,需要在对形成软件供应链的软件之间的功能性和组织性依赖关系进行大规模分析的基础上,对软件供应链中的脆弱点进行识别、分析、预警和剔除,从而避免由此带来的潜在风险。
值得一提的是,随着软件活动数据的逐渐丰富,软件供应链的研究从原来基于少量数据的定性分析方法逐步向基于大数据的量化分析方法转变。这种对供应链中的风险及其传递关系进行量化的方法,为降低这些风险及其影响力提供了更好的契机。但需要指出的是,由于软件供应链几乎囊括了开发、运行过程中涉及到的所有软硬件,涉及项目众多,项目间关系极其复杂,该方面的研究目前还处于初始阶段。
\subsection{个体学习与群体协作的研究}
\label{sec:se-cooperation}
软件涉众中的开发者在软件生态中扮演着非常重要的角色。如何帮助新开发者快速加入复杂生态并提高群体协作效率是一项关键研究内容。
\subsubsection{个体学习}
随着软件生态变得越来越复杂,个体开发者在学习并加入生态方面存在诸多障碍。为了向他们提供有效帮助,相关研究应重点关注两个方面:如何利用数据来度量个体学习和认知能力,以及如何借鉴社会学的研究方法和洞见来研究软件生态中的社会性特征及相关问题。
软件活动的一个根本问题在于开发者个体的复杂性,相应的重点研究内容在于个体学习能力的度量和评估。%例如,通过对软件活动中的多源数据进行融合来度量开发者的开发任务随时间的变化,对任务的价值和难度、所体现的开发者人际关系进行多维度的刻画,建立程序员成熟度的度量框架,以此来评估开发者经验的成长轨迹\cite{Zhou2015Who}。
如何利用海量的软件活动数据和先进的分析方法和工具来建立对个体和群体行为的度量并以此来观察软件生态的特征和问题是未来的核心挑战之一。未来研究工作需要在下述方面深入开展更好支持评估项目中程序员的技能与效率支持对程序员成长轨迹的精确分析为初学者选择合适的开发任务把程序员的工作流和代码跟AI技术相结合以匹配其能力需求等。
社会科学领域的诸多学科,例如认知学、发展心理学、组织管理学,已经对人类学习有许多研究。更确切地说,意识和脑、思考和学习的方式、解决问题过程中神经的行为和能力的提升都被集中地研究。此外,多个分支学科发现的证据存在交集\cite{national2000people}。这些都使得多学科交叉发展以追求对人类学习的更全面的认识成为一个重要趋势。因此,如何借用这些学科的视角去理解开发者的学习是主要研究内容之一。这方面已有很多研究值得借鉴,认知学就是这样一个范例\cite{curtis1984fifteen},它提供了很好的方式去理解影响项目表现的最重要因素。此外,我们还能基于对开发者学习的研究结果普适性地理解人类的学习和认知。
\subsubsection{群体协作}
群体协作在软件活动中主要体现为生态中的软件涉众为完成各项特定任务(例如解决软件故障、提交代码、沟通需求、指导新手等)而协调协作所采用的方式、方法或活动流程。
重点研究内容主要体现在三个方面。首先,需要理解和量化软件相关协作活动中的问题和最佳实践,以优化群体协作活动;其次,研究如何建立技术和机制来协调群体之间的依赖和消解冲突;第三,鉴于软件活动的性质(知识密集型活动)和规模,其群体协作为研究人类协作的机制机理提供了契机,不仅帮助促进大规模软件生产,也可以发展更广泛的对人类群体协作的洞见。因此,群体协作的机制机理研究将是软件生态研究的重要方向。
从研究方法来说,鉴于大规模软件活动数据的存在,对群体协作的研究可以从深度和广度两个方面来开展,如图\ref{fig:fig5}所示。
深度研究是指以典型案例为研究对象进行深入探索在点上展开突破但研究结果可能有特定性。例如基于某个项目研究软件缺陷的定位或修正但其预测模型可能难以应用到不同场景的项目中。广度研究是指从尽可能广阔的视角上例如覆盖尽可能多的项目探索问题因此研究结果有较强的通用性。例如以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{软件生态系统中的商业组织参与}
商业组织在软件生态中扮演越来越重要的角色,但其对各种生态的各个维度的影响尚不可评估。此类研究的主要目的是探究商业组织参与模式及其对软件生态的影响并寻找可能的有效实践。具体内容涉及:研究商业组织领导或参与软件生态的动机(例如,开源生态中的盈利模式)、不同的商业组织在同一个生态中的竞争和协作模式、商业参与程度对生态中其他参与者角色以及生态效率和质量的影响等。特别地,很多研究案例折射出了目前开源生态系统在商业与开源混合时的困局,这其中各种利益如何平衡、生态如何可持续发展等问题都需要综合多领域知识予以回答。未来的挑战还在于从各个角度探索以深入并全面地刻画生态系统中的商业参与。
\section{本章小结}
当前全球化的软件活动面临复杂性不断扩张的问题:软件规模急剧增长、代码依赖错综复杂;开发者个体差异大、群体协作难以控制;广泛的社会参与形成复杂生态等。这些问题从软件生态角度为软件学科带来新的机会和挑战。本章我们从软件生态的三个层次出发,指出了软件生态面临的几大挑战问题。同时,我们也围绕这些挑战问题,列出了一组重要研究内容,包括理解和利用大规模代码和项目的供应链行为,研究个体学习和群体协作,研究软件生态的形成和可持续机制机理等。期待能帮助人们更好的理解和构建软件生态,也希望能为相关研究人员带来一些新观点和新视角。
%\printbibliography[heading = bibintoc]