购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
绪论

本章主要知识点

❑ 软件的作用和特性是什么?软件开发与维护目前面临哪些挑战?

❑ 什么是软件工程?软件工程的根本目标是什么?

❑ 软件工程的知识体系包括哪些知识域?

软件作为信息社会的基础设施,深刻地影响着现代人类文明的进程。作为软件产业的支撑学科,软件工程聚焦于如何高效地开发和运维高质量的软件。在软件定义一切的时代,软件工程对推动我国创新驱动发展的国家战略具有重大意义。本章将从软件和工程两个角度探索软件工程的本质、基本原理和发展趋势,然后介绍软件工程职业道德规范,最后给出本书的案例。

1.1 什么是软件

1.1.1 软件的定义和作用

什么是软件呢?现在,被普遍接受的软件的定义是:软件(software)是在通用计算机硬件之上面向特定应用目标实现的解决方案。它是计算机系统中与硬件(hardware)相互依存的另一部分,包括程序(program)、相关数据(data)及说明文档(document)。为了更好地理解软件的概念,将软件和硬件等其他人工产品相区分是非常重要的。软件是逻辑的而不是物理的产品。因此,软件具有与硬件完全不同的特征。

(1)软件开发不同于硬件设计

与硬件设计相比,软件更依赖于开发人员的业务素质、智力,以及人员的组织、合作和管理。对硬件而言,设计成本往往只占整个产品成本的一小部分,而软件开发占整个产品成本的大部分,这意味着软件开发项目不能像硬件设计项目那样来管理。

(2)软件生产不同于硬件制造

硬件设计完成后就可投入批量制造,制造是一个复杂的过程,其间仍可能引入质量问题;软件成为产品之后,其制造只是简单的复制而已,软件的仓储和运输也非常简单。因此,软件产品必须要成为第一,一旦落后,市场就会被领先的产品以零成本的复制所占领。

(3)软件维护不同于硬件维修

硬件在运行初期有较高的故障率(主要来源于设计或制造的缺陷),在缺陷修正后的一段时间中,故障率会降到一个较低和稳定的水平上。随着时间的推移,故障率将再次升高,这是因为硬件会受到磨损,达到一定程度后就只能报废。软件是逻辑的而不是物理的,虽然不会磨损和老化,但在使用过程中的维护却比硬件复杂得多,在维护过程中还可能产生新的错误。软件在运营时需要持续的维护和版本更新,这也正是软件产业隶属于服务业而不是制造业的主要原因。

当前,软件作为信息技术产业的核心与灵魂,正发挥着巨大的使能作用和渗透辐射作用。所有新的信息技术应用、平台和服务模式,均离不开软件技术作为基础支撑。更为重要的是,在数字经济时代,软件技术已经成为企业的核心竞争力,不仅引领着信息技术产业的变革,在汽车、能源、制造、零售等众多传统领域中存在的比重和重要性也在不断加大,在支持这些传统领域产业结构升级换代甚至颠覆式创新的过程中起到核心关键作用,并进一步加速重构了全球分工体系和竞争格局。作为新一轮科技革命和产业变革的标志,德国的“工业4.0”和美国的“工业互联网”,以及我国的“制造强国战略”,均将信息和软件技术作为发展重点。无所不在的软件,正在走出信息世界的范畴,开始深度渗透到物理世界,在支撑人类社会运行和人类文明进步中发挥重要的“基础设施”作用,甚至开始扮演着重新定义整个世界图景的重要角色。

1.1.2 软件的发展历史

从世界上第一台计算机ENIAC在美国诞生到现在的70多年时间里,软件作为人类智力活动的逻辑产品,经历着与其他行业不同的快速发展。作为信息技术的核心,软件技术呈现从“工具”和“平台”到“引领”的转变。与此同时,软件的产品形态和商业模式也在不断演进,先后经历了大型机和小型机时代的硬件附属阶段、PC时代的独立软件产品阶段、“互联网+”时代的“软件即服务”阶段,以及数字经济时代的“软件定义”阶段

(1)硬件附属阶段

在计算机诞生后的相当长一段时期内,实际上并没有“软件”的概念,计算机是通过用机器语言和汇编语言编写程序直接操作硬件来运行的。到20世纪60年代初,在高级程序设计语言出现后,软件才从硬件中分离出来,成为相对独立的制品。但是,在这个大型机和小型机时代,硬件占据绝对主体的地位,软件仅仅作为计算机硬件的附属物而存在,没有独立的商业形态,软件的代码通常是向使用者开放的,便于用户自己进行修改与优化。

(2)独立软件产品阶段

进入20世纪70年代的PC时代后,出现了软件许可证(license)的概念,卖软件的许可证成为一种新型的商业模式,软件作为一个独立的产品销售,软件代码成为核心竞争力而不再对使用者开放。标志性的成功案例就是微软的Windows操作系统。在这个时期,软件逐渐颠覆了传统计算机产业“硬件为王”的格局,开始成为IT产业的主导者。软件开始正式成为一个独立产业,在各个行业、领域不断普及,催生了人类历史上信息化的第一波浪潮,即以单机应用为主要特征的数字化阶段(信息化1.0)。

(3)“软件即服务”阶段

20世纪90年代中期开始,随着互联网的快速发展普及,软件从单机计算环境向网络计算环境延伸,带来了信息化的第二波浪潮,即以网络在线应用为主要特征的网络化阶段(信息化2.0)。软件的形态发生了重大的变化,“软件即服务”(software as a service)开始成为一种非常重要的网络化软件交付形态和使用方式。不同于传统面向单机的拷贝形态,“软件即服务”使得人们不必再拥有软件产品,而是通过互联网在任何时间、任何地点、任何设备上,直接与软件提供者进行连接并按需获取和使用软件的功能。

(4)“软件定义”阶段

当前,软件正在融入支撑整个人类经济社会运行的基础设施中,对传统物理世界基础设施和社会经济基础设施进行重塑与重构,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式升级、生产关系变革、产业升级、新兴产业和价值链的诞生与发展的重要引擎。

1.1.3 挑战与问题

软件与工业控制、制造、科学计算、数值计算、物联网等各领域不断加强融合,正引领并促进这些领域的高速发展。为了满足各个领域的相关要求,软件对应呈现出许多新的特征,从而导致软件开发与维护面临新的挑战:

1)软件复杂性挑战。今天的软件常常是网络应用,涉及多种硬件、多种操作系统、多种编程语言,逻辑复杂,同时面临层出不穷的新技术。

2)软件大规模挑战。软件规模不断扩大,一个宇宙飞船的软件系统源程序代码可多达2000万行,鸿蒙操作系统的研发人数超过2万。

3)软件高质量挑战。随着软件应用在越来越多的关键领域中,软件的质量要求也越来越高,例如高安全性、高可靠性、高性能、高易用性、可配制的功能和流程等。

4)不确定性挑战。乌卡(VUCA)时代下,软件项目面临需求和技术的易变性、不确定性、复杂性和模糊性的挑战,应用环境从静态、封闭、可控逐步变为动态、开放、难控。

5)进度和敏捷开发的挑战。几乎所有软件项目的进度要求都很紧,常常需求还没有确定,交付日期却已经定了,进度预估不足是常态。这就要求敏捷开发,快速适应需求变化。

6)遗留系统(legacy system)的挑战。随着软件的不断开发和应用,存在着大量的遗留系统需要集成和复用。这些系统是早年采用旧的技术开发而成的,目前一部分仍能有效运行,一部分需要升级改造,还有一部分虽然被淘汰,但仍包含大量可复用的资产。

7)分散团队的协同挑战。全球软件开发由于能充分利用各地的资源,被越来越多的组织所接受,特别是跨国组织和集团。地理位置分散的开发团队,协同合作需要克服时间、文化等差异造成的沟通障碍。

我们所面临的新挑战不止上述这些。这些挑战导致了软件项目的成功率和质量一直偏低。根据Standish Group发布的chaos报告 ,软件项目的成功率低于40%,超过60%的项目由于进度延期、超出预算、不符合客户的需求、质量低劣等原因而在不同程度上失败。由于软件质量低劣导致的故障,也给我们的生活和工作带来了巨大的损失。例如,2018年印尼狮航一架波音737 MAX 8客机途中坠落,189人罹难,失事原因为软件设计缺陷,飞机的迎角传感器“数据错误”触发“防失速”自动操作,导致机头不断下压,最终坠海。

为什么软件开发表现得如此不成熟呢?分析其根源,主要有两个方面的原因:

● 与软件本身的特点有关。软件是无形的逻辑实体,具有高度的复杂性,不仅难以理解和描述,而且难以开发、度量和控制,使得软件开发过程中处处充满着风险。

● 与软件开发和维护的方法、过程、管理、规范和工具不正确有关。Parnas教授曾说过,虽然我们已经提出了不少好的技术和方法,例如迭代式交付(1988)、测量(1977)、风险管理计划(1981)、变更控制委员会(1979),等等,“它们早就在这里多年了,但是没有被适当使用”。当前软件实践常常是,面对进度压力,软件工程师没有计划他们的工作,匆匆地走过需求、设计和编码,软件开发直到测试前仅仅是忽略质量的技术。这些实践引入了大量的缺陷,即使是有经验的工程师也会每7~10行代码就引入一个缺陷,中等规模的系统平均存在着上千个缺陷。大多数缺陷必须靠测试发现,这通常要花去开发时间的一倍时间。目前大多数的工作方式还像30年前一样。

如何才能解决这些问题,提高软件开发和维护的效率与质量?这正是软件工程所研究和实践的。

1.2 什么是工程

1.2.1 软件是一门工程学科

为了更深入地探索软件的本质,软件学术界和产业界进行了大量的研究和探索。软件开发追求的目标是什么?软件应是一门什么学科?是艺术、科学,还是工程?

艺术是追求美(beauty)的学科。软件开发和艺术有关系,优秀的软件好用且美,就像艺术品一样。有人曾说,写一行行代码,就像写一首蓝色的诗。软件的开发和艺术的创作在某些方面常常很相似,都需要灵感和创意,非常依赖于创作者的个体能力、思维方式以及当时的情绪和状态。

科学是追求真(truth)的学科。软件开发和科学有关系,它具有数理性质,可以采用数学抽象方法进行一致性分析并细化成更详细的理论。形式化开发方法就是用数学的方法来开发或验证软件的。

工程是追求善(benefit)的学科。软件开发具有很强的工程性质,软件开发需要一群人靠系统的方法一起进行分析、设计、实现和测试来完成,“不是一个人在战斗”,也不是只靠一种技术。它需要多个人的有效协作、多种学科技术的有效综合才能成功。因此,我们认为软件开发更偏向工程学科,如图1-1所示,软件开发的目标是提供最大的价值。

图1-1 软件是一门工程学科

当前,软件工程学科已发展为计算机科学与技术、数学、工程学、管理学等相关学科的交叉学科。2011年初国务院学位委员会和教育部将软件工程确立为一级学科。

1.2.2 工程的定义和特性

所谓工程,是对技术(或社会)实体的分析、设计、建造、验证和管理。应用于不同的领域,则形成系统工程、社会工程、化学工程、冶金工程、机电工程、土木工程、水利工程、交通工程、纺织工程、食品工程,以及软件工程等。工程是一种组织良好、管理严密、各类人员协同配合、共同完成工作的学科,它具有以下特性:

1)以价值为目标。工程的目标就是获得最大的效益,给社会或组织带来价值。

2)高度的组织管理性。工程需要各类人员为了共同的愿景和目标协同配合,需要把相互作用和相互依赖的若干组成部分结合成具有特定功能的有机整体,因此它是一门组织管理的学科。

3)多种学科的综合。工程需要综合使用多门学科的知识和技术。例如,软件工程涉及数学、工程学、美学、经济学、管理学等学科。

4)高度的实践性。工程需要采用实践的研究方法,从实践中总结知识,再应用于实践中。

1.2.3 工程过程

工程过程由以下步骤组成 ,适用于包括软件工程在内的所有工程领域:

1)理解真正的问题。当需求被确认时,工程就开始了,没有现成的解决方案可以满足该需求。然而,需要解决的问题并不总是工程师被要求解决的问题,因此应采用根源分析等技术来发现需要解决的真正的潜在问题是什么。

2)设计方案。设计多个技术上可行的解决方案,从技术、财务、进度等维度进行评估,从中选出最佳解决方案,确保方案能很好地满足需求。

3)监控所选方案的效能。在方案实施过程中监督和评估它的实际效能,并确定其他备选方案是否更好(如果为时不晚)。

工程过程是迭代的,前一个迭代中获得的知识将为后一个迭代提供指导和改进方向。

1.3 什么是软件工程

面对软件开发与维护所面临的挑战和问题,人们开始探索把工程的方法应用于软件开发,即以价值为中心,用现代工程的概念、原理、技术和方法进行计算机软件的开发、运营和维护,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并进行有效的维护,这就是软件工程。

1.3.1 软件工程的概念和知识体系

“软件工程”一词,最早是1968年北大西洋公约组织(NATO)在开创性软件工程主题会议上提出的,Fritz Bauer给出了如下的定义:“软件工程就是为了经济地获得可靠的且能在实际机器上高效运行的软件而建立和使用的工程原理”。1990年,ISO/IEC/IEEE系统和软件工程的术语标准给出一个更全面的定义:软件工程是将系统的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。

1999年,ISO和IEC启动了软件工程知识体系(Software Engineering Body Of Knowledge,SWEBOK)指南的标准化项目,IEEE和ACM等联合承担了这一任务,几十个国家和地区的几百名软件工程专家共同参与了指南的制定。SWEBOK指南在2001年推出第一个版本,2004年和2014年分别推出了2.0版和3.0版,目前4.0版正在评审中,预计2023年推出。SWEBOK指南的目的是促进世界范围内对软件工程的一致观点,阐明软件工程相对其他学科(如计算机科学、项目管理、数学、工程学)的定位和分界,刻画软件工程学科的核心知识。更新后的SWEBOK指南4.0版把软件工程的知识域分为软件需求、软件架构、软件设计、软件构造、软件测试、软件工程运营、软件维护、软件配置管理、软件工程管理、软件工程模型与方法、软件工程过程、软件质量、软件安全、软件工程经济、软件工程职业实践、计算基础、数学基础和工程基础。其中前15个知识域涵盖软件工程专业知识,后3个知识域是通用的基础知识。

1.3.2 软件价值工程

软件工程是一门工程,因此其根本目标是创造价值。价值是“事物的作用、重要性或实用性” 。软件价值对不同的对象有不同的含义:对软件开发方来说,高价值就是低的开发成本;对软件开发投资方(sponsor)来说,价值是投资收益;对软件使用者来说,价值就是效益。因此要提高软件价值,就要提高效益、降低成本。而效益和成本之间没有固定的计算公式,这就是创新的动力之源。

UMLChina首席专家潘加宇提出一个很有趣也颇有道理的观点,他认为,软件需求的根本目标是创新,解决“提高效益”问题,即让“产品好卖”;而软件设计的根本目标是模块化与复用,致力于解决“降低成本”的问题。不仅仅是软件需求和设计,软件工程中的每一个环节和每一个活动都是为了价值交付。例如,智能编码、强调质量和测试而减少返工、进行成本的估算和控制、采用敏捷过程、构建DevOps工具链、关注软件服务的运维质量等,都是以价值为目标所提出的最佳实践。

软件工程是一项价值工程,其生产力是持续快速交付价值的能力,即以价值为中心,追求软件开发的质量、效率和速度,如图1-2所示。用最朴素直白的表达,就是“多快好省”地开发和运维有价值的软件。

图1-2 软件工程生产力

1.3.3 软件系统工程

软件总是处于复杂的系统中,其中包括网络、服务器、中间件、数据库等基础软硬件以及用户和软件所处的物理与社会环境。对用户及其他干系人(即与软件系统相关的人或组织)而言,真正有价值的是完整的系统而非其中的软件。因此,需要在这个更大的系统范围内思考软件的定位和作用,进行不同系统组成成分之间的职责分配和协同,明确软件的需求。

软件工程的系统思维分为四个方面:

1)全局思维。分析软件系统内各模块之间的关系,与外部系统交互,以及这些关系背后的运行逻辑。

2)综合思维。软件系统是社会系统和技术系统相互作用而形成的社会技术(social-tech)系统。

3)工程思维。软件工程应以资源有限、条件不足为前提,去实现“现实世界”的目标。

4)抽象思维。通过抽象提炼复杂软件系统的本质,对软件系统进行建模。

如何才能成功地开发出一个复杂的软件系统?有三条复杂性控制的基本准则——抽象、分解和迭代,这些方法能应用于几乎所有复杂事物的处理上。

(1)抽象

抽象(abstraction)是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。抽象也是一个裁剪的过程,它将不同的、非本质性的特征全部裁剪掉了。

共同特征是相对的,是指从某一个刻面(角度)看是共同的。比如,对于汽车和大米,从买卖的角度看都是商品,都有价格,这是它们的共同特征,而从其生物特性角度看,它们则是不同的。所以在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。

抽象可应用于各领域中以降低问题的复杂度。普遍运用于程序设计中的抽象包括两种,一种是过程抽象(procedural abstraction),另一种是数据抽象(data abstraction)。对象(类)的抽象则通过操作和属性,组合了这两种抽象。

(2)分解

分解(decomposition),即分而治之,是指把一个复杂的问题分解成若干个简单的问题,然后逐个解决。我们把一个复杂的软件分解成多个模块,开发人员能够在不需要许多交流的情况下,开发不同的模块,最终把这些模块集成为一个软件系统。在分解问题时,应遵循以下原则:

● 每个子问题在细节上处于相同的级别。

● 每个子问题能够被独立解决。

● 每个子问题的解决方案综合起来可以解决原来的问题。

(3)迭代

复杂软件系统充满着很多不确定性和挑战,当我们对此缺少经验,无法对其进行正确的分解和抽象时,如何进行处理?采用迭代(iteration)开发!在软件系统全面构造之前,我们先针对不确定的问题做试验,以获得经验。如果问题很复杂,则再做试验,获得更多经验,直至我们有足够的经验进行正确的处理。每一轮尝试就是一个迭代,例如应对需求模糊的需求界面原型迭代,应对技术和架构风险的技术原型迭代,应对进度风险的构造迭代(重要的功能在前期迭代中完成,可以提前交付),等等。前一个迭代中获得的知识将为后期迭代提供指导。

1.3.4 软件工程的发展趋势

在互联网和人工智能等技术的影响下,软件工程正在经历一场深刻的变革,呈现出敏捷化、智能化和全球化的发展趋势。

(1)敏捷化

面临在需求和技术不断变化的场景下快速实现软件开发和维护的挑战,软件的开发和运维呈敏捷化趋势,Scrum和DevOps等敏捷过程应运而生。敏捷过程强调以人为本,快速响应需求和变化,高效地交付产品,它基于适应而非预测,通过快速、短迭代的开发,不断产出和演化软件。敏捷过程高度注重人员间的协作和交流,而非命令和控制,充分发挥工程师的能动性和创造力,同时通过工具链来提升工作的效率和质量。

(2)智能化

软件工程正在进入智能化时代,Codex、ChatGPT和GPT-4等人工智能技术极大地赋能于软件开发和运维,成为软件工程师强大的智能助手,可用于软件需求分析、设计方案推荐、根据上下文自动生成代码、自动生成测试脚本、自动诊断和修复缺陷、辅助理解代码等环节。智能化软件工程不仅能提升软件工程的效率和质量,使软件工程师能更多地关注创造性工作,而且将极大地推动最终用户参与到软件开发中,最终实现“人人都是程序员”。

(3)全球化

互联网为人类个体之间的交互和协作提供了一种全新的基础设施,促进了社会化、全球化的软件工程实践的出现。这种新型软件工程被称为群体软件工程,它利用互联网将全球各地的开发者和用户协同起来,合作创新,“集众智、采众长”,快速开发出高质量的软件系统。这不仅有利于软件开发和运维的全球化,同时也推动了软件生态的建立和产业创新。目前群体软件工程主要形态有三种,即开源软件、软件众包,以及应用程序商店。

1.4 软件工程职业道德规范

在软件定义时代,软件的行为及质量对现实世界和人类社会有着巨大的影响。作为软件的创造者,软件工程师应遵循软件工程职业道德规范,肩负起这一巨大的责任。

1.4.1 SEEPP标准

为了让软件工程成为有真正意义的职业,IEEE计算机学会和美国计算机学会从1996年起组织专家编写软件工程职业道德规范(SEEPP),作为指导软件工程师的行为准则。该准则1998年已发布5版,通过广泛的评审和修改,其中5.2版 被两学会正式批准,有些公司已开始拿它作为聘请员工签约时的一个组成部分。居德华教授和朱三元教授将规范标准翻译成中文,以促进国内软件工程的职业化建设。

SEEPP标准有两个首要目标。第一个目标是,“软件工程师必须做出自己的承诺,做好软件分析、说明、设计、开发、测试和维护,使软件工程师成为有益和受人尊敬的职业。”换句话说,这一规范的一个主要功能是促进软件工程职业本身的发展。第二个目标是,软件工程师“对公众健康、安全和福利的承诺”,强调软件工程师的社会责任高于某个特定个人,与其他工程领域的职业道德规范类似。为了实现这两个目标,软件工程师应当坚持下列八项原则。

1)公众——软件工程师应保持与公众利益的一致性。

5.2版特意将公众利益列为第一原则,当出现利益冲突时,职业软件工程师应把维护公众利益作为最高判断准则,而绝不能将个人或雇主利益放在第一位,这一点是符合我国国情的。这一原则也意味着,软件工程师应负起使自己的工作和开发的软件能有益于公众的全部责任;对一切可能危及公众或环境的东西,软件工程师应毫不犹豫地加以揭露和阻止。

2)客户和雇主——在保持与公众利益一致的原则下,软件工程师应注意实现客户和雇主的最高利益。

由于软件工程师的工作对客户和雇主有直接影响,他们应当尽力保护客户和雇主的利益,除非后者的利益与公众利益有冲突。软件工程师只提供他们专长范围内的服务,注意保护机密信息,不做私活和有害于客户或雇主的事情,不使用非法获得的软件,如果他们认为项目有可能失败,应如实向客户和雇主报告。

3)产品——软件工程师应当尽可能地保证他们的产品和修改符合最高的专业标准。

对开发的产品,软件工程师应尽一切努力确保高质量、可接受的成本和合理的进度,当因素存在冲突需要折中解决时,应让雇主和客户知道实情。他们应对估算中的不肯定性提供评估,遵守相关的职业标准,在产品公开发布前,确保经过适当的评审和测试。

4)判断——软件工程师应当维护他们职业判断的完整性和独立性。

真正的职业人员同时具有独立行使职业判断的权利和责任,即使在与自身利益或与客户/雇主利益有冲突时,仍能坚持高的职业标准。软件工程师只认可和放行他们认为已适当评审和可以客观认同的产品,他们不应当参与非法或不诚信活动,例如行贿、重复收费或者同时为有利害冲突的双方工作且隐瞒冲突实情。

5)管理——软件工程的经理和领导人员应赞成并促进对软件开发和维护的理性管理。

软件工程的管理人员应与其他软件工程师一样遵循同样的职业标准,包括职业道德规范。对待其雇员应公平和真诚,注意将任务分配给可胜任的人,并注重提升他们的教育和实践经验,对成本、进度、人员投入、质量和项目的其他产出,应能做出现实的定量估计。

6)专业——软件工程师应当推进其专业的完整性和声誉,以符合公众利益。

软件工程师应用自身行动推进软件工程成为一个职业,促进软件工程知识的传播,自觉创造支持职业规范的工作环境,拒绝为违反职业道德规范的组织工作,对出现违反职业道德规范的情况应向同事、经理或有关管理机构及时反映。

7)同事——软件工程师对同事应持正直和支持的态度。

软件工程师应帮助其他同事遵循职业道德规范,互相公正对待,为他人的职业发展提供协助,对要求胜任力之外的专长时,应主动请求具有此专长的其他专业人员的帮助。

8)自我——软件工程师应当终身参加职业实践的学习,并促进理性的职业实践方法的发展。

软件工程师应不断提高自身的技能水平,保持知识更新,使自己能跟上技术发展的步伐,做出更大的贡献。

软件工程职业道德规范和职业实践标准,强调职业的责任和对社会的贡献,正是软件工程本身正在成长和成熟的一个标志。沿着这一方向,我们希望看到一个全新的软件工程职业。

1.4.2 软件工程师的职业责任

高度的工作责任感和严格履行职责是每一位软件工程师的不折不扣的义务,这可表现为以下三个层次:

1)社会责任。只做有益于社会的事,不做并阻止任何有害于社会的事,这是必须坚持的首要原则。因此,IEEE的职业道德规范明确列出,必须承担使工程决策保证公众健康、安全和福利的责任,即刻揭露那些可能危及公众利益或环境的因素。

2)工作责任。这涉及软件工程师工作可能直接影响的人,诸如雇主、客户、合作者、同事和其他干系人,应尽最大努力履行自己的职责,保质保量地完成任务,努力保护干系人应得的利益,诚恳地向他们提出建议,若发现可能有损他们利益的情况则应如实地反映和报告。

3)严格履行合同、协议和交付的职责。应保证交付的软件能实现要求的功能,这涉及工程师是否守信和正直的问题。如果感觉无法按要求完成分配的任务,有责任提出修改要求,应把风险和事由如实告知雇主和客户。对接受的工作和任务,不管是否已表示过可能出现的问题,都应尽力履行,并对出现的结果承担责任。

梅宏院士在CCF中国工程师文化日活动中提出:对于工程师而言,如何顺应时代,迎接机遇,应对挑战,成为数字经济时代推动我国甚至全球产业振兴的新时代工程师,做出无愧于时代的贡献?这是我们必须回答好的问题。我们需要不断学习、勇于创新、追求卓越,用0和1去改变世界、编织世界。

1.5 案例概述

软件工程是一门实践的学科,其知识来源于实践,并应用于实践。因此,软件工程的教学也必须基于实践。本书将以一个简单的汽车4S店业务管理系统为案例,来阐述软件工程的各个环节。

4S是指汽车的整车销售(Sale)、零配件销售(Sparepart)、售后服务(Service)和信息反馈(Survey)。随着近年国内汽车市场“井喷”式的增长,汽车4S店急需一个业务管理信息系统来帮助提升管理水平,提高汽车销售和服务的效率和质量。于是,ABC汽车集团公司委托SJTU小组开发汽车4S店业务管理系统(简称4S系统),实现整车销售、配件销售、售后服务以及信息反馈的4S服务协同管理,整车和配件的采购管理,以及用户权限和基本数据的系统管理。系统的具体功能包括:

1)整车销售:管理整车销售过程,从客户登记、整车报价、订购、签订销售合同到交车结算。

2)零配件销售:管理汽车零配件销售过程,包括零配件报价、领料和销售。

3)售后服务:管理汽车维修过程,从客户登记、维修项目派工、领料、维修完工、检验到交车结算。

4)信息反馈:管理客户投诉和问卷调查,包括投诉登记和处理、问卷设计和调查。

5)采购:管理整车和配件的采购过程,从采购申请、核准、下订单到进货结算。

6)系统管理:管理企业员工及权限、车型及配件等基础数据。

思考题

1.和硬件相比,软件具有哪些特性?

2.软件开发的根本目标是什么?

3.什么是软件工程?软件工程的知识体系是什么?

4.软件工程的系统思维分为哪四个方面?

5.如何控制软件开发的复杂性?请列出三种基本准则,并简述之。

6.请列出IEEE和ACM的软件工程职业道德规范(SEEPP)中的8项准则。 jzJ/WbBB1PJArAe+EDBfv8bq4Ki1PQ19ZvfVY+5VFngIyCdwdqL6V2MamQ6jqV47

点击中间区域
呼出菜单
上一章
目录
下一章
×