提问回顾与个人总结

时间:2021-05-30 11:48:14

1.链接到以前提问题的博客

软件工程第一次作业

2.对自己曾经提出的问题进行解答

2.1.职业发展:考级之路

一个软件工程师,对于他的能力应该如何量化地评定?

举例来说,中国的计算机二级考试等,对于计算机系的学生基本是没用的(对于其他专业的学生好像意义也不大),而美国的专业工程师考试PE考试也已经停办了。说明仅仅知道语法等理论,与实际代码编写还是有一定距离的。这也就是所谓“talk is cheap show me the code”。
在这次团队项目中我是担任前端的角色,在敏捷开发的流程中,也并没有给我们太多时间来学习语言、语法等。所以在上手设计网页html代码以及前端js编写时,基本上是需要啥就找现成的教程来学习以及实际编写,而JavaScript语言一些复杂的语法特性等则完全可以直接忽略掉。因此与其在花时间学习语法特性,还是实际的工程项目能够锻炼自身的代码能力。

2.2为什么要结对编程

这样的结对编程是否会有更优的编程形式?例如两个人先同时编写一个模块,然后相互复审、交流,然后进行下面模块的编写。这样可以提升编程的效率,同时结对编程交流、复审的优点并不会消失。
而以驾驶员/领航员形式的结对编程,固然能不断地处于“复审”的工程,但是是否存在驾驶员被领航员带偏了道路的可能?

通过实际的结对编程发现,同时写一个模块意义并不大,因为对于同一个算法模块,很有可能两人的思路不同,而经过讨论得出统一意见时也没有各自编写的必要了。
至于不断“复审”的过程,还是需要一位更有经验的编码者作为领航员,不然就会出现像我们一样,出现了bug两人都要找半天才发现的情况。

2.3敏捷流程

在现实生活中的软件开发过程,有哪些软件项目是根据敏捷流程开发的?具体说来,敏捷流程如今在软件工程开发中的地位是怎样的。

敏捷开发仍然是有一定适用范围的,例如舍友的软件工程是嵌入式开发,对于精准度的要求很高,所以敏捷开发显然不适用,而是采用花足够的时间设计,然后开始代码编写。
而我们的网站则是适用于敏捷开发的,基本上开一个会议,就能决定出加什么功能,回去马上就能进行编码,而找到bug也是立马就能修复。由此看来,在这种能够容忍一定bug,并且功能增加可以通过快速迭代的软件开发,敏捷开发无疑是一种不错的选择。

2.4PM

你是否觉得你的长处并不在于写代码和debug,而是协调、沟通,让一个团队或组织有效运转起来……

在团队开发中,虽然我没有担任PM职位,但是在我们组内的两个PM都是非常称职的PM。在开会讨论以及为大家分配任务时都充分考虑到了成员的情况。在团队开发完成后,我对PM的认识是,一得对团队成员有全面的了解,这需要的是人际交往能力以及管理能力;二则需要对团队项目有一定认识,最好有相应的技术能力。

2.5.迷思之二:大家都喜欢创新

如果一个新的创新成果出现,却遭到了打压,这种情况下创新能否成功。

在这次团队项目中,有另一个组与我们进行同样的课程评价网站项目开发。导致结果是,对方实现了什么功能,我们会很快加上;我们实现的功能,对方很快也会做出来。否则如果功能相差太多,在软件开发的竞争上是不利的。在团队的软工作业中,这是一种良性竞争,它会促进我们的网站功能发展的更加完善;而在现实的软件竞争中,这就是商品间的恶意竞争了,因为一个用户显然不可能同时在两个网站上进行评价。而大公司的产品一旦积累人气,很容易导致小公司的产品做不下去。所以个人感觉维护创新成果的成本过高,维权困难,仍然阻挠着一部分创新的实现。

3.“知识点”

需求

竞争性需求分析中的NABCD模型,我们的项目在软工中是有竞争的,如何提出改良型的创新,如何获得先发优势十分重要。

设计

在前端的设计中,页面跳转逻辑十分重要,因此需要跳转逻辑图的绘制。

实现

严格遵守gitflow工作流程,在自己的分支中编码完成,然后提交至develop分支。

测试

外部公开测试,即让一些软件学院/计算机学院的朋友使用产品并且收集反馈意见。

发布

产品发布之后的推广十分关键。一个产品哪怕做的再好,如果推广力度不够,可能还是吸引不到足够的用户。

维护

网站出现bug时应当第一时间开始修复,甚至临时关闭服务器以防止bug造成更加严重的后果。

4.自己的理解、心得

首先最大的感受就是忙,这学期选的课程是我大学三年来选的最少的一次,然而忙碌程度却丝毫没有减少,让我庆幸没有多选课。但是忙碌肯定是有收获的。

从结对编程来说,给出来的题目基本相当于一道算法题,恰好我和我的舍友对于数据结构和算法的掌握程度都不是很好,在经过一系列分析讨论之后,我们最终能够使用最基本的DFS算法实现小规模的需求。最终在实现上我们取得了一个不错的成绩,然而实现过程却不尽如人意,因为我们还是按照着OO这门课的流程,每次写完了一个部分才commit,而不是实时的commit。对于git的使用也不够熟练。这是我们需要加强的一方面。

团队项目才是软件工程的重头戏,开始时作为团队里的前端,我和另一位同学开始写html网页。我们都没有前端经验, 因此都是略过了“学习”这一步骤,从网上现学现写,每天快速地提交一份html代码,这也非常符合“敏捷”的原则。此后我成为了唯一的前端,进行后续页面,js编写以及一些bug的修复。所幸网页对于美观性的要求没有那么高,一般写出来了网页看上去都还算不错,否则复杂的css编写会让我无比头疼。最终在我们团队后端以及测试人员的不懈努力之下,做出的课程评价网站由刚接手时的无法使用到现在的还算不错,具备了课程评价网站的基本功能。最终的产品还是让我们有成就感的。

在团队合作上,基本是由我们的PM在开会讨论后为我们分配任务,我们也会提出自己的意见。我不是一个很主动的人,因此大多数时候是被动的接受任务,收到任务后就会尽快着手开始编码,因此每次都能按时地push自己的成果,当时在团队项目的第一次作业成员介绍上,我为自己定的要求是“不拖队友的后腿”,现在看来这个目标是实现了的。

在时间上,三个迭代周期的开发时间很长,最后一周期里又有研究方法论作业以及计算机网络的考试必须准备,所以无法在软工上投入更多的时间,这是希望课程组之后改良的地方。

总的说来,在软件工程这门课还是有不少收获的,例如Django框架的熟悉,gitflow分支管理,让我对团队开发的git操作有了更深入的理解。此外还有团队沟通以及团队展示这些模块,都让我了解到了开发软件的大致流程。