刘艳 原创作品转载请注明出处 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006
对软件工程的理解
我认为,软件工程是对软件项目开发工作的一个规范性指导与管理,目的是帮助我们在有限的成本内完成优秀的软件工程项目开发。
软件的开发工作如同建筑的建设。小型软件开发就好比建造一座小房子,即便是没有学习过建筑的人也可以凭借着自己对于房屋建造的理解盖出来方方正正的模样。而大型软件的开发就好比高楼大厦的建造,需要一个实力强大的团队,从设计、选址到测绘、施工以及最终的交付,均要有着完善的指导方案与严格的技术要求才能完成最终的建设任务。网上流传着一张图片很形象的描述了没有软件工程的指导,软件开发的结果会变成什么样子。
虽然软件工程和土木工程等传统工程项目相比,显得有些抽象,但本质是一样的生产实践工作。所以软件工程是利用工程化的方法,结合软件学科的特点所进行的研究工作。在系统性的对软件生产工作进行研究,掌握软件生产的客观规律,对软件生产建立系统性的认识,从而服务于软件的生产活动。也可以根本上的解决软件危机。这便是我对软件工程学科的理解。
学习软件工程(C编码实践篇)的心得体会
首先是代码规范化的学习。对于程序员来讲,每天的基本任务就是写代码,所以代码规范化也是程序员每天都会面临的问题。统一的代码规范可以帮助程序员们写出优美的代码和简洁的文档,而遵循着规范的代码也可以帮助程序员们事半功倍地读懂和使用。
然后是对软件模块化设计的学习,即高内聚低耦合的设计模式,这是整个课程学习的核心。从最简单的hello world程序,到简单的Shell制作,然后是对Shell的迭代开发。不断完善使其变得更具模块化,可重用性更高。对于软件开发来讲,其开发过程以及产品均具有生命周期。而软件的重用性直接决定了其是非在今后的生产中作为有效资源继续利用。规范化、模块化的软件设计,可以极大程度上降低后期维护和后续其他产品的开发,减少个人的工作量,减少了公司的成本,也促进了行业的进步。
软件设计的主要原则:模块化,接口,信息隐藏,增量开发,抽象,一般化。在实验过程中,老师带领我们从一个简单的程序入手,通过完整的软件开发流程进行开发,一步一步地完善程序。使我们很快可以熟悉程序的开发流程,同时也在实践中为我们讲解了抽象的问题。
实验报告
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
实验六(测验):函数的可重入性(reentrant)及线程安全
总结
软件工程课程的学习是个很奇妙的过程,学习的时候感觉课程是有些抽象的,似乎很难对自己的实际开发工作起到很大的作用。但是学习的过程中很快就能感觉到自己的进步,尤其是写代码的时候会去关注自己写代码的规范以及模块化设计,让自己的代码在看起来会更优美。这的确使得代码在使用的时候更加便利,逻辑上也更加清晰。
这是网易云课堂上的主要收获,而这门课的收货远不止如此。大部分是软件开发者实际工作所需要用到的技能与工具,在软件工程这门课程上均得到了学习。
首先是Git,程序员必备的工具。在刚刚接触云课堂实验楼的时候花了一两个小时去研究git的使用,而后的微信Kingke开发的代码库是放在coding.net上的,在做这些作业的期间学会了Git的使用。
第二是Linux与Vim。实验楼的环境是Ubuntu,做实验的工程中学习了很多Linux以及Vim的命令行操作,而后的微信Kingke开发更是又了解了Meteor.js这个优秀的前端框架以及nginx代理服务器的配置与使用。
第三是产品原型的设计。不想当产品经理的程序员不是好的程序员(我自己编的),而要当产品经理的第一步就是要会做原型、写PPT和文档。以前做毕设的时候做软件开发,虽然知道需要先做原型才能进行开发,但是却完全不知道怎么做。而在软件工程的课程上,老师让我们使用墨刀来做原型。在使用墨刀对微信Kingke的产品原型进行设计以后,对原型的制作工作已经比较熟悉,而且这的确是个很有意思的事情。
第四是技术博客的撰写。之前也时不时的在CSDN也写一些,并没有特别的重视。这次的作业用博客形式提交,深深感觉到老师是在培养我们的码农习惯。这不仅仅是教给我一项技能,而是在教我们如何成为一名程序员。这也是来科大以来我学到的最有用的课程了。
一些小建议
是在平时上课和云课堂上都遇到了的一些个小问题,关于老师讲课方面的一点点感受。就是听课的时候感觉逻辑不是很清晰,很容易就进入迷茫的状态有点不知道在讲什么。
致谢
感谢孟宁老师这两个多月以来在学习上的指导与帮助,也的确是因为这门课让我变得更接近一个真真正正的程序员了。