程欣+原创作品转载请注明出处+《软件工程(C编码实践篇)》MOOC课程作业
两个多月的软件工程课程就这么结束了,有些满足有些惆怅。满足是因为在课程中的确学到许多,收获许多;惆怅是因为学到的东西还不够多,还不够深入。这门课程给我最大的感觉,正如本文题目:千里之行,始于足下。“软件工程”四个字在我的理解中,既是一门学科,也是软件行业在从无到有、从崛起到兴盛的过程中无数人经验和智慧的总结。无论哪个领域,后人能取得更高的成就都仰赖于前人奠基,看得更远只因站在了巨人的肩膀上。
对国家社会乃至人类发展来说,计算机科学出现时间不长,却已经成为了现代社会的基石之一,而软件工程作从科学走向工程的标志性学科,已经成为了每个从业人员所必须掌握的技能。软件工程的能力直接影响着生产效率,或许这门学科并不能开拓人类知识的荒野,却能让人类已经踏足的领域更加繁荣昌盛。对个人来说,软件工程师的道路漫长曲折,但良好的开端无疑是成功的一半,一开始就能以恰当的方式朝着正确的方向前进,总能帮助新人在这条道路上走得更踏实长远。这也正是我上完这门课程的感受,这是一门见识之课,这是一门能力之课,这是一门思维之课,这是一门奠基之课。
课程有七个实验,精髓也正是在每个实验的实践当中。
实验一:写一个hello world小程序
实验一虽然简单,但主要在于熟悉shiyanlou.com提供的Linux环境以及命令行操作,同时还有以下收获:
在编辑代码的过程中学习并熟悉了vim的使用。据说vim是写代码神器,刚刚开始学习还没体会,以后继续使用的过程中再感受一下。参考资料:vim快速入门,vim进阶简明手册
在提交代码的过程之学习并熟悉了git的使用。版本控制工具的使用是一个coder最基本的技能吧,没什么好说的,入门也没什么难度,何况还有全球最大同性交友社区。不过在国内环境,老师推荐coding.net,速度更好一些吧。参考资料:如何使用实验楼的“我的代码库”功能?,git实战教程
在撰写实验报告的过程中学习并熟悉了Markdown格式。用起来嘛……前所未有的丝滑感受……这文档写起来颇为心旷神怡,排版虽然还是有些limitation而且本身有weakness不过总的来说不错,反正比直男审美好多了还省事儿,这才是该作为coder日常使用的东西咳咳。本报告内所使用的格式参看报告附录。参考资料:实验楼里使用Markdown的地方,Markdown语法说明(详解版),Markdown 语法说明 (简体中文版) ,知乎Markdown专题
实验二:命令行菜单小程序V1.0
实验二主要是关于代码规范的学习和实践,而代码规范可以分成两个部分,代码风格规范和代码实践规范。关于代码规范,内容比较杂而细,在整个课程的实践中以及其他的代码实践中慢慢去遵守,如今已经从可以遵循变为开始渐渐内化为习惯。
实验三:内部模块化的命令行菜单小程序V2.0
1. 模块化的思想
- Seperation of concern
- 初级程序员的第一个瓶颈:2000行代码复杂度
程序的复杂程度超过了一般人大脑所能应对的程度
所以需要模块化
模块化的背后就是Seperation of concern - 包容变化是模块化的主要作用
通过模块化把变化的部分放在一起 - 软件=程序+软件工程,程序=算法+数据结构
- 用函数指针调用一个函数
- 面向对象中的多态机制。同一段代码在运行时会表现出不同的形态,不同的运行效果。
2. 基本的模块化写法
- 开闭原则:对扩展是开放的,对修改是封闭的
- 模块复用和系统复用。代码的模块可以复用,或者整个软件可以复用。
- 抽象层级:业务逻辑层和数据存储层。业务逻辑是菜单逻辑,数据层是数据结构和数据操作。同时考虑功能性需求和非功能性需求
- 将系统模块放在不同的源文件中,以便于对程序进行修改和维护
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5
实验四主要关于模块化的思想和内容,经过了这次实验逐渐明白以前把所有东西都写成一大坨是多么丑陋难读而又混乱。同时还学到了一些今本的思想和原则:
- 避免重复造轮子
一些可重用的通用模块可以直接使用,不需要再写一遍(拿来主义)。 - 防止重复include
- 用表达式作为判断条件,不要用布尔变量做比较
- 参数化上下文
- 撰写开发者指南,如范例程序
- 本地化外部接口(Localize input and output)
- DVT(Developer Verify Test)开发者验证测试
- 单元测试和测试驱动开发TDD
- 定义接口,包括软件单元对外提供的服务,以及系统其他部分怎样访问这些服务
- 接口的五个要素:Purpose,Preconditions(Assumptions) ,Protocols,Postconditions(Visible Effects) ,Quality Attributes。
- 函数名、参数和返回值是接口的三个显性的要素
- 前置条件和质量属性是接口的两个隐性的要素
- 如何把接口设计得更通用(参数化上下文信息,移除前置条件,简化后置条件)
- 不要太具体,也不要太一般(通用)
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
实验五中学习到了CALLBACK的概念和简单用法,并在学习过程中又看了一下函数指针。CALLBACK的基本概念也不难理解,用一下就大概明白了。
对接口设计有了更多感觉。接口设计要考虑到用户可能的需求,以及接口设计应遵循的规范,要做到既合理又够用又好用,需要仔细考虑,并带入实际情景分析,比如参数的数量、内容应该怎样选取等等。
知道了原来接口信息还需要必要的隐藏,这个是以后从事开发工作需要注意的地方了。这次试验之前还没明白老师说的“防人之心不可无”到底是指什么,现在开始明白了。
实验六:函数的可重入性(reentrant)及线程安全
实验六没有具体的代码要求,以理解为主,主要是关于函数的可重入性以及线程安全的内容,在多线程程序中这一部分内容应该十分重要,也算比较靠底层的一些思想,需要对进程调度等内容有理解,真正掌握还需要靠今后的实践。
实验七:将menu设计为可重用的子系统
通过这次的实验,实现了对Menu设计为一个可重用的子系统。并且使得menu可以执行带参数的指令。并且增加了自己对makefile这种自动化编译工具的认识。
在学习《软件工程(C编码实践篇)》课程中最大的收获?
工欲善其事必先利其器,每次实验之前都需要查阅许多资料,学习很多新知识,十分耗费时间,而且依然可能会有所遗漏,但总归脑子开始清楚了。浑浑噩噩跟着步骤走大抵学不到很多东西,头脑清醒思路清晰,知道自己每一步目的、途径、限制、参考,才能从更高的角度指导自己做事,心理学上的概念就是元认知(Metacognition)。
实验楼这个学习平台使用体验很好,功能具足,指示清晰,使用方便,比如报告中截图这样的细节功能都考虑得很完善,对学习和效率提高很有帮助。
学习完《软件工程(C编码实践篇)》课程后您最大的遗憾是什么?
时间和精力所限,很多内容算是雨过地皮湿,还缺乏深入理解掌握,比如git,vim,makefile等工具的使用很粗浅,线程安全的内容缺乏实践等等,当然,事无巨细地掌握所有内容可能也不够现实,毕竟这门课是奠基之课,方向已经有了,功力的积累和熟练度地提升却是个长年累月地过程。