1.1 软件 = 程序 + 软件工程
书中作者举例子解释软件、程序、工程的关系,我也举一个。假设我现在想写点博客,就搭建了一个简易的博客编辑器。后来张三觉得很好用,就问我能不能加上支持markdown的功能,李四也想用,问我能不能加上评论功能,王五说他想要rss订阅功能。。。等等。慢慢的就发展成为一个庞大的复杂系统。
一开始写的简易版可以理解为一个程序,这些朋友就是用户,还给我提了很多需求,现在这个博客软件的功能就变得很强大了。
但是,继续开发这个软件的工程也将变得更加困难和复杂。我要想实现这些朋友的需求,我需要好好的设计一个合理的软件架构,还有软件实现,还要找一个管理代码的工具,开发完之后还要软件测试,最后可能还要同时支持多语言国际化,最最后,软件出了问题肯定都得找我,我还得维护运营。以上这系列过程就是软件的生命周期。在这周期里,得有人负责软件项目管理。以上这些活动都是软件工程的核心部分。
软件 = 程序 + 软件工程
我花这么多精力做了这么好的软件,怎么赚钱呢?先试用再交钱?全免费开源?免费用但是要看我的广告?这些都是属于商业模式的范畴。
软件企业 = 软件 + 商业模式
一个软件从idea到商业要经历四个阶段,和人类的飞天梦想类似。从纸飞机到热气球,从莱特兄弟的飞机到现代化的航空业。
玩具阶段:写一个 "Hello world!"
业余爱好阶段:写一个博客系统
探索阶段:行业创新出现新技术
产业阶段:Windows操作系统,电子商务系统
一架成熟的商用飞机要经过很多工序,几十万零件组装检测试飞等。书中举例子,颇有讽刺意味。如果一个飞机工程师在飞机工作时从引擎里爬出来说:“继续飞吧,我搞定了。”我想这样的飞机没人敢坐。在软件行业中,却有大量的工程师以这样的行为自豪。(我认为这里是指很多开发者在生产环境中修改软件)
以上提到的部分专有名词:
- 需求分析(Requirement Analysis)
- 软件架构(Software Architecture)
- 软件设计与实现(Software Design, Implementation and Debug)
- 源代码管理(Source Code Control)
- 软件测试(Test)
- 软件维护(Software Comprehension)
- 服务运营(Service Operation)
- 软件的生命周期(Software Life Cycle, SLC)
- 软件项目管理(Project Management)
- 用户体验(User Experience)
- 国际化和本地化(Globalization & Localization)
1.2 软件工程是什么
把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
1.2.1 特殊性
-
复杂(Complexity)
大型软件有超百万行代码,而人一次只能阅读几十行而已。 -
不可见(Invisibility)
源代码经过编译以机器指令的方式在cpu上运行,而工程师在找bug时只能看见源代码和很少的错误信息,所以要靠工程师的想象力和强大的推理能力。 -
易变(Changeability)
因为需求经常变化,软件看起来非常容易改动,以为会比改动硬件容易,但实际上正确的修改软件非常困难。 -
服从(Conformity)
软件需求运行在硬件上不能独立存在,要服从系统中其他组建要求,还要服从用户的要求,行业的要求。 -
非连续性(Discontinuity)
有时小小的变化会导致软件发生极大的变化
以上这些特性都是决定软件工程的本质问题,其他的问题例如编程语言,开发工具,存储介质等等都是普通特性。
1.2.2 软件工程与计算机科学的关系
前者偏实践,后者篇理论。计算机理论进展促进软件工程的进展,而软件工程的进展反过来更好的帮助计算机理论的实验与探索。
1.2.3 知识领域
- Software requirements
- Software design
- Software construction
- Software testing
- Software maintenance
- Software configuration management
- Software engineering management
- Software engineering process
- Software engineering models and methods
- Software quality
- Software engineering professional practice
- Software engineering economics
- Computing foundations
- Mathematical foundations
- Engineering foundations
前十二项描述软件学科本身的知识领域。后面三项是基础知识:计算基础、数学基础和工程基础。
1.2.4 目标
It's not a bug, it's a feature!
我们的目标当然是创造好软件!
- 用户满意度
- 可靠性
- 可维护性
- 软件流程的质量
总结
通过学习软件工程做到以下三点:
- 研发出符合用户需求的软件
- 在预计时间内发布‘足够好’的软件
- 能证明软件是可维护的和持续发展的
网友评论