首页 > 技术文章 > 个人学期总结

nwnu-liul 2018-07-12 19:54 原文

一、学期初,实验一中的任务4,大家拟定了5个准备从课程学习中找到答案的问题,通过一个学期的学习,相信大家已经有了答案,请根据自己的学习实践回答自己当初提的问题,并提出一个新的问题。

问题一:《构建之法》中提到了“断言”,但是叙述较少,到底什么是断言?断言和错误处理有什么关系?

  编写代码时,如果程序员相信在程序中的某个特定点某表达式值(布尔式)为真,可将其标为断言(assert)。

  举个栗子:

  public class AssertionDemo{

     public static void main(String[]args){

        int i; int sum=0;

        for(i=0;i<10;i++){  sum+=i;    }

        assert i==10;

        assert sum>10&&sum<5*10:"sum is "+sum;

     }

  }

  上述程序中语句assert i==10断言i的值为10,如果i的值不为10将抛出AssertionError异常。语句assert sum>10&&sum<5*10:"sum is "+sum断言sum<5*10,如果为false,将抛出带有消息"sum is "+sum的AssertionError异常。

  如果肯定某件事一定要发生,则可以使用断言;如果这件事有别的可能,这时就要写代码来处理可能发生的错误情况。

  由于可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

问题二:软件开发有流程,硬件也有生产的流程,那么软件生产流程和硬件生产流程的区别是什么?      

  首先第一点是生产模式上的区别,小米手机的生产是流水线作业,设计团队设计出一款新手机,那么就可以批量生产,而软件的开发一般都是有针对性的,一般都是开发者根据客户需求来进行开发,这样开发出的软件都是独一无二的,不存在批量生产的可能性。

  第二点是测试上的区别,文中四块主板经过 SMT 流程之后,进行检查。检查无误才能进行下一步的组装。而软件是在编码完成之后才进行测试。

  第三点是软件开发的流程伴随着文档的编写,而硬件的开发流程则不需要这些。

问题三:第六章中对比了敏捷、计划驱动和形式化的开发方法。为什么形式化的开发方法能有极高的可靠性?如何选择正确的开发方法呢?

  形式化方法建立在严格的数学基础上,其目标是希望能使系统具有较高的可信度和正确性,并能使系统具有良好的结构,使其易维护,关键是能较好地满足用户需求。“形式化方法”一词虽然一直被广泛地应用,但在不同程度上,因理解不同,使其具有了不同的含义。一般说来,形式化方法是指具有坚实数学基础的方法,它是数学上的综合、分析技术的应用,用于开发计算机控制的系统,经常有推理工具的支持,它可提供一个用于模型设计和分析的一个严格而有效的途径。

  形式符号系统具有一定的数学性质,所以它们非二义性的基础在于其内在的数学结构。 形式规范是由一些精确的定义组成的,因为其符号系统的含义是明确定义的。精确规范的直接益处在于:它能减少规范中的二义性和误解释的可能性(危险)。精确是形式化方法或形式符号系统的一个特征,是产生无二义性规范的主要依据。另外,形式规范主要的语用益处在于:可以对形式规范进行较详细的构造性检查,因为对此规范中的具体内容的含义不会有争议,有争议的只是内容的完备性。各种形式符号系统对于精确、抽象地表达概念具有各自不同的能力,但它们均可用于严密地描述概念,更重要的是,它们比自然语言的描述更严密、更精确、更抽象。一般地,形式系统(框架)使得表示一个规范与其相应程序之间的映射成为可能。 形式规范有一个很有价值的特性:可操纵性。这就是说,可以在明确定义的规则的指导下,分析规范或或对形式规范进行变换。利用形式规范的可操纵性可以证明规范的一致性;可以推导出关于此规范的一些重要结果;还可以验证规范的实现过程,至少可以验证源代码相对于其规范的正确性。更一般地说,有可能将不同级别规范间的验证以及规范与程序间的验证问题简化为形式证明问题。这样,形式化方法就可以提供程序对应其规范的非常高的可信度。所以,可操纵性也有助于确认,并且由这种特性可以得到进一步的抽象(推导出的性质),同样,也有助于使得规范更清晰。

  软件开发方法有很多种,在实际软件开发中就涉及到选择适宜的开发方法的问题,具体选择时应综合考虑以下方面因素:

  (1)开发人员的基本素质及经验阅历。主要看软件开发人员是否对该方法有经验或受过专门训练。

  (2)项目进度安排及人员组成情况。要根据开发项目的时间限度、人员配备进行选择。

  (3)现有资源状况。考查现有的软硬件环境及可使用的CASE工具等。

  (4)进行可行性研究。从计划、组织、管理各个环节综合考虑。选择软件开发方法后,还涉及对所选的开发方法进行评价。-般说来,可以从以下四个方面来进行评价:

    a、技术特征:支持各种技术概念的方法特色。

    b、使用特征:具体开发时的有关特色。

    c、管理特征:增强软件开发活动管理能力方面的特色。  

    d、经济特征:使开发部门的生产力和软件质量得到提高,产生经济效益的有关特色。

问题四结对成员一定要区分出强弱进行结对吗?

       本学期的软件工程课也有结对项目,我知道了结对成员是不需要区分强弱进行结对的,但不可否认的是,结对编程能够提供更好的设计质量和代码质量,两人合作解决问题的能力更强。若是强强联手,势必会事半功倍,无论是在程序质量,还是交流学习上,两人都会受益良多,并共同促进整个项目的高效完成。但对于一些菜鸟来说,结对明显是一种强大的压力。在结对工作中会遇到各种复杂的问题,由于自身水平太差,会担心拖累整个项目的进程,羞于表达自己的想法,以至于得不到有效的沟通,导致任务完成效果差强人意。任何事情都具有两面性,我想结对合作也不例外。

问题五:书中介绍了很多测试的方法,那么测试重要吗?我们一般都是根据要求去写程序,实现具体的功能就好了,并没有写测试的概念,那么如何加强意识和提高测试水平?

      毋庸置疑,在一个软件的开发过程中,测试是非常重要的,它是开发过程中不可分割的一部分。软件测试的目的,第一是确认软件的质量,其一方面是确认软件做了你所期望做的事情,另一方面是确认软件以正确的方式来做了这个事情。第二是提供信息,比如提供给开发人员或程序经理的回馈信息,为风险评估所准备的信息。第三软件测试不仅是在测试软件软件产品本身,而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题,这说明此软件开发过程很可能是有缺陷的。因此,软件测试的第三个目的是保证整个软件开发过程是高质量的。

  软件测试非常重要,因此我们应该加强软件测试的意识,提高软件测试的能力。

  (1)想客户之所想

  在测试的过程中时刻想着用户。培养自己对用户需求的共鸣。和用户沟通并且观察他们怎们样使用你的软件。

  (2)多读Bug

  多阅读软件测试工程师发的Bug, 特别是那些针对自己测试部分的Bug 。可以从别人如何找到Bug中学到很多东西。

  (3)多读代码

  找到自己测试的那部分功能的代码。虽然写代码并不是软件测试员的事,但是读那些代码常常会帮助你找到潜在的边际情况和软件缺陷。

  (4)参加软件功能的设计

  在软代代码编写之前,在仍有可能有大的设计变更的时候,积极参加软件的计划阶段,这会帮助自己了解正被考虑的折衷和权衡。

  (5)设计自己的测试

  无论是寻找边界值,运用组合技术,画图表,或创建测试模型,把自己的想法放进测试设计中总是有用的。在试探性测试的时候,有意识地去交替自己的测试计划和产品学习

  (6)了解测试的功能

  不管测试的是哪一块功能,应该了解它的设计,它的局限性,别人发现的Bug,代码的变动,以及它和其它功能间的交互关系。

  (7)提高编程能力

   编程是一项有价值的技能,能帮助你更好地阅读代码,理解产品的内在,同时帮助你写一些小工具使得平淡反复的工作变得简单。

  (8)不断学习

  不管是“软技能”,比如公开演讲, 或者编程语言,亦或新的测试技术,成功的测试工程师总是会从繁忙中抽出时间来坚持学习。

新的问题:如果一个软件核心功能没有太大问题,但是就有很多那些小bug,会对这个软件的口碑产生很大的影响,那么还能发布吗?是不是为保障口碑而延期发布,回去修复bug呢?

二、课程的实践总结和自身的提升:

1、统计你在软工课程实践中,完成了多少行的代码;

      完成了大约四千多行代码。

2、软工实践的各次作业分别花了多少时间?累计花了多少个小时在软工实践上?平均每周花多少个小时?(做一个列表)

软工作业

花费时间

平均每周花费时间

实验一 软件工程准备

 6

7

实验二 软件工程个人项目

 8

7

实验三 软件工程结对项目

 8

7

实验四 基于原型的软件需求获取

 8

7

实验五 软件研发团队组建

 5

7

实验六 团队项目评审与团队项目选题报告

 6

7

实验七 团队作业3—团队项目的原型设计与开发

 8

7

实验八 团队作业4—基于原型的团队项目需求调研与分析

 9

7

实验九 团队作业5—团队项目需求改进与系统设计

 8

实验十 团队作业6—团队项目系统设计改进与详细设计

 9

7

实验十一  团队作业7—团队项目设计完善&编码测试

 8

7

实验十二  实验十二 团队作业8—团队项目用户验收评审

 7

7

3、哪一次作业让你印象最深刻?为什么?

       印象最深的就是实验七 团队作业3—团队项目的原型设计与开发了,那次作业因为刚开始分工不明确导致完成任务时出现了分歧,甚至产生了矛盾,最后团队中有人协调,重新讨论了分工,完成了项目的原型设计与开发,甚至比预想中完成的更好,提前实现了云平台的开发雏形。在那次作业之后,我们的每次团队作业都有明确的分工,之前的矛盾并没有影响我们团队成员之间的关系,我们是一个Team。因此,团队项目中一定要有明确的分工以及相互之间的理解,只有这样,团队项目才能做的更快更好。

4、学习和使用的新软件;

       visio、IntelliJ IDEA、Android Studio

5、学习和使用的新工具;

       process on、墨刀、石墨文档、mockplus

6、学习和掌握的新语言、新平台;

       GitHub、博客园、中国大学MOOC

7、学习和掌握的新方法;

       快速原型方法、白盒测试与黑盒测试、面向对象设计方法

8、其他方面的提升。

      学习完软件工程这门课程,我的编程能力、文档撰写能力、解决问题的能力以及团队协作的能力都提高了,了解了完成一个软件的开发需要完成什么工作。

三、你认为目前的课程有哪些问题,你有什么更好的建议:

1、你认为本门课程需要在哪里进行改进,具体措施有哪些,包括:时间进度安排,项目难度等均可;

       这门课采用的学习形式是比较新颖的,完全可以接受。整体来说,实验的难度还可以,但是实验任务有些多并且给的时间比较紧张,每次作业布置之后,都是在挤时间做,占用了很多时间,由于课程较多,每门课的任务都重,实验太多可能会引起学生的“凑合完成”的心理。因此实验任务可以少一点,时间给的相对充足一点,这样完成的作业质量肯定会提高。

2、你认为助教/老师哪里做的不足,哪里限制太多等;

       助教老师的工作任务比较重,为了同学拿到属于自己应得的成绩,不断的修改了评分标准。但是每个人的看法不同,评分也因此有了差异,这是可以理解的。

3、你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个)

       我认为评分标准应该仔详细一点,这样能稍微降低由于个人主观看法导致多的评分差异。团队项目中不能一味的抬高组长,有些组长只是挂名而已,实际并没有完成太多的工作。

4、在结对项目中你是否真正体会到了结对的好处,是否真正严格进行了结对编程,双方的工作量是否相同;

       结对编程一定是有好处的,多一个人多一个想法,通过合理的分工能减少完成项目的时间,能发现更多项目中存在的问题等。但双方的工作量肯定是不一样的。

5、你的团队项目是否成功,如果重来一次你是否还会选择这个团队,为什么成功/失败;

  我的团队项目是成功的,每个人都是世界上的一个个体,都有自己不同的习惯,之所以能成功离不开团队汇中每个成员的努力。每个项目明确分工以及相互理解和相互帮助,大家一起学习,共同进步。如果重新选择,我还会选择这个团队。

6、总结一下你们团队在做项目时大家的时间安排情况。

  每次的任务在做之前,首先都会讨论需要完成的任务,根据每个成员的性格、特长以及任务的难度和要求进行明确的分工,每个人都有自己的任务,基本上都是在课余时间完成,有些任务可能需要特定的时间完成,这些都根据自己的自己的任务和时间自行安排,遇到自己解决不了的问题会在我们的项目讨论组里进行讨论或者的商议时间开会进行讨论等。

7、对下一届软工课实践教学的建议,或者对于开学初的你,对于大一的你,对于开学初的老师,你有什么想建议和告知的呢?对于后来人的期许。

       这门课安排在大三下学期,任务多,大部分同学没有太多时间来认真完成课程的每个任务,如果课程开设在大二,大家可以抽出时间认真的做一些项目。软件工程这门课最重要的就是实践,希望学弟学妹们能多做项目,认真学习软件工程这门课。本学期的软件工程课我学到了很多知识,通过组建团队,实现项目的开发,这个过程有太多感触。

四、你还有什么想说得话。

      软件工程这门课的学习让我学到了很多知识。软件的开发有很多步骤,并不是一味的埋头写代码就能开发出一个好的软件,甚至一个好的项目的开发并不是写代码,有比写代码更重要的工作,比如调研用户需求以及测试等。团队项目的最重要的就是成员之间的相互理解和相互学习,只有合作伙伴之间没有矛盾,才能更快更好的进行项目的开发。项目的开发是不容易的,只有真正的参与,才知道过程的艰难。

推荐阅读