软工个人博客作业1

我的疑问

单元测试应该覆盖所有代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法。

  • 在之前的面向对象设计的课程中,我初步地尝试了使用JUnit对自己的单元进行测试。但是对于测试的对象、粒度和测试的样例数据,我还是不能很好的把握。测试的粒度可以从小到大,从函数、方法到类再到模块,循序渐进。但是测试的样例数据方面,是否存在比较合理而且固定的方法,能够固定地按照一个流程去分析自己的应用,做到不重不漏,覆盖到所有的分支和情况?还是说单纯依靠代码的编写者去“我觉得,这个地方可能存在问题”这样的直觉和经验呢?

(1)驾驶员:写设计文档,进行编码和单元测试等XP开发流程。

(2)领航员:审阅驾驶员的文档、驾驶员对编码等开发流程的执行;考虑单元测试的覆盖程度;是否需要和如何重构;帮助驾驶员解决具体的技术问题。

  • 在这个过程中,我想知道结对编程过程中,是否会发生两者的贡献不匹配的情况。作为领航员,工作较为多元但是在代码数量方面的贡献不如驾驶员大,是否会出现领航员碌碌无为的情况?领航员在工作中更多是提出问题的一方,单从审阅文档进度、考虑测试覆盖的角度来看,领航员和甲方的区别在哪里?

产品负责人主导大家对于这个Backlog 进行 增/删/改 的工作。每一项的时间估计的单位为 “天”.

冲刺订单上的任务不会被分派,而是由团队成员签名认领他们喜爱的任务。 团队成员能主导任务的估计和分配, 他们的能动性得到较大的发挥。

冲刺期间, 每天要开一个每日例会 (SCRUM Meeting), 团队成员大多站着开会, 所以又称每日立会

  • 看完这一段,我越来越觉得敏捷开发对于团队的要求是很高的。不仅仅是团队成员各自的优势长处要互补,覆盖组织、研发、开发、测试、审查等各个方面,而且团队的熟练度必须很高,经历过一段时间的磨合;团队成员各自的积极性也要得到保证。没有这样的团队,很有可能会出现某个任务无人认领、每日例会浮于形式、工作效率不达标等现象。所以敏捷开发的效率似乎并不一定比按其他开发思想的效率高?同时考虑到需求的不断变动性,敏捷的乙方似乎会为了不断地满足甲方而承担更多的工作量?

大部分优秀的团队可以做到两个:

多, 快, 但是不省

多, 省, 但是不快

快, 省, 但是不多

PM 要带领团队选择哪两个是最重要的, 哪一个是可以牺牲的。

  • 在一个团队中,肯定有熟练者和不熟练者,因为最后采取的方案和开发工具很可能并不是所有人都熟悉的,同样的任务熟练者很快完成,但初学者需要花费很多时间来熟悉。那么作为一个PM,遇到这样的矛盾,如何去安排工作,使得初学者也能够得到认同和满足?

在测试中,如果发现问题,我们就得报告,在移山过程模型中,“Bug”是第二个工作项类型。在这一阶段,我们就主要用Bug进行交流。

  • 在实际的运行过程中,用户可能会反映很多不同类型的bug,但是用户对于bug的描述肯定不会非常全面具体。那么此时,在这样一个背景下,是谁负责去复现这个bug并试图找出原因? 如果遇到用户说不清道不明的情况(现实中常常会遇到),是否只有通过地毯式排查才能复现bug?

  • 在多个成员并行开发的过程中,可能遇到需要合并分支的情况(merge),那么在合并的时候如果发生了冲突,是否需要两个人都在场以便沟通冲突的部分如何取舍?我在之前的合作作业中,也经常遇到merge冲突的情况,当时我是通过回避冲突部分,把冲突部分单独另外提交的方式来规避问题;但是遇到对对方代码不熟悉的情况下,我如何去统一冲突呢?

软件和软件工程

软件

  • 该词语最早出现在1953年8月Richard R.Carhart发表的一份兰德公司的研究备忘录之中。
  • 该词最早发表在1958年美国数学家Tukey发表的论文"The Teaching of Concrete Mathematics"之中。

软件工程

  • 这个词最早是由数学与电脑科学先锋- Margaret Hamilton提出的,当时软件工程一词被人们当成笑话,不被重视,但是最终得到的尊重。
  • 数学与电脑科学先锋,一个自学程序设计,并且当上 MIT 软件工程测试实验室主任(也就是为美国太空总署 NASA 开发电脑系统的单位)的女性——Margaret Hamilton,在阿波罗登月计划期间,首先提出了“软件工程“一词。

小故事

Linus在1991年创建了开源的Linux。2002年以前,世界各地的爱好者把pull request通过diff的方式发给Linus,然后由Linus本人通过手工方式进行merge!但是后来代码库太大了,linus忙不过来,社区的弟兄们也觉得这样不科学,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

但是2005年,linux江湖圈里一个叫Andrew的人试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司一怒之下决心要收回Linux社区的免费使用权。

Linus也很犟,自力更生,花了两周时间自己用C写了一个分布式版本控制系统,叫Git。一个月之内,Linux系统的源码已经由Git管理了!

VCS

  • Microsoft TFS

    优点:与VS无缝接合,可使跨职能团队有效处理各种规模的项目,还集成了项目管理、版本控制、BUG 跟踪,能跟踪需求、项目进度

    缺陷:能充分发挥功能的团队、公司的数量极少,硬件要求高,维护复杂

  • Git

    优点:使用http协议或git协议传输,速度很快,轻量,有出色的合并和跟踪能力

    缺点:新手需要记忆大量的命令和概念。代码保密性差。不能够捕捉创意过程和记录创意点子

  • Mercurial

    优点:有revset,扩展性,append only的存储结构,易于掌握,对新手友好
    缺点:分支管理不灵活,branch管理不够方便

  • Apple XCode

    优点:本身是IDE,有比其他版本管理工具更多样性的功能,编译速度极快,自动提供撤消、重做和保存功能,无需编写任何编码

    缺点:仅用于macOS,可能与windows/linux下许多习惯不同,且插件容易因为版本更新而失效。

  • Trac

    优点:非常灵活,可以随心所欲控制可以和SVN集成,权限设置比较完善,且是一个SCM配置管理平台,意味着它有良好的扩充,权限体系完善

    缺点:不支持多项目,需求和缺陷没有分,用 Wiki 来替代 Word 等工具编写文档提高了学习成本,中文支持不好,核心功能很少,需要配合插件使用。

  • Bugzilla

    优点:检索功能强大,中文化支持完整

    缺点:快速搜索结果不准确,只能管理缺陷

git和Mercurial

我对git还是略有了解,用它管理过大大小小至少50个独立完成或多人合作的项目,所以下文不赘述git的使用,只是对Mercurial进行了一些初步的摸索。下文称Mercurial为小汞,因为我发现它叫“水银”,logo也是个水银,控制台命令居然也是个hg

在初步的使用中,发现git和mercurial都是源代码的版本管理软件,他们的用法很相似:

$ hg init 和 $ git init

该命令在当前工作目录下创建一个.hg文件夹,并开始跟踪该文件夹的文件;这点和git是几乎一样的。

$ hg add . 和$ git add .

该命令表示将当前目录下指定文件(.就意味着所有文件),加入版本管理库;使用git时,并不会在控制台回显具体add了哪些文件,所以这点上小汞占优。

$ hg status 和$ git status

小汞的status我感觉就没有git的舒服。它采用的是文本格式的展示,而不是直接打在控制台上。大概格式是Code file,第一位是M代表Modify修改、A代表Add添加、!代表删除,相比git的信息单薄了很多。

$ hg commit 和 $ git commit

该命令表示提交一次更改,这里没有使用-m参数,则进入默认编辑器(Vim)编辑comment。

$ hg diff 和$ git diff

该命令可以看出当前状态下所有文件和上次commit之后的文件之间的差异。可以看到,我在上次的基础上,修改了a.py文件,为其增加了一行print("world")

$ hg log 和$ git log

该命令可以看当前所有历史commit的日志。可以看到我一共提交了两次commit,以及两次commit的用户、时间和描述。这点和git差不多。

但是我查阅资料,发现:

Mercurial一个目录树就是一个分支,需要使用分支就必须clone一份完整的目录树,这样比较浪费空间;Git支持本地分支,在一个目录树里面开无限个分支,切换非常方便迅速。

总的来说,在版本管理上,两者基本的功能都差不多,足以满足80%的需要。相对来说,Mercurial的命令更加少一些,简洁一些;但是分支上的缺点对我来说确实挺难接受的,自己平时也喜欢checkout到一个新分支去尝试新的东西,写一些可以“不负责任”的代码,Mercurial在这点上还是比较不便。

posted @ 2020-03-03 21:10  lzhmark  阅读(212)  评论(1编辑  收藏  举报