1.软件工程的定义
对软件工程的定义有很多种版本,这里选2种做参考:
1.IEEE对软件工程的定义:
(1)将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。
(2)(1)中所述方法的研究。
2.《计算机科学技术百科全书》的定义:
软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。
2.过程模式
它是指软件开发全部过程、活动和任务的结构框架,通过该模型能清晰、直观地表达软件开发全过程,明确地规定要完成的主要活动和任务,它奠定了软件项目工作的基础。
a)瀑布式开发
严格遵循预先计划的各个步骤,所有的步骤都一次性做完,按照顺序串行执行;很多人已经看不上这种模式了,但也要根据情况来选择,如果事情不大,清晰可控的,并且工作量不高,也可以按照这种模式一次开发出来;如果说项目体量比较大,需要的交互比较多,那么这种方式就会显得落伍了;
b)迭代式开发
迭代式开发将软件项目分为若干个阶段,每个阶段可能都会经过需求、设计、开发、测试、部署等活动;每个阶段都有明确的目标、活动和输出。迭代式开发过程可以分步骤来验证软件是否符合客户的预期,可以有效地管理软件项目的复杂性、风险和质量,提高软件产品的可靠性和满足度。
有很多ToB的软件项目采用这种模式。整体的业务范围是固定的,但体量相对较大,我们没有办法一次性全部弄清楚,那么就会分几个阶段来实施上线。
c)敏捷式开发
敏捷式开发是一种应对快速变化的需求的一种软件开发模式。刚开始需求可能比较模糊,甚至很多需求还未定义。会在整个开发过程中不断加入新的需求和设计。采用迭代、循序渐进的方法进行软件开发。也会把一个系统拆分成多个子项目,各个子项目各自构建。
敏捷式开发更加的拥抱变化。比较经典的有Scrum敏捷开发方式,也有XP、DSDM、Kanban、Lean、FDD、Crystal等;
(来自网络)
d)火车模型
在《启示录》中有提到,并说明有很多互联网公司的软件产品使用这个模式。它不一样的地方是,它有固定的发车时间,每个站点(需求、设计、开发、测试、UAT、发布)到了时间,就会把每个站点的做好的东西搬上车,确保有比较快的发布周期。
几个特点:
1. 每个站点固定时间发车,到了时间则把该站点的产出搬上火车送到下个站去;
2. 没完成的内容,相当于没赶上车的乘客,完成之后等后续火车来了再上车;
3.工程化各种活动
除去项目前期,项目收尾以及项目的一些管理过程,大体上每个项目都会有这几个工程领域。
a)需求工程
软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。要满足合同、标准、规范或其他正式规定文档所需具有的条件或能力。
需求的层次:
1.目标需求:客户决策层、管理层对系统的期望,所要达到的目标;
2.业务需求:客户目前的业务是怎么样流转的,客户希望以后业务怎么流转。
3.功能需求:从系统的角度,客户希望在系统中提供什么样的功能来实现业务。
4.非功能需求:客户希望系统在性能、安全等方面的需求。
需求调研:通过用户访谈、问卷调查等方法了解客户的现状、需求和期望等内容;需求调研是后续分析、设计的依据,所以调研务必需要准确。
需求分析:对“目标需求->业务需求¬->功能需求&非功能需求”多层面的需求进行分析研究,分层次、结构化地梳理,并转换成系统需求的准确定义。过程中会对缺失的内容进行完整。
b)设计工程
所谓“好产品都是设计出来的”,设计的重要性毋容置疑。同样的目标和内容,设计最能体现出差异性。软件系统设计的优劣在根本上决定了软件系统的质量。而且一个好的软件设计会提高软件的质量、节约开发成本。
软件设计是指在软件开发过程中,根据用户需求和系统功能,将需求转化为具体的设计方案,包括业务需求、功能需求、UI/UE、技术相关等设计。软件设计是软件开发过程中的重要环节,它决定了软件开发的质量和效率。在软件设计中,需要考虑多个方面的因素,例如软件的功能性、可靠性、安全性、易用性、可维护性、可扩展性等。
业务需求设计:规划客户在当前项目上线后,应该怎么样的流程来更好的实现业务
功能需求设计:定义系统的功能结构,功能流程,具体的功能原型,操作方式以及功能的数据流转。
UI/UE设计:用户界面设计、用户体验设计;
技术设计:软件技术设计是指将软件需求设计阶段的需求转化为具体的技术实现方案,包括系统架构、模块设计、算法设计、数据库设计、接口设计等。软件技术设计是软件开发过程中的重要环节,它决定了软件开发的技术路线和实现方法。
1.架构设计:从宏观上说明一套软件系统的组成与特性。
2.概要设计:分析设计备选方案,并定义软件体系结构、构件、接口、以及一个系统或构件的时间和大小估计的过程。
3.数据库设计:指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)
4.详细设计:将一个系统或构件的概要设计进行精化和扩展,达到设计充分完善而能够被实现程度的过程。(一般To B的项目或者功能逻辑不是太复杂的系统,很少会做到详细设计这个程度)
c)开发工程
软件开发是指通过一系列的软件工程方法和技术,将需求和设计转化为可执行的计算机程序和系统的过程。
软件开发:开发人员根据需求和设计规范,编写软件代码的过程。在这个环节中,开发人员需要遵循编码规范,编写高质量、可维护、可扩展的代码,并进行代码测试和代码审查,确保代码的质量和稳定性。
内部联调:联调是指在代码编写完成后,将不同模块的代码进行集成测试和调试的过程。在联调过程中,开发人员需要将不同模块的代码进行组合测试,并解决由于不同模块之间的接口问题导致的错误和异常。联调过程中还需要进行性能测试和安全测试,确保软件系统的性能和安全性。
开发编码和联调是软件开发过程中不可或缺的两个环节。在开发编码过程中,需要编写高质量的代码,提高软件系统的可维护性和稳定性;在联调过程中,需要对不同模块的代码进行集成测试和调试,确保软件系统的性能和安全性。同时,开发人员需要密切协作,及时解决代码中的问题和异常,确保软件系统能够按时发布和交付。
d)测试工程
软件测试是指在软件开发过程中对软件系统进行各种测试,以发现软件中的缺陷、错误或者不符合规定的行为,并对其进行修复或改进。软件测试的目的是确保软件系统能够满足用户需求和预期,同时保证软件系统的质量和可靠性,减少软件系统出现故障和损害用户利益的风险。
功能测试:是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。
系统测试:是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。这种测试可以发现系统分析和设计中的错误。
用户测试:测试人员在将产品交付客户之前处于用户角度进行的一系列体验使用,如:界面是否友好(吸引用户眼球,给其眼前一亮)、操作是否流畅、功能是否达到用户使用要求等。
e)部署工程
部署工程是指将软件系统从开发环境中迁移到目标环境并使之运行的过程。部署工程包括软件安装、配置、测试、部署和上线等多个环节。在软件开发过程中,部署工程是非常关键的一部分,其质量和效率直接影响着软件系统的可靠性和交付时间。
系统上线:软件系统上线是指将软件系统正式发布到用户使用的环境中,让用户可以开始使用该系统。在上线之前,需要进行一系列的测试和调试,确保系统能够正常运行。上线后,还需要对系统进行监控和维护,及时解决出现的问题,保证系统的稳定性和可用性。
系统培训:系统培训是指对使用该软件系统的用户进行相关知识和技能的培训,使其能够熟练掌握该系统的使用方法和操作流程。培训的内容包括系统的功能和特点、界面设计、操作方法、操作规范、数据管理等方面。通过系统培训,用户能够更好地理解和使用软件系统,提高工作效率和质量。
4.其他
a)软件依赖性
软件依赖性是指软件系统中各个模块或组件之间相互依赖的关系。在软件开发过程中,由于软件系统通常是由多个模块或组件构成的,不同模块或组件之间需要相互协作,才能完成软件系统的功能。这些模块或组件之间的相互依赖关系就是软件依赖性。
软件依赖性可以分为两种类型,一种是静态依赖性,另一种是动态依赖性。静态依赖性是指在程序编译时就可以确定的依赖关系,例如程序中调用了某个库文件或者其他模块等。而动态依赖性则是指程序运行时才能确定的依赖关系,例如一个模块的输出作为另一个模块的输入等。
软件依赖性的存在使得软件系统变得复杂,同时也增加了软件开发和维护的难度。因此,在软件开发过程中需要注意降低软件依赖性的耦合度,提高软件的可维护性和可重用性。
b)软件安全
软件安全是指在软件开发、部署和维护过程中,保证软件系统在面临各种威胁和攻击时,仍能够保持其机密性、完整性和可用性,以及对系统进行足够的防御和恢复能力的能力。软件安全是一种综合性的概念,包含多个方面的内容,包括代码安全、网络安全、数据安全、身份认证等等。
软件安全的重要性越来越突出,因为软件系统中存在的漏洞和安全漏洞可能会导致各种恶意攻击和数据泄露等问题。因此,在软件开发过程中,需要采取一系列措施来保证软件安全,包括:
(1)安全设计:在软件设计过程中,考虑安全问题,采用安全可控的设计思路,避免在后续开发过程中引入安全风险。
(2)安全编码:在编写代码过程中,遵循安全编码规范,避免存在安全漏洞的代码。
(3)安全测试:对软件系统进行全面的安全测试,发现和修复安全漏洞。
(4)安全部署:在部署软件系统时,采用安全的配置和部署方式,确保软件系统的安全性和稳定性。
(5)安全维护:对软件系统进行定期的安全检查和维护,及时发现和修复安全漏洞。
通过采取上述措施,可以保证软件系统的安全性,避免安全漏洞对系统造成的损失和影响。
c)软件复用
软件复用是指在软件开发过程中,利用已经开发过的软件组件、模块、类库等现有的可重用软件资产,以实现更加高效、快速和成本效益的软件开发。
软件复用可以通过将现有的软件资产集成到新的软件系统中,避免重复开发,节约开发成本和时间。同时,软件复用也可以提高软件系统的质量和稳定性,因为现有的软件资产已经经过测试和验证,能够提供高质量的功能和性能。
软件复用可以通过多种方式实现,例如使用开源软件、使用第三方组件库、使用自己开发过的通用组件等。软件复用也是一种可持续发展的软件开发方式,在软件资产库中积累和管理好的软件资产,可以为日后的软件开发提供更好的基础和支持。
d)软件管理
定义:软件管理是指对软件项目进行规划、控制、监督和评估的过程,以确保软件项目能够按时、按质、按量完成,并达到预期的目标和效果。软件管理是软件工程的重要组成部分,包括项目管理、配置管理、变更管理、质量管理等多个方面。
软件管理的主要目的是提高软件开发的效率和质量,降低软件开发的风险和成本。软件管理需要对软件项目进行全面的规划和控制,包括制定项目计划、确定项目范围、分配资源、制定进度计划、风险管理等。
在软件管理过程中,需要考虑多个方面的因素,例如人员管理、沟通协作、质量保证、成本控制、进度管理等,需要采用一系列的管理方法和工具,例如敏捷开发、迭代开发、Scrum等,以提高软件开发的效率和质量。