作业三:读《构建之法》1-5章有感

这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2178


在这个愉悦的国庆小长假,我仔细阅读了《构建之法》1-5章,对软件工程这门课有了全新的认识。在阅读过程中我产生了一些疑惑,并对问题进行多方查询,有了自己的见解和分析。

 

第1章:概论

        在这一章我明白所谓的程序就是数据结构+算法、软件即程序+软件工程、软件企业即软件+商业模式。程序包括算法、数据结构是基本功,但是在算法和数据结构之上,软件工程决定了软件的质量,商业模式决定了一个软件企业的成败。这可以说是整个构建之法的核心。每个软件都有自己的生命周期,包括问题定义、可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试以及运行维护共8个阶段。

      在1.1节中,我看了这一段文字“乘坐飞机时,你会看到乘务人员不厌其烦地给你介绍飞机有几个出口,如果氧气罩自动掉下来,应该怎么做。你身下的坐垫是可以漂浮的,飞机还可以在水面上降落,逃离飞机的时候应该怎么跳到气上......但是,有多少人使用过这些‘功能’?如果你买了一张特便宜的机票,登机时,乘务员说‘为了节约成本,本次航班没有那些安全设备,没关系的,反正大家也不会用到......’你还敢坐么”如果我是一名乘客,我一定会为了自己的安全考虑而放弃乘坐这架飞机。此事件引发我对作者提出“试想这样的事发生在我们的程序中,程序正在高速运行,突然发生了一个异常,我们的程序能否正常工作,安然退出,并保证用户的数据不被破坏?”这一问题的思考------软件运行中偶然发生的问题,需要软件工程师来修复。又比如说,一款新的软件发布,接踵而来的是用户反映的众多bug,这时候软件开发团队就需要在最短的时间内调试解决这些问题,否则就会降低用户对他们的期待,更有可能因为一款失败的软件,导致一个企业破产,许多人失业。在我们这个专业的学生毕业之后,往往只凭借着自己会哪些语言,自己的分数等来作为自己进入企业的筹码,但是现代企业需要的不仅仅是这些,他们需要多方面的对软件的考虑,包括会发生哪些问题,这些问题又该怎样解决等,也就是说现在的企业更看重一个人的技术,而不是简答的学历证书。因此,一个合格的程序员和一个好的软件开发人员不仅能够设计出一款符合大众需求的软件,而且能解决软件运行过程中的漏洞。譬如,想让一个发生异常且正高速运行的程序安然退出,并保证用户数据的完整性,可以运用我们之前所学的有关数据库的知识解决问题。首先我们可以通过数据转储和登记日志文件技术建立冗余数据,撤销(UNDO)故障发生时未完成的事务,重做(REDO)已完成的事务来恢复数据,保证用户数据不因系统故障而被破坏。当然,解决问题的方法是多种多样的,这里只是我个人根据所学知识得出的解决策略。学习软件工程的目标绝不仅仅是程序,而是要创造足够好的软件,这个足够好并不是一点漏洞都没有,而是这个软件一定要尽可能地符合大众的需求,并且在将来的一段时间中都能有所发展。没有一个软件是一个人在短时间内就能完成的,它需要一个团队的努力,是在一个长期阶段内逐步完成的。这需要我们在学习过程中,不断思考,不断向他人请教,在团队中扮演好自己的角色,为完成一个足够好的软件而努力。

     就“如何让一个高速运行的程序在发生异常后仍正常工作或者安然退出?”这个问题我查阅了资料,网上都是针对某个应用给出解决方案。譬如,程序FreeEIM.exe 遇到问题异常退出,可以利用SetUnhandledExceptionFilter函数使异常程序重启,正常工作。但是对于别的异常程序又该如何解决?我的困惑是有没有普遍通用的解决方案?


 

第2章:个人技术和流程

       在这一章作者主要介绍了单元测试和回归测试的概念、区别和流程,此外,作者通过PSP简述了软件开发的流程。

      在2.3节中,我看了这一段文字“卡内基梅隆大学的能力成熟度模型(CMM和CMMI),是用来衡量一个团队能力的一套模型”后,有这个问题“能力成熟度模型既然能用来衡量一个开发团队能力的强弱,那么它能衡量单个开发人员的能力吗?”根据上个学期学习的《软件工程导论》中,能力成熟度是用于评价软件机构的软件过程能力成熟度的模型。它的基本思想是,因为问题是管理软件过程的方法不恰当造成的,所以采用新技术并不会自动提高软件生产率和软件质量,应该下大力气改进对软件过程的管理。CMM在改进软件过程中所起的作用主要是,指导软件机构通过确定当前的过程成熟度并识别出对过程改进起关键作用的问题,从而明确过程改进的方向和策略。继而我查询了资料,能力成熟度又分为5个等级,从低到高依次是:初始级、可重复级、已定义级、已管理级和优化级。初始级的软件过程的特征是无序的,有时甚至是混乱的。几乎没有什么过程是经过定义的(即没有一个定型的过程模型),项目能否成功完全取决于开发人员的个人能力。因此处于1级成熟度的软件机构,其过程能力是不可预测的,其软件过程是不稳定的,产品质量只能根据相关人员的个人能力而不是软件机构的过程能力来预测。但我还是不明白,我的困惑是倘若某个简单的项目某软件机构为了节约成本要求有一个技术人员去完成,那就意味着这个软件成熟度永远处于初始级吗?尽管这个开发人员实力很强,开发的软件也符合用户需求。能力成熟度模型引导软件开发机构不断识别出其软件过程的缺陷,并指出应该做哪些改进,但是,它并不提供做这些改进的具体措施。那么,我的困惑是有没有什么更好的模型能提供软件机构对自己开发的软件进行改进的措施呢?  


 

第3章:软件工程师的成长

     在这一章中作者主要讲述了如何成为一名合格优秀的软件工程师,并且列举了一些软件工程师的思维误区。本章内容比较简单,通俗易懂。

     在3.3.1节中,我看了这一段文字“在中国,软件工程师的职业资格考试有:计算机等级考试和全国计算机技术与软件专业技术资格考试。同时,很多公司也提供了针对自己产品的职业认证项目。例如,微软公司有微软认证专家,甲骨文公司有Oracle认证项目。获得了相应公司和行业的认证,工程师就可以更容易地获得相应的工作、合同机会”后,有这个问题“是不是只要拿到了这些证书就能让别人认为我是一名优秀的、合格的软件工程师,毕业之后就一定能找到一份很好的工作?这些证书的含金量究竟有多少?”作为一名软件工程专业的学生,我在大二就拿到了全国计算机等级考试的二级C语言程序设计和三级数据库技术证书。在考证之前我认为自己作为一名IT类的学生,有必要去参加计算机等级考试检测自己掌握专业知识水平的程度。并且我还买了练习书,刷了很多题。结果上了考场发现题目都是从往年的题目中随机抽取出来,再重新整合而成的。因为之前刷了很多往年的考试题,所以我做起来得心应手,一个小时就做完了试题。考完试后我很纳闷,全国计算机等级考试的题目有这种水平吗?将以前的题目拿出来反复考。为此,为了了解其他学生对考取全国计算机等级证书的看法,我查了资料,发现大部分网友都很看中全国计算机等级考试,认为其含金量高。他们的说法是“这是国家级的证书,由国家教育部颁发,终身有效(省级的同等级证书是有年限的),是国家认证你的计算机水平的证明,是用人单位在招聘时考察的标准之一,是你和别人拉开差距,增加优势的利器之一。”也就是说全国计算机等级证书具有一定的权威性和通用性。但是我身边的很多朋友都会告诉我,读计算机企业最重视的不是学历,而是你有没有相关技术,有没有做项目的经验。于是我发现自己虽然通过了相关的计算机等级考试,可是自己并没有单独完成一个项目的经验,甚至不了解做项目开发的流程。我发现自己只是理论知识学得很透彻,却不懂得如何将它们运用到实际软件开发中,实践能力比较差。正如作者所言“此类考试有这样一些局限性:以答题/评分为主要考试形式,没有面对面的考察;考试中每个人单独行动,不能考量团队合作能力;要考虑到通用性和稳定性,考题内容相对滞后于工业界的发展,部分内容相当滞后。”因此,我的困惑是现在的考试都是单人进行的,那么究竟什么样的软件工程类证书才能考察一个人的团队合作能力?计算机学历证书在IT类企业中真的很重要吗?


 

第4章:两人合作

      在这一章中作者主要讲述了如何规范代码,以及强调两人合作编程的重要性。   

     在4.5.2节中,我看了这一段文字“在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平比较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间”后,有这个问题“人和人不尽相同,不同性格类型对合作有多大影响?不同性格的人在各个阶段应该如何应对?”我查询了资料,某位博主提到“如果合作的对象是一个安静、严肃、有责任感的人,那么他会更加的理性与实际,我们就需要给他看一些数据性的东西,跟他去分析可靠性之类的,这样才更能打动他和促进合作。而碰到热情洋溢、富有想象力的人,我们就需要从情感和实际两方面入手,这样更有利于合作。如果对前者只是去跟他谈感情,再加上这个人要是项目的干系人,那合作可能就无法进行了。”所以我认为对不同性格的人,应该有不同的相处方式,否则会给合作造成很大的影响。在与别人合作时,不论在哪个阶段,我们都应该做到:讲究个人卫生,这是一个人的基本素质;感谢对方的提醒;多沟通,相互鼓励;多提问,不要不懂装懂。我就是一个比较内向、慢热、不善交际的人。大一下学期有个C语言大作业,就是需要结对完成。在做这个项目过程中,我和我的搭档好多次都意见不合,甚至有时为了简单的界面设计发生争吵,毕竟女生审美都不一样。后来好在我的搭档比较沉稳、冷静、大方,每次我们吵得不可开交时她仍会耐心跟我讲解,将我的想法带入代码中实现,然后与她提出的想法进行对比。结果我发现,她的思路的确更准确更完美些。因为这次合作我们的大作业最终取得了很不错的成绩。通过个人经验我认为结对编程是个相互学习、相互磨合、循序渐进的过程,在这个过程中彼此必须要相互体谅、相互宽容。试想,当初倘若不是我的搭档一直迁就我,我一个人不可能想出出奇的点子,用户界面更不能做得那么美观。

     除此之外,不是所有性格的人都适合与他人进行合作,像一些内向、不善交际但实力足够的人可以让他们独立搞开发,因为这样也许比结对编程效率更高。但是我仍有一个困惑:究竟哪些项目是不适合结对编程,有具体的项目实例吗?


 

第5章:团队和流程

     在这一章中我了解到许多不同的软件团队模式。软件开发流程包括需求分析、形式化说明、总体设计、详细实现、实现和运行维护,有不同的模型也体现了软件开发过程。本章作者主要介绍TSP、MVP、MBP和RUP之间的优缺点。

     在5.3.4节中,我看了这一段文字“从瀑布模型开始的各种模型都有一个共同点:重计划,重事先设计,重文档表达。这一类的方法中集大成者要算Rational统一过程。RUP把软件开发的各个阶段整合在一个统一的框架里”后,有这个问题“按照作者这种说法,是不是RUP比瀑布模型更具优势,适用于所有软件开发过程?”为了弄明白瀑布模型和RUP之间的优缺点以及两者的区别,我查阅了资料。瀑布模型具有以下特点:阶段间具有顺序性和依赖性;推迟实现的观点;每个阶段都必须完成规定的文档;每个阶段结束前都要对所完成的文档进行评审。它的优点是可强迫开发人员采用规范的方法;严格规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证。它的缺点就是由于瀑布模型几乎完全依赖于书面的规格说明,可能导致最终开发出的软件产品无法真正满足用户需求。它适用于需求明确或很少变更的项目,譬如,汽车防锁死刹车控制系统。Rational统一过程提高了团队生产力;在迭代的开发过程、需求管理、基于组件的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面,针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,确保全体成员共享相同的知识基础;建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。它的缺点是缺少关于软件运行和支持等方面的内容,此外,它没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。Rational统一过程适用于大型的且需求不断变化的复杂软件系统项目。

     由瀑布模型和Rational统一过程的作用范围,引发我的一个困惑:哪个软件过程模式更适合于商业环境下具有有限资源和有限开发时间约束的项目? 


 

总结:通过在假期阅读《构建之法》第1-5章的知识内容,我更加熟悉了软件开发各阶段的具体要求;掌握了不同软件过程模型的优缺点;领悟到了结对编程对提高软件开发效率的作用。同时,我深刻体会到在软件设计和开发中团队协调、团队合作的重要意义,它可以直接决定一个软件的成败。因此,我们应该培养自己与它人的合作能力和沟通能力,开发出符合用户需求、适应时代潮流的软件项目。


 

posted @ 2018-10-04 01:15  林溢漫  阅读(384)  评论(9编辑  收藏  举报