良心让狗吃了的高级软件工程课程总结

来源:互联网 发布:淘宝公主裙 编辑:程序博客网 时间:2024/05/16 23:02

{修改版前言}

这篇总结最早发表是在6月底,时至8月课程出了成绩才敢修改。因为:
第一,这是上课要求的作业,不得不实名。
第二,文中极尽谄媚之词也是为了分数为之,我自己也恶心无极。思量再三,觉得还是留下不删为好,一来提供证据,二来警示自己。
最后,请各位后来者看到引以为戒,不要选孟某人任何课程。

{前言}

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. ( From Refactoring - Improving the Design of Existing Code )

任何一个傻瓜都能写出计算机可以理解的代码,惟有写出人类容易理解的代码,才是优秀的程序。(出自《重构-改善既有代码的设计》)

{课程总结}

“规范”。遵守代码规范的主要目的并不是为了能编译出执行效率更高的可执行程序,而是方便他人阅读。因为软件工程既然是工程,就需要多人的分工协作,一个程序员写的代码不仅仅是给自己看的,还需要给合作者看,所以代码要遵守一些约定俗成的规则,例如缩进要有层次,大括号独占一行等等。各大公司甚至出台了自己的编程规范,例如Google就先后出台过C++、Java、Python等多种语言的规范。

“分解”,即把一个复杂的大问题分解为若干简单的、容易解决的小问题,然后去解决这些小问题;而如何定义这些“小问题”,又涉及到抽象层级的确定,最典型的例子如TCP/IP的分层协议模型。

软件工程中的模块是指整个系统中一些相对对独立的程序单元,每个程序单元完成和实现一个相对独立的软件功能。通俗点就是一些独立的程序段。关于模块的设计,需要遵循“KISS”,即Keep it simple and stupid.

模块通过接口与其他模块进行交互。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。而内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

“通用”,编写代码不仅仅是解决“一个”问题,而是要去解决“一类”问题。为了实现这一点,实验五中采用了利用callback函数参数使Linktable的查询接口更加通用。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

{课程实验}

1.写一个Hello world小程序-[实验连接]

摘要
在Linux环境下编写入门程序hello.c。通过这个小程序来熟悉Linux环境下开发C语言代码的方式方法,同时学习Linux的相关指令。

对于习惯在IDE下编写程序的我来说,这次实验无疑是一场清奇的体验:一来熟悉了Linux环境,二来感受了备受赞誉的vi编码。

本次实验的目的就是适应新的开发环境,就吾人来看,似是达成了。

2.命令行菜单小程序V1.0-[实验连接]

摘要
本次实验学习了命令行小程序menu的编写思路,即:通过不断地输入来与目标字符串进行匹配,匹配成功后即调用相应的方法。但本次实验只是用到了简单的if-else来判断,没有任何可移植性。

同时,进一步加深了对代码规范的理解,即遵守简明、易读、无二义性的代码风格,注意书写代码时候的缩进、命名、注释等代码编排的风格规范。当遇到团队开发的项目时,优秀的代码规范可以提升整个团队的开发效率,还可以增强这个项目的健壮性。

3.内部模块化的命令行菜单小程序V2.0-[实验连接]

摘要
在实验二的基础上,这次实现将数据结构进行抽象,以链表的形式对菜单项进行存储,使得这种结构可以在任何程序中使用。

本次实验也使我初步掌握了模块化的思想:即业务逻辑和数据结构的分割管理。这个思想可以为今后的程序设计提供指导,以完成更多可以复用的模块。

4.用可重用的链表模块来实现命令行小程序V2.5-[实验连接]

摘要
本次实验较实验3更进一步,设计一个可重用的链表模块Linktable来实现命令行菜单小程序,链表模块的接口设计要足够通用,可以使其他模块执行某个命令时调用一个特定的函数作为执行动作。更进一步将业务逻辑和数据结构进行了分离。

5.用callback增强链表模块来实现命令行小程序V2.8-[实验连接]

摘要
实验五是在实验四的基础上进一步进行改进,在这一部分,是为了学习callback函数,它是一种实现模块通用性的实现机制,能够实现模块解耦功能,利用callback函数参数使Linktable的查询接口更加通用,同时我们也必须要注意接口的信息隐藏。

6.函数的可重入性(reentrant)及线程安全

摘要
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

可重入的函数不一定是线程安全的,可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的)读写锁可以有效解决这里的线程安全问题。

7.将menu设计为可重用的子系统-[实验连接]

摘要
本次试验在上次实验基础上进行的了更为通用的接口设计。首先将menu子系统也设计成为一个可以调用的模块,增加了初始化和配置的方法;引入能够支持带参数的复杂命令。为工程编写Makefile ,好处是能够使用一行命令来完成“自动化编译”,极大提高了效率。

{课程感言}

武功高强之人往往能“举重若轻”,使重兵刃犹似无物,但“举轻若重”,却又是更进一步的功夫。虽然“若重”,却非“真重”,须得有重兵器之威猛,却具轻兵器之灵巧。

这句话出自《天龙八部》,是萧峰赞叹段延庆武功境界时的旁白。

程序员的成长也是如此,一开始做一些简单课程实践的磕绊,到最后成立小组做项目的游刃有余。经过不断的积累和提升,再大的项目也可以按部就班地用软件工程的方法完成,可谓趋于举重若轻的境界了。

当成长到这个时期,再回头去完成程序中的函数方法的编写,自然胸中有丘壑,能“从心所欲不越距”,此时完成的代码质量高且性能出色,其实已是将软件工程的方法内化到其中了,诚可谓已臻举轻若重的化境了。

似我之辈可以仗着自己完成几个课程项目而大言不惭自称“举重若轻”,但是每每开始新的项目不过是以前工作的机械重复,代码质量堪忧,模块之间纠缠不清,维护难度大。但经过半个学期的锤炼,初窥孟老师“举轻若重”的内功门径,虽然只捕捉到一丝一忽的工程化思想影子,却也似有醍醐灌顶一般的顿悟了。就如一个看似简单的menu小程序,末学最多能写成一个v1.0版本的样子已是知足,但从未想过以后的复用。而看着孟老师一步一步将业务逻辑与数据结构进行分离,从特殊到一般的演绎,每进一步都令人大呼过瘾。

选修这样独具匠心的课尚属首次,这种别开生面的授课方式也给我带来了以往所收获不到的惊喜。摒除了其他课程一言堂式的教学方式,每个同学可以自由而全面的发展,并能够感受不同思想的碰撞,颇有一种百家争鸣的盛世场面。大家各自繁荣,还能各取所长。

如果说有些遗憾的话,就是课程时间实在太短,很多软件工程的内容都未及涉足,例如面向对象的分析、设计模式等,这些都没有详细讲解。所以我也非常期待软件工程的后两部分,OO分析与设计篇和过程与管理篇能早日付梓。

然而分别终究是要来到了。但是课程的结束并不意味着工程的止步,软件工程的魅力和一个多月的成果,将推动我们朝着更高的要求前进。希望在以后的工作中,我们能够怀揣着这门课程带来的理念和精神,在今后的学习生活中乘万里风,破万里浪!

原创粉丝点击