软件工程——清华大学《软件工程》课程学习与分享

博主在研究生时期主要用Fortran做数值计算方面的算法研究,现在工作上会用到Python做一些数值计算软件二次开发及自动化的应用。由于博主处在的汽车行业正经历“软件定义汽车”的时代浪潮中,但博主自觉自己在软件工程方面的知识还有所欠缺,所以早前就有在相关方面做拓展学习和积累,本次就简单介绍与记录下自己之前学习的清华大学的《软件工程》的视频课程。
当然自己写此篇博文,一方面是为了做学习记录,另一方面是课程讲的确实挺好。现在的视频课程的学习平台很多,除了慕课和清华学堂,还有b站或其他视频网站,课程资源繁多琳琅满目的时候,很有可能让人看花了眼难以选择。而且不同课程授课水平各不一样,有些讲的好,通俗易懂旁征博引,有些课程可能就略显照本宣科,还是需要做一番筛选的。自己当时就软件工程课程相关公开课做过比较,对比下来发现清华大学的这么《软件工程》课程讲的不错。所以也秉承着学习分享的态度,希望为同样有兴趣系统学习软件工程的小伙伴们做个参考。

1. 课程相关信息

1.1 课程简介

本课程从软件生命周期的角度讲解软件工程的基本概念、基本原理和基本方法,内容涉及开发管理、需求建模、设计实现和测试维护等四大部分的相关基础知识,强调软件工程的根本性和永久性原则,诸如可测试性、软件体系结构、模块化和可复用性等,关注软件系统的复杂性问题以及迭代式的开发方法,重视分析问题与解决问题的能力以及软件工程实践训练,培养学生良好的工程化开发习惯。经过本课程的学习,学生能够掌握软件工程的基础知识,从工程学角度认识软件在大型复杂系统中的设计和应用,具备作为软件工程师从事软件开发所需的专业能力。
该课程于2019-10-30上线,应该算是新编课程,所以课程的内容一定程度上也结合反映了当下软件工程的新发展及应用的,课程总共分为15个章节,共计83堂课,总课时约为17小时。课程所在的学堂在线网址如下:
《软件工程》——清华大学课程

1.2 教师团队

以下是官网上贴出的教师团队:
在这里插入图片描述

本课程主讲老师为刘强老师,随着自己在课程的学习中发现,授课其实并不止以上两位,课程中《第4章 软件开发过程》请来前微软Azure工程团队首席研发经理、现CSDN副总裁的邹欣介绍了微软的开发流程,共3节课,作为企业实际开发的实例介绍也是不错。
课程中《第12章 软件交互设计》是由史元春主讲,自己冲着史老师人美声甜授课专业且饶有趣味, 还专门查了下老师的资料:
史元春,清华大学计算机系“长江学者”特聘教授,人机交互与媒体集成研究所所长,清华大学全球创新学院(GIX)院长。她的主要研究方向为人机交互、普适计算、多媒体、网络教育技术等,主持国家十三五重点专项等国家研发计划项目。其科研成果近年连续获得国际人机交互领域顶级会议最佳论文奖、并两次获得国家科技进步奖。史元春兼任中国计算机学会常务理事,人机交互专业委员会副主任。
在这里插入图片描述

1.3 课程编程语言

本课程中相关软件工程的知识介绍,主要是以编程语言Python来配合讲解, 使用的Python IDE(集成开发环境)是Pycharm。相关的代码分析工具为 Pylint,单元测试工具使用的是PyUnit。
对博主而言,自己熟悉的Python编程语言,且常用的Python IDE就是Pycharm,相关工具Pylint/ PyUnit也会用到,博主的博客专栏《机器学习实战之路》就是基于此开发环境实现。所以本课程要求的相关知识基础方面,还算与博主这块较为匹配的。
不过不同于自己博客专栏《机器学习实战之路》的论述,机器学习专栏更多的是定位在开发技术人员的分享学习,对于广大的程序员开发同胞来说,Python和Pycharm等这些概念是无需多言的。不过《软件工程》本课程的定位在于全面系统的介绍软件工程,相当于一门专业导论课,所以博文在此也简要介绍一下Python和Pycharm等概念:
Python:由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。由于Python的众多优势, Python早已广泛应用于人工智能、机器学习、深度学习、大数据、网站Web开发、搜索引擎、云计算、科学计算等领域。
PyCharm:是来自JetBrains公司的全功能python开发环境。在涉及人工智能和机器学习时,它被认为是最好的 Python IDE。最重要的是,Pycharm 合并了多个库(如 Matplotlib 和 NumPy),帮助开发者探索更多可用选项。PyCharm支持很多的第三方web开发框架,比如Django、 Pyramid、web2py、google app engine 和 Flask,这些也使得它成为了一个完整的快速应用集成开发环境。这也是本课程《软件工程》使用PyCharm做为Python IDE的原因之一。
Pylint:是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码。
PyUnit(unittest): 是 Python 自带的单元测试框架,用于编写和运行可重复的测试。PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用于进行白盒测试和回归测试。通过 PyUnit 可以让测试具有持久性,测试与开发同步进行,测试代码与开发代码一同发布。

1.4 课程参考教材

虽然本课程中没有给出对应学习的教材,且主讲老师也在回复学生的评论中说没有对应教材,不过自己买了本Ian Sommerville的《软件工程》作为主要参考书,基本上对应与覆盖视频课程的知识点。
在这里插入图片描述

除此之外,还有结合《SWEBOK(Software Engineering Body of Knowledge)指南》一起学习。2014年2月20日,IEEE计算机协会发布了软件工程知识体系 SWEBOK(Software Engineering Body of Knowledge)指南第3版。SWEBOK指南的目的是为软件工程学科的边界提供一致确认的特征,为支持该学科的主体知识提供指导。SWEBOK 指南把软件工程学科的主体知识分为10个知识领域,各种重要概念之间的区别在每个知识领域描述中阐述,便于读者迅速查找所感兴趣的主题。SWEBOK 的宗旨是在众多知识中圈定“属于”软件工程学科领域的知识,规定软件工程教育和培训方面的要求和制订出评价原则,并且在世界范围内求得公认。它还试图为从事软件实践的工程师和负责制定有关职业指导原则的政策的官员提供指南。

2. 组织过程资产输入

2.1 编程的学习与实践

前面也已简要叙述了,博主在研究生时期主要用Fortran做数值计算方面的算法研究,工作上会用到Python做一些数值计算软件二次开发及自动化的应用。还有自己在机器学习方面的学习及实战,都是可以作为此次学习的基础编程知识输入的。
在这里插入图片描述

2.2 PMP项目管理经验

在软件工程中,软件项目管理也是十分重要的。关于项目管理方面的专业知识储备,博主在上一篇《项目管理学习——PMP 5A高分通过备考经验分享》已经进行过分享论述,PMP认证在IT行业广泛受到认可,博主当时备考PMP的那一批小伙伴中,大部分就是来自IT互联网相关的行业,所以PMP项目管理的知识在软件项目管理中是同样适用的。关于PMP项目管理相关备考知识的展开,有兴趣的可以查看博主的备考博文。

3. 软件工程

软件工程学科的定义有很多种,表述各有不同,但其蕴含的内容是基本相同的。在此引用其中的一种来进行介绍,《计算机科学技术百科全书》对该学科的定义是:应用计算机科学、数学、工程科学及管理科学等原理开发软件的工程。开发一个软件产品是构建一套符合逻辑的指令,通过发送信号来控制某个机器与其它机器、人与自然界的互动。软件项目较之普通的工程项目,其复杂程度高出很多倍。
软件开发的主要活动大致可以分为:软件需求,软件设计,软件构造,软件测试,软件维护,还有整个开发过程中的软件开发管理。
在这里插入图片描述

3.1 软件生命周期模型

软件生命周期是人们在研究软件生产时所发现的一种规律性的事实,软件生产有一个生产、使用和消亡的过程,称之为软件的生命周期,软件的生命周期从软件的功能确定、设计、开发完成、投入使用、并在使用中不断的修改、增补和完善,直至被新的需要所替代而停止该软件的使用为止的全过程。总体上分析,软件生命周期将包括分析、设计、实现和维护等一系列过程。而对于生命周期的不同划分方法就会形成不同的软件生命周期模型。
瀑布模型
在传统软件开发中,瀑布模型是最常用及最典型的软件生命周期模型。瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落,这也是瀑布开发名称的由来。从本质来讲,它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的, 从系统需求分析开始直到产品发布和维护。其主要特点是:与一般系统工程一致,易于使用,不要求特别的技术与工具也能较好地进行软件开发;其缺点是:难于很好地表达和描述用户的需求。
敏捷开发——Scrum
敏捷开发是近些年兴起的一种软件开发与管理的思想, 以其灵活性, 易操作性得到软件行业的广泛关注。 敏捷开发方法是一组开发方法的统称,主要包括极限编程、Scrum、 精益开发和动态系统开发方法(DS-DM)、特征驱动开发(FDD)等 。它的基本原则有迭代式开发、增量交付、互动式开发、持续集成等。
Scrum 是目前应用最广泛和最受人欢迎的敏捷思想,它将软件开发团队比作橄榄球队,全队有明确的最高目标:发布产品的重要性高于一切。团队高度自治,队员们熟悉开发过程中涉及到的各种技术,紧密合作,确保每个迭代都朝着最高目标推进。而且每隔2至6周,每个人都能看到能实际工作的软件,并且据此决定是发布这个版本还是继续开发以加强它的功能。对于功能需求可能经常发生变化的项目来说,Scrum是它们最为理想的选择之一。

在这里插入图片描述

Scrum团队:由一位产品负责人(Product Owner)、开发团队(Development Team)和Scrum Master三部分共同组成。Scrum团队是自组织和跨职能的。Scrum团队模型旨在优化灵活性、创造性及生产力。

产品负责人:负责从开发团队工作产品中最大化产品价值,且必须是一个人。
开发团队:由专业人员组成,负责每个冲刺结束时,交付潜在可发布的“已完成”的产品增量。
Scrum Master:负责推进和支持Scrum定义的工作事务,帮助团队中每个成员理解Scrum理论,实践,规则和价值观。

Scrum事件:Scrum中使用规定的事件来创建规则,并最小化对Scrum 中未定义的会议需求。Scrum 中定义了四个事件:冲刺计划、每日站立会、冲刺评审、冲刺回顾。
Scrum 工件:代表着团队工作或者价值,赋予审视和适应两大支柱一个透明的机会。工件包括产品任务列表 (Product Backlog)、冲刺任务列表 (Sprint Backlog)、产品增量 (Increment)。
冲刺(Sprint):是 Scrum 的核心,也是 Scrum 团队工作的一个工作时间盒,每次冲刺都应保持在 1 周到一个月之间。冲刺必须是连续的,一个接一个的,从而保证一个稳定的、固定的项目节奏。每次冲刺都以开发计划为起点,以评审已完成的工作和额外的评审团队协作的方式为终点。每次冲刺都由整个Scrum 团队共同完成整个产品或项目的一个或多个增量。每个完成的增量必须是潜在可释放的,也就是每一个增量必须是在冲刺结束后经过充分测试和充分认可的。以下为Scrum 团队单次冲刺过程示意:
在这里插入图片描述

下面我们进一步对软件开发的主要活动稍加论述,当然教材及很多材料对这些知识有详细的论述,我这里就简单汇总整理一下各阶段的知识点。

3.2 软件需求

通常来看,软件需求更多的被定义为“业务知识+问题列表+其他因素”。其中业务知识包括业务事件、业务实体和业务规则;问题列表就是用户在工作中遇到的困难和障碍,这也是软件开发需要解决的问题;其他因素包括了一些设计约束和非功能方面需求。从软件工程的角度看,决定软件项目成败与否最主要的因素是需求,需求开发和管理工作做得好,软件开发成功的几率就大。
在这里插入图片描述

3.3 软件设计

软件设计是从软件需求规格说明书出发,根据需求分析阶段确定的功能设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及编写具体的代码,形成软件的具体设计方案。从工程管理的角度,可以将软件设计分为概要设计和详细设计阶段。
在这里插入图片描述

3.4 软件构造

软件构造得到软件的源代码和可执行代码,使软件产品的设想变为现实,软件构造是软件工程体系中的重要一环。为了实现高质量的软件产品,不仅需要有编码工作,还必须遵守软件构造的各种原则,具有良好的软件设计,遵守一定的编码原则以及规范的编码过程,具有软件测试的过程等,以上这些都是软件构造需要关注的。
在这里插入图片描述

3.5 软件测试

在开发人员设计完成所有模块之后,测试人员应当对设计完成的软件展开全面测试。展开软件测试的关键目的,便是及时将存在的各种问题和bug 等找出来。然而需要注意的是,在将软件中 bug 找出来之后,测试人员不能对其展开直接修改,需要在其经过审核后,由开发人员对 bug 进行修改,待所有 bug 完成修改后,才可以使软件正常工作。在正式测试工作开始前,应当确保测试人员对相关功能、业务加以全面学习、掌握,随后才能确保其能够明确软件中的不足与缺陷。

在这里插入图片描述

3.6 软件维护

测试完成之后便进入了维护阶段。如今大部分科技产品均拥有各自维修站,这主要是由于在各类软件、产品的具体运用过程中,许多产品常常出现各不相同的故障、问题,而工作人员亟需将各类问题反馈上去,及时维修这些问题。这就需要工作人员在对软件进行使用的时候,及时记录各类问题,从而便于后续的修改以及维修工作,使相应工作人员能够在第一时间找到问题的原因。
在这里插入图片描述

3.7 软件开发管理

在进行软件开发时,不但要注重技术的应用,还应该加强人员和开发过程的管理力度,引入先进的管理体系,提高软件开发管理水平。软件开发中引入软件工程项目管理理念,改变传统的以个人为中心的管理模式,更注重团队协作。在现阶段的软件开发阶段,采用管理学的理念进行过程管理,合理的把控开发进度,同时确保软件的开发能够达到预期效果,此外,通过项目管理手段也能够实现软件领域的长远发展,避免软件开发风险造成的严重后果。关于项目管理相关知识的论述,可以参考博主前面写的博文《项目管理&项目经理进阶——PMP 5A高分通过备考经验分享》。
相比于普通的工程项目,软件工程的配置管理更为复杂,在此稍加展开论述。软件配置管理(Software configuration management,SCM)是指通过执行版本控制、变更控制的规程,以及使用合适的配置管理软件,来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护。简单而言就是管理软件的变化,它应用于整个软件工程过程,通常由相应的工具、过程和方法学组成。
配置管理的目标是记录软件产品的演化过程,确保软件开发者在软件生命周期中各个阶段都能得到精确的产品配置。配置管理过程是对处于不断演化、完善过程中的软件产品的管理过程。其最终目标是实现软件产品的完整性、一致性、可控性,使产品极大程度地与用户需求相吻合。它通过控制、记录、追踪对软件地修改和每个修改生成的软件组成部件来实现对软件产品的管理功能。

在这里插入图片描述

4.参考学习的书目教材

  1. 清华大学《软件工程》视频课程
  2. 《软件工程》Ian Sommerville 著 彭鑫 译
  3. 《SWEBOK指南 第3版》
  4. 《系统集成项目管理工程师教程 第2版》 谭志彬 主编
  5. 《项目管理知识体系指南(PMBOK指南)》

=文档信息=
本学习笔记由博主整理编辑,仅供非商用学习交流使用
由于水平有限,错误和纰漏之处在所难免,欢迎大家交流指正
如本文涉及侵权,请随时留言博主,必妥善处置
版权声明:非商用自由转载-保持署名-注明出处
署名(BY) :zhudj
文章出处:https://zhudj.blog.csdn.net/

  • 0
    点赞
  • 18
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页
评论

打赏作者

zhudj08

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值