一、请回望第一次作业,你对于高级软件工程课程的想象
1.对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么?
- 通过一个学期对软件工程的学习和实践,我的代码编写能力,Bug定位能力,环境搭建能力,软件测试能力,书面表达能力,团队组织能力等都得到了锻炼和提高。此外还有很重要的一点是让我在课堂上和实践中更加深刻地感受到了软件工程这个专业的博大精深以及实践的精髓所在。这些都是我在开篇时所期待的,如今反观并思考,这些方面确实达到了我的期待和目标。
- 在代码编写方面,由于本科并非科班出身,我所经历的编程训练过少,因此该方面能力较弱。很感谢这次软件工程实训和平时的设计模式作业,给了我很好的锻炼机会。在遇到困难时,有同学的帮助,有老师的指点,大家不仅帮助我解决问题还慷慨地分享了曾经相似的经历以及总结出的经验,让我不仅排除了难题而且学到了更多的技巧和知识。面向对象设计原则规范了我的编程过程,设计模式让我学到了诸多精妙的设计思路,软件工程实践训练让我将这些所学应用到实实在在的开发工作中,一方面加深了对面向对象设计原则和设计模式的认识和理解,另一方面提高了我的代码质量并且提升了代码的逻辑合理性。
- 在Bug定位方面,我的能力也得到了很大的提高。一方面归功于实践量的增多,累积经验也越来越丰富,很多常见的bug(有些出于环境问题,有些出于代码编写疏忽)都能够很快地找到并修复。另一方面借着开发实践的机会,我在博客园上搜了不少关于bug查找地帖子,学习技术达人的bug定位技巧,并且运用在开发过程中,争取尽快地掌握其中技巧和精华。
- 之前一直觉得搭建开发环境就是装软件,看看安装教程就能搞定。而随着使用工具的增多,慢慢意识到这其实是一门很深的学问,能否顺利安装好一款开发软件,有时候是对开发者的能力和知识基础的考量。这次软件工程实践应用的主要开发工具是MyEclipse和MySQL,前者的搭建很顺利,而在搭建后者时遇到了较多的问题比如:MySQL安装完毕后无法正常启动,查看日志发现缺少data目录,解压文件夹中缺少my-default.ini配置文件,以及在window7操作系统下打开tomcat的可执行文件时提示Unable to open等。好在有队友的帮助和自己的钻研精神,最终通过不断尝试解决了这一难题。虽然问题解决了,但是该过程也反映了搭建环境能力不足,这与知识积淀和开发经验直接相关,说明在往后的学习过程中要注意完善和提高。
- 软件测试方面,软件测试的目的是为了发现软件设计和实现过程中疏忽所造成的错误,本次实践的软件测试是我做的第一个软件测试。起初的测试仅仅是人工随机测试,这种测试方式不仅测试进度慢,而且测试效果也不好,然后我们才意识到应该系统地了解一下软件测试方面的方法、工具和专业流程。软件测试中有测试策略,有系统测试,还有调试技巧,其中系统测试又包括:恢复测试、安全测试、压力测试、性能测试和部署测试。我们最终选用的测试工具是robotframework,这是一款python编写的功能自动化测试框架,具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。robotframework工具帮助我们发掘出许多bug,我们在此基础上修缮系统,测试效率明显提高,系统性能大大提高。
- 不足之处:项目中还有好几个创新点没有能够实现,以及部分可优化的地方没有来得及在提交项目之前完成改善工作。出现这个情况的原因一方面是开发效率不够高,尤其是在前期阶段,由于开发经验不足走了很多冤枉路;另一方面,因为团队是刚刚组建的,大家之间的默契程度不够高,在开发过程中慢慢磨合后,才有了越来越好的配合效果。所以,在今后的工作学习中应当注重动手实践,多多经历以积累经验,并且在正式开发前预估可能遇到的问题,合理且弹性地安排时间。
2.总结这门课程的实践总结和带来的提升,包括以下内容:
(1)统计一下,你在这门高级软件工程实践中,完成了多少行的代码
代码量来自两个方面,一是软件工程实训,二是平时的设计模式作业,其中前者是主体部分,累计约1.2万行。
(2)高级软工实践的各次作业分别花了多少时间?(做一个列表)
作业 | 花费时间 | 作业 | 花费时间 |
---|---|---|---|
软件工程第一次作业-准备 | 6h | 项目Alpha冲刺Day8 | 9h |
软件工程第一次作业 | 2h | 项目Alpha冲刺Day9 | 13h |
软件工程第二次作业 | 3h | 项目Alpha冲刺Day10 | 11h |
设计模式第一次作业 | 5h | 项目Alpha冲刺Day11 | 13h |
设计模式第二次作业 | 7h | 项目Alpha冲刺Day12 | 9h |
设计模式第三次作业 | 9h | 项目Alpha冲刺测试随笔 | 3h |
团队展示 | 3h | 项目Alpha冲刺总结随笔 | 5h |
选题报告 | 4h | 项目Alpha冲刺集合随笔 | 0.5h |
选题报告ppt | 8h | 项目Alpha冲刺事后诸葛亮 | 3h |
选题报告评审表 | 1h | 项目Beta冲刺预备 | 3h |
选题博客随笔 | 1.5h | Beta冲刺第一天 | 12h |
需求分析博客随笔 | 5h | Beta冲刺第二天 | 10h |
需求分析PPT和评审表 | 8h | Beta冲刺第三天 | 9h |
需求分析报告 | 8h | Beta冲刺第四天 | 12h |
项目Alpha冲刺Day1 | 10h | Beta冲刺第五天 | 13h |
项目Alpha冲刺Day2 | 12h | Beta冲刺第六天 | 10h |
项目Alpha冲刺Day3 | 11h | Beta冲刺第七天 | 11h |
项目Alpha冲刺Day4 | 11h | Beta冲刺总结 | 5h |
项目Alpha冲刺Day5 | 12h | 用户调查报告 | 6h |
项目Alpha冲刺Day6 | 9h | Beta冲刺集合 | 0.5h |
项目Alpha冲刺Day7 | 12h | 项目验收PPT | 12h |
个人实践总结 | 10h |
(3)哪一次作业让你印象最深刻?为什么?
让我印象最深刻的是alpha冲刺的中期阶段。由于在alpha前期遇到了很多没有预见的问题,多花费了很多时间在解决这些问题上,导致接下来的后几天(也就是alpha冲刺的中期阶段)一度处于赶进度的状态,由于院楼大门晚上10点半关闭,所以那段日子(将近一个礼拜)大家都是翻窗户离开院楼的,回到宿舍一般是0点多。为了不影响整体的进程,故有一些天的当天任务没有完成,回到宿舍后要继续加班。那段时间确实是很艰难的一段时光,能睡够六个小时已经是很奢侈、很享受的事了。现在可以带着微笑回想这段时光,给这段岁月贴的标签也从艰难换成了奋斗。之所以能够如此,是因为坚持,是因为自己的不抛弃不放弃和大家的互相鼓励。也好在那个阶段的奋斗,很快地赶上了进度,给alpha的后期减轻了不少工作负担,也增强了我们每个人的信心,让我们更加相信这个团队的潜力,相信这份潜力在敏捷开发思想的指导下能够爆发出很大的能量。
(4)累计花了多少个小时在高级软工实践上?平均每周花多少个小时?
软件工程实践方面所花时间约230小时,冲刺持续3周,平均每周约77小时。
(5)学习和使用的新软件
- 开发软件:MyEclipse 2014
- 数据库软件:Mysql
- MyEclipse企业级工作平台是对EclipseIDE的扩展,利用它可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。MyEclipse 是一个十分优秀的用于开发Java, J2EE的Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持性能好。MyEclipse可以支持Java Servlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC数据库链接工具等多项功能。
- MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
(6)学习和使用的新工具
学会使用RobotFrameWork测试工具对系统进行测试。Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发。
(7)学习和掌握的新语言、新平台
对Java语言的掌握更加到位,同时也学到了html、css、js、jQuery的基础语法,能够实现一些普通的功能。学习了github平台的使用方法,在组内实现协同开发,提高了开发效率。GitHub是开源代码库以及版本控制系统,作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
(8)学习和掌握的新方法
- 掌握了多种设计模式的使用方法,主要是策略模式、适配器模式、工厂方法模式、模板模式等。
- 学习了mybatis框架的使用方法。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
(9)其他方面的提升
主要是让我更加清楚地意识到如何成为一名合格的开发者。通过这次实践,在和其他组员的合作中我更加深刻地感受到一名合格的开发者应该具有个人责任感,这对整个团队而言至关重要,每个人应当尽力实现对同伴、队伍的承诺。一名合格的开发者应该具有奉献意识。要乐于与组员分享经验和心得,帮助他们解决困难,提高整体的水平和效率。一名合格的开发者应当具有敏锐的意识,能够注意到项目的进展趋势和瓶颈所在,根据环境的变化和组员的工作情况灵活地调整自己的行为。一名合格的开发者应当能够承受一定的压力,需求的增加、环境的苛刻、同伴的失误、截止日期的迫近都是项目开发中常有的压力来源,在这种压力环境下一名合格的开发者应当尽可能合理、妥善地处理好这些情况。最后,一名合格的开发者应当有良好的洞察能力,留心细节,这有利于在关键时刻做出准确判断和重要决策。
二、写下属于自己的人月神话——个人或结对或团队项目实践中的经验总结+实例/例证结合的分析
- 软件需求分析的一个重要部分是问题分解,在确定软件范围的活动中,不必想着把问题拆分完全,只要分解部分主要方面即可,如必须交付的功能和内容(消息)及使用的过程。面对复杂的问题,我们常用的策略是分而治之,即把一个复杂的问题划分为若干个更容易处理的小问题。在对问题进行预估之前,应尽可能对软件范围中所描述的软件功能进行评估和细化,以提供更多的细节。因为成本和进度估算都是立足于功能,所以对功能进行某种程度的分解是十分必要的。
- 软件具有不确定性和互操作性,这些特性会给开发带来很多问题。为了有效地处理这些问题,必须建立切实可行的方法来协调小组成员之间的关系。为了满足这一要求,必须建立团队成员之间的沟通机制。沟通交流可以分为正式的交流和非正式的交流。正式的交流包括报告、会议等,非正式交流包括日常的讨论和协商。前者需要制度规范,严格按照一定标准执行,后者则相对灵活,根据个人或团队习惯采取合适的方式进行,可以提高效率为目标进行方式选择。
- 团队负责人是团队中的关键角色。优秀的负责人应当鼓励每一位成员,给每个人合适的平台供其发挥其最大价值和才华,并且促进组内交流,激励大家互相学习,取人之长补己之短,提高团队整体实力。负责人还需要有敏锐的洞察力,能够时时感知到项目的瓶颈所在以便于及时调整开发任务的分配。优秀的负责人必须有能力理解语言和非语言信号,并对发出这些信号的人要求做出反应,应当在高压环境下保持良好的控制能力和应变能力。
- 软件工程实践给予我们理论联系实际的锻炼机会。从理解问题(沟通和分析)、策划解决方案(建模和软件设计)到实施计划(代码生成)及检查结果的正确性(测试和质量保证),这个完整地过程提高了我们每个人的综合能力,包括信息检索能力,代码编写能力,文案撰写能力,知识梳理能力和沟通交流能力等。敏捷开发使我们深刻认识到团队的力量远远大于简单的累加求和。我们不应该低估自己的潜力,只是大多数时候我们缺少的是咬紧牙关的坚持和背水一战的决心。这次软件工程的实践虽然已临近尾声,但这段经历带给我们的锻炼和启示会伴随我们往后的学习,我们会将软件工程实践的精髓和敏捷开发的经验融入生活和工作,创造更多的价值。
三、对下一届实践的建议,或者对于开学初的你,对于大一的你,对于开学初的我,你有什么想建议和告知的呢?
通过这个学期学习软件工程的体验,我想给后来者以下几点建议:
- 珍惜难得的锻炼机会。软件工程这门课中的项目实践环节从项目开题、用户需求分析,到制定计划,编程实现以及项目测试、用户反馈等。这是一个完整的项目开发过程,也许有很多其他专业课也包括实践环节,但很少有像软件工程实践这般、具有完整的实践过程。而且之前很多时间都花在了课堂上,学了不少的理论知识,软件工程实践正是理论联系实际的平台,不仅能巩固知识,更重要的是让实践者知晓如何将知识转化为实际的价值。故建议大家好好珍惜难得的锻炼机会。
- 不要畏惧困难、逃避困难。项目开发的各个阶段会遇到各种不同类型的问题。比如搭环境阶段可能会遇到配置文件出错的情况,实施计划的时候可能遇到了意料之外的问题而拖慢进度,编程时遇到bug找了很久却没能成功定位,项目测试时不会使用专业的测试软件以及在组内讨论意见不一时激烈的辩论……林林总总,都是正常的,是软件开发的必经之路。如果被困难吓退,那么这段时光很有可能会成为开发的阴影;反之,解决困难、战胜困难,不仅在日后回想起时能够有成就感,而且大大增强了对自己能力的信心。
- 有耐心。常言好事多磨,即使有认真完成项目的态度,在真正执行时还是会有很多心浮气躁的时间段存在。其主要原因可归结为两点:一是开发过程中并不一帆风顺,毕竟目前大家的项目经历十分有限;二是除了软件工程实践外,大家还有科研、课程、考试等其他事情需要兼顾,若不巧事情集中在同一时间段,则难免会心生浮躁。故请大家保持耐心,这是做好软工实践以及其他事情的重要保障。
- 保持良好的心态。虚心地向老师同学们请教,这比孤军奋战效率高得多。保持积极向上的态度,少一些抱怨和烦躁,会发现其实情况没有那么糟糕,问题也都是可以解决的。热心帮助他人,这不仅有利于提高整体的效率 、加强自身对知识、技巧的掌握,而且能够提升自身的价值。经历过这些之后,会发现自己真的收获了很多,编程能力、查错能力、测试能力、写作能力、表达能力等各方面能力都会有明显的提高。
借此机会我还想分享一篇文章。这篇文章是老师在布置第一次作业时推荐的。文章的标签是:热情、能力、选择。我想表达的是有了热情和兴趣,无论是工作还是学习都会快乐很多。
兴趣和热情只能让你很执着,但并不一定能让你走好这条路,只有你的能力和你的强项才能让你走好这条路。
你的路你的人生要你自己决定,不要轻易的让人帮你决定,那怕是你的家人。
-- 引用自《对程序员职业的一些建议》
四、分析一下自己所处的团队。软件工程实践是大学里少有的认真的团队协作经验。《构建之法》上说团队的发展有几个阶段,你的团队都经历过么,最后到达了“创造”阶段了么?(参考《构建执法》第17章 人、绩效和职业道德)
- 团队发展分为四个阶段:萌芽阶段、磨合阶段、规范阶段、创造阶段。
- 我认为我们团队经历了前三个阶段,目前处于规范阶段,还没有到达最后的创造阶段。从建队到现在不超过四个月,能顺利度过磨合阶段进入规范阶段要归功于团队里每个成员的责任心和团队意识。目前我们团队仅仅做过软件工程实践一个项目,训练量尚不足以支撑这个团队进阶至创造阶段。
- 记得在建队不久刚开展项目时,摆在面前的第一个问题就是选题,看似简单的定题过程在实际开展时涌现出了很多需要考虑的因素,而且也没有好的思路,对团队所能接受的项目工作量和难度也是心中没底,也是因此走了不少弯路。幸亏有了老师的点评和提醒,让我们明白做项目应该做实用的产品,故应从用户需求的角度出发,考察市场需要什么,据此来确定题目。根据这个思路,我们注意到日常工作学习的主要场所实验室其实是一个事务繁多的地方,而不同的事情的处理往往需要借助不同的工具和平台去实现,目前尚无合适的管理系统对实验室的学生和事务进行管理,我们分析之后认为这是一个可以值得立项的需求基础,故拟定方案开展项目。
- 在计划安排之后进入动手实践阶段,层出不穷的问题一度打乱了我们的进度,加上其他方面事情的干扰,团队在那段时间里处于浮躁的状态,而且每天站立式会议上讨论时也时常出现意见不一的情形,激烈地争论之后往往使气氛凝重。好在大家能够理性地分析问题,有责任心和团队意识,尽可能从团队利益角度和用户需求角度出发优选合理的解决方案,最终达成一致。也正是经历过这些考验地洗礼,大家之间越来越有默契,因为每个问题都是认真对待,有了这些的铺垫后续的工作进行得顺利很多。这大概是对我们磨合阶段的概括。
- 虽然大家之间合作得效率越来越高,遇到的困难被也一个个攻克,但是规范化仍是一个问题。比如软件测试和编程规范,这方面在前期都没有加以重视。此外,对于敏捷开发提出的12条原则我们也没有完全遵循。故在度过磨合期之后,我们在站立式会议上着重讨论了规范化的相关问题,强调了规范的重要性,制定了要求及惩处措施以督促每一位成员严格规范自己的工作。在大家的共同努力下,我们团队进入了规范阶段。
五、怎样证明你学会了软件工程?
(1)研发出符合用户需求的软件
(必须公开发布,有实际的用户,一定的用户量和持续使用量 (3 天后能保持10 - 100个用户);而不是: 做没有用户使用的软件)
- 我们在项目开发的收尾时期将相关代码在GitHub平台上开源;
- 在需求报告中提出的所有功能全部实现,并且通过测试,保证质量;
- 项目测试并debug后的第二天我们就将该系统投入到团队实验室试用,涉及用户数量50+。
(2)通过一系列工具,流程,团队合作,能够在预计的时间内发布 “足够好” 的软件
(有项目规划/需求/设计/实现/发布/维护,有定时的进度发布 ; 而不是: 通过临时熬夜,胡乱拼凑,大牛一人代劳,延迟交付等方式糊弄)
从选题报告到用户需求分析,及后续的项目设计、人员分工,alpha冲刺和beta冲刺的编程实现,项目测试,还有最后的用户使用反馈,我们都认真对待,燃尽图从满到零,在计划时间内完成任务。
- 我们有明确的项目规划和人员分工,若有调整会在当天的随笔中记录;
- 我们的需求分析经过调研和分析,根据实际需求撰写需求分析报告作为后续工作的指南;
- 经过两个阶段的开发,我们实现了所有在需求分析中提到的功能;
- 根据用户的使用反馈,我们对系统中的前端界面布局后后台设计进行完善,实现维护;
- 在每个阶段开始前发布预备随笔,在开发阶段的每一天发布当日随笔作为进度记录;
- 团队分工明确,人人各司其职又相互合作、帮助,不存在一人代劳的现象;
- 项目如期交付,没有推迟延期。
(3)并且通过数据展现软件是可以维护和继续发展的。
(而不是:找不到源代码,代码无文档,代码不能编译,没有task/bug 等项目的发展资料)
团队的所有行动都在博客园上有所记录,主要包括以下几个方面。
- 团队介绍:https://www.cnblogs.com/zxhfzu/p/9798374.html
- 实践选题:https://www.cnblogs.com/zxhfzu/p/9900959.html
- 需求分析:https://www.cnblogs.com/zxhfzu/p/9960934.html
- alpha阶段的开发、测试与总结:https://www.cnblogs.com/marboy/p/10035388.html
- 反思(事后诸葛亮):https://www.cnblogs.com/marboy/p/10046298.html
- beta阶段的准备、开发、用户反馈与总结:https://www.cnblogs.com/marboy/p/10092660.html
六、个性发挥,包括图文、照片和创意等
完成项目之后,一篇一篇地点开每次随笔和作业,回首一路走来的付出与收获,重温老师当时分享的文章,感触良多。
加强实践与执行力。不要欠生活,不要欠工作。出来混,总是要还的,你不会的知识,你懒于想通的东西,总是会在一个必要的时候提醒你、惩罚你。将没有搞懂的、希望做到的东西,写在纸上、贴在面前,认真实践,当你做到的越来越多的时候,你就会越来越自信,你的层次会提高的。相信我,人与人之间的差距很大,原因在于自我控制力有差距。
-- 引用自《在失望中寻找希望》