第1次软工作业

项目 内容
所属课程 2019春季计算机学院软件工程(任健)(北京航空航天大学)
作业要求 这里
课程目标 提升自己的编程水平,拿一个合适的分数
这个作业在哪个具体方面帮助我实现目标 对软件工程有一个简单的了解,查了很多资料

1. 快速看完整部教材,列出你仍然不懂的5到10个问题。

我觉得这本书写的十分好,内容由易到难,循序渐进,十分适合对这方面还没有什么太多了解的初学者使用。我在第一遍快速阅读本书时觉得没有什么太大的疑问,大部分内容都言之有理,书籍质量十分高。但是题目要求列出至少5个不懂的问题,因此我又比较仔细地读了一遍全书,提出了这些问题:

1. 关于结对编程和代码复审

书中这样提到了这样一段话:
既然代码复审能发现这么多问题,有这么好的效果,如果我们每时每刻都处在代码复审的状态,那不是很好么?事实上,极限编程(Extreme Pro-gramming)正是这一思想的体现—为什么不把一些卓有成效的开发方法用到极致(Extreme),让我们无时不刻地使用它们?
书中说结对编程是一种进化到极致的代码复审,相当于无时无刻不在代码复审。众所周知代码复审能找到许多问题,可是无时无刻的代码复审真的效率更高吗?我觉得结对编程还要面对两个人思路不同,理解速度不同,写代码速度和思考的速度不同等问题。比如逻辑简单,难度低,出bug概率低或者之前写过类似的功能的部分,多人并行的效率是否更高呢?我觉得一个程序核心代码使用结对编程,非核心部分分开编写并测试效率是不是更高呢?

2. 软件开发流程(5.3章)

我之前曾经上过外系的一门选修课:系统工程概论。我认为软件开发也是一门系统工程,比如系统工程中常见的五个阶段以及经典的V字模型:结构分解与定义,结构综合与验证与软件开发过程也有相通之处。我比较好奇系统工程的方法和书中的软件开发流程的关系,以及敏捷开发是否是比系统工程方法更先进。

3. 目标人群与大胆做减法

书中在第12章中提出要找准目标人群,同时也说大家平时都说要向某某大师或某某产品学习,把最重要的功能做好交给用户,把那些无关紧要的功能藏起来,做减法…但是做减法适应更多人群可能也会失去原来目标人群的兴趣,例如减去了原来很有意思的功能。在经济管理中我们了解到了有一种需求是兴奋需求,能极大的刺激人们的购买欲望,可是在这里它无疑是最容易被做减法砍掉的。那么我们应该如何确定到底该减什么?

4. 关于创新(16章)

书中这样提到了创新:但是统计数据表明,70%的创新者说,他们最成功的创新,是在他们的拿手领域之外发现的。蒂姆·伯纳斯-李是一个物理学家,他在1989年3月提出了一个想法,想利用超文本(HyperText)实现方便的信息共享和更新。他的老板看了之后,说"Vague, but exciting."这里有两个问题,一是如何保证自己的创新被采纳。如果创新者的创新是在他们的拿手领域之外发现的,那么该如何说服那些领域内大佬听取自己的创新?第二个问题是举例不妥。蒂姆·伯纳斯-李实际上在开发超文本之前是一个软件工程师。根据 维基百科 毕业后,伯纳斯-李在多塞特郡普尔的Plessey电信公司担任工程师。1978年,他加入多塞特郡芬当的D. G. Nash公司,替打印机编写了排版软件. 虽然他是物理学士学位,但是看上去他毕业以后就转行了,并且在上学期间自己组装了电脑。 而且他加入CERN是作为独立承包商而不是一个物理学士毕业生。

5. 关于团队(17章)

在17章中讲了团队合作的几个阶段,比如假团队什么的。那么在实际遇到了假团队时应该主动走人或者撕破脸吗?会不会错失磨合成真团队的机会,或者让自己在他人口中的名声变差?还是说应该撑下去等着呢?这个期限又是多少?

2. 请问 “软件” 和 “软件工程” 这些词汇是如何出现的 - 何时、何地、何人?

Tukey's 1958 paper "The Teaching of Concrete Mathematics" contained the earliest known usage of the term "software" found in a search of JSTOR's electronic archives, predating the OED's citation by two years.
The earliest known publication of the term "software" in an engineering context was in August 1953 by Richard R. Carhart, in a Rand Corporation Research Memorandum.
根据 维基百科 的内容,软件这个单词早在上世纪五十年代就已经出现。Richard R. Carhart 或 John Tukey 被认为是最早提出该概念的人。
而根据 这篇博客 中的内容,
你是在这段期间发明了“软件工程”一词吗?
A:软件在这个计划的初期还被当作初初学步的孩子一般对待,完全不像其他工程学科;例如像硬件工程那样的受到重视,而且在大家的眼光中他就像是艺术、魔术一般,而不是一门科学。
我一直以来坚信这项发明流着艺术与科学的血液,虽然当时很少人是这么想。因此,我致力于为软件以及那些发明者争取应有的正统性与尊重,所以我开始使用“软件工程”这样的字眼来将之与硬件还有其他工程学类做出区别。
当我第一次使用这样的语词时,大家都觉得有些好笑,甚至有很长一段时间被当作笑话。他们常笑我极端的想法。但最终,软件学科确实得到了应有的尊重!

Margaret Hamilton 被认为是软件工程一词的发明者,她1969年左右开发阿波罗11号程序时发明了该词。
然而,根据 维基百科 中的内容,软件工程这个词可能还有其他许多发明者。
The origins of the term "software engineering" have been attributed to various sources. The term "software engineering" appeared in a list of services offered by companies in the June 1965 issue of COMPUTERS and AUTOMATION and was used more formally in the August 1966 issue of Communications of the ACM (Volume 9, number 8) “letter to the ACM membership” by the ACM President Anthony A. Oettinger;, it is also associated with the title of a NATO conference in 1968 by Professor Friedrich L. Bauer, the first conference on software engineering. Margaret Hamilton is the person who came up with the idea of naming the discipline, “software engineering”, as a way of giving it legitimacy. At the time there was perceived to be a "software crisis".The 40th International Conference on Software Engineering (ICSE 2018) celebrates 50 years of "Software Engineering" with the Plenary Sessions' keynotes of Frederick Brooks and Margaret Hamilton.
我更倾向于这些词汇是一个群体在交流时自发形成的共识,是一个群体的共同产物,而没有一个特定的创造者。

3. 【附加题】:大家知道了软件和软件工程的起源,请问软件工程发展的过程中有什么你觉得有趣的冷知识和故事?

我想到了Ken Thompson 在UNIX和编译器插入后门的故事了。我讲故事的水平比较低,因此就直接引用别人讲的故事了。
Ken爷爷有段佳话:装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。很快大家就发现Ken爷爷总能进入他们的帐户,获得最高权限。Bell Lab里的科学家都心比天高,当然被搞得郁闷无比。于是有高手怒了,跳出来分析了UNIX代码,找到后门,修改代码,然后重新编译了整个UNIX。就在大家都以为“这个世界清净了”的时候,他们发现Ken爷爷还是轻而易举地拿到他们的帐户权限,百思不解后,只好继续郁闷。谁知道这一郁闷,就郁闷了14年,直到Ken爷爷获得图灵奖之后,发表自己获奖感言时道出个其中缘由。原来,代码里的确有后门,但后门不在Unix代码里,而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码,就自动生成后门代码。而整个Bell Lab的人,都是用Ken爷爷的C编译器。
参考来源: Ken Thompson的故事 , The Ken Thompson Hack

4. 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?

目前流行的源程序版本管理软件有 Git, SVN, Microsoft TFS, Mercurial, Trac 等。由于我没有使用过Git以外的工具,下面的内容优缺点的部分主要是对网上资料的整理和总结。

使用人数估计

我找到了StackOverflow公布的 2017 2018 年的调查数据,其中包括了对于所使用的版本管理工具的调查。我没有找到原始数据,因此以截图的形式给出。
2018-all.PNG
2018-prof.PNG
2017-all.PNG
2017-prof.PNG
由图中可见无论是否是专业开发者,Git的用户遥遥领先并不断增加,而其他版本管理工具都比较少。可见Git确实有其出众之处。

优缺点

维基百科:版本控制软件比较 中列举了详细的各种版本控制软件比较,包括支持功能,维护状态,用户界面,历史与用户等等,然而有些过于专业了。

Git

一个常见的版本控制软件
优点主要有:

  • 分支切换快,分支都在本地保存,适合小实验。
  • 支持广泛,被大量现代IDE支持,使用起来方便。
  • git更加分布式,容灾好。

缺点有:

  • 保密性不够好,容易不小心泄露程序中的账号,密码,开发机路径等,而删除这些敏感信息时要把每个commit都检查一遍。
  • 分布式同样导致了敏感信息一旦被clone,就会在某处留下备份。

SVN

优点:

  • 对中文支持好,操作简单,使用没有难度,美工人员,产品人员,测试人员,实施人员都可轻松上手。
  • 使用界面统一,功能完善,操作方便。
  • 有严格的权限管理

缺点:

  • 不适合代码管理(适合项目管理)
  • 使用中心服务器,容灾较差。

Microsoft TFS

优点:

  • TFS是一个应用软件生命周期管理(ALM)软件,是一个软件研发平台产品,其功能覆盖了软件研发过程中的所有环节(包括源代码管理)和所有角色
  • 比SVN更加易用
  • 支持代码评审,bug追踪等复杂功能
  • 支持Git等,有扩展性

缺点:

  • 搭建复杂,硬件需求较高

Mercurial

优点:

  • 更轻松的管理。
  • 采用分布式系统,更健壮。
  • 对网络的依赖性更低。

缺点:

  • Mercurial仓库中尚不支持Pack操作,当仓库中小文件非常多的时候,分散存储会导致空间浪费
  • 以Revlog方式存储的changelog,子版本与父母版本之间是通过Revlog字段p1和p2进行链接的,有被篡改的风险。
  • Mercurial一开始的设计是不支持分支操作的,如果需要分支,就需要重新克隆Mercurial仓库。

Trac

优点:

  • 非常灵活

缺点

  • 功能较弱

题目中还提到了Github, Bitbucket, Bugzilla, Rational, Apple XCode等。其中Github和Bitbucket是网络源代码托管服务,区别是更加注重于公开仓库与私有仓库,Bugzilla是用于软件缺陷的追踪管理网络程序。Rational 好像是一个IBM开发的专有软件,考虑到IBM软件如SPSS的模式,这应该是一个专业性很强的平台。Apple XCode好像是一个IDE,支持主流版本管理系统。
参考资料:SVN和Git 介绍,区别,优缺点,适用范围总结,比较TFS与SVN,你必须知道的10点区别,管理软件的优缺点,Mercurial与TortoiseHg简介,分布式版本控制系统Mercurial介绍与使用小记,CVS,GIT,Mercurial和SVN比较,分布式版本管理工具的内涵【二】Mercurial篇

posted @ 2019-03-02 16:58  zrst  阅读(323)  评论(2编辑  收藏  举报