软件开发是什么, 该怎么做?
1 引子
关于什么是软件开发存在很多观点,有的认为软件开发即服务,有的认为软件开发即产品,有的认为软件开发即平台,这些观点各有各的侧重点。这篇文章我们来学习和探讨一下软件开发。
2 软件开发
软件开发是指在创建和维护应用程序、框架或其他软件组件的过程中所涉及的构思、设定、设计、编程、记录、测试和修正错误的过程。
软件开发是一个编写和维护源代码的过程,但从广义上讲,它包括了从构思所需的软件到软件的最终表现形式之间的所有活动,一般来说是一个有计划、有组织的过程。因此,软件开发可以包括研究、新开发、原型设计、修改、再利用、再设计、维护或其他任何关联软件产品生产的活动。
软件可以为各种目的而开发,最常见的三种情况是满足特定客户和企业的特定需求(定制软件的情况)、满足某些潜在用户的某种需求(商业和开放源码软件的情况)或个人使用(例如,科学家可以编写软件来自动完成一项常规的任务)。比如,嵌入式软件开发,可用于控制消费类产品的嵌入式软件的开发,它要求开发过程与被控物理产品的开发相结合。系统软件是应用软件和编程过程本身的基础,往往是单独开发的。
为了更好地对软件开发过程进行质量控制的需要,软件工程学科应运而生,它的目的是将工程范式中的系统化方法应用到软件开发过程中。
软件项目管理的方法有很多,可以被称为软件开发生命周期模型、方法论、过程或模型。瀑布模型是传统的软件开发模式,与近来创新的敏捷软件开发模式形成鲜明对比。
2.1 方法论
软件开发方法是一种用于对信息系统开发过程进行结构化、计划和控制的框架。多年来,这种框架的种类繁多,每一种框架都有其公认的优点和缺点。
软件开发有几种不同的方法:有些人采取更有结构化的、以工程为基础的方法来开发业务解决方案,而另一些人则可能采取更多的增量方法,即软件在逐个开发的过程中不断发展。一种系统开发方法不一定适合所有项目使用。基于技术、组织、项目和团队的各种考虑,每一种可用的方法都最适合于特定类型的项目。
大多数方法论在软件开发的以下几个阶段中都有一定的组合:
· 分析问题
· 市场调查
· 收集拟议的业务解决方案的需求
· 为基于软件的解决方案制定计划或设计
· 软件的实施(编码)
· 测试软件
· 部署情况
· 维护和错误修复
这些阶段通常被统称为软件开发生命周期,即SDLC。不同的软件开发方法可能以不同的顺序进行这些阶段,或将更多或更少的时间用于不同的阶段。
软件开发的每个阶段所产生的文档的详细程度也可能不同。这些阶段也可以依次进行(如"瀑布式"),或者在不同的周期或迭代中重复进行(如"极端编程")。极端编程的方法通常花在计划和文档上的时间较少,而花在编码和开发自动化测试上的时间较多。
极端编程方法也促进了在整个开发生命周期内的持续测试,以及确保在任何时候都有一个可工作(或无BUG)的产品。
结构化或 "瀑布式"的方法试图在编码开始前评估大部分的风险,并制定详细的软件计划,避免在软件开发生命周期规划的后期阶段进行重大的设计变更和重新编码。
各种方法都有明显的优点和缺点,用软件解决问题的最佳方法往往取决于问题的类型。如果对问题有很好的理解,并且可以提前有效地规划出解决方案,那么基于 "瀑布式 "的方法可能效果最好。另一方面,如果问题是独一无二的(至少对开发团队来说是独一无二的),而且软件解决方案的结构不容易设想,那么"极端编程"的增量方法可能是最好的。
2.2 软件开发活动
2.2.1 确定需求
软件产品的创意来源是非常丰富的。这些创意可以来自市场调查,包括潜在新客户的人口统计、现有客户、拒绝产品的人群的分析、其他内部软件开发人员或有创意的第三方。软件产品的创意通常首先由营销人员评估经济可行性、与现有渠道分销的契合度、对现有产品线可能产生的影响、所需的功能、与公司的营销目标的契合度。在营销评估阶段,成本和时间假设成为评估的内容。在第一阶段的早期,根据营销和开发人员所得到的更详细的信息,决定是否要进一步推进该项目。
在《伟大的软件辩论》一书中,AlanM. Davis在 "需求 "一章的"需求"小节"的软件开发中缺失的部分"中指出:
学工科的学生学的是工科,很少接触到金融或者是市场营销。市场营销专业的学生学的是市场营销,很少接触到金融或工程。我们中的大多数人只成为了一个领域的专家。更为复杂的是,我们很少有人在职场上遇到跨学科的人,我们没有更多的资源可以借鉴。然而,软件产品策划是开发成功的关键,这绝对需要多个学科的知识。
由于软件开发可能会涉及到妥协于或超出客户的要求,因此软件开发项目可能会游离于技术性较差的领域,如人力资源、风险管理、知识产权、预算编制、危机管理等。这些过程也可能导致业务开发与软件开发的作用重叠。
2.2.2 规划
创建软件程序的一个重要任务是提取需求或需求分析,客户通常对他们想要的最终结果有一个抽象的想法,但不知道软件应该做什么。熟练而有经验的软件工程师会在这一点上认识到不完整的、模糊的、甚至是相互矛盾的需求。
虽然在需求阶段投入了大量的精力来确保需求的完整和一致性,但现实中很难做到这一点。需求的波动性对软件开发很有挑战性,因为它们会影响到未来或正在进行中的开发工作。
一旦从客户那里收集到一般需求,就应该确定并明确说明开发的范围分析。这通常被称为范围文件。
2.2.3 设计
需求确定后,可以在软件设计文档中确定软件的设计。这涉及到主要模块的初步设计或高级设计,并对各部分如何组合在一起进行总体规划。语言、操作系统和硬件组件在这时都应该是已知的。接下来就是创建一个详细的或低级的设计,可能是作为概念验证或确定需求的原型设计。
功能实现、测试和记录
功能实现是软件工程师实际为项目编写代码的过程中的一个部分。
软件测试是软件开发过程中不可或缺的重要阶段。这一部分的过程确保了缺陷尽快被识别出来。在某些过程中,通常被称为测试驱动开发,测试可能就在功能实现之前就已经制定好了,并作为验证功能实现的方法。
在整个开发过程中,对软件的内部设计进行文档化,以便于将来的维护和改进。这包括编写外部的和内部的API文档。开发团队所选择的软件工程过程将决定有多少内部文档是必要的。计划驱动的模式(例如,瀑布模式)通常比敏捷模式产生的文档多。
2.2.4 部署和维护
在代码经过适当的测试、批准发布、销售或以其他方式分发到生产环境后,部署工作就直接开始了。这可能涉及到安装、定制(如将参数设置为客户所需要的值)、测试,以及可能的评估期延长。
软件的培训和支持很重要,因为只有正确使用软件才能达到预期的目的。
维护和改进软件以应对新发现的故障或需求,可能需要花费大量的时间和精力,因为错过的需求或者新的需求可能会导致软件的重新设计。
在大多数情况下,需要定期维护,并修复报告的问题来保持软件的正常运行。
2.3 软件开发相关主题
2.3.1 视图模型
视图模型是一个框架,它提供了关于系统及其环境的相互关系。
观察点和视图的目的是为了使人类工程师能够理解非常复杂的系统,并围绕专业领域组织问题的要素和解决方案。在物理密集型系统的工程中,观点往往与工程组织中的能力和责任相对应。
大多数复杂的系统规范非常的广泛,没有一个人能够完全理解规范的所有方面。
此外,我们都对某一系统有不同的侧重点,也有不同的原因来研究系统的规范。一个业务主管会和一个系统的功能实现者会对系统的构成提出不同的问题。因此,观察点框架的概念是将不同的观察点提供给定复杂系统的规范。
这些观察点分别满足了对系统的某些方面感兴趣的受众。与每个观察点相关联的是一种观察点共识语言,它为该观察点的受众提供了交流方式。
2.3.2 业务流程和数据建模
使用图形化的方式来表示信息的现状为用户和系统开发人员提供了一种非常有效的信息呈现方式。
· 业务模型说明了与被建模的业务流程相关的功能和执行这些功能的组织。通过描述活动和信息流,为可视化、定义、理解以及验证流程奠定了基础。
· 数据模型提供了要存储的信息的细节,这些模型可以为自己编写还是购买软件产品提供依据。
通常情况下,在进行后建立一个模型,称为业务分析。编程范式包括主持人提出一系列问题,旨在提取描述一个过程所需的信息。访谈者被称为主持人,用以引导参与者提供信息。主持人应该对所关心的过程有一定的了解。
因为通常是由一个主持人团队在整个设施内收集信息,所有访谈者的信息结果必须在完成后整合在一起,这个时候使用合适的方法论很重要。
这些模型的建立,要么定义了流程的当前状态,最终产品被称为"现况"快照模型,要么是流程应包含哪些内容的想法的集合,从而形成了"可能的"模型。
流程和数据模型的生成可以用来判断现有的流程和信息系统是否健全,只需要稍作修改或增强,或者作为纠正措施,是否需要重新设计。业务模型的建立不仅仅是查看或自动化信息流程的一种方法。分析可以用来从根本上重塑你的企业或组织的运营方式。
2.3.3 计算机辅助软件工程
计算机辅助软件工程(Computer-aidedsoftware engineering,简称CASE),在软件工程领域,是指将一套软件工具和方法科学地应用到软件开发中,从而获得高质量、无缺陷、可维护的软件产品,也是指在软件开发过程中,与自动化工具一起用于信息系统开发的方法。
CASE的功能包括分析、设计和编程等。CASE工具用所需的编程语言自动设计、记录和制作结构化的计算机代码的方法。
计算机辅助软件系统工程(CASE)的两个重要思想是:
· 培养软件开发和软件维护过程中的计算机协助,以及
· 培养软件开发和维护的一种工程化方法。
典型的CASE工具有配置管理、数据建模、模型转换、重构、源码生成等。
2.3.4 集成开发环境
集成开发环境(IDE)又称为集成设计环境或集成调试环境,是指为计算机程序员提供软件开发的综合设施的软件应用。一个集成开发环境通常由以下几个部分组成:
· 源代码编辑器。
· 编译器或解释器。
· 构建自动化工具,以及
· 调试器(通常)。
IDE的设计目的是通过提供具有类似用户界面的紧密组件来最大限度地提高程序员的工作效率。通常情况下,IDE是专门针对特定的编程语言而设计的,以便提供最符合该语言编程范式的功能集。
2.3.5 建模语言
建模语言是指任何可以用来表达信息、知识或系统的人工语言,它是由一组一致的规则定义的结构。这些规则用于解释结构中各组成部分的意义。建模语言可以是图形化的,也可以是文本化的,图形化的建模语言使用图式技术,用命名的符号表示概念,用线来表示关系,用各种其他图形注释来表示约束。文本建模语言通常使用标准化的关键字跟参数来构建计算机可理解的表达。
软件工程领域中的图形建模语言的例子有:
· 业务流程建模语言(BPMN,和XML形式的BPML)是流程建模语言的一个例子。
· EXPRESS和EXPRESS-G(ISO 10303-11)是一种国际标准的通用数据建模语言。
· 扩展企业建模语言(Extended Enterprise Modeling Language,EEML)常用于跨层业务流程建模。
· 流程图是一种算法或分步流程的示意图。
· 基本建模概念(FMC)建模语言,用于软件密集型系统的建模语言。
· IDEF是一个建模语言家族,其中最著名的有IDEF0用于功能建模,IDEF1X用于信息建模,IDEF5用于本体建模。
· LePUS3是一种面向对象的可视化设计描述语言,也是一种正式的规范语言,主要适用于大型面向对象(Java、C++、C#)程序和设计模式的建模。
· 规范和描述语言(SDL)旨在对反应式和分布式系统的行为进行明确的规范和描述。
· 统一建模语言(Unified Modeling Language,UML)是一种通用的建模语言,是指定软件密集型系统的行业标准。当前版本的UML 2.0支持13种不同的图示技术,并有广泛的工具支持。
并非所有的建模语言都是可执行的,对于那些可执行的建模语言,使用它们并不一定意味着不再需要程序员。恰恰相反,可执行的建模语言旨在提高程序员的工作效率,使他们能够解决更多的难题,如并行计算和分布式系统等。
2.3.6 编程范式
编程范式是计算机程序设计的一种基本风格,它一般不受项目管理方法(如瀑布式或敏捷)的支配。范式在用于表示程序元素(如对象、函数、变量、约束)和构成计算的步骤(如分配、评估、延续、数据流)的概念和抽象上有所不同。有时,范式所断言的概念在高级系统架构设计中被协同使用;在其他情况下,编程范式的范围仅限于特定程序或模块的内部结构。
一种编程语言可以支持多种范式。例如,用C++或Object Pascal编写的程序可以是纯程序化的,也可以是纯面向对象的,或者包含两种范式的元素。软件设计者和程序员决定如何使用这些范式元素。
在面向对象编程中,程序员可以把程序看成是一个交互对象的集合,而在功能编程中,程序可以看成是一个无状态的函数评价序列。当计算机或具有许多处理器的系统编程时,面向过程的程序设计允许程序员将程序看作是一组并发的进程,并在逻辑上共享的数据结构上起作用。
正如软件工程中不同的群体主张不同的方法论一样,不同的编程语言也主张不同的编程范式。有些语言的设计是为了支持一种范式(Smalltalk支持面向对象编程,Haskell支持功能编程),而其他编程语言则支持多种范式(如ObjectPascal、C++、C#、VisualBasic、Common Lisp、Scheme、Python、Ruby和Oz)。
许多编程范式都是以其禁止什么方法而闻名,或者是以其启用什么方法而闻名。例如,纯函数式编程禁止使用跨范围修改;结构化编程禁止使用 goto 语句。
新的范式往往被习惯于早期风格的人认为是教条主义的,或者是过于僵化。
高级别的范式的例子包括:
· 面向方面的软件开发
· 特定领域的建模
· 模型驱动的工程
· 面向对象的编程方法
GradyBooch的面向对象设计(OOD),又称面向对象分析与设计(OOAD)。Booch模型包括类、对象、状态过渡、交互、模块、过程六张图。
· 基于搜索的软件工程
· 面向服务的建模
· 结构化的程序设计
· 自上而下和自下而上的设计
o 自上而下的编程:由IBM研究员Harlan Mills(和Niklaus Wirth)在20世纪70年代发展起来的结构化编程。
2.3.7 软件复用
软件复用的定义是利用预定义的软件组件创建软件的过程。软件复用方法旨在增加或最大限度地利用软件开发生命周期中的现有软件工件。
以下是一些常见的软件复用方法:
· 软件框架是一个软件系统或子系统的可复用设计。
· 基于组件的软件工程涉及将现有的组件整合在一起创建一个应用程序。
· 面向服务的架构或面向服务的程序设计是建立在组件的概念基础上,提供网络服务。
· 软件产品系列寻求基于一套共同的 "核心"资产和流程来开发软件,以生产出一系列针对特定市场的产品或"应用程序"。
· API
· 开放源码文档,通过GitHub等库,为软件开发者提供免费的代码,供他们重新使用。
3 小结
我们在本文中对软件开发的一些概念和知识等进行了学习和探索, 希望可以抛砖引玉,对各位朋友有所裨益。
欢迎批评指正。
4 参考
https://en.wikipedia.org/wiki/Information_visualisation
https://en.wikipedia.org/wiki/Data_model
https://www.ibm.com/topics/software-development
https://en.wikipedia.org/wiki/Software_development
https://www.rasmussen.edu/degrees/technology/blog/what-does-software-developer-do/
可通过如下方式关注《丁哥开讲》:微信公众号,B站,今日头条,Youtube。
赞丁哥的是有品位的!