软件工程导论
今天开始学习《软件工程》一书,随缘写些笔记摘抄在这里。有些内容我会根据自己的理解进行改写、转述并加入自己的看法
软件是抽象的、不可触摸的,它不受物质材料的限制,也不受物理定律或加工过程的制约:一方面使软件工程得以简化,因为软件的潜能不受物理因素所限制;另一方面,由于缺乏自然约束,软件系统也就容易变得极为复杂,理解它会很困难,改变它价格高昂。
软件工程的提出
软件工程这一概念首先是在1968年召开的一个会议上被提出的。因为当时人们认识到单一的程序开发技术不能适应大型复杂软件系统的开发。这些项目经常不可靠、费用高于预期,并且延迟交付。
“软件失效”的原因
这主要来自于下面两方面的因素:
1、不断增长的系统复杂性。随着新的软件工程技术可以帮助我们构建更大更复杂的系统,要求在发生变化。系统必须更快地构建和交付;需要更大、更复杂的系统;系统需要具备在以前看来不可能完成的功能。
因此,我们必须不断发展新的软件工程技术来迎接交付更复杂的软件的新挑战。
2、未有效采用软件工程方法。我们常常不采用软件工程的方法或技术去编写计算机程序。这将会导致软件的费用经常高于预期而可靠性低于预期。
软件工程与个人编程的区别
许多人都在编写程序,这些有专业化的软件开发,也有个人因兴趣而进行的编程,也有各行各业的人员由于工作需要而编写程序。大部分的软件开发都是专业化的活动。
专业化开发和个人化开发的区别在于,专业化软件除了开发者之外,还会有别的用户会使用,专业化软件在其生命周期内要进行不断维护和修改。
软件工程的目的是?
软件工程的目的是支持专业化的软件开发而不是个人编程。它包括支持程序规格说明、设计和演化的相关技术,这些通常与个人化的软件开发无关。
软件不等同于计算机程序
我们在讨论软件工程的时候,软件不仅仅包括程序本身,还包括所有使程序能正常使用的相关文档、库、支持网站、配置数据等。
一个专业化开发的软件系统通常远远不止一个程序,它包含了多个程序以及用于设置这些程序的配置文件。还有关于这些程序的各种文档。
这就是专业软件开发和个人化开发的区别。如果你只是自己编写一个程序,除了你以外没有别的用户的话,你就不用费心写程序指南和设计文档等。
软件工程为什么重要?
1、个人和社会越来越多地依赖于先进的软件系统,这就要求我们能以快速经济的方式开发出可靠、可信的系统
2、从长远来看,运用软件工程方法和技术开发专业化的软件系统,比单纯作为个人编程项目编写程序更加便宜。无法有效应用软件工程方法将会导致更高的测试、质量保障和长期维护的成本。
基本的软件工程活动有哪些?
软件规格说明、软件开发、软件确认和软件演化
软件产品的种类?
通用软件产品和定制化软件产品。
软件除了提供相应的功能,它还具有一系列的质量属性。这些属性不直接涉及软件的功能,而是反映软件在执行的时候的行为以及源程序的结构、组织以及相关的文档。比如,软件对用户请求的响应时间、程序代码的可读性就属于这类属性。
好的软件产品的基本属性?
可接受性、可依赖性和信息安全性、效率、可维护性
可依赖的软件即使在系统失效的时候也不应当导致物理或经济上的破坏。
可维护性体现在软件应当能够通过演化来满足客户变化的需求。
软件工程的成本有哪些?
软件开发成本约占总成本的60%,测试成本占40%。对于定制化的软件来说,演化成本经常超过开发成本。
软件工程与计算机科学和系统工程都相关
下面4个相关的问题对许多不同类型的软件都有影响
1、异构性
2、企业和社会的变革
3、信息安全与信任
4、规模
应用的类型
1、独立的应用
2、基于事务的交互式应用
这类应用在远程计算机上运行,用户通过自己的计算机、手机或者平板电脑进行访问。显然这类应用包括Web应用
3、嵌入式的控制系统
4、批处理系统
这类系统被设计来处理大批量的数据。他们处理大量的单个输入以创建相应的输出。这些系统包括定期计费系统,比如运营商收你月租的那个系统。
5、娱乐系统
6、建模和仿真系统
这类系统包括很多独立且相互交互的对象。这类系统通常是计算密集型的,需要高性能的并行系统来运行。
7、数据收集和分析系统
这些软件可能需要和传感器进行交互,并且经常安装在恶劣的环境中。(比如安装在发动机内或者野外)
8、系统之系统。
这类系统在企业和大型组织中被使用,由一些其他软件组成。
这些不同软件之间的边界是模糊的。
每种类型的系统需要专门的软件工程技术。因为软件有不同的特点。比如烧录到ROM中的嵌入式软件需要进行全面的验证和确认。因为这类软件的修改十分昂贵。
对于交互式的基于Web的系统或者移动应用,迭代式开发和交付是很好的方法。其中,系统由可复用的构件组成。
有些基础适用于所有的软件系统
1、软件系统开发过程应当是受管理的并且被开发人员理解。
2、可靠性和性能对于所有的系统来说都很重要。
3、理解和管理系统规格说明和需求(软件该做什么)是很重要的
4、我们应当尽可能高效地利用已有的资源,这就意味着我们应当在一些适当的地方复用已经开发的软件,而不是从头写一个新软件。
软件工程职业道德
软件工程师必须坚持诚实正直的行为准则,有些方面,没有法律加以规范,只能依靠职业道德来约束。
1、保密。无论是否签署了保密协议,都应当保守雇主或客户的机密
2、工作能力。不应该对自己的能力水平进行虚假陈述。不应该故意接受超出自己能力范围的工作。
3、知识产权。软件工程师应当知晓有关专利权、著作权等知识产权的法律,必须谨慎行事,确保雇主和客户的知识产权受到保护。
4、计算机滥用。不应该运用自己的技能滥用他人的计算机。滥用他人计算机有时候影响不大,但是有时候后果非常严重。要警惕“面向监狱的编程”!
基于软件工程师在软件系统开发中的地位,软件工程师可能将事情做好,也可能做坏,还可能让他人或者影响他人将事情做好或做坏。为了最大限度地保证自己的工作是有益的,软件工程师必须保证使软件工程业成为对社会有益的、受人尊敬的行业。
根据ACM/IEEE-CS联合推出的软件工程职业道德和行为准则,
软件工程师应当遵循下列8条原则:
1、公共感。软件工程师应始终与公众利益保持一致。
2、客户与雇主。软件工程师应在满足第一条的情况下,保证客户和雇主利益最大化
3、产品。应当使得产品以及相关的修改尽可能满足行业最高标准。
4、判断力。软件工程师应当具备公正和独立的职业判断力。
5、管理。应当维护并倡导合乎道德的有关软件开发和维护的管理方法
6、职业感。软件工程师应当弘扬职业正义感和荣誉感,尊重社会公众利益。
7、同事。软件工程师应当公平地对待和协助每一位同事。
8、自己。软件工程师应当毕生学习专业知识,倡导合乎职业道德的职业活动方式。
可是有时候不同的人会有不同的观点和目标,这时候软件工程师可能会面临道德困境。当雇主行为违背道德的时候,职业工程师的处境就会很困难。比如,一个公司负责开发一个安全关键性的系统,由于时间太紧而篡改了安全的确认记录。这时候。工程师应当保守秘密,还是提醒客户注意,亦或是以某种方式揭露所交付的系统是不安全的?
当我看到这里,我思考了很久。因为这的确是一个难以抉择的问题。因为这是坚守自己的职业原则还是为了雇主的利益而放弃自己的原则的问题。
这里的问题在于,这种安全不是绝对的。
也就是说,虽然系统没有按照预定义的准则进行确认,但是它可能在整个生命周期中一直保持安全运行。当然,也有可能是,即使完成了安全确认,最终系统仍然发生失效并导致事故。
在早期披露这些问题,会导致雇主和雇员蒙受损失,如果隐瞒这些问题则会对他人不利。
我觉得,在这个问题上,必须有自己的主见。
应当分析问题的严重程度,因为严重程度影响着决策。如果情况非常危险,那还是应当用合适的方式披露出来,但是,要充分尊重雇主的权利。
总结
软件工程是一门覆盖软件生产各方面的工程学科
世界上存在着许多不同类型的系统。每一种系统都需要一种与之对应的软件工程工具和技术。几乎不存在适用于所有类型的系统和软件的设计和实现技术。
软件工程的基本思想适用于所有的软件系统。
软件工程师对行业、社会负有责任,不应该只是关心技术问题,而应该对工作的道德问题有所知晓。