452009年秋季刊多功能开放式软件设计按时提供稳定的软件产品需要严格遵守既定的开发计划。开发小组根据客户需求针对其产品设定部分功能,当然也就不可避免地排除了部分强化功能。向外部程序设计者开放软件开发流程可以为增加新的软件功能开辟另一条途径,这样做对生产时间和原始产品的质量都不会产生任何影响。在理想情况下,一个软件只具备某用户所需的一些功能,仅消耗当前任务所需的资源,而且拥有以这些功能为中心的人机交互界面。但在现实中却很少有这样的情况,所开发的软件功能往往需要满足多个不同客户的需要。结果可能导致该软件对某些人而言过于复杂,而对其他一些人而言又缺少关键组件;不过有一种方法可以解决这一难题,该方法正被越来越多的软件开发公司和用户所采纳。开发人员可以通过开发应用编程界面(API)获取软件程序或操作系统状态和功能方面的信息[1]。软件开发人员可能会选择通过建立一个API而取消对特定组件或所有软件的锁定,以便使客户或其他开发者可以添加新的功能来增强软件的性能。这一点对独立开发者而言非常有利,因为独立开发者可以选择增加新的功能,可以根据自己的计划自主选择,也可以在不受原开发者约束的条件下自由开展工作[2]。过去,软件开发人员要想增加软件程序的新功能必须先修改该程序的源代码[3]。修改源代码会产生以下两方面的问题:首先,这样做会使原开发者无法控制原始软件的修改;其次,任何使用源代码的人员都可以公开使用与原始软件相关的专用自主知识产权(IP)。但与API结合后,开发者就具备了使用高级编程语言的新能力[4]。独立开发者编写的算法与原始程序的数据和公用程序之间通过API进行交互。最初是由某开发者开发、后来又由某独立程序设计者进行扩展的软件程序可以通过计算器的一系列功能进行比喻说明。某开发者开发出了包括加、减、乘、除程序在内的简单程序。后来,某独立编程者在此基础上增加了正弦、余弦和正切三角函数之类的函数运算功能。如果原始开发者通过开放的API能够提供计算器软件必要组件的话,那么就可以在不修改源代码的条件下将新功能“插入”简单的计算器中[5]。能够将额外功能(如前面例子中的三角函数)增加到软件中但又不会改变其原始结构的一个好处是可以根据需要将其开启或关闭。仅需简单计算器的用户就可以享用一个包含更少指令和概念的精简界面。一旦有需要,用户就可以通过诸如菜单栏之类的各种途径使用附加功能。双重开发软件的概念更趋于完善。例如,诸如Web浏览器之类拥有庞大用户群的应用软件能够与一个扩展性的API相结合,生成一个由原始开发者和独立开发者群体组成的软件生态系统,独立开发者群体的任务是扩展核心软件程序。生态系统组件的综合比各个独立的生态系统提供更多的功能价值,从而使原始开发者、独立开发者和用户都能从中受益。RichardBennettBenjaminCornelisseRobertMerkle壳牌国际勘探与生产公司荷兰RijswijkJanEgilFivelstadPaulHovdenakBlueback油藏公司挪威斯塔万格TrygveRanden挪威斯塔万格《油田新技术》2009年秋季刊:21卷,第3期。©2009斯伦贝谢版权所有。在编写本文过程中得到以下人员的帮助,谨表谢意:休斯敦的NajibAbusalbi,MarcusGanz,SusanLundgren,AndrewMuddimer,JeffRubenstein和EricSchoen,以及美国马萨诸塞州堪布里奇的DavidMcCormick。Ocean和Petrel是斯伦贝谢公司的商标。BRIDGEEM是Blueback油藏公司的商标。.NET,VisualC#和Windows是微软公司的商标。Rock3D和Rock3DSynthetics是壳牌公司的商标。1.有关应用编程界面、免费在线计算词典的更多信息,请参见:(2009年9月22日浏览)。2.原始开发公司是软件的所有者。此处的独立开发者要么为软件添加新的功能,要么利用软件中的组件生成另一种程序。一般情况下,软件所有者和独立开发者之间会签订一份专利使用许可协议;但书面协议条款也可能注明是免费的。3.软件开发商编写被称为源代码的文本行。这些指令一旦被转化成计算机代码之后就由计算机处理部件实施处理。4.高级编程语言比汇编语言更抽象,汇编语言本身就是一台特定中央处理机计算机语言的符号性表示。高级语言通常包括诸如for、loop或return之类的口头语言陈述(通常是英语)。5.插件是一个常用的计算机术语,是为大型软件程序提供新的功能而编写的小型软件程序。该术语代表为中央程序增加新的模块。通常在未安装核心软件的情况下,这些模块无法运行。46油田新技术在油气行业,许多复杂的软件程序都旨在应对油气开采过程中出现的多方面的挑战。例如,Petrel地震-模拟软件就包含了许多地质和地球物理(G&G)工作流组件方面的工具。对于每个新版本,开发小组为了满足业界的技术需求为软件添加了一些新的功能,并提高软件效率、可靠性和用户友善性等。项目经理需要对诸多拟定功能该不该开发做出艰难的抉择。为了向客户提供具有更多功能的G&G工作流,斯伦贝谢最近开发了一个API,旨在向第三方软件供应商开放Petrel软件。这样做可以使公司开发者将精力主要集中在开发主要功能上,而独立开发者可以以插件形式给软件增加新的功能。各种新模块的复杂程度各不相同。任何具备基本编程技术的人员在几分钟内都能完成简单、省时的实现人工数据处理过程自动化算法的编写。然而,能够提供诸如电磁建模之类的更复杂功能的插件,则需要编程小组和油田专家付出更大的努力。开放式软件既有利于独立开发者,又有利于斯伦贝谢,因为这一措施使得插件开发过程与Petrel发布进程分离开来。因此,新的功能可以随时得到开发和应用,而这些新功能的知识产权仍归其所有者所有。独立开发者可以利用Ocean应用程序开发架构在该软件基础上自主开发新功能。Ocean架构以微软公司.NET架构和VisualC#语言之类的业界标准编程工具为基础,可以为Petrel软件的内部工作提供一个编程接口。独立编程人员可以编写自己的算法将新功能与现有组件(如属性建模或体积计算)相结合,然后在软件环境中显示交互结果。本文介绍了开放式软件的概念,并对其如何被用来增强复杂软件的功能做了阐述。第一个实例介绍了客户利用Ocean架构来开发新的岩石物理分析功能的过程。第二个实例重点介绍了独立软件供应商利用该软件开发472009年秋季刊叠前地震数据处理叠后地震解释地震反演实时地质导向岩石物理和合成地震模拟油藏模拟油藏模拟油井设计电磁数据解释^G&G工作流实例。该流程从输入和解释包括地震数据(左上)和电磁数据(左下)在内的信息开始。随后在建立油藏模型之前实施地震反演。工作流中的一些步骤会对其他步骤产生影响:例如,生成合成地震数据(中)的目的是验证油藏模型属性的准确性。如果数据之间存在明显的不一致性,那么就必须对模型进行更新,并重新进行检验。在工作流早期识别此类问题非常重要。油藏模拟(右)过程成本高、耗时长,如果建立油藏模型过程中出现了差错,都必须重复该步骤及之前的多个步骤。随着钻井过程中获得更多的井资料(右下),作业人员就有可能根据实时随钻测井数据(实时地质导向,上)做出反应。不同领域专家在同一共享数据模型中进行沟通是避免、识别和校正错误的有效手段。各领域专家通过一个可以管理所有工作流步骤的集中式数据模型及统一的软件程序可以解决此类问题。使用熟悉的共享系统也可以在解决任何问题过程中提高用户效率。电磁模拟模块的情况。同时,本文还对学术界对Ocean的采纳情况进行了讨论。G&G软件选项地质和地球物理工作流程通常涉及多种来源的数据采集,数据处理,然后再将处理结果综合后进行解释。该流程并非是单向或一维的,在后期工作流分支中的一些新发现都可能要求对前面的程序做出调整,或者对输入数据进行修改(上图)。G&G项目从始至终可能需要几个月的时间。在一口井或多口井的规划过程中需要许多地质师、地球物理师、工程师及利益相关人员的共同参与。这一过程主要依靠软件来完成各种任务,如根据井眼数据反演岩石属性,或是通过地震叠加数据拾取层位等。由于每项任务都很复杂,为了满足所有的工作流需求,勘探与生产公司往往选择利用多个软件程序。此外,部分公司还自主研发专用软件或算法来解决特定地质环境中的特殊问题。将多个不同的软件程序应用于同一个项目会增大数据移植相关误差发生的风险,如将前一个程序中保存下来的结果输入到下一个程序中就可能出现误差。此外,通过培训使分析人员能够应用多种不同程序也是不现实的。利用一个能够处理所有G&G工作流要素的软件程序可以简单地解决这一问题,但单一的软件程序不可能满足所有客户的需求,因为勘探与生产公司针对其资产组合都有其各自独特的需求。一种可以使不同应用软件简单化的方法是在各软件程序之间建立实时链接。在这种共生方式中,各软件共享中间数据,这样更便于技术人员48油田新技术•Add函数(整数X和Y)•创建整数变量Answer•Answer=Addition(X和Y)•返回Answer版本1目标软件代码API代码独立编程者代码私有代码改变公用代码不变,私有代码变化,以反映目标软件代码的变化代码不变版本2•创建整数变量A,B和C•使A=2,B=3•调用API代码:C=Add(A和B)•Add函数(整数i1和i2)•创建整数变量i3•i3=i1+i2•返回i3•Add函数(整数X和Y)•创建整数变量Answer•AddTwoIntegers(X,Y和Answer)•返回Answer•创建整数变量A,B和C•使A=2,B=3•调用API代码:C=Add(A和B)•AddTwoIntegers函数(整数i1,i2和i3)•i3=i1+i2转化结果目标:两个数字相加并将结果返回^API的工作。独立程序设计者创建代码(左)需要使用目标软件程序(右)中的函数,但并未得到使用许可。目标软件所有者创建API(中),用以提供私有代码的进入通道。API可以在不影响目标程序的情况下共享数据、软件事件状态及程序功能。本例中的目标软件由版本1更新到版本2。独立软件未察觉到这一变化,而继续保持原有状态。在没有API的情况下,这种联系将会中断。目标软件开发者对API进行了更新,以考虑函数名从Additon转变到AddTwoIntegers,以及数据变量从X、Y解析到X、Y和Answer的这一情况。然而,这些函数和数据变量的表现方式仍然与版本1相同,因而可以与独立程序相兼容。只要独立程序和目标软件一直符合API语言,那么这些程序的任何变化都不会破坏它们之间的链接。这一点非常重要,因为各开发公司之间的软件更新通常并不同步进行。识别数据移植问题。同时,由于应用软件实施自动化处理,因此利用该方法还可减少输入和输出过程引起的停工时间。这一概念的延伸可以让每个程序控制下一个程序中的部分功能。这一点更有利于那些无图形用户界面(GUI)的算法。在这种情况下,其中一个软件程序充当主程序,其GUI可以被用于控制一个无界面算法,对部分用户而言,这种方式比编写文本命令更方便[6]。此外,由于省略了开发和调试GUI步骤,因此可以更快地编写出此类算法。共生方式会引发一个潜在问题,即程序间的准确链接功能可能会取决于其所发布的版本。每次新版本发布时大多数软件都会发生一些变化,结果导致应用软件之间的链接可能会完全中断,或者至少会出现一些问题。虽然部分链接软件由同一家公司开发,但许多软件包则是由多个公司开发的。因此,要想统一软件项目的开发路径较为困难。如果一项更新计划推迟或出现变动,那么就可能对所有相关应用之间的互动造成影响。上述问题可以通过开发一种既不会频繁发生变化,又可以与软件程序开展交流的界面语言来解决。应用程序接口既可以提供访问软件包的功能性,又是一种良好的通信语言。它们实际上可以被看作是一种译码器:将一种公开发布的输入语言转换成一种私有语言,然后再将其应用于软件程序中。API的公