软件工程与“足够好”
今天看了北航软工课程学生写的一篇博客[1],刚好可以借此机会把我这几年关于软工的思考整理出来。
我在 2016 年做过福大OO课的助教,以及在 2017 年做过集大的软工助教。当时我有很多地方都没有做好,并且这几年没怎么关注软工课程,与教学一线脱离较久,说的东西不一定对,大家随意看看就好。
为了确保我理解了上述博客的内容,我会先尝试对博客做个总结,然后选择标题“足够好”作为切入点说说我自己的一些粗浅的看法。
博客说了啥
博客的一个关键背景是团队项目选题,详细内容在:
https://edu.cnblogs.com/campus/buaa/BUAA_SE_2021_LR/homework/11925
选题方式有三种:自选题、推荐选题、继承往届选题。不同选题方向对团队关于所选题目有不同的要求(这里课程组没有充分地把要求清晰地表达出来)。选题和需求分析的时间限制是 4 天(周末两天),同学们面临的来自时间压力比较大。由于本次选题后的需求答辩邀请了业界人士和大众评审团,需要事先提供各团队的相应资料给他们,助教面临的完成度压力也比较大。
在第四天,助教团队发现部分学生团队未提供上述需要提前给相关人员查看的内容,以通知的形式说了一段比较重的话,特别是三个“严重”。成为了同学们爆发不满情绪的直接原因。在此之后助教主动联系一位同学,交换了关于此事的意见,事后助教向同学们道歉。助教在这一点上做得很好,说明助教是想解决问题的。
现在无法通过博客内的连接查看到对话原文。从优化后的对话来看,WPB 同学对事件思考深刻,抓住了问题的根本原因,容易促成具有建设性的对话;说话有条理,清晰地表达了自己的想法,有利于助教快速准确地理解学生的看法。
总结一下,该事件的直接原因是助教的通知说了很重的话;主要原因是本学期时间更短但事情更多;根本原因是学生和老师助教对于软工的理解不一样。
WPB 同学敏锐地察觉到根本原因,不愧是助教选中并进行对话的同学。他有一句总结“这就是我们对软件工程理解的偏差了,我们希望关注技术,你们希望关注产品”,这是本篇想要重点讨论的内容。
接下来我会展开谈一谈对于软工和软工课程的 个人看法,不一定对,仅供参考。
软件 or 工程?
软件工程课程的重点是软件还是工程?重点当然是工程。软工课的所有内容都在告诉我们实现软件工程的目标的方法有哪些。如果重点是软件,那么可以在OO课上完成这些事情,不需要放在软件工程课。
既然重点是工程,那么工程的目标是什么?助教反复强调有三点,我在这三点中挑最重要的一点,即【通过一定的软件流程,在预计的时间内发布“足够好”的软件】。我想把这句话在补充完整的同时不受限于这句话本身。
前方高能,请坐稳手扶好
工程的目标是:在当前社会环境中,工程实施者使用有限的资源,把能创造的价值最大化,并将其凝固在一个商品里面。
之所以说在当前社会环境中,是因为同一个商品的价值在不同社会发展阶段的价值不一样。例如三十年前做一个图书馆管理系统和现在做一个图书馆管理系统的价值相差特别大。
有限的资源包括了时间资源、能力不同的参与者(需求方、PM、程序员等等)、人脉、资金等。
我们经常说“足够好”,那么这个“足够好”应该用什么来衡量?抽象地说就是看创造了多少价值,具体说就是最终的产品(商品)在多大程度上满足了用户的需求。
在软件工程课程里面,学生团队与实际公司的团队的一个很重要的区别在于他们的资源更加有限,特别是时间资源。他们难以动用资金资源。对于人脉资源,有些同学有,有些则没有。那么同学们主要用于创造价值的资源是【能力不同的参与者】。
同学们容易陷入的误区是,只让技术能力强的同学得到充分发挥,也就是重技术过于产品。然而事实是,在错误的方向上,技术能力越强的同学越会让项目陷入危险。
作为程序员角色的同学,希望通过软件工程课程学到技术。有一部分原因是其他课程没有提供这个机会,但是软工课老师又不能要求其他课程提供这些机会。系统层面的问题这里不作过多讨论,因为解决这个问题需要很长的时间,所以重点讨论课程本身怎么样在短期做到最大化的改善。
软工课程主要提供了两个东西:
- 学习和实践工程思想和方法
- 多人合作做出一个软件,从中学习到技术
老师主要想让同学做的是第一点,同学想要做的是第二点。
不学习和实践工程思想和方法的团队可以做出比其他团队更好的软件,但是他们未必使用有限资源最大化地创造出价值,因此技术强的同学抱团的成绩未必比其他团队的成绩高。如前文所述,软件本身(尤其是所用到的技术是否高级)不能作为软工的主要评价依据。不过这在评分的时候,对助教的要求会高很多。
是否最大化地创造价值,有多个依据。我举一个比较容易看出来的依据:看团队主动舍弃了哪些需求,以及降低了哪些需求的完成标准。
老师需要明确地把第一点的要求传递给学生,主要是在宣传上做几件事情:
- 强调课程的目标是让学生学习和实践工程思想和方法,弱化软件本身的重要性
- 强调评分主要基于同学们对工程思想和方法的掌握和实践情况
- 让那些只想要做软件而不是学习工程思想和方法的同学,提前做好分数低的思想准备
对于只想学技术的同学来说,选择这门课是一个不理智的决定。这些同学需要在非常有限的时间内同时完成两件事,既满足老师的需要又满足自己的需要。就像既想从英语技术书中学到技术,又想学到英语。这种“我全都要”的想法,对个人的能力要求非常高,而人们容易高估自己的能力,结果是“全都要不到”。
如果我是这部份学生,我会舍弃掉软工课程的分数,仅仅做到及格。与此同时最大化我自身的需要,即多人合作做出一个想做的软件,学到想学的技术。这就是“足够好”。不过我要强调的是,这是在我意识不到工程思想和方法的重要性的情况下做出的选择。事实上,我当时上这门课的时候,是舍弃了其他课程的分数。
老师和助教是【教授软件工程课程】这一工程的实施者
对于老师和助教来说,他们也是在实践工程。这一工程课的具体目标是使用有限的资源让【软件工程课程】的学生从软工课中学到和实践的工程思想和方法的价值最大化。
在有限的资源发生变化时,要做出相应调整,适当舍弃一些内容。我看到助教团队和老师出题的时候,给了一些不同要求的题目供选择,在对话中也有谈到。
这正是在通过舍弃一些内容,让同学们学习和实践更具有价值的工程思想和方法。这是很好的实践,只是由于信息未能充分地传达给同学们,出现了一些问题。
改革是不可能不出现问题的,但是有勇于离开舒适圈的老师以及愿意解决问题的助教,这门课必定会越来越好。