软件工程个人博客作业
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 个人博客作业 |
我在这个课程的目标 | 团队完成好的软件,并对自己作出规划 |
这个作业在哪个具体方面帮助我实现目标 | 阅读教材并对软件工程作出思考 |
参考文章和博客 | *,linux中国 |
1、快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上。
问题1:
2.1.1用VSTS写单元测试
注意在单元测试中,VSTS自动为你生成了测试的骨架,但是你还是要做不少事情,最起码要把那些标注为//TODO的事情给做了
我的疑问是为什么所有的单元测试中都是要再额外生成一个测试模块。以下内容节选自百度百科单元测试
1、它是一种验证行为。
程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支援。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更*的对程序进行改进。
2、它是一种设计行为。
编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
3、它是一种编写文档的行为。
单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。
4、它具有回归性。
自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。
如果我们再程序中添加一些输出语句,也可以做到单元测试,并且效率我觉得也不会比新建一个测试模块低。因为在测试模块中我们也是手动构造一些测试样例,然后利用断言来判断模块的正确性。这样其实和运行一遍程序利用标准输入输出和断点等调试没有区别。那么为什么还要花费时间在写单元测试模块上呢?或者说如果我再写每一个模块时就能够保证该模块的正确性,那么我是否还需要写单元测试模块呢?
问题2:
4.5.4如何结对编程
驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
领航员:审阅驾驶员的文档;监督驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。领航员也可以设计TDD中的测试用例。
驾驶员和领航员不断轮换角色,不要连续工作超过一小时,每工作一小时休息15分钟。领航员要控制时间。
还是难以理解结对编程的合作模式。书中要求驾驶员和领航员不断轮换角色,而领航员是需要思考是否重构。那么当两人编程水平不同时,是否会出现一方认为要重构,另一方认为不需要的情况。还有驾驶员互换时,另一方接着编码时,是否会出现难以读懂对方程序的情况。虽然书中有代码规范注释等要求,但即使有这些我认为看懂别人的代码还是需要花费一定的时间的。综上这样模式的结对编程效率会不会还不如一个人高?如果有一个人能够设计好框架,两个人分模块编写各个模块的功能后相互调用,这样的效率会不会好一些?
问题3:
8.3获取用户需求——用户调研
通常,团队收集到的需求都是杂乱无章的,不同的角色从不同角度表达了希望软件能做什么,有什么特点,能解决自己的什么痛苦,或者有什么好玩的地方,等等。
我个人感觉用户需求是一个难以控制的情况。首先用户是站在用户角度和利益方面,而我们开发者是站在开发者的角度。在收集到的需求中,总会出现一些奇奇怪怪,难以实现的需求。那么面对这样的情况,我们是否要花费很大的代价甚至重构去满足某些用户的需求?其次,面对不同用户的不同需求时,我们是否需要全部实现?那如果需求之间出现冲突时,我们要优先实现哪些用户的需求?
问题4:
16.1.4迷思之四:创新者都是一马当先
其实大部分成功的创新者都不是先行者,例如搜索引擎,Google是很晚才进入这个领域的。
确实大多数在某一领域被人们所熟知的公司一般不是做得最早的,而是做的最好的。但是一般情况下在某领域内研究的越早,才越容易创新。如果我作为一个新领域的开发者,我是否要一马当先的在该领域内不断探索?如果我想成为成功的创新者,是要在新领域内不断探索还是在前人的基础上接着探索?
问题5:
16.1.5迷思之五:要成为领域的专家,才能创新
但是统计数据表明,70%的创新者说,他们最成功的创新,是在他们的拿手领域之外发现的。
我认为这个逻辑是否有问题?难道不应该是先有了创新,才会成为领域的专家么?何为专家?
指在学术、技艺等方面有专门技能或专业知识全面的人;特别精通某一学科或某项技艺的有较高造诣的专业人士。
我相信没有任何一个人没有任何创新就能成为领域内的专家。就连学校内的学生们都要求在毕业论文内有创新点,之后有些学生有了更深的造诣,成为领域内的专家。此外,他们最成功的创新在拿手领域之外发现的。我认为他们在拿手领域之外也一定有很深的造诣,有很广的知识面,才能促成他们有着最成功的创新。所以他们在拿手领域之外的领域不可以称为专家么?
2、请问 “软件” 和 “软件工程” 这些词汇是如何出现的 - 何时、何地、何人?
“软件”一词最早在1953年8月,由Richard R.Carhart在RAND Corporation的研究备忘录中提出。
“软件工程”一词由Margaret Hamilton在进行阿波罗登月任务时这期间第一次使用。
3、【附加题】:大家知道了软件和软件工程的起源,请问软件工程发展的过程中有什么你觉得有趣的冷知识和故事?
1965年同年,为了研发一个能处理多任务的操作系统,美国电话及电报公司(AT&T)、通用电器公司(G.E.)及麻省理工学院(MIT)联合研发了一款操作系统——Multics。由于定义的功能极其复杂,最终参与研发的AT&T 公司的贝尔实验室(Bell Labs)退出了该项目。当时贝尔实验室有个工程师叫做肯·汤普森(Ken Thompson)正在负责为Multics操作系统写一个游戏,但是项目中止了,汤普森没法申请使用造价昂贵的计算机,也没有了可以使用的操作系统。这时候这个极客竟然用一台破旧的小型机(这时候的小型机依然很大)上成功用汇编语言完成了操作系统的编写。汤普森的同事觉得他这个系统写得烂透了,给他开玩笑说,这么烂的系统就叫Unics吧(Multics多任务,Unics单一任务)。而汤普森的另一个同事丹尼斯·里奇(Dennis Ritchie)确对Unics很感兴趣,为了使用汇编写的操作系统能够在多种设备上移植,Dennis开发了一种大名鼎鼎的语言C语言,并把Unics改写了一遍。从此Unix与C语言在这个世界诞生,影响着整个计算机时代的发展。
4、上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?
Microsoft TFS
优点:任务版上能将需求、项目进度一览无余,集成了项目管理、版本控制、BUG 跟踪,与vs相容较好。
缺点:只是一个团体完成项目的工具,在源代码管理方面有些问题。搭建、维护tfs比较复杂,硬件要求也比较高。
Git和GitHub
优点:开源免费,让系统得到更好的进化,免费则吸引了更大的用户群体,形成一个良性循环。分布式系统,可以让用户有更大的主动性和发挥空间,对服务器依赖降低到最低限度。速度快体积小,复制黏贴占用空间大,而Git采用快照方式,创建和切换分支速度非常快。
缺点:学习代价和周期相对较长,中文资料较少,代码保密性差,一旦把整个库克隆下来就可以完全公开所有代码和版本信息。
Mercurial
优点:学习曲线相对平缓,支持windows,记录不容侵犯。
缺点:与Git相比功能相对较少,分支功能少。
Bitbucket
优点:免费支持私有仓库,同时支持hg/git。
缺点:知名度不够,使用人数相比git较少。
Trac
优点:有良好的扩充性,权限体系比较完备,非常灵活,可以随心所欲的定制,可以和TortoiseSVN集成。
缺点:不支持多项目,需求和缺陷没有分离,用 wiki 来替代 Word 等工具编写文档对于产品策划来说门槛太高了,中文化不完整,美术人员接触起来困难重重,不显示中文名,本地化做得很差,核心功能很少,不安装插件基本上没法用。
Bugzilla
优点:BUGZILLA不收费,BUGZILLA现在有中文版支持。
缺点:BUGZILLA只能管理缺陷。
Apple XCode
优点:可以自动创建分类图表。自动提供撤消、重做和保存功能,无需编写任何编码。
缺点:更新版本后,某个插件可能会失效。
使用人数:
Github:3100万人
Bitbucket:500万人
Microsoft TFS:370万人
5、调查完目前流行的源程序版本管理软件和项目管理软件后,请你选择其中至少2个软件来进行动手实践
GitHub
如图这是我将本地仓库上传到Github时做的简单的测试。需要和Git一起使用,可以实现多人对项目的共同管理,每一个都可以清晰及时的看到版本的更替,是多人项目很重要的版本管理软件。但界面是英文的,而且有时会出现SSH失效的情况,所以我一般用http上传。
Git
如图这是我上传两次的命令。可以记录每一次版本更替的名字并记录修改内容,还有git checkout等指令可以新建分支实现对项目不同方向的更新与拓展。唯一的问题是指令较多,学习时间较长,目前我也只是会一些简单的版本控制,还有许多强大的功能需要逐步学习。