中科大软院《高级软件工程》学习总结

你的男孩P7 2022-07-10 22:31:03

一、课程感想

作为一名本科也是软件工程专业的学生来说,孟宁老师的《高级软件工程》这门课给我带来了和本科老师所教授的《软件工程》截然不同的两种感受。

在本科时候所学习的《软件工程》老师主要还是围绕着传统的软件工程关于 “研究和应用如何以系统性的、规范化的的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来” 的内容进行课展开,教学方式以教师课堂授课为主,学生被动地听课,教学一般重理论而轻实践。

而在研究生阶段孟宁老师引入了一些新的教学内容和教学思路,乃至对软件本身进行哲学上的思考。课程第一篇叫 “工欲善其事,必先利其器” ,不是先讲一堆枯燥的关于软件工程的学术知识和概念,而是先从简单、实用的工具讲起,包括VS Code、Git 以及正则表达式。一开始我是挺惊讶的,作为一门课程却先避开了学术内容走向实践,虽然这些工具有接触过一些,但是一路听老师所讲述的下来最大的感受就是两个词——干货、实用,没有什么花里胡哨和繁琐的废话,上来全是真正实用能打的内容。

其中关于git的内容受益匪浅,以前搜索关于git的内容很多都是长篇大论,会夹杂着很多你并不需要的内容。在这门课上对四种git常见的场景包括本地仓库、远程代码库、团队项目中的分叉合并和最后的git reabase,把日常我们使用会遇到的基本情况全部罗列并讲解。

讲完了工具后,开始站在代码编程的角度上介绍工程化编程的基本方法,涵盖了代码风格规范、模块化、可复用、可重入和线程安全等,在一步步完善代码的同时将软件工程的思想融入其中,实践的同时强调理论知识的重要性,做到了理实交融。后续的话从需求分析和建模开始,探讨了一些软件工程中的基本建模方法,接着深入了软件的本质和软件的结构,以软件科学化的视角梳理了软件的基本构成元素、基本结构、设计模式、软件架构、质量属性,以及描述软件的不同视图等;最后讲述了软件危机,将软件的生命周期作为讨论的重点,并与业界主流的PSP、TSP、CMM/CMMI、敏捷开发、DevOps等软件过程和生命周期管理衔接起来,中间还涉及到了软件与哲学内容的探讨,整体属于是相当精彩并饱含思想的一门课了,就像老师书所述那般:兼有理论深度和实践厚度,内容丰富、由浅入深、层次鲜明。

二、课程总结

下面是我关于本课程部分内容的归纳整理

Git

  • 基本操作逻辑

  • 场景⼀:本地仓库

    命令

  • git init 初始化⼀个本地版本库
  • git status 查看本地版本库的状态
  • git add file 将⽂件添加到暂存区
  • git commit -m "adsad" 把暂存区的⽂件提交到仓库
  • git log 查看 当前HEAD 之前的提交记录
  • git reset --HEAD 回退
  • git reflog 查看当前HEAD之后的提交记录,回到未来

    用法

  • 要通过git add和git commit -m提交版本
  • 过去和未来之间的分界点就是HEAD,即当前⼯作区所依赖的版本。

 

  • 场景⼆:远程代码库

    命令

  • git clone
  • git fetch 下载⼀个远程存储库数据对象等信息到本地存储库 (⼀个完整的仓库)
  • git push
  • git merge
  • git pull 从其他存储库或分⽀抓取并合并到当前存储库的当前分⽀

    用法

  • 对代码修改之前都⾸先进⾏代码同步操作,防⽌产⽣分叉和冲突。
  • 实际操作中难免会产⽣⽆法同步的情况,这时候需要在本地解决冲突
  • 先我们通过git pull拉取远程仓库⾥的提交项到本地仓库并合并到当前分⽀,即将origin/master中 的提交项fetch到本地仓库并merge到本地master分⽀。

 

  • 场景三:团队项⽬中的分叉合并

    用法

  • 让⼀段连续的⼯作在commit⽇志的时间线上呈现为⼀段独⽴的分⽀线段,只在关键节点处进⾏分⽀合并

    流程

  • 克隆或同步最新代码到本地存储库
  • 为⾃⼰的⼯作创建⼀个分⽀,该分⽀应该只负责单⼀功能模块或代码模块的版本控制
  • 在该分⽀上完成某单⼀功能模块或代码模块的开发⼯作
  • 最后,将该分⽀合并到主分⽀

    命令

  • git clone 或 git pull
  • git checkout -b mybranch && git branch
  • git add FILES && git commit -m "commit log"
  • git checkout master && git pull && git merge --no-ff mybranch && git push

 

  • 场景四:git Rebase

    在场景三团队项⽬⼯作流程中增加⼀步Git Rebase,即在mybranch分⽀上完成⾃⼰的⼯作之后,为了 让 log 记录将来更容易回顾参考,⽤ git rebase 重新整理⼀下提交记录。

 

软件架构风格与描述方法

 

  • 构建软件架构模型的基本⽅法

    克隆

    重构

  • 分解

    ⾯向功能的分解⽅法 

    特征

    数据

    并发

    事件

    对象

  • 软件架构的描述⽅法

    分解视图:⽤软件模块

    依赖视图:软件模块之间的依赖关系

    泛化视图:软件模块之间的⼀般化或具体化的关系

    执⾏视图:系统运⾏时的时序结构特点

    实现视图:描述软件架构与源⽂件之间的映射关系

    部署视图:执⾏实体和计算机资源建⽴映射关系

    ⼯作任务分配视图:将系统分解成可独⽴完成的⼯作任务

 

软件危机和软件过程

软件危机

根本问题:软件概念结构(conceptual structure)的复杂性,⽆法达成软件概念的完整性和⼀致性,⾃然⽆法从根本上解决软件危机带来的困境。

软件过程模型

  • 软件的⽣命周期

分析:需求分析和定义

设计:软件架构设计和软件详细设计

实现:编码和测试

交付:部署、交付测试和⽤户培训

维护:持续时间最⻓

  • 过程

描述性过程:客观陈述在软件开发过程中实际发⽣什么

说明性过程:主观陈述在软件开发过程中应该会发⽣什么。抽象的

  • 瀑布模型

适⽤于:能够完全透彻理解的需求且⼏乎不会发⽣需求变更的项⽬

瀑布模型中的主要阶段通过⾥程碑(milestones)和交付产出来划分的

  • 原型化的瀑布模型

原型就是根据需要完成的软件的⼀部分,完成哪⼀部分是根据开发原型的⽬标确定,可将⻛险前移

  • V模型

 ⽣死相依原则

    在开始⼀项⼯作之前,先去思考验证该⼯作完成的⽅法

    V模型是开始⼀个特定过程活动和评估该特定过程的过程活动成对出现

分阶段的增量和迭代开发

  • 增量开发

  • 迭代开发

 

  • 螺旋模型

每⼀次迭代过程分为四个主要阶段:

  1. Plan
  2. Determine goals, alternatives and constraints
  3. Evaluate alternatives and risks
  4. Develop and test

  • 个⼈软件过程(PSP)

计划阶段

开发阶段

  1. 设计
  2. 编码
  3. 测试

开发完成后进⾏总结分析

  • 团队软件过程(TSP)
  • CMMI

软件过程评估:⽤于确定⼀个组织当前的软件⼯程过程状态及组织所⾯临的软件过程的优先改善问题

软件能⼒评估:⽤于识别合格的软件承包商或者监控软件承包商开发软件的过程状态

应⽤⽅⾯:

  1. 能⼒评估
  2. 过程改进
  • 敏捷⽅法

全员规划,分块并⾏

⽂档为纲,当⾯交流

迭代开发,分块检查,持续交付

优先开发,讲究实效

  • DevOps

是开发,技术运营,质量保障的交付

 

 

SA21225372

 

参考资料:代码中的软件工程

 

...全文
88 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

软件能⼒评估:⽤于识别合格的软件承包商或者监控软件承包商开发软件的过程状态


那你是怎么做评估的呢? 这个 “知识点” 对你有什么价值呢?

  • 打赏
  • 举报
回复
发帖
代码中的软件工程

395

社区成员

软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
帖子事件
创建了帖子
2022-07-10 22:31