项目 | 内容 |
这个作业属于哪个课程 | |
这个作业的要求在哪里 | |
我在这个课程的目标是 | 学习软件工程相关理论,并开发一个自己的软件 |
这个作业在哪个具体方面帮助我实现目标 | 了解了软件工程的基本理论,并引发我进一步思考 |
阅读提问
问题1:关于单元测试的局限性:是否有更好的测试方法?
在单元测试的这一章中,作者讲述了单元测试的必要性以及好的单元测试的标准。
但是我对此产生了疑问。首先,在我写程序的经历中,更多的错误发生在那些复杂的逻辑判断中,而不是最底层的函数/方法中(例如编译器的错误处理,其中有大量的特殊情况)。如果整个代码是一棵树,单元测试相当于只对叶结点进行了检查。然而,那些非叶结点更容易出现错误,这些错误无法在单元测试中被发现。而且,单元测试使用的是小样例,且不采用随机生成的方式,有时即使覆盖到了所有代码,也不能发现错误。此外,单元测试需要耗费大量精力,那么是否有更好的方法呢?
作者还提到了在其他地方采用随机化的测试,如果我们可以将出现错误的数据保存下来,那么为什么不在单元测试中也采用随机数据呢?
问题2:什么是精通?
在技能的反面这一章中,作者用c#编程和魔方两个例子来阐述“技能”与“解决问题”之间的关系。
我的看法和作者不同。我认为算法和语言是两个独立的东西。即使很熟悉某个算法,如果使用不熟悉的语言或者IDE,也会难以实现。同理,即使很熟悉语言,也不能现场发明出算法。魔方同理,有些人拧魔方的手速很快,而另一些人对魔方底层的数学研究深刻,这两个东西也是互相独立的,没有哪个在另一者之上。
这两者可以概括为熟练程度和思维能力。两者兼备肯定是最好的,但是并不是所有人都能做到。如果说思维能力更加重要,那么为什么面试官会去关心面试者的熟练程度呢?
究竟什么算精通?
问题3:在结对编程中,是否能够做到“任何一段代码都至少被两双眼睛看过,两个脑袋思考过”,并及时发现问题?
书中提到,结对编程能够进行不间断的复审,从而发现问题。以我个人的经历,我认为这其实很难做到。在ACM竞赛中,经常会遇到三个人同时debug一份代码,却迟迟找不出一个小bug的情况。这是因为我们在对代码进行debug的时候,很容易出现思维定势,并出现盲区。在结对编程时,有“驾驶员”和“领航员”两个角色,领航员需要更关注整体架构,如果还需要对每一行代码都认真看,肯定会很大的影响效率。
当然,结对编程跟单独编程相比还是有不少优势的,但是如何将这些优势体现出来并不容易。所以应该如何去做,才能及时发现对方代码中可能出现的错误?
问题4:团队中,如何根据成员不同的能力和心态分配角色和任务?
在团队这一章中,作者提到猪/鸡/鹦鹉三种心态以及PM/DEV/QA三种角色。在实际的开发过程中,每个人的能力水平和愿意投入的精力是不同的。而且团队许多成员之间都不太了解,在这种情况下,如何去分配任务等?以及是否需要一个领导者?
问题5:创新的根源,来自于开发者还是用户?
在创新这一章中,作者用了VCD和魔方的两个例子来说明创新的重要性。但是它们中间有一些差别。VCD的创新是开发者通过自己的思考,把一项不起眼的技术发展成的VCD。而魔方的创新中,开发者并没有对魔方结构本身进行创新,他通过猜到了用户的需求获得了成功。那么在实际开发中,应该用哪一种来主导创新呢?