2023春高级软件工程课程总结回顾

2023春高级软件工程课程总结回顾

本学期我学习了孟老师开设的《高级软件工程》课程,经过一个学期的学习、思考与代码实战,我对软件工程有了更为深入的认知。下面,我将尝试按照章节梳理本学期的学习的主要脉络,总结回顾课程的精华。

一、合适的工具使程序员效率百倍

俗话说:“工欲善其事,必先利其器”,课程伊始,孟老师先给我们介绍了几个软件开发过程中好用的工具,从程序员必备的高速、准确的typing到轻量且强大的代码编辑器VSCode,再到分布式版本控制系统Git、Vim文本编辑器和正则表达式,简洁、易用的工具会让我们的注意力更多地集中在业务开发上,从而提高我们的开发效率。

这些工具当中,我系统地了解了VSCode的特性和Git的几大使用场景,并在本学期尝试使用VSCode和Git来开发、管理多个项目。在听课和使用过程中,我几乎是重新认识了这两个功能强大的程序员生产力工具。

VSCode作为一个轻量且强大的代码编辑器,它的本体专注于开发者最常用的功能,但又提供了无比丰富的插件生态系统,在本学期我用VSCode进行过C语言和Python语言项目的开发,在使用过程中我意识到它既可以成为功能完整而强大的IDE、也可以成为一个如记事本一般简单的文本编辑器,这完全取决于使用者的心意。

Git作为一个功能强大的分布式版本控制系统,支持开发者与开发团队快速地进行版本控制、团队开发的工作,同时也通过fork+pull request的方式解决了开源团队松散团队的协作问题。同时,VSCode集成了Git功能,使项目的版本控制事半功倍。

二、从工程化项目理解高质量代码

在第二章节,孟老师依托menu项目,带领我们完成了一个简单的工程化项目,通过阅读、复现高质量代码来理解高质量项目开发的设计方法论,理解了模块化、接口、增量式开发等重要概念。

在代码风格上,我们要追求简明、易读、无二义性。

在代码开发过程中,一个非常重要的思想是模块化,其蕴含了分而治之的思想,而低耦合高内聚正是模块化所追求的目标,即期望各个软件模块之间的依赖程度低、每个软件模块内部各个元素的依赖程度高。

我们希望各个模块之间依赖程度低,但软件的功能又离不开各个模块之间的相互协作,这就需要设计接口,来实现各个模块之间的相互调用。接口是相互联系的双方共同遵守的一种协议,它有五个基本要素:(1)接口的目的;(2)接口使用前要满足的条件,即前置条件;(3)使用接口的双方要遵守的协议规范;(4)接口使用之后的效果,即后置条件;(5)接口所隐含的质量属性,比如响应时间。此外,微服务接口、作为“间谍”进行前夫的callback方式接口,也是非常有趣、有启发性的应用。

此外,我初次接触了可重入函数和线程安全的概念。可重入函数主要用于多任务、多线程的环境下,它是“可以被中断的函数”,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。它之所以是可重入的,是因为它除了自己函数调用堆栈内的数据之外不依赖于其他数据,比如静态数据、全局变量等。线程安全指的是多个线程同时运行,这些线程可能会执行同一段代码,每次运行都会得到相同的结果,其他变量的值也是和预期一样的,说明这是线程安全的。线程安全问题都是由全局变量和静态变量引起的,如果要访问这些共享变量,需要使用互斥锁。

在软件开发过程中,我们追求一种可重用的软件设计,作为消费者我们希望可以重用已有的一些软件模块代码,以加快开发的进度;作为生产者,我们需要写出通用的模块才可能有更多重用的机会。这就要求我们要在模块化、接口、信息隐藏、增量式开发、抽象与通用等重要的设计指导原则下完成更高质量的软件模块。

三、从需求分析到软件设计

软件开发从来不是一个技术团队闭门造车的过程,而是需要用户、投资人、技术团队等多方共同参与、协作下的过程。在第三章节,孟老师带领我们深入学习了需求分析的过程,什么是高质量的需求、如何对需求进行分析和建模,以及如何从需求分析到软件设计。

需求分析有原型化和建模两种方法,我们着重学习了用例建模。用例建模是经过逻辑抽象出来的一个业务过程,它描述了从参与者-待开发软件内部-参与者的信息流特征视角,从整体上把握待开发软件的内外关系。用例分为三个层次:抽象用例、高层用例和扩展用例。我们需要从需求中准确提取用例,这个过程中涉及面向对象分析的基本思想,最终绘制用例图。

面向对象是一种非常重要的编程范式与思想,它几乎贯穿我们学习的始终。面向对象的方法,把相关数据和方法组织为一个整体来看待,从更高的层次进行系统建模,更贴近事物的自然运行模式。在面向对象的分析中,我们要识别哪些是对象、哪些是对象的属性,类之中包含属性和方法,不同类之间又会有继承关系、聚合关系、关联关系这几种不同的关系。

最后我们讨论了需求分析如何指导我们进行软件设计。我们学习了敏捷统一过程,它的核心要义是:用例驱动,以架构为中心,增量且迭代的过程。以面向对象的分析和设计为思想主线的主线,提供了一种从需求分析到软件设计的基本建模方法。

四、软件也是一门科学

这一章节的学习颠覆了我过去认为软件只是一门实验的学科的认知,我惭愧于过去的浅薄,在学习过程中,我深刻认识到到软件的内在特性体现在复杂的概念结构上,软件开发需要科学的“世界观”进行指导,它可以是科学的概念结构和软件设计模式,同时也需要系统的“方法论”让我们将软件落地。

从面向对象的角度进行分析,软件由对象、函数、变量/常量构成,继续深入,软件由指令和操作数构成,再继续深入,软件由无数0和1构成,0和1是软件的基本信息元素。软件的基本结构有顺序结构、分支结构、循环结构,我们要根据需求善用这些结构,使软件更好地工作。函数调用框架是以函数为基本元素,并借助函数堆栈,形成的复杂的结构。此外从面向对象的角度出发,还有继承和对象组合的概念。此外,软件中还有一些特殊的机制,比如回调函数、多台、闭包、异步调用、匿名函数等。

软件的设计模式本质是在面向对象设计原则的实际运用过程中总结出的经验模型,它可以使程序设计更加标准化,代码可用性高、可读性强、可靠性高、灵活性好、可维护性强。在课上提到的设计模式中给我留下深刻印象的是观察者模式,这种模式又称为发布-订阅模式,适用于一对多的依赖情况下,接受者通过订阅接收到发布者发布的信息。

隐藏在设计模式背后的是几条重要的设计原则:开闭原则、Liskov替换原则、依赖倒置原则、单一职责原则、迪米特法则、合成复用原则。这几点中给我留下深刻印象的是合成复用原则,它清晰地指出合成复用才能发挥封装的真正威力,我们应优先选用合成复用而不是继承复用。

常见的软件架构有MVC架构和MVVM架构。MVC(model-view-controller)架构也可以理解为中介者模式范例,model负责封装核心数据和功能,view负责向用户展示信息,controller一般与视图联合使用。在MVC架构中,model和view的耦合度较低。MVVM(model-view-viewmodel)架构将view和model分离开,耦合度相较MVC架构更低,viewmodel的可用性强,且可测试。

五、软件危机和软件过程

这一部分孟老师带领我们梳理了软件危机的出现和科学家对于“没有银弹”问题的讨论。软件危机随着大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发需求和软件的规模都急剧增长。大型软件中打造抽象软件的复杂概念结构的根本困难是缺乏有效的管理,而非技术本身。Brooks提出了人月神话:人月神话:人是程序员,月是时间,如果1人干10个月如果等同10人干1个月,那就是神话。意思是10人干1个月很难达到1人干10个月的效果。之后,Brooks进一步提出了**“没有银弹”:没有解决软件危机的杀手锏(银弹),目前的所有方法都解决不了软件中的根本困难,即软件概念结构的复杂性**,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。而Brad认为有一个银弹:经济利益带来文化上的改变,促使人们去制造软件组件,这些组件将软件内的复杂结构包装起来,使得软件组件简单易用,由这些组件组织起来的大型软件,自然也就简单易用,从而化解软件危机。这两位的出发点不同,Brooks以技术为中心,Brad以人为中心,自然会得到不同的结论。而我们现在回首这段辩论,依然具有相当的启发性。目前诞生的一系列技术确实在一定程度上缓解了软件危机,这些技术本质上都是通过对软件本身的抽象来有效管控软件的复杂性。但在大型复杂软件系统中,这些技术依然力有不逮。

此外,孟老师还介绍了集中软件过程模型,比如瀑布模型、带原型的瀑布模型、V模型、螺旋模型等。随着科学理论和技术发展,软件从复杂单体软件的以架构为中心向微服务架构的分布式软件转变,软件过程从CMM/CMMI向敏捷方法和DevOps转变。

一点个人体会

这门课程留给我最深的印象就是颠覆了我过去认为软件只是一门实验的学科的认知,我惭愧于过去的浅薄,在学习过程中,我深刻认识到到软件的内在特性体现在复杂的概念结构上,软件开发需要科学的“世界观”进行指导,需要科学的概念结构、软件设计模式、面向对象的理念、开闭原则等重要设计原则等进行指导,同时也需要系统的“方法论”让我们将软件落地,比如采用怎样的架构、怎样的软件过程模型进行开发等等。

除此之外,软件工程也为个人提供了作为软件工程师的成长路径,打铁还需自身硬,软件工程是一门重理论、也重实践的学科,我距离一名合格的软件工程师,还有很长的路需要走。

最后,感谢孟老师一学期来的辛勤付出,祝您未来一切顺利!

参考资料:《代码中的软件工程》https://gitee.com/mengning997/se

学号:093

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值