软工实践总结
软工实践总结
一、个人成长。
1、学习和使用的新软件
1)、墨刀
这款在线的手机原型设计工具,是同学推荐的,它最大的特色是能够设计出真实性很强的原型来,还可以把设计好的原型下载到手机里运行,我们后来的开发工作,大部分是以我们原型为主的,它使得我们的开发变得很有条理,每个人对项目的总体有个比较明确的认识,这为我们项目的成功奠定了扎实的基础。
当然,最大的遗憾,是我们竟然错过了用原型与用户进行沟通的机会。。
2)、Rational Rose
这是一款用来设计用例图,类图之类的软件,功能很强大,不过我就在实践课的课堂上学习了一下用例图和类图,之后由于这块内容是组长在负责的,所以没有怎么深入学习。不过我觉得类图这块功能特别的好用,你只要输入类之间的关系,它就能帮你生成相对应的代码,感觉这样特别的方便。有机会要进一步学习它。
3)、Genymotion
一款跑的超快的手机虚拟机,快的时候不到一分钟就能启动,而且支持多开,我们演示的时候就是同时开了四台虚拟机来演示的。用起来超爽。
不过这款虚拟机的兼容性比较差,并且也不怎么支持中文,用了两天时间才在上面安装了搜狗输入法和wps.中文文件不支持直接拖取,不过可以在virtualbox里面设置共享文件夹。
4)、赛风
为了登githubFQ用的,不用安装,直接点开就能用,不过不太稳定就是了。
5)、花生壳
我们没有去买服务器,而是直接用笔记本来当服务器的,那么怎么才能让外网访问我们的服务器呢?研究了好久,在同学的推荐下花了8块钱买了个花生壳的域名,用来映射我们的内外ip。便宜好用,不过偶尔会断,刷新下就好,没有什么大问题。
吐槽:由于不熟悉购买流程,不小心买了一个好奇怪的域名。。
2、学习和使用的新工具
1)、Github
github是我们小组用来管理我们项目的主要工具,我觉得它最强大的功能是能够将每个人负责的那部分代码整合到同一个项目中去。如果没有没有使用这个工具,几个人负责的地方不同的话,还可以通过手工拷贝的方式将项目整合在一起,虽然比较苦逼比较土,但是,如果有多个人同时修改同一个文件的话,那么必须吧这些地方一个个找出来,然后一行一行比较,一行一行筛选比较。这样的工作量是难以想象的,而且很可能会遗留下很多问题。而github则帮你把这些事情都做好了,你只有pull,他会把多个人修改的同一个文件出现冲突的地方一个个列出来,你只要在这些地方解决下冲突就可以了。
虽然我们只用到了很小的一部分功能,例如:
git add .
git commit -m "..."
git push origin code
git pull
但是,仅仅这几个功能就给我们带来了极大的方便,虽然一开始大家都嫌麻烦,不想用,但是后来随着对github的了解加深,我们也慢慢体会到他的好处,甚至感觉这是项目管理必不可少的一个工具。
当然,在使用github的期间,也不是一帆风顺的,我们也遇到了很多麻烦,例如,在项目进行大规模整合的时候,其他同学是不能够继续开发的,因为这样在合并的时候会出现很多很多的冲突。还有就是,我们项目git的时候好像用出现一些代码丢失的现象,最后也搞不清是git的问题还是被其他组员误删了,主要的原因还是我们对git的掌握比较浅,所以导致中间出现了一些没有办法解释的现象。
深刻意识到github还有很多功能需要深入学习,以后一定要找时间好好学习一下。
最后,小小吐槽一下,登录github,还是需要一定人品的,我们有一次就是因为无法git上去导致我们小组停工了一天(当时正好遇到项目的大规模整合。。)
2)、markdown
我主要是用来博客园排版用的,一开始觉得这东西并没有什么软用,打个表格就会很麻烦的样子。不过既然老师要求的,就硬着头皮去学了,起初,每次要写博客的时候,旁边都要备一份markdown的语法说明书,后来慢慢的也就记住了,因为毕竟用来用去也就那几句语法。之后对比了一下以前用的编辑器,感觉markdown的好处在于写出来的博客格式会清晰很多,而之前的编辑器排版则会比较乱。markdown写的文档,可移植性也是很强的!
总之,虽然相比其他编辑器,makdown学起来会比较麻烦,不是“用户友好型”,但是还是比较好上手的,而且排版也是比较整齐的。
顺便提一下,Miu这款软件支持本地编辑markdown,而且可以实时查看编辑效果,界面风格不错,就是我每次保存老是会变成网页的格式。。
3)、单元测试
我用到的单元测试主要是junit,用来测试我们服务器的DAO包里面的类。因为如果每次测试服务器都要跑客户端,就太困难了,而直接写一个main函数的话又会比较麻烦,这时候就该单元测试上场了,只要创一个测试类,在上面写测试代码就然后跑一下测试类就能做测试了,方便简洁,而且还可以复用,并且不会影响代码的正常运行,测试必备!
3、学习和掌握的新语言、新平台
1)、新语言:java
这学期由于android和服务器都是用java来敲的,就去学了下java,感觉有了c++和c的基础,上手java还是挺快的,不过由于项目实践没有什么经验,所以对面向对象的思想还不是很了解,一些代码冗余的比较厉害。
当然,我只是掌握了最基础的一些java知识,我觉得比较重要的是对面向对象的思想的学习。
2)、新平台:J2EE,android studio
J2EE:
我们是用mysql+Tomcat+servlet的方式来搭建服务器的,使用的平台是J2EE,一开始完全不知道服务器是什么鬼,后来看别人有用java来搭服务器,我们也就跟着去学了,这里大部分是靠度娘挺过来的,一开始是队长帮忙搭的tomcat环境,然自己去学了一下jdbc的连接,数据库一连接上,就看到希望了,参考了网上的一些代码,服务器这边也就慢慢上手了,没有用什么框架,所以安全性,鲁棒性什么的会差些,不过看着和队长一起写的服务器跑起来了,还是很有满足感的。
如果以后出去搞服务器的开发,估计我们要学的东西,要考虑的问题还有很多吧,但现在至少有了初步的的认识了。
android studio
功能很强大,就是太占内存,为了开发android应用,专门去升级了一下硬盘。android studio支持git的操作,很智能化。
4、学习和掌握的新方法;
1)、调试
学会了一些基本的调试策略:
a、蛮干法:在程序中大量打出日志信息,追踪错误原因的线索
b、回溯法:从发现症状的地方开始,向后追踪源代码,直到发现错误的原因。
c、原因排除法:先列出所有可能错误的原因,再执行测试逐个排除。
其实这些方法平时都有在用的,只是并没有去归纳总结,用的时候也是顺其自然,想到什么用什么,知道这些是基本调试策略之后,以后调试的时候思路会更清晰,会更有意识的去使用这些方法。
2)、一些面向对象的方法
继承:
在写了服务器的两三个dao之后,发现这些类都有些公操作,于是果断些了个Mydao的基类,让所有的dao来继承它,省了不少事,而且代码的冗余度也降下来了.
接口:
在写HttpUtil类的时候,由于是多线程,所以写了一个回调类来执行服务器响应之后的代码,这里回调函数就使用了接口的形式,通过每次重写onfinish,onerror方法来实现回调类的实例化。
封装:
我们封装了大量的工具类,如ExcelUtil,HttpUtil等,并且我们尽量把这些类的方法写成静态的,这样无需实例化就可以调用这些工具的方法,很方便,而且每次要用的时候调用它就行了,不用每次都自己写。
当然,我们也遇到了很多问题,比如说我们写dao的时候基本是每张数据表要配一个增删改查的,但其实这些方法除了处理的对象不同,其他并没有什么太大差别,于是我们便想能不能通过类模板,继承等手段解决这个问题,但是最终发现代码量始终是没办法减小了,只是最后你放在哪里写的问题。因为在最后用sql语句与数据库交互的时候,那段代码你是没办法省的。。
3)、框架
一开始并不知道这是什么东西,一支把它理解成了架构,我在写
文件选择器的时候到github上找了很多项目,然后根据说明书以及度娘,成功把它的项目作为附加的部分加到了我们的项目里面,并且成功的使用了它的文件选择器,不过它里面很多东西(比如fastjson)什么的是没用的,后来发现其实导入jar包更省事,并且在github上找到了各种框架(如think android之类的,不过考虑到我们项目已经做的差不多了,再上框架怕大家会不适应,会带来各种潜在的问题,于是就没用了,只是在后期写ExcelUtil时导入了jxl.jar的包,以及用于服务器客户端格式化数据传递的gson.jar包。
总之,使用别人写好的东西还是相当爽的,但知其然也要知其所以然,这样能够更好的使用它,并且学习它里面的思想对我们的进步也是很有帮助的。
4)、架构
我们一开始其实也不知道这是什么鬼,不过我们遇到的第一个问题就是:我们要从哪里写开始呢?于是我们拿出原型,按着上面的界面,把所有需要的activity类都写了出来,又创了一个包“Tb"来放静态数据模型,以及工具包Util。于是我们就有了属于我们自己的一个比较简单粗糙的架构:数据层+逻辑层+显示层(其实显示层和逻辑层的分界线不是很明显)。
比较严重的问题是:我们的架构分的不太清晰,大家写代码的时候比较容易写到同一个地方,然后就比较容易冲突。
二、人月神话--项目中的经验总结
1、增加公共类遇到的灭顶之灾
我在写到后期的时候发现tb包里面没有存放教师报课表信息的类,于是就添加了一个,同时另一个队友也遇到了同样的问题,也写了一个同样功能的类。在发现这个问题之后,我觉得只不过是数据冗余的问题,应该是没什么影响的,这时候要改多麻烦呀,还不如什么都不做。
但是,后来我们综合测试的时候就遇到大麻烦了!,因为服务器上的tb类是我直接拷贝上去的,是以我写的为准的,并不支持另一个同学写的那种方法!于是在用json格式进行传递的时候数据对不上了,也许你会说这不是调整下构造函数就可以解决了吗,但我们是在做综合测试呀!我们单是预测可能出错的地方就好几处啦!还要考虑到服务器是否有问题,简直大海捞针!发现错误的地方就花费了我们大量的时间精力。。
当初欠下的债,最后总是要还的,而且还高额利息有木有!
所以,发现问题,及早修改,不要抱侥幸的心态,一个小小的bug,随着软件的不断庞大,修复它所需要的代价也在不断被放大。
2、不要抱着今天做完明天丢手的心态
在我们项目快要完成的时候,我们就有了这样的想法,想早点结束它,然后去做其他的事情,但是第一天晚上,我们修复一个bug就到一点多了,为了赶完,我们有加班到3点多,无奈之下,只能再缓一天了,然后,这样的日子我们一直过到了验收的那天!!!。。
最后我们得出的结论是:这种想法本身有毒,,软工这种东西,是急不得的。
3、锲而不舍的精神很重要
我在写服务器的数据库连接的时候,导入的jdbc.jar包一直出问题,虽然跑本地的连接没问题,但是服务器一上架,就会报找不到jdbc的错误,然后我就吧jdbc放到各种路径下面,但是都没有成功!请教别人也没有解决这个问题,这种状态延续了好几天,项目进度也缓下来了,相当的郁闷与绝望,各种总姿势的度娘,各种姿势的失败。但是,终于在第三天让我度到了!竟然是要把jdbc包放到java的配置文件目录下面!!!
坚持下去,总有一扇门为你而开。
4、边学边用的能力必不可少
其实我们一开始都是没有什么基础的,所以一直想着老师会教,结果发现,现实并不是这样的,不但没教,而且还要我们直接开始做了!我们当时的内心其实是崩溃的,只能自己边学边用了。不过现在回想起来,如果不是这样的话,我们估计项目做不完的。
当然,这样的方式学的虽然快,但是掌握的东西都是比较基础的,所以如果想要有更大的突破,还是需要系统的去学习这些知识点,其实这学期学到的许多东西,也只不过是入门而已。
5、编码规范要遵守
一开始的时候我们还是相当谨慎的,严格按照编码规范来写的,但是写到后面就开始随意了,我一个人的命名规则就有好几种,想到什么写什么。后面的悲剧也是理所当然了,我发现自己写的比较乱,就在服务器那边稍微统一了一下命名规则,结果成功给队友挖了一个坑。。
三、对下一届实践的期许
1、github要从娃娃抓起
大一刚进来的时候什么都不懂,不要让小鲜肉觉得大学这么水,大学就是拿来完的,大学学不到什么东西的,稍微给点强度,也许能改变不少人的。而且学点有用的东西,到后面的成长会更快一些。
2、不要因为没接触过就觉得自己学不会
其实大部分知识难度大的地方只占20%,而80%是比较基础的,万事开头难,不要被纸老虎吓到,入门之后你会觉得其实也就这么回事。
3、培养自学能力
学校能教给你的只是一些比较普遍,基础,理论化的知识,项目之类的实践性比较强的东西,还是要靠自学的,当然如果能理论联系实践,那最好不过。
四、对未来的期许
1、能够对现在掌握的一些知识进行更系统化的学习,提高自己的技术水平。
2、下学期如果有机会的话去抱团组队做项目,在实践中成长,为自己提高就业竞争力。
3、追求完美,追求艺术,虽然现实并不完美,但是追求还是要有的,这样才能不断鞭策自己做到更好
五、总结
软工实践终于结束了,心中的那块大石头也落下了,再也不用熬夜了,可以早点休息,好好复习了...
回想软工实践,收获还是与付出成正比的,虽然跌跌撞撞,但最终还是基本完成了我们的项目,看着我们团队的作品在验收的时候跑起来,还是相当激动的(虽然也夹杂着提心吊胆的紧张。。)。我们四个人,在不断的协作与冲突中朝着共同的目标前进,虽然大家嘴上说着我们放弃吧,但是心里谁也不甘心,最终坚持到了最后,看到了曙光,我们收获的不仅是个人的成长,也是丰厚的友谊(话说,我们本来就挺好的。。)。