什么是软件工程?
把系统的、有序的、可量化的方法运用到软件的开发、运营和维护中的过程
包括那些领域?
软件需求分析、软件设计、软件构建、软件测试和软件维护
为什么要搞工程?
1、需求复杂:用户需求复杂,需要长期维护
2、系统复杂:在有着百万行代码的系统中,其潜在的复杂性使这些工作变得必要
3、因为人的生命、财产依赖于软件
软件特性
复杂性
软件是最复杂的系统类型,一个软件包含成千上万行代码,程序员的记忆力和普通人一样,只能记得几十行代码,软件各个模块之间有着显性或者隐形的关系,随着系统的成长和模块的增多,这些关系的数量已指数级速度增长
不可见性
程序员可以看到和源代码,但是源代码并不是软件本身,源代码需要转化为机器码才能在计算机上高速运行,有时候在多个cpu内核上运行,工程师看不到自己的源代码如何在计算机上被执行。
商用软件出现了问题,工程师可以看到出错留下的痕迹,但是几乎无法重现程序到底出现了什么问题
易变性
更改软件比更改硬件简单的多,人们希望做出的更改是1、为软件增加新的特性2、使软件能够适应到新的硬件,实际上,正确修改软件使一件非常困难的事
服从性
软件依赖于各种组件和硬件,服从人们的需要,同时要服从行业和系统标准
非连续性
人们比较能理解的事物,比如增加输入,就能看到相应的输出。但是很多软件没有这样的特性,输入上很小的变化,会引起输出很大的变化
软件的其他特性
新特性:
有许多不同的程序设计语言、
软件工具和软件开发平台
存在许多不同的软件开发流程
软件团队中存在许多不同的角色
软件通常既可以存储在磁带上,也可以存储在CD/DVD上
AI 可以写程序(OpenGPT), GitHub 社区
但是这些非本质、临时的特性并不能决定软件工程的本质问题。例如,有人发明 了一种新的程序设计语言,或者又出现了一个新的软件开发流程,或者网上出现了又一个程序员技术社区……这些事并不能改变软件工程的根本难度,这也是著名的“没有银弹(No Silver Bullet)”论断所阐述的道理。