问题一:
**问题来源:**书40页
**问题说明:**单元测试必须由最熟悉代码的人(程序的作者)来写:代码的作者最了解代码的目的,特点和实现的局限性。所以,写单元测试没有比作者更合适的人选了。
**作者观点:**如果一个连到单元测试都没时间做,那么你也没有时间写好这个功能。在一些极限编程的方法中,是可以考虑让别人来做单元测试的,但是,程序的作者还是要对单元程序测试负责。
**我的疑惑:**程序单元测试不应该仅仅由程序的作者来测,而且其他人测试的效果要比原作者更好。现在企业大多都招聘代码测试人员,如果代码和测试都由一个人去做,那么软件的分工是不是不利于流水化,那么软件工程的任务很多都可以由最熟悉的人去做,为什么还需要团队去共同完成一个项目。这样失去了分工和交流的意义。而且,对于经验丰富的程序员本身,程序出现单元结果不正确的可能远比边缘考虑缺失的可能性大,而一个专业的有经验的测试人员更有利于对程序完整性和健壮性的测试。如果仅仅说要一个输入一个输出的正确,那么就完全可以使用机器化测试了,何必使用程序的作者。
**查阅结果:**通过对单元测试的查阅,感觉作者说的很有道理。单元测试由程序员本身完成,并没有浪费很多时间,单元测试仅仅是证明了这些代码做了什么单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。要进行充分的单元测试,应专门编写测试代码,并与产品代码隔离。我认为,比较简单的办法是为产品工程建立对应的测试工程,为每个类建立对应的测试类,为每个函数(很简单的除外)建立测试函数。程序员的单元测试是简单的单元测试,是十分必要的,能够为以后的测试提供方便。

问题二:
**问题来源:**书70页 案例四
**问题说明:**程序员消费原计划三天完成某个任务,现在是第三天的下午,他马上就可以做完。但是在实现功能的过程中,他越来越意识到自己原来的设计中的弱点。他应该采取另一个办法,才能避免后面集成阶段的额外工作。但是他如果现在就改弦更张,那势必要影响自己原来的估计的准确性,并且会花费额外的时间,这样他的老板,同事都会因此看不起他,他应该按部就班地按既定计划设计完成,最后花在后续的集成上。他应该怎么做。
**作者观点:**作者留给读者思考,并没有给出很标准的答案。
我的观点:在我看来,要考虑到后续集成时间与更改源程序的时间差异,找到更优化的方式。同时本案例也说明了做出一个详细需求分析以及做一个系统的全面的程序设计的重要性。
**查阅资料:**通过查阅资料,我更加感受到了学习软件工程对于大型程序设计的重要性,做出一个详细需求分析以及做一个系统的全面的程序设计是十分必要的。让我感兴趣的是12306发生的软件危机的时间,程序设计的失误会导致后续工作的额外工作带来更多的资金与时间上的花销。因此,我们面对小飞同样的问题,要考虑到资金,用户需求,软件的使用年限和维护成本的对比,面对此类问题及时提出问题,及时的计算预期成本,使程序的设计带来更好的收益和效果。

问题三:
**问题来源:**书228-229页
**问题说明:**形式化的方法与文学化编程
形式化的方法( Formal Method):很多软件需求(例如计算机语言的编译器)可以抽象为对符号的运算和变换,很多软件的某些核心功能需要严密地验证,保证没有问题。一些科学家一直在努力,希望用无歧义的、形式化,的语言描述我们要解决的问题,然后用严密的数学推理和变换一步一步把软件实现出来,或者,证明我们的实现的确完整和正确地解决了问题。在这个领域一个比较成熟和经过实践考验的方,法是Vienna Development Method ( VDM ) 。
文学化编程( Literate Programming):程序员在写程序的时候,要理解在文档中的需求,同时还要在程序里写相关的注释,这些不同目的的“写作”各有价值,但是一旦需求或程序发生变化,这些不同的,文档很难保持同步。更不用说程序员最常见的毛病“我以后会加上注释的…”Donald Knuth在20世纪70年代末开始尝试并提倡Literate Programming的思想并在自己的软件项目中身体力行。这一方法和常见的“写程序,时不时加上一些注释”相反,它是“写文, ”档,时不时有些代码”。它使用了宏( Macro )来进行抽象和信息隐藏。通过工具的支持,它,的源代码可以提取出让计算机编译执行的部分(叫Tangle) ,以及文档(叫 Weave ) 。
我的观点::我觉得形式化编程与文学化编程把软件工程当成一门艺术,或是纯理论知识,或是纯文学知识。他们没有把软件工程当成是一门技术。人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些,相关的技术和过程统一到一个体系中,叫“软件开发流程” 。作者在第一章提出过软件工程的定义和他认为的软件工程。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。根据我们对软件特性及工程这一概念的了解,可以看到,计算机科学中的理论研究部分,大多可以从形式上证明,与数学、离散数学、数理逻辑密切相关;计算机科学中与实践相关的部分,都和数据以及其他学科发生关系;软件工程则和人的行为、现实社会的需求息息相关。软件工程的研究目标(软件的开发、运营和维护)都有“人”出现,这些“人”可以是项目需求的提,供者,可以是软件的开发人员,还可以是软件的用户。这一特征与其他计算机科学的子领域明显不同。其实,在任何科学领域中,都有偏理论的子领域和偏应用的子领域(例如数学与应用数学) ,当偏应用的领域得到长足发展之后,就会更多地被大家所熟知,甚至成为一门独立的学科。
然后形式化的方法让软件工程成为的纯数学,机械的逻辑行为,而文学化的方法让软件工程成为了大量书写项目说明书的项目,使得软件说明成为的主导,失去了软件说明是为了更好开发项目的初衷。另外,我觉得本文前面提到表达控制流和统一表达方式这种规范就很好,让说明书具有的一定的规范和流程,让阅读者通过简单模糊的学习就可以让好的进行沟通。

10-07 12:32