USTC高级软件工程课程学习心得

USTC高级软件工程课程学习心得

CS逍遥剑仙 - 原创作品转载请注明出处 - 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

1 对软件工程的理解

  个人觉得,软件工程就是用工程化的思想去写代码,使得代码更加高效,这个高效不是指性能好,而是指提高开发效率,降低开发团队的成本。以前的编程的重心往往在算法的复杂度,较少考虑代码结构、通用性、可复用性、可读性等,其实,如果想写出高质量的代码,软件工程思想必不可少。

2 课程学习的收获

  这学期的高级软件课程分为线上和线下,线上课程循循善诱,线下课程围绕《Software Engineering at Google》展开,通过学习Google程序员的软件工程思想并学以致用,而非学习过时的传统教材,是一种大胆的创新。课后实验需要自学Go语言并实现线上功能,对线上课程的学习起到了很好的巩固作用。

  ”我们写的不仅仅是代码!我们实现一个C语言小项目,通过其演化来呈现无设计代码、模块化设计的代码、可复用的代码和回调函数等接口设计,以及可重入函数、线程安全等较深入的设计问题“。通过学习C编码实践篇,使我认识到代码层面的软件工程可以分为4个方面:代码风格、模块化、可重用性、线程安全

  1. 代码风格 这一章详细讲了缩进、命名、注释等代码编排的风格规范,彻底摒弃了以往凭感觉写代码的方式,按照标准规格来写代码,不仅方便他人阅读,也有利于自己养成良好的代码书写习惯。
  2. 模块化 模块化的学习让我认识到如果提高代码的效率,模块之间尽量做到高内聚、低耦合。模块化主要有以下几个规则: KISS(keep it simple & stupid):一个函数或一个方法,只做一件事。扩展开来,在设计上,一个系统、一个子系统、一个模块、一个类等也只做一件事。 设计与实现保持一致:从设计到实现的过程中加入伪代码要好于直接将设计翻译成代码。 不要和陌生人说话原则(Law of Demeter):一个对象应当对其他对象有尽可能少的了解。 合理利用Control Structures、DataStructures来简化代码:采用合适的控制结构和数据结构能大大简化代码。 一定要有错误处理:Debug版本中所有的参数都要验证是否正确;Release版本中从外部(用户或别的模块)传递进来的参数要验证正确性。
  3. 可重用性 不要重复造轮子,注意可重用性可以避免一些无用功,复用已有的代码,在代码可重用性层次上面要非常注重模块化程序接口的设计,尽量多考虑到以后可能会用到的一些接口。 常见接口设计规范有:参数化上下文,生死相依原则,移除前置条件,简化后置条件等,另外还需编写开发者指南,供用户阅读使用。这里要考虑一个接口通用的问题,并不是越通用越好,因为过于通用需要考虑很多情况,导致模块臃肿、效率低下,因此应该not too specific, not too general。
  4. 线程安全 线程安全相当重要,错误的数据只会带来灾难。如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 函数的可重入性与线程安全之间的关系:可重入的函数不一定是线程安全的,同时,可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的),但不可重入的函数一定不是线程安全的。

3 实验报告及目录

序号

实验主题

实验内容

报告链接

实验1

熟悉Linux实验环境

写一个hello world小程序 (了解Linux下的一些基本的操作,实验报告采用markdown进行书写)

https://www.shiyanlou.com/courses/reports/1270860

实验2

代码风格规范

命令行菜单小程序V1.0 (代码风格规范)

https://www.shiyanlou.com/courses/reports/1272145

实验3

基本的模块化设计

内部模块化的命令行菜单小程序V2.0 (KISS、不要和陌生人说话原则等)

https://www.shiyanlou.com/courses/reports/1273305

实验4

可重用模块的接口设计

用可重用的链表模块来实现命令行菜单小程序V2.5

https://www.shiyanlou.com/courses/reports/1275052

实验5

可重用模块的接口设计(callback函数)

用callback增强链表模块来实现命令行菜单小程序V2.8

https://www.shiyanlou.com/courses/reports/1276114

实验6

函数的可重入性(reentrant)及线程安全浅析

线程相关知识学习,函数可重入性、线程安全及两者之间的关系,线程安全问题的处理

线上测试

实验7

子系统的可重用设计

将menu设计为可重用的子系

https://www.shiyanlou.com/courses/reports/1277992

4 总结体会

  软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件的一门科学,代码的设计不仅是为了使程序可运行,可实现需要的功能,在代码的规范、设计的规范、模块化思想、线程的安全性、子系统的可重用性上都有所要求。

  孟老师说:”写代码要小步快跑不断迭代,罗马不是一天建成的“,软件工程是一门实践性很强的学科,大量的实践才能有所感悟,写出高质量的代码,而通过软件工程这门课程的学习,可以使我们避免走很多前人走过的弯路。

  孟老师课程中提到:”夫事未有不生于微而成于著,圣人之虑远,故能谨其微而治之,众人之识近,故必待其著而后救之;治其微则用力寡而功多,救其著则竭力而不能及也“,这句话我感触很深,同样的,学习软件工程也需要我们站在一个更高的高度去看待代码,从细微处提高代码质量。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小程序·云开发专栏

你不知道的Node.js性能优化

仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么?

8.4K5
来自专栏微信公众号:Java团长

如何扎实自己的Java基础?

JDK其实就是Java SE Development Kit的缩写,要玩好这东西可不简单。JDK主要包含了三部分,第一部分就是Java运行时环境,这其实就是JV...

1213
来自专栏跨界架构师

如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码:

1283
来自专栏温安适的blog

3个面试中遇到的问题

6月是个忙碌的月份,结完婚,处理完家事,也换了份工作。以至于6月都没有写blog,今天闲来无事,将之前面试的问题,以及一些感悟分享给大家。

1773
来自专栏大数据和云计算技术

对象存储入门

10.5.3 对象接口 对象存储系统(Object-BasedStorage System)是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS...

7514
来自专栏牛客网

知识总结:java的web开发常用框架

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到...

43413
来自专栏后端技术探索

php7和HHVM的性能之争

根据“TIOBE编程语言排行榜”(榜单虽然统计方式有局限,但是仍然不失为一个比较好的参考),2010年PHP最高曾经在世界编程语言中排名第三。可见,PHP语言在...

3152
来自专栏CSDN技术头条

【问底】徐汉彬:PHP7和HHVM的性能之争

【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。最近,PHP7...

2395
来自专栏喔家ArchiSelf

回顾Bob大叔的简洁架构

Robert Martin 就是我们常说的Bob大叔,是码界的骨灰级人物了,在4年前提出了所谓的简洁架构,值得回顾反思一下,看看是否可以借鉴到微服务中呢?

902
来自专栏Kirito的技术分享

一个DDD指导下的实体类设计案例

终于开通原创功能了,大家以后可以在文章下方留言了,欢迎交流。 1 前言 项目开发中的工具类代码总是随着项目发展逐渐变大,在公司诸多的公用代码中,笔者发现了一个...

3857

扫码关注云+社区

领取腾讯云代金券