1.1 软件=程序+软件工程算法
众所周知,“程序=数据结构+算法”, 然而在实际应用中,这一说法又显得有些空泛。程序,在这里指的是源程序,就是一行行的代码。它们是创建在数据结构上的一些算法。程序还要对数据进行操做,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序经过网络下载的数据、用户的文字或语音输入等)。可是光有代码和静态数据仍是不行,工程师要把它们构建成为机器能懂的可执行代码。构建不只仅是cc和link命令,一个复杂的软件不但要有合理的软件构架、软件设计与实现,还要有各类文件和数据来描述各个程序文件之间的依赖关系、编译参数、连接参数,等等。这些都是软件构建的过程。
安全
怎么保证软件在修改过程当中质量不断提升,至少要维持之前的质量?这是源代码管理的问题——也叫配置管理。咱们还有一系列的工具、流程和文档来保证程序的正确性,这些工具(也是软件)、流程应该达到很高的质量,才能保证开发出来的软件的质量。这就是质量保障,具体验证过程叫作软件测试。网络
软件团队要从需求分析开始,把合适的需求梳理出来,而后逐步展开后续工做。软件团队的人员也会流动,新的成员要尽快读懂已有的程序,了解程序的设计,这叫程序理解。软件在运行过程当中还会出现这样那样的问题,也许咱们要时不时给软件打一个补丁,或者维护众多的服务,团队的新老成员要一块儿修复各类各样的问题,这叫软件维护,或者服务运营。这一系列过程就是软件的生命周期,有人得负责软件项目的管理。数据结构
一个好的软件,即便功能和同类软件区别不大,但却会让人感到很是好用。这就是软件的用户体验。用户体验和数据结构、算法没有直接关系,可是不少很是成功的软件就赢在这个方面。工具
软件工程的核心部分为:构建管理、源代码管理、软件设计、软件测试、项目管理。广义上的软件工程也包括用户体验、用户界面设计等。因此一个推论是:软件=程序+软件工程。一个扩展的推论是:软件企业=软件+商业模式。测试
将软件开发类比于航空产业,软件开发能够分为四个不一样的阶段,分别是:练习、尝试、探索、成熟的产业模式。然而不管是软件开发仍是航空航天产业,做为一个合格的业内人员,都必需要作到在安全平稳的基础上提升技术水平,不能舍本逐末。网站
1.2 软件工程是什么ui
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。搜索引擎
人们在开发、运营、维护软件的过程当中有不少技术、作法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提升软件开发、运营、维护的效率,并提升软件的质量、用户满意度、可靠性和软件的可维护性。光有各类流程的思想是不够的,咱们还要有一系列的工具来保证这些思想可以在实践中有效率地运做。软件工具备不少:有工程师自行开发的工具,有软件团队独有的工具,也有许多公开的软件工具,例如编译工具、源代码管理工具、源代码编辑工具;也有一些软件工具系统,例如Microsoft Visual Studio、GitHub、Eclipse、ClearCase和ClearQuest,等等。
spa
1.2.1 软件的特殊性
软件是能够运行在计算机及电子设备中的指令和数据的有序集合。软件有各类分类方法,其中一种是:
软件和人类制造出来的其余产品相比,有许多共性,也有一些特殊性。它们都是解决某种需求。咱们知道许多计算机硬件的能力大体以每两年提升一倍的速度发展,而软件开发的流程却没有这样的提速过程,开发成本也没有降低,为何?软件开发过程有什么特别的难题?学者们总结了如下五点:
软件能够说是人类创造的最复杂的系统类型。大型软件(操做系统、办公软件、搜索引擎)有超过百万行的源代码,上万个不一样的文件。而软件工程师的肉眼一般一次只能看到30-80行源代码(至关于显示器的一屏),他们的智力、记忆力和常人差很少,在过去的几十年中并无大的提升。软件的各个模块之间有各类显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量每每以几何级数的速度增加。而理解运用这些复杂性的人并无太大的变化。
2.不可见性
软件工程师能直接看见源代码,可是源代码不是软件自己。软件以机器码的形式高速运行,还可能在几个CPU核上同时运行,工程师是“看”不到本身的源代码如何具体地在用户的机器上被执行的。商用软件出现了错误,工程师能够看到程序在出错的一瞬间留下的一些痕迹(错误代号、大体的目标代码位置、错误信息),可是几乎没法完整重现到底程序出现了什么问题。当工程师回过头来看源代码时,它们仍是安静地排列在屏幕上。
3.易变性
软件看上去很容易修改,修改软件比修改硬件容易多了。人们天然地期待软件能在下面两种状况下“改变”:a、让软件作新的事情;b、让软件适应新的硬件。可是与此同时,正确地修改软件是一件很困难的事情
4.服从性
软件不能独立存在,它老是要运行在硬件上面,它要服从系统中其余组成部分的要求,它还要服从用户的要求、行业系统的要求(例如银行利率的变化)。
5.非连续性
人们比较容易理解连续的系统:增长输入,就能看到相应输出的增长。可是许多软件系统却没有这样的特性,有时输入上很小的变化,会引发输出上极大的变化。
这些特性的前四个是佛瑞德·布鲁克斯在No Silver Bullet一文中提到的,第五个特性是瓦茨拉夫·拉里奇提到的。这些特性是由软件的本质所决定的,软件还有其余特性:
可是这些非本质、临时的特性并不能决定软件工程的本质问题。
1.2.2 软件工程与计算机科学的关系
软件工程中的“工程”二字也大有来历,人们把下面的活动称之为工程:
创造性地运用科学原理,设计和实现建筑、机器、装置或生产过程;或者是在实践中使用一个或多个上述实体;或者是实现这些实体的过程。
根据咱们对软件特性及工程这一律念的了解,能够看到,计算机科学中的理论研究部分,大多能够从形式上证实,与数学、离散数学、数理逻辑密切相关;计算机科学中与实践相关的部分,都和数据以及其余学科发生关系;软件工程则和人的行为、现实社会的需求息息相关。软件工程的研究目标(软件的开发、运营和维护)中都有“人”出现,这些“人”能够是项目需求的提供者,能够是软件的开发人员,还能够是软件的用户。这一特征与其余计算机科学的子领域明显不一样。其实,在任何科学领域中,都是偏理论的子领域和偏应用的子领域(例如数学与应用数学),当偏应用的领域获得长足发展以后,就会更多地被你们所熟知,甚至成为一门独立的学科,这并不说明相对应的两方面有高低或优劣之分。
计算机科学和软件工程的不一样侧重点
计算机科学 | 软件工程 |
发现和研究长期的、客观的真理 |
短裙的实际结果(具体的软件会过期) |
理想化的 | 对各类因素的折中 |
肯定性、完美、通用性 | 对不肯定性和风险的管理,足够好,具体的应用 |
各个学科独立深刻研究,作出成果 | 关注和应用各个相关学科的知识、解决问题 |
理论的统一 | 百花齐放的实践方法 |
强调原创性 | 最好的、成熟的实践方法 |
形式化,追求简明的公式 | 在实践中创建起来的灵感和直觉 |
正确性 | 可靠性 |
计算机理论的进展会帮助软件工程(例如对程序正确性的分析);软件工程的进展(更好的工具,更多的应用领域)会帮助计算机科学家更有效地进行实验和探索。
1.2.3 软件工程的知识领域
软件工程共有15个知识领域(Knowledge Area,KA):
须要指出的是,在上面的15个KA中,KA1-12描述了软件工程学科自己的知识领域;KA13-15描述了软件工程三大类基础知识领域:计算基础、数学基础和工程基础。
1.2.4 软件工程的目标——创造“足够好”的软件
什么是好的软件?一些同窗认为,所谓好软件,就是软件没有缺陷(Bug),所谓软件工程,就是把软件中的Bug都消灭掉的过程。这的确是抓住了软件工程的一个要素。和软件打交道的专业人士都知道软件有“Bug”,软件团队的不少人都成天和Bug打交道,Bug的多少能够直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性。例如:、
用户满意度:用户在使用时发现了软件的不少问题,影响了用户使用软件的效率。
可靠性:某个软件常常会崩溃,某个操做系统会时不时死机,某个网站每每在最须要的时候登不上去。
软件流程的质量:软件团队和开发流程的问题太多,致使团队成员没法互相协做,按时交付软件。这也能够说是软件团队的Bug。
可维护性:某个软件太难维护了,修复了一个问题,另外一个问题又出来了。也没有足够的文档,维护人员表示须要更多的资金和时间来维护这个软件,甚至建议推到重写。
什么是Bug呢?简单地说,软件的行为和用户的指望值不同,就叫Bug。是不是Bug,取决于用户和开发者的不一样角度。软件工程的一个重要任务,就是要决定一个软件在何时能“足够好”,能够发布。