第一次阅读作业

一、阅读教材后提出问题

1、关于第一章中的“软件的非连续性”

作者在讲解软件开发提速中存在的难题时提到了“软件的非连续性”,具体描述是这样的

  1. 非连续性(Discontinuity)

人们比较容易理解连续的系统:增加输入,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输入上很小的变化,会引起输出上极大的变化

我理解的非连续性是“计算机的非连续性”,也就是我们常规的计算机采用的都是离散的运算,无法真正表示连续的数据和模型,但这是怎样影响软件的开发速度呢?又或者说这里的“非连续”具体指的是什么呢?

2、关于第二章中提到的“单元测试”

作者在讲解单元测试的技巧和作用时,多次强调了单元测试的路径覆盖率

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

我曾阅读过Kent Beck大师写的Test-Driven Development: By Example,其中对单元测试的覆盖率有这样的解读

不要测试过多代码

这是一条放之四海而皆准的普遍真理。在利用单元测试核心代码中我看到许多有价值部分。创建这些代码我更多的是根据TDD原则创建而来(尤其是没有产生错误的代码及没有失败的测试)。但是我并不把100% 的代码覆盖率作为最终目标,因为这样没有任何意义。我想,总会有相当多的代码不只是适用于单元测试,即协调/组织类型的代码(我们称之为组成节点将其作为组成root的引用),它们需要一些依赖关系,通过调用几种方法,把代码从这里移植到那里,无需添加任何逻辑,而无需真正干扰数据。由于其沉重的mocks和stubs 的使用,这种编写测试的代码比代码本身要复杂的多。

我完全同意作者对单元测试的重视和强调,因为测试是开发的保障,但在实际开发中,确实存在一些代码因本身十分简单而并不需要过多的测试,甚至根本不需要测试,也有一些代码因为是历史遗留代码或是高危代码而需要着重的测试,我们是否应该追求100%的覆盖率呢?又应该如何平衡测试的重心呢?

3、关于第四章中提到的“结对编程”

作者在书中提到了下面这个问题

身旁的这个家伙老是问问题,他/她不会看书么?我都无法专心工作了

这种情况一般出现在结对两人的水平有差异的时候,对于这个问题,作者给出了解答

每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方 面水平较高的那一位。

在企业管理层次上,结对能更有效地交流,相互学习和传递经验,分享知识,能更好地应对人员流动

我对上面的陈述在现实中是否存在留有疑问,现在的企业生产环境十分紧张,企业往往愿意直接招聘高水平的人才然后直接投入困难的工作,而并不倾向于培养新人,同时也存在老人排挤新人等情况,这种开发模式真的在企业生产环境中有落地吗?

4、关于第十六章中提到的“要成为领域的专家,才能创新”

作者对于这个观点的看法是这样的

这个想法看起来没什么错,我们不就是为了成为某个领域的专家,才来上学,拿学位,希望拿到学位之后成为专家,然后再开始这个领域的创新?但是统计数据表明,70%的创新者说,他们最成功的创新,是在他们的拿手领域之外发现的。

之后作者举出了HTTP的诞生阿里巴巴的诞生等例子,佐证上面的观点。

但是这些例子中有一些共同点,这些创始人大多只是提出了创意,而最终产品的落地依然要依靠专业人士的参与,没有专业人士的参与也仅能是自己的一番空想。此外,这些创新多是在一些空白领域提出的,例如,马云提出阿里的时候,国内并没有电商领域,而倘若在一些既有领域,如深度学习领域,没有相当的学术功底是不可能提出创造性的学术创新的,所以关于这一方面我不敢完全苟同。

5、关于第十七章中提到的“磨合阶段”

作者介绍了团队合作的几个阶段,其中对“磨合阶段”的描述如下

磨合阶段(Storming)就像一个人的青少年时期,充满了对个人、同伴和团队的 疑惑和冲突。团队中的一团和气只能维持一小段时间,大家不得不认真地面对问题,开展讨论。随着讨论的深入,有些人会沉不住气,就会出现小的意见分歧和冲突。

那么如何判断一个团队是处于“磨合阶段”还是说这个团队的人员配置本身真的存在问题呢?

二、“软件” 和 “软件工程” 这些词汇是如何出现的

  • 软件最早是由Alan Turing于1935年在他的论文Computable numbers with an application to the Entscheidungsproblem (decision problem)中提出,因世界上第一台电子计算机在1941年才出现,所以图灵提出的只是软件理论。在工程环境中,最早的“软件”一词的发表是在1953年8月,Richard R. Carhart在RAND Corporation的研究备忘录中发表的。
  • “软件工程”最早出现于1965年6月出版的“COMPUTERS and AUTOMATION”中。玛格丽特·汉密尔顿(Margaret Hamilton)第一次提出了这个名词,尽管最初这个名词的提出并不被人们理解,但最终软件学科确实得到了应有的尊重。

三、软件工程发展的过程中有趣的冷知识和故事

游戏开发应该也属于软件工程的范畴吧,下面分享一个关于史上第一个游戏彩蛋的故事

1978年,当时家用主机游戏市场的老大雅达利刚刚被华纳通讯收购,新老板Raymond Kassar走马上任。

这位大哥来到雅达利之前,在当时数一数二的纺织品公司当老板。或许是习惯了压榨工人,他到了雅达利之后,也不拿游戏程序员当回事。

他上任后,制作人和程序员都被当做“公司资产”,所有卡带上一律全标“雅达利”,不允许把制作人等的名字印在包装或卡带上。

不仅如此,所有参与制作游戏的人都没有版权分成,只有一份死工资,程序员日子过得非常酸苦。

故事的主人公Warren Robinett(沃伦·宾耐特)就是这群程序员中的一员,他当时正在研发第一个动作冒险游戏《冒险》(Adventure)。

沃伦越努力工作越憋屈,最后他终于想出了一个主意:你不是不让我们署名吗?那我在游戏里设计一个隐藏关卡,在游戏里面写上“Created by Warren Robinett”(沃伦·宾耐特制作)。

沃伦写上自己的名字还不过瘾,他特别地把这两行字添加了闪烁效果。

img

史上第一个游戏彩蛋就这样诞生了。

参考链接:第一个游戏彩蛋的诞生告诉我们:没事别惹程序员

四、目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点

1、用户数量与热度

Name Users Projects Alexa rank (lower = more popular)
Assembla Unknown 526,581+[45] 23,052 as of 9 September 2019[46]
Bitbucket 5,000,000[47] Unknown 989 as of 9 September 2019[48]
Buddy Unknown Unknown 73,518 as of 9 September 2019[49]
CloudForge Unknown Unknown 339,271 as of 9 September 2019[50]
Gitea Unknown Unknown 209,697 as of 9 September 2019[51]
GitHub 31,000,000[52] 100,000,000[52] 65 as of 9 September 2019[53]
GitLab 100,000[54] 546,000[55][k] 2,146 as of 9 September 2019[56]
GNU Savannah 93,346[57] 3,848[57] 100,244 as of 9 September 2019[58]
Launchpad 3,965,288[59] 40,881[60] 12,344 as of 9 September 2019[61]
OSDN 54,826[62] 6,294[62] 8,529 as of 9 September 2019[63]
Ourproject.org 6,353[64] 1,846[64] 1,191,954 as of 9 September 2019[65]
OW2 Consortium Unknown Unknown 610,052 as of 9 September 2019[66]
Rosetta code Unknown Unknown 62,045 as of 9 September 2019[67]
SEUL Unknown Unknown 1,268,571 as of 9 September 2019[68]
SourceForge 3,700,000[69] 500,000[69] 407 as of 9 September 2019[70]

2、工具特点

  • Microsoft TFS

    • 优点:
      • 任务版上能将需求、项目进度一览无余
      • 集成了项目管理、版本控制、BUG 跟踪,能有效实现 SCRUM,能与 VS 无缝接合。
    • 缺点:
      • 搭建、维护tfs比较复杂
      • 硬件要求比较高。
  • GitHub

    • 优点:
      • GitHub是一个非常万能的工具。对于任何大小的项目,他都是理想的工具。
      • 他也是伟大的web工作流工具。首先,他可以作为一个版本控制系统和协作工具,用它来发布工作。利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。
      • 他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。
      • 代码不需要保存在本地或者服务器。
      • 你可以按自己的需要恢复、提交出现问题、恢复任何形式的代码,可以避免很多麻烦。
    • 缺点:
      • 不擅于捕捉创意过程和记录创意点子。
      • 不擅于跟踪设计。
      • 对GUI的支持不是很好。
      • 学习成本相对较高。
  • Trac

    • 优点:
      • Trac做一个SCM配置管理平台,意味着它有良好的扩充
      • Trac的权限体系是比较完备的设计
      • 非常灵活,可以随心所欲的定制,可以和TortoiseSVN集成。
    • 缺点:
      • 不支持多项目
      • 需求和缺陷没有分
      • 用 wiki 来替代 Word 等工具编写文档提高了学习成本
      • 中文化不完整
      • 不显示中文
      • 核心功能很少,需要配合插件使用。
  • BUGZILLA

    • 优点:
      • BUGZILLA不收费
      • BUGZILLA现在有中文版支持
    • 缺点:
      • BUGZILLA只能管理缺陷
  • Apple XCode:

    • 优点:
      • 可以自动创建分类图表。
      • 自动提供撤消、重做和保存功能,无需编写任何编码。
    • 缺点:
      • 更新版本后,某个插件可能会失效。

参考:https://www.cnblogs.com/yuyue1216/p/5281544.html

3、个人使用经验

(一)Git

我个人使用Git作为管理工具是比较多的,主流IDE基本上都对Git有插件支持,即使不是很熟悉Git的操作也可以使用插件的GUI来进行操作

img

Git的一大优势我认为是GitHub等Web项目对Git的支持,代码的云端保存使得多人合作变得更加容易。即使是在线办公,异地办公都可以轻松应对。

就我个人使用习惯而言,我有一台桌面计算机和一台笔记本计算机,经常有时在不同的机子上工作,用GitHub做同步工作就十分方便。

此外Git的PR也十分符合软件开发的流程,每个人Fork出自己的分支,在自己的分支进行commit,待某个功能完成后进行PR操作,让相关人员进行代码复审后签入,既保证了个人的开发不会影响整体环境,也实现了代码复审流程。

下面是一个简单的使用流程(本人网名Nocturne在图中有出现)

git

关于Git的使用,有一个不错的教程,下附链接,可以帮助快速入门Git

https://git-scm.com/book/zh/v2

此外,GitHub上有一个开源项目GitHug,可以通过闯关的方式学习Git的使用,有兴趣的话可以了解一下

(二)SVN

这个小乌龟是我最先接触的代码管理工具,但是感觉个人使用的话比Git要麻烦,因为它是一个CS架构的软件,个人用的话还需要在自己的主机上开启服务器,我是不太喜欢这种方式的,太重了,但是作为企业使用的话还是没有问题的,因为可以单独拿出一台服务器做代码管理服务器。

下载

首先下载安装两个安装包,Subversion是客户端,Tortoise是服务端

安装完成

装好之后大概是这样的(至此应该可以证明是我做的了吧,后面的只截取了控制台,本人网名Nocturne)

然后选择一个目录作为代码库的目录,这里出于简单,直接用桌面了

启动服务器

然后另开一个终端,签出库,添加文件,提交修改

初始版本签出

结果png

至此,一次修改就成功提交了。

整体来说使用体验是不错的,但是部署体验较差。

原文地址:https://www.cnblogs.com/Nocturne/p/12382217.html