概述
学习收获和感想
在之前的学习中,我很少会去关注软件工程的具体应用,而经过认真学习《高级软件工程》这门课程后,收获到了很多软件工程相关的基础知识,从中我学习到了问题解决方法论、软件生命周期、软件开发过程、需求分析的方法、用例图、图形化描述方法训练、工作量评估和项目管理、项目管理工具和软件测试技术方面的知识,了解到软件的实现不只是软件的代码部分,还有很多不限于代码的部分,如软件实现前的需求分析,团队选用的不同的软件实现过程模型,团队不同人的分工等等都属于软件的实现必须的步骤。这些知识可以提高开发时的效率,降低开发中的成本,写出更好的、更高质量的代码。
学习内容总结
对软件工程的理解
在学习高级软件课程的过程中,也完成了一个工程实践的项目,从中也加深了对软件工程相关思想的理解。
通过学习高级软件工程这门课,我所了解到的软件工程并不是一门具体的技术课程,而是对软件开发过程的指导路线。在开发过程中,运用软件工程的相关知识,可以让开发得到的编码获得更好的组织结构,开发的过程也会更加高效,最终的产品也将更好的满足多方的需求和目标。
什么是软件工程
软件工程(SoftwareEngineering,简称为SE)是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。随着软件行业的飞速发展,软件复杂性在飞速增长,随之出现了一系列的问题,比如说:软件成本极高、开发周期长、维护工作量大等。软件工程研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
软件的流程
- 需求分析:开发人员进行深入的研究,准确地了解用户的需求
- 设计阶段:用快速发布来证明设计是有效的
- 实现阶段:用各种软件工程的方法来实现软件
- 稳定阶段:证明测试是否覆盖了代码的大部分
- 发布阶段:如期发布软件,搜集用户的评价与反馈
- 维护阶段:保证软件的高可用、高可靠
码农需要掌握的工具
- Typing
- VSCode
- Git
- Vim
- 正则表达式
menu菜单的实现和LinkedTable库的编写
通过这两个实验加深对代码的理解,体会软件工程中模块化、可重用接口和线程安全的思想。
- 模块化设计:将系统各部分相互独立,即关注点分离,高内聚、低耦合
- 可重用接口:软件模块接口,给某一类对象定义公用的接口,对接口的不同实现形成了多个功能不同的类;回调函数接口,使用事件驱动方式调用,当事件发生时触发响应的接口执行
- 线程安全:并发情况下,加锁保证数据操作的原子性,数据操作结束后对锁释放。
了解了看待软件质量的几个不同角度,软件工程研究的主要目标就是寻找开发高质量软件的策略。我们一般从以下三个角度来看待软件质量:
- 测评的角度,也就是软件产品本身内在的质量特点
- 用户的角度,也就是软件产品从外部来看是不是对用户有帮助,是不是有良好的用户体验
- 商业的角度,也就是商业环境下软件产品的商业价值,比如投资回报或开发软件产品的其他驱动因素
需求分析
需求分析的两类基本方法
- 原型化方法,可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互操作过程。
- 建模的方法,可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来整顿繁杂的需求细节。
用例
用例(Use Case)的核心概念中首先它是一个业务过程(business process),经过逻辑整理抽象出来的一个业务过程。
用例的三个抽象层级:
- 抽象用例(Abstract use case)。只要用一个干什么、做什么或完成什么业务任务的动名词短语,就可以非常精简地指明一个用例
- 高层用例(High level use case)。需要给用例的范围划定一个边界,也就是用例在什么时候什么地方开始,以及在什么时候什么地方结束
- 扩展用例(Expanded use case)。需要将参与者和待开发软件系统为了完成用例所规定的业务任务的交互过程一步一步详细地描述出来
从需求分析到软件设计
1. 敏捷统一过程
敏捷统一过程的四个关键步骤
- 确定需求
- 通过用例的方式来满足这些需求
- 分配这些用例到各增量阶段
- 具体完成各增量阶段所计划的任务
2. 对象交互建模
对象交互建模的基本步骤
- 找出关键步骤进行剧情描述(scenario)
- 将剧情描述(scenario)转换成剧情描述表(scenario table)
- 将剧情描述表转换成序列图的基本方法
- 从分析序列图到设计序列图
- 一个完整用例的对象交互建模
3. 形成软件设计方案的基本方法
- 分析,是分解大问题变成易于理解的小问题。
- 综合,是将一个个小问题的解决方案组合起来构建软件的整体解决方案。
软件中的一些特殊机制
1.多态
多态是实例化变量可以指向不同的实例对象,这样同一个实例化变量在不同的实例对象上下文环境中执行不同的代码表现出不同的行为状态,而通过实例化变量调用实例对象的方法的那一块代码却是完全相同的.
2.回调函数
回调函数是一个面向过程的概念,是代码执行过程的一种特殊流程。回调函数就是一个通过函数指针调用的函数。把函数的指针(地址)作为参数传递给另一个函数,当这个指针调用其所指向的函数时,就称这是回调函数。
3.闭包
闭包是变量作用域的一种特殊情形,一般用在将函数作为返回值时,该函数执行所需的上下文环境也作为返回的函数对象的一部分,这样该函数对象就是一个闭包。
4.异步调用
Promise对象可以将异步调用以同步调用的流程表达出来,避免了通过嵌套回调函数实现异步调用。所谓Promise对象,就是代表了未来某个将要发生的事件,通常是一个异步操作。
5.匿名函数
lamda函数是函数式编程中的高阶函数,在我们常见的命令式编程语言中常常以匿名函数的形式出现,比如无参数的代码块{ code },或者箭头函数 { x => code }。
软件设计模式
在面向对象分析中我们涉及到了类、对象、属性以及类与类之间的关系,在此基础上我们进一步理解面向对象设计和实现所涉及的基本术语之间的关系。
设计模式的本质是面向对象设计原则的实际运用总结出的经验模型。对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解的基础上才能准确理解设计模式。
1. 设计模式的分类
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。比如模板方法模式等属于类模式。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。、
2.常用的设计模式
-
单例模式:某个类智能生产一个实例,该类提供了一个全局访问点供外部获取该实例,典型的应用如数据库实例。
-
原型模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新势力,原型模式的应用场景非常多,几乎所有通过复制的方式创建新实例的场景都有原型模式。
-
建造者模式:讲将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。主要应用于复杂对象中的各部分的建造顺序相对固定或者创建复杂对象的算法独立于各组成部分。
-
代理模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
-
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。继承和对象组合都可以实现适配器模式,但由于组合关系或聚合关系比继承关系耦合度低,所以对象组合方式的适配器模式比较常用
-
装饰(Decorator)模式:在不改变现有对象结构的情况下,动态地给对象增加一些职责,即增加其额外的功能
-
外观(Facade)模式:为复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
-
享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用
-
策略模式:定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的改变不会影响使用算法的客户。
-
命令模式:讲一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储传递调用增加与管理
-
模板方法:定义一个操作者的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。模板方法是继承和重载机制的应用,属于类模式。
-
职责链:为了避免请求发送者与多个请求处理着偶合在一起,将所有请求的处理者通过前一对象记住旗下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,知道有对象处理它为止。通过这种方式将多个请求处理着串联为一个链表,去除请求发送者与它们之间的耦合。
-
中介者:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
3.设计模式背后的设计原则
- 开闭原则(Open Closed Principle,OCP)
- Liskov替换原则(Liskov Substitution Principle,LSP)
- 依赖倒置原则(Dependence Inversion Principle,DIP)
- 单一职责原则(Single Responsibility Principle,SRP)
- 迪米特法则(Law of Demeter,LoD)
- 合成复用原则(Composite Reuse Principle,CRP)
软件架构
- 三层架构
- MVC架构
- MVVM架构
1.软件架构的描述方法
- 分解视图:分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。
- 依赖视图:依赖视图展现了软件模块之间的依赖关系。
- 泛化视图:泛化视图展现了软件模块之间的一般化或具体化的关系,典型的例子就是面向对象分析和设计方法中类之间的继承关系。
- 执行视图:执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。
- 实现视图:实现视图是描述软件架构与源文件之间的映射关系。
- 部署视图:部署视图是将执行实体和计算机资源建立映射关系。
- 工作任务分配视图:工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员。
2.软件质量属性
- 易于修改维护(Modifiability)
- 高内聚和低耦合
- 良好的性能表现(Performance)
- 安全性(Security)
- 可靠性(Reliability)
- 健壮性(Robustness)
- 易用性(Usability)
- 商业目标(Business goals)
软件过程模型
1.软件的生命周期概述
- 分析阶段的任务是需求分析和定义
- 设计阶段分为软件架构设计和软件详细设计,前者一般和分析阶段联系紧密,一般合称为“分析与设计”;后者一般和实现阶段联系紧密,一般合称为“设计与实现”。
- 实现阶段分为编码和测试,其中测试又涉及到单元测试、集成测试、系统测试等。
- 交付阶段主要是部署、交付测试和用户培训等。
- 维护阶段一般是软件生命周期中持续时间最长的一个阶段,而且在维护阶段很可能会形成单独的项目,从而经历分析、设计、实现、交付几个阶段,最终又合并进维护阶段。
2.瀑布模型
瀑布模型(Waterfall Model)是第一个软件过程开发模型,对于能够完全透彻理解的需求且几乎不会发生需求变更的项目瀑布模型是适用的。
3.带原型的瀑布模型
为了尽早暴露风险和控制风险,在瀑布模型的基础上增加一个原型化(prototyping)阶段,可以有效将风险前移,改善整个项目的技术和管理上的可控性。
原型就是根据需要完成的软件的一部分,完成哪一部分是根据开发原型的目标确定,比较常见的有用户接口原型和软件架构原型。
4.V模型
V模型也是在瀑布模型基础上发展出来的,也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。
5.分阶段增量和迭代
分阶段开发可以让客户在没有开发完成之前就可以使用部分功能,也就是每次可以交付系统的一小部分,从而缩短开发迭代的周期。
6.螺旋模型
螺旋模型是一种演化软件开发过程模型,兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险管理,使软件在无法排除重大风险时有机会停止,以减小损失。
软件危机和软件过程
软件危机的根本问题:软件概念结构的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。
软件生命周期:分析、设计、实现、交付、维护。
团队的基本要素
团队规模
团队的凝聚力
团队协作的基本条件
敏捷宣言
个体和互动高于流程和工具
工作的软件高于详尽的文档
客户合作高于合同谈判
响应变化高于遵循计划
DevOps
DevOps(Development和Operations的组合)是一组过程、方法与系统的统称,用于促进软件开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。可以把DevOps看作开发(软件工程)、技术运营和质量保障(QA)三者的交集。
作者:310
参考资料 代码中的软件工程 https://gitee.com/mengning997/se
最后
以上就是超级红酒为你收集整理的高级软件工程学习总结学习收获和感想学习内容总结的全部内容,希望文章能够帮你解决高级软件工程学习总结学习收获和感想学习内容总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复