项目 内容
这个作业属于哪个课程 2021春季软件工程(罗杰 任健)
这个作业的要求在哪里 个人阅读作业2
我在这个课程的目标是 认识软工,拥抱软工,提升相关能力以便日后与其朝夕相伴
这个作业在哪个具体方面帮助我实现目标 于《构建之法》中理解软工,于实际应用中理解CI/CD

一、阅读提问

1.什么是Bug?

原文参见《构建之法》第1章第2节

什么是Bug呢?简单地说,软件的行为和用户的期望值不一样,就叫Bug。例如,某聊天软件启动时就崩溃了,用户期望这个聊天软件不能崩溃。例如,某聊天软件不支持视频聊天,用户期望这个聊天软件支持视频聊天。但是该软件的开发人员说,这个软件根本没打算支持视频聊天。

相应问题:

  • 如果不同用户的期望值不相同,此时如何比较软件的行为和用户的期望值?“不一样”从何谈起?

  • 如果软件行为因为商业盈利而没有达到(或有损于)用户期望,也算作Bug么?

  • 软件的行为是否一定要追求和用户期望保持一致呢?

个人理解:

  • 比如微信上线的“拍一拍”功能,上线后用户体验有褒有贬,有的人认为很有趣,增加了互动的方式;有的人则认为毫无增益,十分反感,那么此时可以说明“拍一拍”功能是Bug么?笔者认为不能单纯地以软件行为与用户期望值是否一致判定是否为bug,软件的一些基础功能(大部分用户都有相应的期望值的功能,比如书中的启动崩溃的例子)应当毫无疑问地达到用户的期望值,而软件的一些扩展功能(比如“拍一拍”)应当秉持“风物长宜放眼量”的态度,不能因为不能达到大部分用户的期望值就过分苛责软件的行为,当然软件行为也不能因为存在部分用户的肯定而忽视批评的声音,两者应当是不断磨合的关系(比如后续增加了“拍一拍”撤回的功能,反感的用户也逐渐适应并使用拍一拍功能),只有彼此的正向反馈才能促进软件的发展和提升用户的体验。
  • 比如大部分用户都期望看视频的时候没有广告,但是各类视频软件都不约而同地为了盈利投放广告,此时软件的行为与用户的期望值并不相符,也并不能算作软件的Bug,毕竟如果软件完全以用户期望为导向,而不考虑自身生存,可能软件本身便会不复存在了,所以笔者认为软件开发设计的导向应当不仅仅局限于用户需求,应当综合多方面的因素和考量。
  • 在触摸屏诞生之前,大部分用户对手机的需求(期望)恐怕仍然停留在希望按键手机有更多的功能,可以更加好用吧,所以有时用户的期望存在一定的局限性,但同样不可否认的是,正是少部分用户的需求推动了硬件或软件的发展,进而拓展了大部分用户的期望空间,所以如果置身于历史的长河中,软件的行为和用户的期望更像是一种交替前进的状态,并不是单方面的追求,而是携手共进,此时再回首看一看那些“Bug”,不过是一朵朵浪花罢了。

2.单元测试

原文参见《构建之法》第2章第1节

单元测试必须由最熟悉代码的人(程序的作者)来写。代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。

相应问题:

如果程序的作者在程序的设计实现阶段便忽略了对某些情况的考量,此时再由作者构造单元测试,是否仍然不能注意到这些在程序设计实现上的漏洞呢?

个人理解:

虽然程序的作者最为熟悉自己的代码,可以较快地构造出对应的单元测试,但是这些单元测试只能保证当前已经实现程序的正确性,并不能说明当前的程序设计是完备的,如果此时由他人构造一些单元测试,则有可能发现程序本身的漏洞,才可以让程序尽可能的完备。

3.goto的使用

原文参见《构建之法》第4章第3节

函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto

相应问题:

goto是否能有助于程序逻辑的清晰体现

个人理解:

从1968年的一篇名为《 Go To Statement Considered Harmful》的文章,作者Edsger Wybe Dijkstra提出不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂,到现如今程序语言的教学中不推荐使用goto语句,这一切已然可以说明在程序中不写goto语句是一份共识,那么再在程序设计实现时使用goto则可能影响团队中他人对代码的理解,对他人而言并不是一种程序逻辑的清晰体现,反而影响团队的开发效率。

4.结对编程

原文参见《构建之法》第4章第5节

结对编程中驾驶员和领航员的角色要经常互换,避免长时间紧张工作而导致观察力和判断力下降。

相应问题:

驾驶员和领航员不应当是各有所长、各司其职么?如果互换的话,会不会不能达到开发效率的最大化?

个人理解:

结对编程的两位程序员存在水平上的差距,程序员A可能更擅长架构设计或构造测试,程序员B可能更擅长代码实现,因而存在驾驶员和领航员两种角色,如果结对编程追求的是1+1>2的效果,那么角色互换则可能让两者在并不擅长的领域内工作,无法达到提升项目质量、提高开发效率的效果。

5.萝卜与白菜

原文参见《构建之法》第17章第4节

由于萝卜的设计有缺陷,导致模块非常复杂,萝卜也成了唯一了解其模块的开发人员......所以我们要让“萝卜快了不洗泥”的人慢下来,这样能减少他们的危害,我们要胡萝卜和大棒并用。我们的大棒就是“小强地狱”

相应问题:

“小强地狱”是否真的合理?

个人理解:

一个团队内的各个成员在完成任务时应当有明确的分工,团队开发过程中也应当有明确的DDL,如果某位成员提前完成开发任务,应当立即进行测试或者探讨更优设计,而不应当着手开发新的功能,项目的每一步进展应当是扎实有效的。所以笔者认为通过小强地狱让萝卜慢下来不如让萝卜在开发的同时更注重提升代码的质量,在开发的过程中尽量通过优化设计减少问题的产生而不是等到问题出现再进行修复,当然这仅仅是笔者目前的粗浅理解,后续结合软工开发经验观点也会有所改变。

二、调研源代码版本管理软件

相同之处

Github/Bitbucket/Gitlab均可以

  • 利用git进行版本控制,管理项目
  • fork/clone 仓库
  • 支持Markdown
  • 问题跟踪
  • 双向认证
  • 高级权限管理
  • 提供功能丰富的API

不同之处

GitHub GitLab Bitbucket
提供了API用于应用程序开发 提供了API用于应用程序开发 集成了多个API和服务
提供错误跟踪系统,用于提高编码质量 提供了错误跟踪系统以及基于Web的代码编辑选项,用于提高编码质量 使用语义搜索来分析编码语法,以提高编码质量
支持导入Git,HG,SVN和TFS 支持Git,Google Code,Bitbucket和FogBugz 支持Git,Google Code,SourceForge,HG,CodePlex和SVN。
Free Plans允许托管无限的公有代码仓库,随时进行clone, fork 和 contribute,对磁盘使用没有限制。但是,项目不能超过 1 GB和单个文件不能超过 100 MB。 cloud-hosted plan 允许无限数量的用户在无限数量的公共和私有项目上进行协作,并且每个存储库有 10GB 的空间限制 Small teams plan 允许 5 个成员加入,公有/私有仓库均免费。

调研持续集成/部署工具

Gitlab CI

1.选取OOpre2Task1课程作业作为本次集成的测试,并利用JUnit对代码进行测试

2.配置.gitlab-ci.yml文件,并上传至gitlab仓库(注:当前因没有权限直接在gitlab创建个人公开仓库,目前利用原OO课程作业仓库调试)利用CI在线编译,在线运行,在线测试

Github Action

1.相同程序部署到github的个人仓库

2.根据文档编写.github/workflows/maven.yml,触发action编译运行

CI/CD相关

1.什么是CI/CD?

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题

2.Gitlab CI特点,特性

GitLab-CI是一套配合GitLab使用的持续集成系统,从GitLab 8.0后就默认集成了GitLab-CI,并且所有项目默认启用,只要在项目仓库的根目录添加 .gitlab-ci.yml 文件,并且配置了Runner,那么每一次MR / push 都会触发CI Pipeline

3.Github Actions特点,特性

actions可以用来作为CI/CD使用,但是它不只是CI/CD,因为它其实是一组docker容器所组成的Workflow,Workflow的触发条件,公共仓库目前仅支持push,私有仓库则支持check_run、create、delete、issue comment, commit comment, pull request等许多事件, 通过这些事件,可以完成除了CI/CD之外的许多自动化操作,例如接收到issue comment之后使用telegram bot发送通知等等

4.CI/CD工具作用分析

  • 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量
  • 开发和测试人员可以共用gitlab的pipeline界面或github的workflow界面, 测试人员能够随时把握代码部署的情况,同时还可以通过交互界面手动启动pipeline(workflow),自己去部署测试,从而节约和开发之间的沟通时间
  • 持续集成可以及早的发现代码中的问题,及早解决
  • 代码库存越是积压,就越得不到生产检验,积压越多,代码间交叉感染的概率越大,下个release的复杂度和风险越高,持续集成可以保证团队开发人员提交代码的质量,减轻了软件发布时的压力

5.CI/CD工具对比

Gitlab CI与Github Actions的系统对比详见Continuous Integration Comparison,在此不再赘述

由于Gitlab的Runner已经预先配置且作业要求中提供了最小示例,以及Github actions的文档较为详细,所以在两个平台部署CI的过程较为顺利,希望随着软工课程的不断推进,可以切实感受到CI/CD带来的便利和对项目质量的提升。

构建之法与CI/CD的更多相关文章

  1. 软工个人阅读作业2 —— 构建之法与CI/CD

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...

  2. 《构建之法》& CI/CD调研

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 2021年软工-个人阅读作业2 我在这个课程的目标是 提升软件开发能力与团队意识 这个作业在哪个具体方面帮助 ...

  3. Linux搭建.net core CI/CD环境

    一.简介 微服务开发中自动化.持续化工程十分重要,在成熟的CI/CD环境中项目团队可以灵活分配,大大提供团队效率.如果还不了解什么是CI/CD,可以先查看相关文章,这里主要介绍环境的搭建,相关原理就不 ...

  4. Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统

    前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...

  5. 【软件工程】《构建之法》 & Git+ & CI/CD

    <构建之法> & Git+ & CI/CD 个人阅读作业#2 项目 内容 本作业所属课程 2020春季软件工程(罗杰 任健) 本作业要求 个人阅读作业#2 我的课程目标 具 ...

  6. 通读《构建之法》与CI/CD工具尝试

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 作业要求 我在这个课程的目标是 积累软件开发经验,提高工程能力 这个作业在哪个具体方面帮助我实现目标 通读课 ...

  7. 用 GitHub Action 构建一套 CI/CD 系统

    ​ 缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...

  8. Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)

    一.说明 1.1 说明 前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-s ...

  9. Azure 实践(4)- CI/CD .netcore项目Docker构建及部署

    上篇已介绍了.netcore项目构建的相关步骤,本篇继续完善 1.什么是CI/CD CI/CD 中的"CI"始终指持续集成,它属于开发人员的自动化流程.成功的 CI 意味着应用代码 ...

随机推荐

  1. Redis常用数据类型及其存储结构(源码篇)

    一.SDS 1,SDS源码解读 sds (Simple Dynamic String),Simple的意思是简单,Dynamic即动态,意味着其具有动态增加空间的能力,扩容不需要使用者关心.Strin ...

  2. 整合mybatis plus

    第一步:导入jar包 导入页面模板引擎,这里我们用的是freemarker <!--mp--> <dependency> <groupId>com.baomidou ...

  3. nacos集群

    本章分析一下nacos集群之间nacos服务器上线,下线原理 每5秒运行定时任务ServerListManager.ServerListUpdater获取新上线的节点或下线的节点 每2秒运行定时任务S ...

  4. wxWidgets源码分析(4) - 消息处理过程

    目录 消息处理过程 消息如何到达wxWidgets Win32消息与wxWidgets消息的转换 菜单消息处理 消息处理链(基于wxEvtHandler) 消息处理链(基于wxWindow) 总结 消 ...

  5. 解决浏览器点击button出现边框问题

    发现问题 本人不懂浏览器的HTML代码 不知道怎么在chrome浏览器的F12之后点到了哪里 点击button的时候就会出现黑色边框 解决 终于发现不是因为动了调试页面,而是动了谷歌浏览器的高级选项, ...

  6. CodeBlocks的安装配置以及使用教程

    CodeBlocks的安装配置以及使用教程 教程写的很啰嗦,本来几句话就能搞定的,但为了照顾到那部分真正的小白还请大家见谅! 一.下载 前往CodeBlocks官网下载带编译器的版本,目前的最新版本为 ...

  7. MyBatis中的Map

    接口 int addUserMap(Map<String, Object> map); Mapper.xml <!-- Map比较灵活 传递的值为Map的key,可以为任何(野路子, ...

  8. 通达OA 页面敏感信息-2013/2015版本

    参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/4.html 漏洞影响 2013.2015版本 复现过程 POC: http://0-sec.or ...

  9. synchronized中锁是怎么升级的

    在JDK1.6以前,使用synchronized就只有一种方式即重量级锁,而在JDK1.6以后,引入了偏向锁,轻量级锁,重量级锁,来减少竞争带来的上下文切换. 锁升级主要依赖对象头中的Mark Wor ...

  10. 读 Kafka 源码写优雅业务代码:配置类

    这个 Kafka 的专题,我会从系统整体架构,设计到代码落地.和大家一起杠源码,学技巧,涨知识.希望大家持续关注一起见证成长! 我相信:技术的道路,十年如一日!十年磨一剑! 往期文章 Kafka 探险 ...