专业术语整理:
Program = data structure + algorithm
Software = Program +Software Engineering
Software Company =Software + Business Model
第一章
*********************************************************************************************************************************************************
1.1软件 = 程序+软件工程
从一个简单的程序,扩展到一个满足各种功能的应用软件,再扩展到一个能保证服务质量的软件服务,
这里的程序,也指的是源程序,他是建立再数据结构上的一些算法。程序还要对数据进行操作
一个复杂的软件不但要有合理的软件构架、软件设计与实现、还要有各种文件和数据来描述各个程序
文件之间的依赖关系、编译参数、链接参数,这些都是软件构建的过程
有些程序要配置不同的界面,运行在中文、英文或者其他语言的操作系统上;有些程序还有32位版本、64位版本等。
这是源代码管理的问题--也叫配置管理。还有一系列的工具、流程和文档来保证程序的正确性,才能保证开发出来的
软件的质量。这就是质量保障,具体的验证过程叫做软件测试
软件团队的人员也会流动,新的成员要尽快读懂已有程序,了解程序的设计,这叫程序理解。
软件在运行过程中还会出现这样与那样的问题,需要时不时给软件大补丁,或维护众多的服务,这叫软件维护、或者
叫服务运营。这一系列过程就是软件的生命周期,在这一周期中,有人得负责软件项目的管理。
一个好的软件,即使功能和同类软件区别不大,但却会让人感觉到非常好用。这就是软件的用户体验,用户体验和数
据结构、算法没有直接的关系,但是很多费城成功的软件就赢在了这方面。软件还要处理不同的语言、不同地区的用
户对界面和功能的不同需求,这叫做软件的国际化和本土化
有些软件企业的商业模式有些是合情合理的;但有些不怎么合法;在相关法律完善之前,软件行业还有一个行规,即应
该有职业道德规范来约束IT人的行为
上面这些和软件开发活动(构建管理、源代码管理、软件设计、软件测试、项目管)相关的内容,是软件工程的核心部分
广义上的软件工程也包括用户体验、用户界面设计等
所以一个推论是:
软件=程序+软件工程
一个扩展的推论是:
软件企业=软件+商业模式
软件开发的不同阶段
1、玩具阶段 写程序练习数据结构/算法,用新语言尝试一下“Hello World”
2、业余爱好阶段 用JavaScript、ASPNET、Ruby写写网站
3、探索阶段 钻研新技术,应用新技术在软件行业创新
4、成熟的产业阶段 银行软件系统,互联网搜索行业、电子商务系统、Windows操作系统
*********************************************************************************************************************************************************
1.2软件工程是什么
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
软件工程和下列的学科相关:计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、
软件人体工学、系统工程、工设计和用户体验设计。
*********************************************************************************************************************************************************
1.2.1软件的特殊性
系统软件:操作系统、设备驱动程序、工具软件等
应用软件:用户使用他们来完成工作、从管理核电厂到文章,或者是通信、游戏、浏览网页、播放视频等
恶意软件:软件病毒等
1)复杂性 软件可以说是人类创造的最复杂的系统类型,大型软件有超过百万行的源代码,有上万个不同的文件。而软件工程师
的肉眼通常一次只能看到30-80行源代码(相当于显示器的一屏)。软件的各个模块之间有各种显性或隐性的依赖关系,
随着系统的成长和模块的增多,这些关系的数量往往以几何数的速度增长。
2)不可见性 软件工程师能直接看见源代码,但是源代码不是软件本身。软件以机器码的形式高速运行,还可能在几个CPU核上同时
运行,还可能在几个CPU核上同时运行
3)易变性 软件看上去很容易修改,修改软件比修改硬件容易多了。人们自然的期待软件额能在下面两种情况下“改变”a)让软件做新的
事情;b)让软件适应新的硬件。但是与此同时,正确的修改软件是一件困难的事请。
4)服从性 软件不能独立的存在。他总是要运行在硬件上面,他要服从系统中其他组成部分的要求,他还要服从用户的要求,行业系统
的要求(例如银行利率的变化)
5)非连续性 人们比较容易理解连续的系统;增加输入,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输入上很小
的变化,会引起输出上极大的变化
这些特性的前四个事佛瑞德.布鲁克斯(Fred Brooks Jr.)在No Silver Bullet 一文中提到的
第五个特性是瓦茨拉夫.拉力齐(Vaclav Rajlich)提到的
这些特性是由软件的本质决定的,软件还有其他特征:
1、有许多不同的程序设计语言、软件工具和软件开发平台
2、存在许多不同的软件开发流程
3、软件团队中存在许多不同的角色
4、软件既可以存储在磁带上,也可以存储在CD/DVD上
*********************************************************************************************************************************************************
1.2.2 软件工程与计算机科学的关系
中国高校中的三种计算机软件的机构
1、计算机科学与技术系或学院
2、软件学院
3、软件工程、软件工程学院
计算机科学这以学术邻域可以分为这些下面这些偏理论的领域:
计算理论、信息和编码理论、算法和数据结构、形式化方法、程序设计语言
以及下面这些偏实践的领域:
计算机体系结构、并行计算和分布式系统、实时系统和嵌入式系统、操作系统、计算机网络、科学计算、安全和密码学、
人工智能、这个邻域覆盖了许多相关的邻域,如模式识别、机械学习、数据挖掘、信息提取、等
计算机图形学、计算机视觉、多媒体
数据库和大规模数据处理
万维网
自然语言处理和语音
人机交互
软件工程
计算机科学和软件工程的不同侧重点
计算机科学 软件工程
发现和研究长期的、客观的真理 短期的实际结果(具体的软件会过时)
理想化的 对各种因素的折衷
确定性,完美,通用性 对不确定性和风险的管理,足够好,具体的应用
各个学科独立深入研究,做出成果 关注和应用各个相关的学科的知识,解决问题
理论的统一 百花齐放的实践方法
强调原创性 最好的、成熟的实践方法
形式化,追求简明的公式 在实践中建立起来的灵感和直觉
正确性 可塑性
各个项目中的各个特点:
Build To Learn:开发软件,构建系统的目的式做进一步的试验,试图发现客观规律或探求某方法的优劣。这些项目经常是科研论文的基础工作。
Build To Show:为了突出地展现某个技术的作用,开发一些以演示为目的的软件,这些项目很吸引眼球,经常获得新闻报道,但是功能未必全面或实用。
Build To Serve:为了服务一定范围的目标用户而构建的工具等,有时以公开SDK的形式发布,让别的研发人员使用
Build To Win:以在市场上赢得用户为目标而构建的软件。这也是种种科学发现、技术突破最好的试金石。
*********************************************************************************************************************************************************
1.2.3 软件工程的知识领域
生命周期 软件需求、软件设计、软件构件、软件测试、软件维护
专门领域 软件配置管理、软件工程管理、软件工程过程、软件工程模型和方法、软件质量
理论基础 计算基础、数学基础、工程基础
*********************************************************************************************************************************************************
1.2.4软件工程的目标——创造“足够好”的软件
1)用户满意度 用户在使用时发现了软件的很多问题,影响了用户使用软件的效率。
2)可靠性 某个软件经常会崩溃,某个操作系统会时不时死机,某个网站往往在最需要的时候登不上去。
3)软件流程的质量 软件团队和开发流程的问题太多,导致团队成员无法互相协作,按时交付软件。这也可以说式软件团队的bug
4)可维护性 某个软件太难维护了,按下葫芦起了瓢,修复了一个问题,另一个问题又出来了。也没有足够的文档,维护人员需要更多的资金和时间来维护这个
软件,甚至建议推倒重写。
*********************************************************************************************************************************************************
通过本书学习,作者希望读者达到的目标:
1、研发符合用户需求的软件
通过实际的工作手机、推导、提练需求,并在软件发布后通过实际数据验证需求的确被满足了。需求来自于实际,而不是自己想象出来的“需求”或者人云亦云
的需求(例如:虚拟的、没人用的、也没有数据的“图书馆管理系统”)
2、通过一定的软件流程,在预计的时间发布“足够好”的软件
这个软件并不是期末前两天由两三个同学熬通宵赶出来的急就章,而是经历了一定的软件流程,通过全体团队成员的努力,在一个长期阶段(一个学期)内逐步完成的。
对于现实生活中的软件团队来说,好产品不是某个英雄长期加班突袭出来的
3、能证明所开发的软件式可以维护和继续发展的
例如,对用户需求的分析有详细的文档说明,包括对将来发展的分析和计划。主要功能的设计文档说明和软件的实际行为一致,源代码完整并能构建出符合之来给你要求的版本。
能用软件管理软件看到源代码的每次修改记录,Bug的修改过程。关键模块有可以正常执行的单元测试、压力测试脚本,等等-
原文:https://www.cnblogs.com/kingvist/p/11482139.html