目录
软件工程个人阅读作业——阅读和调研
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 北航 2022 春季敏捷软件工程 |
这个作业的要求在哪里 | 个人阅读作业-阅读和调研 |
我在这个课程的目标是 | 提升合作开发的能力、观点表达能力、展示能力,熟练掌握多种开发工具的实用技能,具备合作开发复杂软件的能力 |
这个作业在哪个具体方面帮助我实现目标 | 集中学习现代软件开发的基础理论,对软件开发与协作有了系统性的框架 |
1 阅读提问
1.1 单元测试问题
第 2.1 节中的单元测试中提到了如下的内容
代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。
提问:
如果仅仅由开发者来写单元测试,但是如果开发者没有考虑到某些边界条件,导致代码和单元测试中都没有涉及到边界条件的处理,这样也会留下漏洞。测试对于测试人员而言,测试用例是提前准备好的,还是看过代码后针对性编写的?
相关思考:
回顾《面向对象设计与构造》课程,在互测环节中,同学们的确需要通过查看代码进行针对性的样例构造进行测试;如果只是进行黑盒测试,则效率较低,也不易发现潜在的 bug。而且引文中强调:
代码的作者最了解代码的目的、特点和实现的局限性。
可见测试需要在充分了解源代码的基础上进行,则表明测试人员也需要了解代码,并且写出覆盖率 100% 的测试程序;在此基础之上考虑开发人员的代码是否漏掉了某些边界条件再进行构造。
1.2 效能分析问题
第 2.2 节的效能分析工具中提到了如下内容:
抽样就是当程序运行时,Visual Studio 时不时看一看这个程序运行在哪一个函数内,并记录下来。程序结束后,Visual Studio 就会得出一个关于程序运行时间分布的大致印象。
提问:
若采样具有周期性,程序的运行也具有一定的周期性且周期具有一定的倍数关系,是否会产生某些周期性调用的函数未能被采样或采样严重失真的情况?Java 自带的 Sampling 就是间隔 5 m s 5\ ms 5 ms 取样。
例如: Profiler 的采样频率为 τ \tau τ,某一函数调用的频率在一段时间内近似为 τ / n , n ∈ N ∗ \tau / n, n \in N^* τ/n,n∈N∗,在这种情况下,函数的调用可能恰好错开 Profiler 的抽样。
1.3 杀手功能问题
第 8.5 节功能的定位和优先级中提到了如下的内容:
要把用户从竞争对手那里吸引过来,团队自己的产品要有一个差异化的焦点,在这个焦点上,我们的团队能做得比别人好 10 倍,高一个数量级。这种功能又叫杀手功能,其他功能也很重要,但是它们都是(相对来说)外围的。产品也许有很多功能,但是应该只有一两个功能是杀手级的。
为什么将杀手功能的数量限制较少,是限于开发时间和成本吗?如果面对已经较为成熟的软件系统,自己仅有个别功能的效果达到杀手功能的级别,此时是需要完成整个软件系统,还是开放成针对该功能的专用软件?
1.4 典型用户问题
第 10.1 节提到典型用户:
典型用户不再是一个抽象的概念,而应该是一个活生生的人物。典型用户一般有哪些特性?一个典型用户往往描述了一组用户的典型技巧、能力、需要、想法、工作习惯和工作环境。
提问:
为什么要抽象出典型用户进行分别的需求整理,而不是将所有用户的需求进行汇总并按照提出的人员占比(以及购买软件支出的占比)进行排序后总结出需求清单?
相关思考:
后面在 13 节中可以了解到,有典型的用户画像,可以针对性的模仿用户一系列的行为进行测试和功能改进。例如在测试部分性能和用户体验时能够按照某一类用户惯常的操作习惯进行一些列操作,从而发现当前设计中存在的部分问题。13 节提到:
当用户使用一个软件时,他/她并不会独立使用各个模块,而是把软件作为一个整体来使用。我们在做场景测试的时候,就需要考虑在现实环境中用户使用软件的流程是怎样的,然后模拟这个流程,看看软件能不能满足用户的需求。这样,才能使软件符合用户的实际需求。以一个图像编辑软件为例,这个软件的各个模块都是独立开发的,可是用户有一定的典型流程,如果这个流程走得不好,哪怕某个模块的质量再高,用户也不会满意。
很好地回答了这个问题。
1.5 创业团队问题
在 16.1 节中提到关于团队创业的问题:
有趣的是,所有颠覆性的技术在开始的时候市场都不大。有些大公司就会扮演后发制人的角色,等着一帮先行者在市场萌芽阶段拼杀,时机成熟时,采用收购、入股、投资、快速跟进等方式,切入新兴市场。但是,等到时机成熟,那些先行者要价一般都很高(再加上一些泡沫的作用),花了大价钱买入,往往事倍功半。
当今许多大 IT 公司已经完全瓜分了优先的市场。在新的创意开辟的市场下,小微企业面临高昂的硬件和人力成本,很难开辟新的市场。即使有新的市场被开辟,也很快被大企业兼并。因此在现有的情况下,个人或小团队的创新发展只能依赖大型企业的资本支持了吗?
2 调研源代码版本管理软件
GitHub、GitLab、Bitbucket 等,都是常见的代码托管平台。
2.1 GitHub
GitHub 的团队协作流程如下:
- 创建开发分支。一般用 master 表示稳定版分支, dev 分支表示开发版本
- 在公共仓库通过 fork 操作,将团队项目 fork 到个人仓库
- 利用
git clone
命令将个人仓库克隆到本地,尤其是要 clone 下开发分支 - 通过
git fetch
命令与团队开发的进度同步,若代码有冲突,需要先解决冲突 - 冲突解决后,将自己的修改 push 到远程的个人仓库
- 在自己的远程仓库发送 pull request 申请将自己的修改合并到公共仓库
- 项目负责人进行审核,若通过,则同意合并
GitHub 在项目管理方面,个人私有仓库最初是收费的,近年才转为免费业务。
2.2 GitLab
GitLab 的团队协作和 GitHub 类似,都是基于 git 工具的,可参见 2.1,但是合并时采用的是 merge request,其他几乎相同,不再赘述。
GitLab 官网给出了与 GitHub的对比:GitLab vs GitHub。从中可见,GitLab 对系统的配置要求相对较低,对用户权限要求较为灵活,尤其是用户组功能的建立。这在某些层面上可以看出,GitLab 项目的目标人群除了大型软件公司以外,还兼顾了普通的项目合作小组。例如本人上学期的《数据库系统原理》大作业就是部署在腾讯云服务器上,采用 GitLab CI 进行自动化部署。
2.3 Bitbucket
Bitbucket 的团队协作也与 GitHub 差不多,不再赘述。
在项目管理方面,Bitbucket 较为简单的搜索功能,但是对 5 人以下的小团队不限制存储空间。可以进行代码托管、合作开发、测试和部署。相对于 GitHub 而言,更像是为开发大型项目专门设计,而 GitHub 则更好地兼具了社区的功能。BitBucket 也在自己的主页声明,该站点是 “Built for professional teams”
3 调研持续集成 / 部署工具
3.1 GitLab CI
GitLab CI(GitLab Continuous Integration)是Gitlab提供的持续集成服务,该服务脚本用 yaml 语法编写。如下图所示[GitLab CI, 2022-03-11],该服务很适合常见的开发流程,用户在本地开发,每一次 push 到 gitlab 的时候,触发一次脚本执行, CI / CD 将会进行:
- 自动运行脚本完成以下工作
- 构建和测试用户程序
- 在 Review App 中预览更改
这些步骤完成后,将会按照预期执行:
- 审查和批准代码
- 将功能分支合并进默认分支
- 自动将更改部署进生产环境
即使某些步骤出现问题,用户可以回滚更改。
上学期《数据库系统原理》课程的一个大作业部署在 GitLab上,采用 CI 进行部署在腾讯云服务器上。
仓库 URL:QA-frontend。
前端 URL:Python 问答系统。因为当前服务器负载原因,仅运行了前端进程。
下图是 push 后 CI 运行的截图。
下图是 CI 运行完成的截图。
下图是前端的截图。
3.2 GitHub Action
GitHub Actions 是仓库中自动化、自定义和执行软件开发工作流程。 用户可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中,同样用 yaml 语法编写。
GitHub Actions 可以分为如下的层级:
- Workflow (工作流程):持续集成一次运行的过程,就是一个 Workflow。
- Job (任务):一个 Workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
- Step(步骤):每个 Job 由多个 Step 构成,一步步完成。
- Action (动作):每个 Step 可以依次执行一个或多个命令(Action)。
本部分属于现学现卖,参考教程:github actions 部署vue项目。主要实现了将个人的 Vue Demo 页面自动部署到 github.io 上。另外,感谢薛欣同学在本人进行部署遇到 bug 时给予帮助。
遇到的主要问题是 Vue build 参数中的路径问题,需要将 assetsPublicPath
从 '/'
改成 './'
,这样才能正常打包。
Demo 仓库地址:fxj_demo_app repo
github.io 页面地址:fxj_demo_app
下图是 GitHub Workflow 运行时截图。
下图是 GitHub Workflow 运行完成截图。
下图 GitHub 部署完成的截图。
下图是 github.io 页面截图
3.3 使用看法
GitLab CI、GitHub Workflow 等都极大简化了开发过程中部署等过程的流程,实现了自动的持续部署。在进行 pull、push、merge 等 git 操作后,自动完成一定的后续操作。
就使用体验而言,GitLab CI 更适合部署在团队服务器上,在开发软件的过程中持续部署,结合 docker 直接部署到生产或测试环境中;而 GitHub Wrokflow 在部署静态页面或信息展示上显得更加方便。