1、计算机科学与技术:涉及大数据技术导论、数据采集与处理实践(Python)、Web前/后端开发、统计与数据分析、机器学习、高级数据库系统、数据可视化、云计算技术、人工智能、自然语言处理、媒体大数据案例分析、网络空间安全、计算机网络、数据结构、软件工程、操作系统等方面
2、软件工程:涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
二、软硬件不同
1、计算机科学与技术:既有软件技术,也包括硬件技术。
2、软件工程:偏向软件技术。
三、就业领域不同
1、计算机科学与技术:主要就业领域是从事网络工程领域的设计、维护等工作和软件信息技术领域的技术开发、教学、科研及管理等工作。
2、软件工程:主要就业领域是软件信息技术领域的技术开发工作和金融领域的经济管理工作。
一个软件从定义,使用,开发,维护,直到最终被废弃为止的整个过程。
基本思想:从时间角度对软件开发和维护的复杂问题进行分解,把软件生命的漫长周期依次分为若干个阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。
前阶段任务的完成是后阶段工作开始的前提与基础,后阶段任务是前阶段的具体与细化。
优点:各阶段任务相对独立,便于分工协作,降低开发工作的难度,便于科学组织与管理;保证了产品的质量,提高了可维护性。
这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。 Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。
统计结果显示: 大部分错误是在编码之前造成的,大约占63%; <2> 错误发现的越晚,改正它要付出的代价就越大,要差2到3个数量级。 因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。
开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。
从六、七时年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。
软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。
开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少的多; 当开发小组为N人时,可能的通讯信道为N(N-1)/2, 可见随着人数N的增大,通讯开销将急剧增大。
遵从上述六条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。
软件过程模型(software process model)是软件开发全部过程,活动和任务的结构框架,它能直观表达软件开发全过程,明确规定要完成的主要活动,任务和开发策略。
优点:
缺点:
增量模型(Increment Model)
在大型软件开发中存在着很多的不确定因素,需求的变更不可避免,所以积极应对变更对于一个软件过程模型来说尤为重要。
先完成一个系统子集的开发,再按同样的开发步骤增加功能(系统子集),如此递增下去直至满足全部的系统需求。
优点:
缺点:
原型模型是一个软件系统的初期版本,用于展示概念,验证设计方案,发现存在的问题和寻找可能的解决方法。
螺旋模型(spiral model)
缺点
RUP(Rational Unified Process,统一软件开发过程)
传统的开发方法有详细的项目规划,受控的过程管理和严格的质量保证,在规划,设计及文档编写方面投入句法,适合大型,长寿命周期的软件开发,无法满足中小型软件的开发需要。
敏捷开发适合系统需求在开发过程中快速变化的应用类型。
敏捷开发基本原则:
极限编程是目前最为流行的敏捷开发方法。该方法推行最佳工程实践,如迭代式开发,结对编程,测试驱动开发等,致力于积极响应用户需求变化,并能高效率的开发出高质量软件。XP适合于小团队开发
。
XP是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观 是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。
具体可以点击这里–>极限编程
优点:
不应该,软件的成功不仅需要开发人员的设计和实现。而且还需要测试人员去做测试找出bug,避免在用户使用时出现较多错误,影响用户体验度。在一个团队中,大家均是为了完成这个软件,难免会有漏洞,只有独立开,专以找出软件的漏洞为职责,才能更好地修复软件。
软件需求是待开发系统特征的描述,即提供的服务及运行时满足的约束条件。
可行性研究的主要任务是”了解客户的要求及现实环境,从技术,经济和社会因素等三方面研究并论证本软件项目的可行性,编写可行性研究报告,制定初步项目的开发计划。“
技术可行性
:对待开发的项目的功能,性能和限制条件进行分析,确认现有的资源(硬件,软件,技术人员水平,已有的工作基础)条件下,项目能否实现。经济可行性
:对待开发的项目的开发成本与预期收益进行评估,确定该项目是否值得去投资开发。考虑的问题主要是成本和效益的估算。社会可行性
:待开发项目是否存在着违反法律的(合同,责任,侵权)的潜在因素以及待开发的项目在用户组织内是否行的通,现有的管理体制,人员素质和操作方式是否可行。清楚的理解用户要解决的问题,完整准确的获取用户的需求,并用《软件需求规格说明书》规范的形式准确的表达用户的想法。
所面临的挑战是:
需求工程对人员的要求:
在这个阶段,重要的是什么,而不是怎么做。
需求工程有三个层次:
业务需求 Business Requirements
:描述了企业对项目的高层次目标,从宏观上描述开发系统的必要性,意义和目标。用户需求 User Requirements
:描述了用户对于系统的期望和目标,即用户要让系统做什么,产生什么样的业务价值,这是需求获取阶段的产物。具有离散型
(用户从不同角度,不同层面,不同粒度提出需求)和矛盾性
(用户处于不同的工作岗位,难免有局限性和矛盾性)的特点。系统需求
:描述软件产品要实现的软件服务以及需要满足的约束条件。用户利用这些服务来完成工作任务,满足业务需求。这是需求分析和建模的产物,对UR进行分析得到。在需求文档中撰写用户需求与系统需求的过程,需求要求具有清晰性,明确性,易读性,完整性和一致性的特点。
用户需求
:从用户角度描述体统功能及非需求功能,只涉及外部功能,不涉及内部设计, 用自然语言及图形描述。系统需求
:如何让系统满足用户的需求,是系统的一个完备,详尽的描述,也是系统设计的起点。目标:完整的获取系统必须提供的服务,以及需要满足的约束条件。
主要方法:
对需求获取得到的用户第一手需求资料进行综合整理分析,从而得到系统需求的过程。
主要任务:
需求验证
:检测需求是否正确,完备和一致,且为后续设计开发和测试提供了足够的基础。需求确认
:确认建立的需求正确的反映了用户对软件的要求,通常由软件公司和客户共同完成。主要方法:
快速原型
。需求评审
。
快速原型是建造一个模型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么。快速原型模型需要迅速建造一个可以运行的软件原型 ,以便理解和澄清问题,使开发人员与用户达成共识,最终在确定的客户需求基础上开发客户满意的软件产品。 快速原型模型允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义,快速设计开发出软件系统的原型,该原型向用户展示待开发软件的全部或部分功能和性能;用户对该原型进行测试评定,给出具体改进意见以丰富细化软件需求;开发人员据此对软件进行修改完善,直至用户满意认可之后,进行软件的完整实现及测试、维护。
组织记录软件需求,控制变更,并确保软件开发与软件需求一致的一系列方法与活动。
耦合是影响软件复杂程度和设计质量的一个重要因素,为提高模块的独立性,应建立模块间尽可能松散的系统,在设计上我们应采用以下原则:若模块间必须存在耦合,应尽量使用数据耦合,少用控制耦合,慎用或有控制地使用公共耦合,并限制公共耦合的范围,尽量避免内容耦合。
内聚有如下的种类,它们之间的内聚度由弱到强排列如下:
(1) 偶然内聚
:一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起。这种模块也称为巧合内聚,内聚程度最低。
(2) 逻辑内聚
:这种模块把几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能 。
(3) 时间内聚
:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
(4) 过程内聚
:构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。简单的说就是如果一个模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚。
(5) 通信内聚
:指模块内所有处理元素都在同一个数据结构上操作或所有处理功能都通过公用数据而发生关联(有时称之为信息内聚)。即指模块内各个组成部分都使用相同的数据数据或产生相同的数据结构。
(6) 顺序内聚
:一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常前一个处理元素的输出时后一个处理元素的输入。
(7) 功能内聚
:模块内所有元素的各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,模块已不可再分。即模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可。
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。
软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割。但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的程度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等。
耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
(1) 内容耦合
:一个模块直接访问另一模块的内容,则称这两个模块为内容耦合。
若在程序中出现下列情况之一,则说明两个模块之间发生了内容耦合:
一个模块直接访问另一个模块的内部数据。
一个模块不通过正常入口而直接转入到另一个模块的内部。
两个模块有一部分代码重叠(该部分代码具有一定的独立功能)。
一个模块有多个入口。
内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。
(2) 公共耦合
:一组模块都访问同一个全局数据结构,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合;如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合。
公共耦合会引起以下问题:
无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性。
使软件的可维护性变差。若一个模块修改了公共数据,则会影响相关模块。
降低了软件的可理解性。不容易清楚知道哪些数据被哪些模块所共享,排错困难。
一般地,仅当模块间共享的数据很多且通过参数传递很不方便时,才使用公共耦合。
(3) 外部耦合
:一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合。
(4) 控制耦合
:模块之间传递的不是数据信息,而是控制信息例如标志、开关量等,一个模块控制了另一个模块的功能。
(5) 标记耦合
:调用模块和被调用模块之间传递数据结构而不是简单数据,同时也称作特征耦合。标记耦合的模块间传递的不是简单变量,而是像高级语言中的数据名、记录名和文件名等数据结果,这些名字即为标记,其实传递的是地址。
(6) 数据耦合
:调用模块和被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递。
面向对象范型主要是基于将数据和操作绑定到一起;,或者说形成对象, 利用对象来绑定操作。要点如下:面向对
(1)面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由简单的软件对象组合而成。
(2)所有对象划分成各种对象类,每个对象都定义了一组数据和一组方法。
(3)按照子类(派生类)和父类(基类)的关系,把若干个对象类组成一个层次结构的系统(类等级)。在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。
(4)对象彼此之间仅能通过传递消息互相联系。
面向对象的特点:对象对自己负责;找到变化并封装之;优先使用对象聚集,而不是类继承: 相比这下,继承类需要深入了解父类,有可能带来冗余和职责不清的问题。针对接口编程,而不是实现;相同功能下,减少了代码的数量,也减少了出错的机率。代码越少,问题越少。约定优于配置。
用例图是指由参与者(Actor)、用例(Use Case),边界以及它们之间的关系构成的用于描述系统功能的视图。用例图(User Case)是外部用户(被称为参与者)所能观察到的系统功能的模型图。用例图是系统的蓝图。用例图呈现了一些参与者,一些用例,以及它们之间的关系,主要用于对系统、子系统或类的功能行为进行建模。
状态图用来描述一个特定的对象所有可能的状态,以及由于各种事件的发生而引起的状态之间的转移和变化。
并不是所有的类都需要画状态图,有明确意义的状态,在不同状态下行为有所不同的类才需要画状态图。
要根据情况而决定,不同情况使用不同的模型。目前有瀑布模型、快速原型模型、增量模型、螺旋模型
瀑布模型
,也称软件生存周期模型。快速原型模型
增量模型
螺旋模型
软件测试是保证软件质量,提高软件可靠性的关键。
狭义的软件测试定义:为发现软件缺陷而执行程序或系统的过程
广义的软件测试定义:人工或自动地运行或测定某系统的过程,目的在于检验它是否满足规定的需求或弄清预期结果和实际结果间的差别
为什么要做软件测试?
测试的任务
软件测试的原则
所有的测试都应追溯到用户的需求
尽早地和不断地进行软件测试(缺陷具有放大的特点,测试成本随阶段深入而上升)
8-2原则
软件缺陷的寄生虫性:找到的缺陷越多说明软件遗留的缺陷越多
避免自己测试自己的程序
回归测试:避免引入新的错误
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。
黑盒测试和白盒测试区别
软件维护是软件生命周期的最后一个阶段,不属于系统开发时期。
目的
是通过必要的维护工作使得系统持久的满足用户的需要
包括四类维护:
许多软件的维护非常困难,原因如下:
软件的可维护性由如下七个特性来衡量:
文档是可维护性的决定因素。
软件维护是非常重要且有必要的,软件维护是软件生存周期的最后一个阶段,就是要针对用户使用软件产品过程提出的问题而对软件产品进行相应的修改或演化,从而修正错误,改善性能或其他特征,以及使软件适应变化的环境。
软件维护工作的目标是不断地、持续地改进、扩充、完善软件系统,以提高系统运行效率,并尽量延长系统的使用寿命,为用户创造更大的价值。
我不愿意做维护工作。维护工作是一项漫长,艰巨且需要程序员有优秀的专业能力的工作,具体的困难性表现如下:
理解别人写的程序困难,困难程度随软件配置成分减少而迅速增加
要维护的软件往往没有合适的文档或资料不全
绝大多数软件设计时没有考虑将来的修改
软件维护不是一项吸引人的工作
软件人员经常流动,维护不能依靠原开发人员
追踪软件的建立过程非常困难,或根本做不到
项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性努力。
项目管理是一系列伴随着项目的进行而进行的,目的是为了确保项目能够达到预期结果的管理行为。
(PMBOK)a guide to the project management body of knowledge
软件开发成本主要是指软件开发过程中所花费的工作量及相应的代价,不包括原材料和能源的估计,主要是人的劳动的消耗。