提问回顾与个人总结

提问回顾与个人总结

1. 提问回顾

1.1. 前情提要

在学期初,我们阅读了《构建之法》,并在博客作业中(软件工程个人阅读作业——阅读和调研)针对书中的知识点提出了疑问。现在要对这些问题进行解答。

1.2. Q&A

  • 提问 1:单元测试问题

第 2.1 节中的单元测试中提到了如下的内容:

代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。

提问:
如果仅仅由开发者来写单元测试,但是如果开发者没有考虑到某些边界条件,导致代码和单元测试中都没有涉及到边界条件的处理,这样也会留下漏洞。测试对于测试人员而言,测试用例是提前准备好的,还是看过代码后针对性编写的?

现在的回答:
首先应该明确,即使单元测试覆盖率达到 100%,也无法保证模块的完全正确。在此基础之上,开发者编写,好处是对各个分支、模块更加熟悉,可以更快覆盖到尽可能多的代码,提高测试效率。对于测试人员而言,可以先准备一部分样例,然后根据具体的覆盖情况,结合源代码补充一部分样例。

  • 提问 2:效能分析问题

第 2.2 节的效能分析工具中提到了如下内容:

抽样就是当程序运行时,Visual Studio 时不时看一看这个程序运行在哪一个函数内,并记录下来。程序结束后,Visual Studio 就会得出一个关于程序运行时间分布的大致印象。

提问:
若采样具有周期性,程序的运行也具有一定的周期性且周期具有一定的倍数关系,是否会产生某些周期性调用的函数未能被采样或采样严重失真的情况?Java 自带的 Sampling 就是间隔 5 m s 5 ms 5ms 取样。

例如: Profiler 的采样频率为 τ \tau τ,某一函数调用的频率在一段时间内近似为 τ / n , n ∈ N ∗ \tau / n, n \in N^* τ/n,nN,在这种情况下,函数的调用可能恰好错开 Profiler 的抽样。

现在的回答:
这种情况太特殊了,不考虑。这种抽样检测的方式本身就存在一定误差。当周期性函数开销小时,没有被采样到不会对最终的采样结果产生很大的偏差。如果开销较大,则因为主频波动或者其他干扰,总能大概率被采样到,对结果不会产生实质性影响。

  • 提问 3:杀手功能问题

第 8.5 节功能的定位和优先级中提到了如下的内容:

要把用户从竞争对手那里吸引过来,团队自己的产品要有一个差异化的焦点,在这个焦点上,我们的团队能做得比别人好 10 倍,高一个数量级。这种功能又叫杀手功能,其他功能也很重要,但是它们都是(相对来说)外围的。产品也许有很多功能,但是应该只有一两个功能是杀手级的。

提问:
为什么将杀手功能的数量限制较少,是限于开发时间和成本吗?如果面对已经较为成熟的软件系统,自己仅有个别功能的效果达到杀手功能的级别,此时是需要完成整个软件系统,还是开放成针对该功能的专用软件?

现在的回答:
对于初创公司,开发各方面功能完善的软件成本的确很高。而且为了抢占市场,防止杀手功能被竞争对手补充上,的确是需要先满足杀手功能,其他功能尽量从简。从本课程学到的思路也可以映证。本课程采用两个版本迭代的方式开发,这表明,其他的功能是否需要实现完善并不是一个绝对的要求,而是可以根据实际情况动态决定,在最初抢占市场的软件基础上加增。只要能够保证杀手功能的知识产权,就能有生存空间。

  • 提问 4:典型用户问题

第 10.1 节提到典型用户:

典型用户不再是一个抽象的概念,而应该是一个活生生的人物。典型用户一般有哪些特性?一个典型用户往往描述了一组用户的典型技巧、能力、需要、想法、工作习惯和工作环境。

提问:
为什么要抽象出典型用户进行分别的需求整理,而不是将所有用户的需求进行汇总并按照提出的人员占比(以及购买软件支出的占比)进行排序后总结出需求清单?

之前的相关思考: 后面在 13 节中可以了解到,有典型的用户画像,可以针对性的模仿用户一系列的行为进行测试和功能改进。例如在测试部分性能和用户体验时能够按照某一类用户惯常的操作习惯进行一些列操作,从而发现当前设计中存在的部分问题。13 节提到:

当用户使用一个软件时,他/她并不会独立使用各个模块,而是把软件作为一个整体来使用。我们在做场景测试的时候,就需要考虑在现实环境中用户使用软件的流程是怎样的,然后模拟这个流程,看看软件能不能满足用户的需求。这样,才能使软件符合用户的实际需求。以一个图像编辑软件为例,这个软件的各个模块都是独立开发的,可是用户有一定的典型流程,如果这个流程走得不好,哪怕某个模块的质量再高,用户也不会满意。

很好地回答了这个问题

现在的回答:
现在的开发过程也映证了之前的思考。在 OS 课程平台的开发中,我们需要设想学生、老师、助教的主要使用流程。因为涉及的 API 很多,这些 API 在实现一项功能的时候并不是单独起作用,而是多个 API 协同完成。同样,使用者使用本软件达成一定的目的,并不是单一使用某一项功能,二十多项功能连续使用。因此,我们必须要考虑多个功能之间的耦合问题,让用户使用时逻辑连贯,减少不必要的重复操作、等待等。

  • 提问 5:创业团队问题

在 16.1 节中提到关于团队创业的问题:

有趣的是,所有颠覆性的技术在开始的时候市场都不大。有些大公司就会扮演后发制人的角色,等着一帮先行者在市场萌芽阶段拼杀,时机成熟时,采用收购、入股、投资、快速跟进等方式,切入新兴市场。但是,等到时机成熟,那些先行者要价一般都很高(再加上一些泡沫的作用),花了大价钱买入,往往事倍功半。

提问:
当今许多大 IT 公司已经完全瓜分了优先的市场。在新的创意开辟的市场下,小微企业面临高昂的硬件和人力成本,很难开辟新的市场。即使有新的市场被开辟,也很快被大企业兼并。因此在现有的情况下,个人或小团队的创新发展只能依赖大型企业的资本支持了吗?

现在的回答:
在现实中颠覆性技术的开创并不一定都是小微企业开创的。从唯物主义角度而言,一项开创性技术需要一定的技术积累或理论支撑。如果是小微企业能够达成的,那么会不止有一家小微企业参与这个方向,而且大型企业也会参与竞争。如果存在高技术壁垒,那么只有大型公司才有相应的财力物力支持研发,也就是相应技术只会从大型企业中产生。对于研究者,新技术往往需要通过产业投入使用,可以考虑与大型企业合作,或者申请国家级的创业补助。

没有产生新的问题

2. 在实践中学习

不同阶段学到的知识点:

  • 需求阶段: 明确了需求的来源一定是从现实出发,可通过用户调查、自己使用的感受等方面获得。然后可以以 NABCD 需求分析 的形式进行展现,这种结构化的形式能够很好地帮我们理清思虑,并具备了初步设计的雏形。
  • 设计阶段: 设计阶段需要在需求基础上完善,尤其是要明确具体的验收指标和技术栈。此时对产品的最终形态必须已经有了较为具体可感的设计,因此,在这一步需要形成 《功能规格说明书》《技术规格说明书》 等,然后 划分阶段 ,并将目标 拆解为基本任务
  • 实现阶段: 实现阶段采用 代码管理工具 + 持续集成部署工具 ,可大大减小开发过程中的代码管理、编译等问题。进一步对 代码风格规范 提出要求,对开发分支提出要求,维护 commit tree 的良好可读性,对于出现问题的代码好追责。建立 code review 制度,可进一步保障代码质量。在合并分之前,保证本地基础调试通过。
  • 测试阶段: 测试阶段需要进行 正确性测试压力测试 。其中,正确性测试的代码覆盖率需要达到 85%。对于本项目而言,由于需求的特殊性,压测需要保证在未来可见的一段时间内,能保证全部的课程同学能够正常考试,并留出一定冗余即可。完成测试后需要形成 测试报告 ,并针对其中的问题进行修改。
  • 发布阶段: 本阶段需要将项目从开发服务器部署到生产服务器,由于环境可能存在区别,因此在开发之初就采用了 docker 以保证环境的相对稳定。在发布时同时需要进行大量的宣传,积累用户。
  • 维护阶段: 本阶段需要 持续接受用户的反馈 ,对于 bug 等问题进行及时修复。而对新的功能期待,不太紧急的功能可以缓慢开发更新,而可以抢占市场的相应功能则需要紧急迭代。同时,对数据库、配置等要 及时进行备份提高服务器安全性

3. 理解与心得

本次《软件工程》课程中,我们从零开始,迭代开发了 OS 课程平台——OSome。历经 Alpha、Beta 两个大阶段,完成需求分析、设计、实现、测试、发布、维护等六个步骤,并维护规模庞大的文档。

整体收获可概括为两个方面:

对于课内内容,了解了基本的软件工程方法,经历了完整的软件开发生命周期,将对软件工程的理解从感性层次上升到了初步理论水平,对应该有什么阶段、每个阶段应该干什么、怎么干,都有了较为深入的了解并琴身实践。

对于课外内容,掌握了 golang、MySQL 等语言,进一步提升了代码能力和知识水平。学习了单元测试相关知识,提升软件代码质量。学习了继承部署、分支管理相关规范,提高开发效率。

唯一的问题在于任务量实在太大,有点吃不消。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

冯旭杰-19373311

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值