第三次作业

软件工程的理解

什么是软件工程

软件工程分为:构建管理,源代码管理,软件设计, 软件测试,项目管理。
软件工程是把系统的,有序的,可量化的方法应用到软件的开发, 运营, 和维护上的过程。

软件工程中的bug

这里的bug和我们之前理解的程序的bug不一样,毕竟完美的程序是不存在的,软件工程的一个重要任务就是要决定一个软件在什么时候能“足够好”,没有严重的“bug”,可以发布。

个人能力

知识: 对具体技术的掌握, 动手能力

经验: 对问题领域的知识和经验的积累

通用的软件设计思想, 软件工程思想的提高

职业技能
职业技能包括: 自我管理的能力; 表达和交流的能力, 与人合作的能力; 把任务按质按量完成的执行力。

效能分析

文中通过一个分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来的程序为例子。
先进行抽样分析,在效能浏览器中找到最花时间的函数,再进行进行代码注入的分析,找到重复调用多的函数进行效能测试,分析,改进,再效能测试。来逐步优化程序去,要注意保证正确性再谈优化量。

单元测试

主要步骤:

设置数据;

使用被测试类型的功能;

比较实际结果和预期的结果)。
单元测试应该在最低的功能/参数上验证程序的正确性,必须由最熟悉代码的人(程序的作者)来写,测试过后,机器状态保持不变,测试要快,产生可重复、一致的结果,运行/通过/失败不依赖于别的测试,应该覆盖所有代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法,应该集成到自动测试的框架中,必须和产品代码一起保存和维护。

回归测试

分为两部分,一是新的代码对原来的代码没有影响,二是在修复bug时新的代码没有把模块的现有功能破坏。

能力训练

简单的事情要熟练形成肌肉记忆,这样才能达到新的高层次的部分,掌握一个东西不能简简单单掌握一种套路,二是要掌握它的内部肌理,这样才能称之为掌握。

个人感悟

通过对这个部分的阅读,我认为如若要成为实时控制软件的开发人员,首先要具备的能力分为以下几点

  1. 扎实的代码基础,这里讲到的并不是仅仅是通过某一个考试或者考取某一种资格证,而是真真正正的掌握某种代码,如技能的反面讲到,真正的掌握技能是一种肌肉记忆,就像骑马登山一样,职业人员是自己大脑不需要思考的反应,并不需要在弄得时候还要去思考怎么做,如我上次做作业很多之前声明都没有弄清楚的部分是肯定不行的。
  2. 良好的调试分析习惯,作为一个程序员,每天只是闷头编代码这是肯定不行的,一定要有良好的分析的习惯,文中举了效能分析,针对程序效率。单元测试和回归测试的例子,讲究一个程序员应该花费一定的时间在分析上,来提高自己程序的可靠性和效率。
  3. 对代码的理解,因为代码本身的可复制性,很容易出现抄袭的现象,但你抄袭的过程很多时候只是抄去了一个套路,而没有理解本质的内涵,这样是毫无意义的,先不谈这样的产品推上市场会不会带来法律的纠纷,就是下次改一点要求可能你就做不出来产品了。
  4. 掌握软件工程,软件工程作为一门科学,已经有自己的体系和很多的行业规范,虽然法律上并没有健全。所以除了代码外,还要注意开发效率,用户满意度,可维护性和可靠性。
  5. 作为一个实时控制软件的开发人员,肯定不是一个人,那么在团队内的沟通,和团队一起的工作方式,如Scrum/Sprint,要有自己的理解。
  6. 提升:我现在第一步都没有做好,自然是先从弄好代码基础做起,在业余时间夺取了解一下软件工程和开发流程相关的知识。

基于模型的开发

基于模型的设计是一个能够快速,经济高效地开发动态系统的过程,包括控制系统,信号处理和通信系统。在基于模型的设计中,系统模型是开发过程的中心,从需求开发到设计,实施和测试。该模型是一个可执行规范,您可以在整个开发过程中不断完善。模型开发后,模拟显示模型是否正常工作。当模型包括软件和硬件实现要求(如定点和定时行为)时,您可以生成嵌入式部署代码,并为系统验证创建测试台,节省时间并避免手动编码错误。

开发优点

在项目团队中使用通用的设计环境

将设计直接链接到需求

将测试与设计集成,以不断识别和纠正错误

通过多域仿真优化算法

生成嵌入式软件代码

开发和重用测试套件

生成文档

重用设计来跨多个处理器和硬件目标部署系统

方法对比

文中介绍了waterfall,敏捷开发Scrum/Sprint这两种办法。首先和waterfall比较这种是实验——改进再实验的步骤,最后做出产品再进行报告等问题。带来的问题自然是时间很长,效率比较低。但基于模型的设计重点在于在Simulink搭建整个ESC,可以同时开发多个算法来进行比较这样一来,进行的较高层面的系统整合测试,测试系统在不同情况下的表现。可以在开发的早期就发现类似于ambiguous requirements的问题。codegen也避免了手写代码的痛苦。如果在车辆测试中发现实际车辆和模拟车辆表现有差别还可以进一步来完善plant model。最后整个项目搞完之后还省了很多时间去写报告。
而Scrum/Sprint方法是找出完成产品需要做的事情,决定当前的冲刺需要解决的事情,冲刺,得到软件的一个增量版本,然后在此基础上又进一步计划增量的新功能和改进。其中最重要的在于冲刺阶段,有点类似头脑风暴,大家一起火急火燎的完成大部分的内容。这个开发流程和基于模型的办法并不矛盾,只是基于模型的办法是冲刺内容的一个组成部分而已。

开发缺点

模型数据库,这需要一定成本,或者购买数据库成本很高。
需要多种人才合作,不仅仅需要懂得代码,更要有良好的专业数学等基础,对人的要求更高。

posted @ 2017-10-10 15:28  机械之芯  阅读(164)  评论(1编辑  收藏  举报