一、请回望暑假时的第一次作业,你对于软件工程课程的想象
1)对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么?
在当时,我写下的对待这门课的期待是“与一群队友共同学习共同进步,共同作出软件作品,因为‘合作’是目前我的大学前两年中存在感比较低的词汇”。
可以说,我找到了一群非常靠谱的队友,和他们的合作非常令人愉悦,这是非常独特的体验。自己在alpha冲刺时担任了后端组的组长,也是发挥了一定的领导作用,得到了丰富的合作经验。
在开发上,短时间内熟悉了一个网络后端框架和后端php语言,可以进行项目的开发。不足就是,时间太紧,在开发工具还需要去学习的情况下,不得不做一些妥协,例如对一些较难的实现算法用较为朴素的实现方法替代,或者砍掉一些复杂的功能。
2)总结这门课程的实践总结和给你带来的提升,包括以下内容:
1、统计一下,你在这门软件工程实践中,完成了多少行的代码;
作业 | 代码行数(去掉注释等的估算) |
---|---|
个人项目 | 500 |
结对项目 | 300 |
团队结对 | 200 |
alpha冲刺 | 1400 |
beta冲刺 | 100 |
总计 | 2500 |
个人和结对项目完成wordcount功能,C++共计约800行,以及python爬虫100行。团队编程写了约200行php,alpha冲刺负责了约1400行的后端代码,beta冲刺时分配了许多任务给其他同学,自己负责了较少的部分。
2、软工实践的各次作业分别花了多少时间?(做一个列表)
作业 | 时间花费(min) |
---|---|
第一次作业——准备 | 180 |
第二次作业——个人项目 | 865 |
第三次作业——结对一(原型设计) | 600 |
第四次作业——团队展示 | 60 |
第五次作业——结对二(实现) | 1020 |
第六次作业——团队选题报告 | 280 |
第七次作业——需求分析报告计 | 915 |
alpha冲刺 | 根据冲刺时期每日估算后累计约52个小时 |
alpha事后诸葛亮 | 245 |
团队项目测评博客 | 185 |
beta冲刺 | 根据冲刺时期每日估算后累计约5个小时 |
beta冲刺答辩总结 | 120 |
总计 | 121.5个小时 |
3、哪一次作业让你印象最深刻?为什么?
无疑是alpha冲刺,因为那时与各位队友通力合作,共同从0到1构建项目——分析、设计、编码、测试——这个辛苦的过程是最令人感到难忘的。
4、累计花了多少个小时在软工实践上?平均每周花多少个小时?同时贴出开篇博客“你打算平均每周拿出多少个小时用在这门课上”的回答
累计花了121.5个小时在软工实践上。alpha冲刺时两周花了52个小时占比42%。其余时间平均一周5小时左右。
当时我的回答是:
(你打算平均每周拿出多少个小时用在这门课上)在回答这个问题时我想引用《黑客与画家》里面的一句话:
> 黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。
我个人对此深有体会并赞同,如果我在思考一个问题、一个程序,我可能会集中精力很久都不会觉得累,而且好几天都会持续付出努力,吃饭睡觉时脑子里都在想,原因只是因为我想构造出这个程序,或者是我觉得它很有趣。所以我觉得单纯用时间来衡量可能不是很有意义的。我会把每项任务都做尽可能好,而且软工的作业里经常都有对时间进行记录的例行公事。
我早已经对这种硬核课程的时间花费有了心理准备~~
5、学习和使用的新软件;6、学习和使用的新工具;
- 虚拟机:Virtualbox、Vagrant
- 绘图:ProcessOn
- 文档协作:石墨文档
- 原型设计:Axure RP 8
- 数据库管理:HeidiSQL、mysql-workbench
- 测试:OpenCppCoverage、postman、Visual Studio 2017 单元测试
- 代码管理:git,用到了很多之前一个人用不到的团队协作用法
7、学习和掌握的新语言、新平台;
- 新接触语言:php
- 进一步学习C++与python
- 后端框架:Laravel
- 云服务:腾讯云、putty
8、学习和掌握的新方法;
- NABCD法需求分析
- 单元测试的写法
- C++爬虫、regex正则表达式匹配
- UML类图的制作
- Axure RP 8 原型设计工具
- 软件需求规格说明书的书写
- Laravel后端框架
- 腾讯云服务器部署
- 团队git的使用
- MVC模型、RESTful API、json、HTTP协议
- 一定的数据库调错、后端调错能力、postman使用
9、其他方面的提升。
- 合作能力获得极大的提升
- 懂得如何把控项目进度,懂得了一些软工中的“神话”(也就是误区)怎么去避免
二、写下属于自己的人月神话——个人或结对或团队项目实践中的经验总结+实例/例证结合的分析
这部分我在beta结束后进行了思考,在这里引用《人月神话》中的三句话,也是我根据实践经历非常有体会的三句话:
缺乏合理的进度安排是造成项目滞后的最主要原因……它反映了一种不真实的假设:一切都将运作良好
一定不要觉得“一切都将运作良好”!除非你以前做过类似的事情,如果你是初学某个框架/语言,一定不能懒、不能嫌麻烦,多投入时间。积极去学习,寻找学长学姐询问有关经验,多交流,多动手。
计算机编程基于十分容易掌握的介质,编程人员通过纯粹的思维活动——概念以及灵活的表现形式来开发程序。……我们期待在实现过程中不会遇到困难,因此造成了乐观主义的弥漫……而我们的构思是由缺陷的,开发也总会遇到bug的。
团队在讨论的时候,常常会出现这种情况:“这个功能很简单的啦,建一张表,有XXX字段,到时候查表就行了”、“这里我就构造一个json发送给你你到时候接着就行了”或者“我学一下这个就行了”,这其实是一种乐观主义,我们要避免陷入这种盲目,因为对困难估计不足,容易在遇到困难时手足无措。
人月作为衡量工作的规模是有欺骗性的神话,向进度落后的项目添加人手只会使进度更加拖延
跟书名同名的经典理论。在团队实践中,添加人手所增加的负担在于培训和相互交流成本,任务不能完全分解给参与人员而不增加他们之间的交流成本。可以得知,培训、相互交流、合理地分配任务在软工中扮演极其重要的位置。
培训成本这一点就要求大家寻找有项目经验的队友或者与学习能力较强的人做队友,学习能力较强的人可以引领大家一起前进。
交流在团队中是最重要的,如果大家有什么问题自闭着不说出来,不能互帮互助解决。或者大家在讨论时也不交流想法,碰撞出火花,那么还不如一个人开发更好。队内氛围很重要,如果死气沉沉,或者一神带N腿,都不是良性的团队。
三、对下一届实践的建议,或者对于开学初的你,对于大一的你,对于开学初的我,对于同期的TA们,对于后来的学弟学妹:
1)你有什么想建议、告知和期许想要告诉他们呢?
对于同学:
强烈推荐代码功底好,自学能力较强的人选择本课。即是你是0基础接触前端、后端方向,到做出一个软工项目对你来说不是难事。学习能力强的你会成为队内核心。
以下的情况你可以不选这门课:
- 怕累,想过轻松的大学生活
- 不想熬夜,想多一点自由支配的时间
- 社交恐惧症
- 动手能力不是很强的
- 比较内向,不太会交流,遇到困难时不知道如何解决
但如果你想改变上面的某一项,就可以大胆地选课吧!
好好组队,寻找好队友。
怎么选队友可以参考下我当时的招聘启事:https://www.cnblogs.com/ZCplayground/p/9623856.html
2)特别地,特别地,下一届要不要中途换队员(强制的、彻底的从一队换到另一队)?假设依旧是一个90+人数的大班
柯老师我爱您!!!!!!!!!!!!!
今年没有强制换组!!!!!!!!!!!!!!!
上一年那些老师的说法就是典型就是“我是为了你们好”,把握了话语权,任凭你学生怎么反对都没用。
说白了这就是个教学手段吧,要教给我们什么说实话我们是没有选择的权利的。那对于一个教学手段来说,要以有没有教学效果来作为评估手段。而不是什么“现实生活中都是这样”为理由你们就都得这样强制换组。
现实情况就是,完全没有任何教学效果,对于运作良好的组,换人就是瞎折腾浪费精力和时间,消磨人的积极性。再怎么说,这也只是在学校里的实践课吧,项目组运作良好,强行换人有什么好处?两组做的东西不同、技术栈不同,换来换去是不是要增加重新学习的成本?换过去的同学如果在原来的组表现就不错,换过去如果表现平平,不仅学不到什么东西,而且分数还要受损,公平性呢?
我们这次有换组的情况,情况是那一组项目开展极其不顺利,然后那一组解散,几个同学进入别的组。这种情况我百分百支持。
真的不建议对运作正常的小组进行强行还组!!!!!
3)身在一个格外大的班级,竞争强劲,你认为一个组的人数应当在多少比较合适?
正常情况下我个人是觉得5-6人够了。但今年班上人特别多,所以每个队的人数都达到了8-11人。
以后选课的人越来越多,我校只有3个老师教软工(今年只有两个),所以每个班人会很多。老师和助教的精力有限,队伍的数量不能太多,那么每个队的人数就要增加。其实不好。
对于助教想说:以前能请到工业界人士做助教,也算这门课的福利了。培养往届同学做助教,这个思路没什么问题,但本届助教积极性说实话不高,只在每次分数发布时有存在感,助教变成无情的分数发布机器人,基本无互动。第一次作业,还处在去年暑假假期时,基本上蔡学姐多数都有评论,其余一学期全部作业两位助教基本无大范围评论任何一次的博客作业,说好的“消灭0回复博客呢?”
4)个人/结对/团队作业应该控制在怎样的规模?
现在这样就挺好的
5)这学期下来,你最感谢的人是谁?有什么话想要对TA说呢?
首先一定要感谢邹老师写这么一本有意思的书,构思出这么有意思的一套教学模式,不然软件工程又是一门无聊的理论课。您是伟大的教育者。我相信多年后,同学们可能都忘记了其他无聊的课程,但都能记起这次实践课的细节。
队友我最感谢王源,真的是很靠谱的一个人,和你一起开发很有意思,遇到困难我们可以一起解决,分配给你的任务也能很好的完成,非常让人放心。少有的体验。
四、分析一下自己所处的团队。
软件工程实践是大学里少有的认真的团队协作经验。《构建之法》上说团队的发展有几个阶段,你的团队都经历过么,最后到达了“创造”阶段了么?(参考《构建执法》第17章 人、绩效和职业道德)
《构建之法》上说团队有萌芽/磨合/规范/创造阶段,我们都有经历过:
- 萌芽阶段:大家互相之间不是很熟,每个人技术也不多,还在学习
- 磨合阶段:经历团队编程,大家逐渐成长,可以产出代码
- 规范阶段:到alpha中期,团队就已经较为规范
- 创造阶段:可能有所欠缺,但在beta阶段团队已经井井有条进行增量开发,各司其职,极少被之前遇到的问题难住
五、怎样证明你学会了软件工程?
1)研发出符合用户需求的软件。必须公开发布,有实际的用户,一定的用户量和持续使用量 (3 天后能保持10 - 100个用户);而不是: 做没有用户使用的软件
我们的团队项目“即食”APP没有发布到应用商店平台上,但是已经向部分同学开放使用。根据后台数据库显示,目前的用户已经超过了一百人。
2)通过一系列工具,流程,团队合作,能够在预计的时间内发布 “足够好” 的软件。有项目规划/需求/设计/实现/发布/维护,有定时的进度发布 ; 而不是: 通过临时熬夜,胡乱拼凑,大牛一人代劳,延迟交付等方式糊弄
在alpha答辩时展示了由我主导的团队技术笔记、接口文档整理、团队git使用,得到了全班同学的一致好评。
3)并且通过数据展现软件是可以维护和继续发展的。而不是 找不到源代码,代码无文档,代码不能编译,没有task/bug 等项目的发展资料
技术笔记、github合作流、文档等,都有利于我们软件的可维护和继续发展。
随意展示一些:
工作笔记:
技术文档:
接口文档:
GitHub使用:
代码规范:
详细的commit信息:
4)对着这个检查表:http://xinz.cnblogs.com/p/3852177.html 检查一下,自己如果去企业面试,这些常见的问题是否都能回答,并在此总结。
类别 | 具体技能和面试问题 | 回答 |
---|---|---|
语言 | 最拿手的计算机语言之一,代码量多少? | 最拿手也是用的最多的应该是C/C++ 约3W行 |
语言 | 最拿手的计算机语言之二,代码量多少? | php,2000行,这次实践时使用的web后端语言 |
软件实现 | 你有没有在别人代码的基础上改进 | 较少 |
软件实现 | 你是怎么读懂别人的代码的 | 读源码+文档 |
软件实现 | 你采取了什么方法来保证新功能不会影响原来的功能 | 我知道要用回归测试,但我没有实际做过 |
软件实现 | 你在开发中遇到的最复杂的bug是什么,你是如何解决的?这个bug出现的原因是什么,你在将来应该怎么避免bug再出现? | 这一次后台开发时有一次取数据库中的一个record反复报错,查看报错信息说“类型不匹配”,不是一个很精确的报错语句。查找资料得知select之后是一个record的集合,需要调用first得到其中的一个。 |
软件测试 | 你如何测试自己写的代码 | 单元测试。以及在写后端时,现在本地虚拟机测试,本地代码通过后部署到云服务器上使用postman测试,再写接口文档联系前端进行测试 |
软件测试 | 你如何测试别人写的代码 | 没测试过别人写的代码……如果是我的话,先问清楚代码逻辑和输入输出,为他设计测试用例 |
软件测试 | 你掌握了多少种测试工具和方法 | OpenCppCoverage、postman、Visual Studio 2017 单元测试 |
软件测试 | 你写过测试工具吗 | 没有 |
软件测试 | 你如何对一个网站进行压力测试和效能测试 | 有专门的压力测试网络服务 |
软件测试 | 你如何测试一个软件的人机界面(UX/UI) | 根据规格说明查看各个功能是否有错误,是否有功能缺失,点击交互是否有错误反馈。 |
软件测试 | 你写过的最复杂的代码是什么 | 红黑树和本学期写的wordcount比较复杂,其他的都不是太复杂,我也没有研究过非常难的算法 |
软件测试 | 你是如何测量和改进它的效能的,用了什么工具,如何分析的 | 使用visual studio的性能分析工具 |
项目管理 | 你参与过项目管理吗 | yes,作为后端leader |
软件设计 | 你做过构架设计,模块化设计,接口设计吗? | 做了后端的接口设计 |
质量意识 | 你是怎么做代码复审的 | 由于实践时间很短,学技术+码代码就没什么精力做复审这种额外工作了。我的做法是把代码规范约定好并跟队友强调,然后靠他们的自觉了,实践证明队友还是很靠谱的 |
工具/社区 | 你在各种开发平台都使用过什么开发工具 | VS |
工具/社区 | 自己写过什么工具来改进工作效率 | 写过爬虫,写过统计代码行数的程序 |
工具/社区 | 给社区贡献过什么工具和代码,github有分享代码吗 | github常用,但只要作为个人代码仓库和项目展示,未给大型项目贡献过代码 |
工具/社区 | 你的技术博客坚持了多久,读者最多的是哪一篇 | 从17年1月断断续续至今。读者最多的前三十:mininet安装、C语言统计代码行数程序、浮点数的细节 |
团队协作 | 请描述你在项目中如何说服同伴采用你提出的更好的解决方案,或者你如何听取了别人的一件,改进了自己的方案 | 开会讨论时各抒己见,最后由leader定夺 |
团队协作 | 你如何说服懒惰的同伴赶紧工作,实现团队目标 | 主动询问他遇到什么困难。因为很多人都是遇到困难就自闭了,解决了这个困难就可以跟上 |
理论素养 | 你上过什么数学,计算机或其他理论课 | 微积分线代概率论离散数学,其他理论课不一一列举了,我觉得最有帮助的是计算理论、计算机网络、操作系统、数据库、数据结构与算法、编译原理 |
理论素养 | 请举出具体的例子,说明你学到的理论知识如何帮助你解决实际问题 | 计算理论接触到的状态图、正则表达式帮助我构思wordcount的核心功能。OS\network\database是写一个安卓APP的后端所必须的知识 |
自我管理 | 全年级你专业排名多少? | 31/55 |
自我管理 | 你刚入学带现在的排名有变化吗? | 上升 |
自我管理 | 如何解释你的排名的变化 | 我转了专业 |
七、个性发挥,包括图文、照片和创意等
best memory in this semester