个人作业-Week1
教材疑问
1.在书中我看到这样一句话“单元测试应该覆盖所有的代码路径”,对这句话我个人是不太认同。
在上学期的OO课,有几次作业也让我们用测试工具对代码进行测试,覆盖率要求达到100%,不过在做的过程中,我发现其实有的代码并不一定需要测试到,因为他们理论上是不可能用到的,不过我们为了代码的全面性对他进行了处理。
就比如我读取输入,格式正确返回1,格式错误返回0,我有个方法要用到这个返回值,为了程序的完整,我不仅考虑了返回值为1或0的情况,还考虑了其他返回值。这些其他返回值其实并不可能出现,单元测试我觉得并不一定要去覆盖他们,应该将其作为可选项。
2.对于敏捷开发,我大致浏览了一下,感觉其中需要程序员接到任务后,赶快动手做这条规则有点不太靠谱。
对于小点的工程还可以忍受,但工程一大,前期没有构思好的话,后期改起来会花费太多的时间和精力。我认为,不管是敏捷开发还是一般的开发方式,第一步构思整个程序的大体框架都是非常必要的,花点时间也是非常有价值的。在这一步完成后再进行敏捷开发比较合适。
3.关于交流成本的复杂度,我感觉绝大部分程序都没有书上所说的这么大。
我个人认为,对于程序编写,都是可以设计成类似流水线的这种模式,把要实现的各个功能分区,按照A->B->C…这种流程传递下去,每个开发人员负责一部分,只需要从前一人那里获取中间数据,然后将自己处理得到的数据再传给下一人。这样任务明确,交流成本也比较低。
4.CMMI是什么?
书上只说他是一种衡量软件工程质量的理论,然后说他的一些作用,不过竟然没有大致介绍一下他是如何衡量的,这点让人很困惑。
5.把这本书大致过了一遍,看到了很多原则流程什么的,比如MSF,敏捷开发原则等。
其实我之前根本没接触过这些东西,不过我在写程序的时候也大都用了这些原则流程,毕竟在真正编程时这些东西大家也都能想到。那么问题来了,对于没有经验的编程者,看了这些东西脑子里也不会有什么印象;对那些编程老手,这些东西自己就总结出来了。那么这些东西除了给大家看看还有什么太大的作用?
“软件”
电脑问世初期,人们只是把软件当成为了使计算机完成某个任务所需要的指令的集合,并没有专门对它进行定义。之后到了20世纪50年代,专门卖软件的公司开始增加,规模也越来越大。其中,第一家软件公司CUC逐渐走上正轨后,在1959年首次使用了“软件”一词。
"软件工程"
软件工程一词是在20世纪60年代由数学与电脑科学先锋— Margaret Hamilton提出。当时她负责阿波罗11号的软件编写,工作量非常大,这些软件的编写也需要非常系统而规划的管理,而不仅仅是人们认知中简简单单的写程序。她将其称作软件工程,希望为软件以及那些发明者争取应有的正统性与尊重。
源代码管理软件
1. GitHub
这是我至今接触和使用的唯一一款源程序管理软件,就我个人感觉来说,我觉得他的优缺点如下。
优点:提供Git存储库服务,能够记录下每个阶段的代码,每个参与者的贡献,每次修改的内容,操作也比较简单。在不同程序员之间的交流方面做得也很好。
缺点:功能不完善,比如同时有两个分支分别对不同的代码进行了修改,却只能合并一个。每次修改必须在最新的版本上,可是分支有时候很难收到更新信息,经常导致写好代码之后才发现未下载最新版冲突了。冲突很难解决。
2. Git
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
优点:适合分布式开发,强调个体。公共服务器压力和数据量都不会太大。速度快、灵活,任意两个开发者之间可以很容易的解决冲突。可以离线工作。
缺点:资料少(起码中文资料很少),学习周期相对而言比较长,不符合常规思维。代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
3. Microsoft TFS
百度了一下,感觉这是为了VS而设计的。
优点:任务版上能将需求、项目进度一览无余,对于小团队而言,比甘特图更有用。集成了项目管理、版本控制、BUG 跟踪,能有效实现 SCRUM。能与 VS 无缝接合。
缺点:要求较高,学起来很复杂。整个系统是用 asp 实现的,用浏览器访问相当慢,从 IE上访问、填写各种开发、测试记录,也是很慢。用 XP 系统无法访问,还得是64位的,所以把电脑的整体性能拖下来了。团队的邮件细节配置比较复杂,不关心的项目的变更集也会发邮件。
4. Mercurial
Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,。
优点:易于学习和使用,扩展性强,管理更加轻松,系统更健壮,对网络的依赖性较低。
缺点:速度可能较慢。
5. Bitbucket
BitBucket 是一家源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户。听起来更像是让别人去使用管理软件帮我们管理源代码。
优点:无限制的私有仓库个数,无限制的磁盘空间,同时支持https/ssh,Bug跟踪,API支持,灵活的权限控制,可自定义域名,RSS 修改记录输出,自定义下载。
缺点:在不同的程序员之间进行交流和沟通方面不如GitHub。