学号:SA16225018
姓名:曾龙飞
一、什么是软件工程与高级软件工程课程设置
1.1软件工程
首先,我先谈谈我对软件工程的理解。软件工程在我的脑海里就是如何利用工程化管理的技术来做软件。为什么会诞生软件工程呢?孟老师不止一次的提到,随着代码量的增大,人对代码的掌控能力越来越弱,代码的逻辑、进度和成本越来越不好控制,产生了软件危机!为了解决软件危机,软件工程应运而生。
1.2课程设置
以上就是高级软件工程这门课产生的背景。高级软件工程课程,授课老师孟宁老师。课堂主要以孟老师主讲,学生分享的形式进行教学。课下分为线上作业与线下开发两部分。线上使用C语言开发软件,线下使用go语言开发软件。go语言是google开源的5大官方语言之一,一经开放在几年内从TIOBE排行50开外到现在的稳定在前50,孟宁老师线下作业选择go语言进行开发,且看孟老师眼光是否精准。不论go语言是否在未来用的到,这种语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改的特性,在线下开发中可是深深地体会了一把,go语言还融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。
二、通过对软件工程的学习,自己对一开始关于软件工程课程的疑惑的认识:
现在孟宁老师的软件工程课程已经结课了,从一开始的对软件课程的一无所知到现在的对软件开发流程的整体认识都有了质的认识,一开始对软件开发的各种困惑,通过一个学期的学习,原来的各种疑惑也都解决了。软件的开发并不只是单纯地敲代码,还要经过一整套严格的开发流程,有对软件的整体设计,需求分析,编码规范,开发,测试以及后续的相关维护等有了认识和了解。
首先,谈谈自身学习。以前每天都只是知道写自己的代码、写注释,不注意代码书写的规范性,缺少对团队合作和交流,在现在软件工程的课程中,一味的遵循个人意愿很难开发出一个好的软件,俗话说:百密必有一疏。这时候,必须要去寻求科学的方法,协调自己的合作伙伴,通过众力量来完成对一个可行性软件的设计、开发和维护等工作。在线下开发中,发现以前项目开发的很多流程和做法都不符合规范,比如代码规范、团队模式、开发方式等。因此在以后项目开发时事先对项目要有一个详细的规划,需求分析,UI设计,看图写代码等。不能只是简单地开发代码,而不去注重软件开发过程记录,多去按照标准的软件开发模式去书写每一个软件开发过程的文档。
三、课上内容
3.1版本控制
在课上,孟老师主要讲解的方向是版本控制,如果说什么是软件开发项目一定要使用的基础工具,那么版本控制系统应该算最重要的部分。不管是个人开发或是团队协作开发,都可以通过版本控制系统获得巨大的好处。
没有版本控制系统的话,代码可能被别人或自己不小心覆盖或遗失、也不知道是谁因为什么原因改了这段代码、也没办法可以复原回前几天的修改。有了版本控制系统,开发人员只要将每次程式码的变更都纪录(Commit)起来,并且透过版本控制系统中进行更新。
有了版本控制系统,我们可以浏览所有开发的历史纪录,掌握团队的开发进度,而且作任何修改都不再害怕,因为你可以轻易的复原回之前正常的版本。我们也可以透过分支和标签的功能来进行软件发行的不同版本,例如稳定版本、维护版本和开发中版本。
很多项目需求方还没有明白开发的定义,这里必须要跟大家说一点老生常谈的段子:“开发永远是个过程,而不是结果。”所以开发者一定要使用版本控制系统,Git或Mercurial是免费开源的版本系统系统、随处可用的网络、便宜的云端服务器,甚至有现成的第三方服务Github。
3.2版本控制收获
通过课上的学习,成功在线下一级自己团队开发的振东贴(贴吧)项目中使用了版本控制,体会了其中的好处,git本地仓库,从git-hut远程push,pull分支,checkout分支,git st检查版本变动,到add与am提交commit。
git真的很神奇,切换分支后在本地文件系统中自动显示当前的分支,其实他是基于各个版本之间差异以存储差分的形式控制各个版本的。远程项目的git-hub,merge分支,与校验,已经出错时的版本回溯。在并行软件开发的过程中起到了十分重要的作用。版本的发布借用了部分svn版本控制的功能,在课上经同学分享习得,也十分好用。
在下面分享一本书《Pro git》详细的讲述了有关版本控制的知识,相信会对大家以后的项目开发有举得的帮助。
这里还有我在网上摘抄的有关版本控制具体分支建立规则的黑科技知识:
四、线上与线下开发
4.1软件工程线上/下开发
线上采用c语言完成实验线上有孟宁老师在网易云课堂的在显视频讲解,内容明了清晰(云课堂链接:孟宁老师网易云课堂链接)每次在实验楼linux系统平台上完成实验(链接:实验楼,实验楼不定期还会推送出精彩的试验课程,比如SSM框架spring+springmvc+mybatis还有Python爬虫课程,我都有在上面实验,收获良多),线下使用go语言完成开发。项目与实验主要是为了让广大同学熟悉一下软件开发的要点:
第一、需要遵守代码规范,好处是便于修改和维护。让别人看的清楚你的代码;
第二、数据和业务逻辑的分离。我们需要将代码进行模块化,从而更好地维护和复用代码;
第三、懂得合理地设计接口,既不能面面俱到,也不能太过笼统,够用就好。比如说:链表的接口设计和菜单的接口设计就有所不同。链表需要增删查改的接口,而菜单的接口就无需如此太过细节化;
第三、掌握代码的运用技巧,比如说回调函数的使用;
第四、非功能性需求,比如说安全性。这里尤其需要谈到的是线程安全,如何利用加锁的机制构建出写出安全的代码;
第五、设计思想,这里需要应用一些前人总结的设计模式,比如说工场模式、观察者模式、适配器模式等。应用这些模式能大大增加代码的延展性,更好地包容变化,更好地复用代码。当然,为了拓展视野,孟老师也提到函数式、形式化方法的编程;
以下是我的线上试验的目录与连接:
实验六:函数的可重入性(reentrant)及线程安全浅析(非实验,为线上测验)
4.2课业内容与得分
(注:第六次试验内容为在线测试,没有试验报告,每次试验后会进行学生互评,没有完成互评的学生当次试验成绩折半,最后一次试验过了互评截止日期惨遭折半)
4.3开发心得
线上实验与线下作业分别有7次,循序渐进的完成了工程菜单模块的设计,从实现功能性需求到实现非功能性需求,再到解耦模块之间的功能,规范接口,使用回调函数,使用makefile编译。一路下来真的学到了很多,尤其是关于回调函数,以前一直不知道使用它的意义,到现在,为了分离所有函数功能,与业务逻辑。在函数功能中定义回调函数,在业务逻辑中的函数参数中传入回调函数接口,完成数据存储与业务或者说计算的分离。感觉自己真的进步了。
五、收获与遗憾
学习软件工程我最大的收获,就是理解了软件工程,初步设计软件,明白软件开发的流程。特别是,由于孟老师有着丰富的软件开发经验,所以比只讲软件工程理论要来的有趣、更好理解得多!最大的遗憾是,我希望线上课程能让我和同学共同协作,通过规定接口来完成一个比较大型软件项目,因为我感觉软件工程离不开沟通协作。这方面可能会延长教学周期,但是真心希望可以有这方面的课程。
最后,深深感谢孟宁老师给我带来了如此生动、有趣而又丰富的软件工程课程。
作者:曾龙飞
《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006
转载请声明出处以及上信息,谢谢!