zoukankan      html  css  js  c++  java
  • 培训归来随笔

    今天终于结束了公司为期七天的软件培训,虽然培训的是N年没用的C,但是经过短暂的不适应,还是能很快找到感觉。总结下本次培训的几个关键内容:

    1,低级错误案例分析。

    2,性能优化

    3,需求和代码设计

    4,测试

    5,工具

    6,实战

     

     

    一,低级错误案例分析:

    通过对公司Top10的低级案例分析的讨论和讲解,笔者对编码规范有了更深一步的认识。原来自己写代码,怎么写都无所谓,以为只要实现功能就OK,现在看来是太幼稚了。总结下一般需要注意的低级错误:

    1,传入参数合法性验证,不光如此,使用到的全局变量也要进行相应的判断。

    2,各分支要考虑齐全,各个需要进行的有效判断,都要想到位。

    3,注意循环条件,不要造成死循环。

    4,记着要初始化。

    二,性能优化

    其实在性能优化上,之前就有过一点点了解,特别是目前笔者正在使用的C#,如果用不好,很容易造成性能的低下。养成良好的编码规范,是解决这一块,一劳永逸的办法。能够提升性能的主要途径如下:

    1,优化算法

    2,通过对编程语言的理解,用正确的方式编码

    3,重构

    不管哪种办法,只要能降低时间和空间复杂度的,都是对性能的优化。这里再总结下平时编码时一些需要注意的地方:

    1,循环体内工作量最小化。与循环无关的操作可提出来。外部循环次数应该比内部循环次数少。

    2,对于重复使用的运算方法,如果其结果是定值,应该用一个变量保存起来。

    3,避免不必要的内存拷贝。

    4,传参尽量使用引用类型传递。

    5,把最可能命中的if判断放前面。

    6,在需要时才初始化对象或资源

    7,日志必须按合适的级别分级打印

    几种常用的提升性能的方法:

    1,以空间换时间

    老师举的例子很形象,说是N年前,最早的设计游戏,很卡很卡,然后一家公司,很聪明的将所有使用到的计算,制成一张表,然后用直接表内调用结果,去代替实时计算,大大的提升了游戏性能。

    2,减少函数切换次数

    函数不断切换,在汇编层面是函数地址间的切换,很浪费时间,最好内联。

    3,模块之间耦合度过高,重复代码和函数体过大的情况,应使用GOF的23种设计模式,来进行重构。

    4,函数参数不应多于4个

    这个好像和寄存器有关系,欢迎补充。

    5,避免使用复杂的表达式

    代码应该简洁明了,不应该使用晦涩的编码,如i+++++++

    6,过多的函数调用层级(过度深度递归)

    这个好像和栈有关系,具体情况没遇到过,欢迎补充。

    7,避免长switch

    如果是很长的switch,为什么不用哈希表呢

    这些建议,很多不光与性能优化有关,还和编码规范,可维护性,可扩展性,健壮性有关。

    三,需求和代码设计

    其实在入职前,在学校是使用过软件工程的内容,进行项目的需求分析,设计的。但是这次明显感到,学校里做的东西,实在是太水了,我们自己做的需求和设计,和真正SE做的一比,差的不是一点点。职业SE对需求要点抓的很准,流程和结构理得都很是清晰,特别是其对功能模块的切分,粒度大小,范围恰到好处。给出的设计文档,规范易懂,流程梳理的很是清晰,各个分支以,异常处理,输入和输出都进行了详细的标注。开发人员一看,就知道如何动工,按图索骥。

    在这一块,我最大的收获是:

    1.需求分析,应该从客户的角度去看,而不是根据自己的经验想当然的去添加或删除东西。

    2,最好理出个整体流程出来,再按各个角色的角度去划分各自的流程。

    3,简化流程,梳理出大概的流程图。开始圈分出功能模块,分清其开发的优先级。

    4,对各个功能模块开始细化设计,理清其输入,输出,各个可能的分支。最好边分析,边画出其详细的流程图。

    四,测试

    其实在入职前的实习阶段,我负责的部分就是和测试息息相关的自动化测试环境。所以对白盒和黑盒,ST,UT等都有所了解。虽然如此,但是私下编码时。。。一个都没用到过。这次被强行要求编写UT,慢慢的开始感到,“磨刀不误砍柴工”的真理。虽然在之前弄ACM时,听闻各个大神都是直接Printf,从不断点Debug,更别谈UT,那开发速度,如神一般。但我们毕竟是凡人,所以还是按更为稳妥的方式来编码,特别是在听过各种“一个错误代码,导致N 千万损失”的案例后。。。

    简而言之,随手写UT,减少以后的工作量!

    五,工具

    因为笔者使用的是C#,所以对课里将的C/C++使用的Insert Source不是很感冒,但是其中的PC Init和MaxCC计算工具,还是上了下心的。因为公司对这几个工具的指标,下了死命令。。。

    六,实战

    感觉很好的一点就是,培训不是老师在上面讲,下面一堆人各干各的,有了这个最后的实战考试,大家对学习内容还是很上心的。实战即是编写一个“停车场收费系统”,结构很简单,最大的数据结构不过是一个链表(C只会用数组的表示还是有点蛋疼),代码框架定义好了API,只要实现其功能,提交上去,平台就会根据设定自动评分。

    实战的收获在于,自己动手过一遍,才算是真正的掌握知识要点。

  • 相关阅读:
    MySQL-InnoDB锁(一)
    Java方法调用机制
    并发编程-锁相关的内存语义
    Java开发工具汇总
    并发编程-底层实现原理
    并发编程-Java内存模型
    JsonTest
    PTA(Basic Level)1034.有理数四则运算
    PTA(Advanced Level)1081.Rational Sum
    PTA(Advanced Level)1008.Elevator
  • 原文地址:https://www.cnblogs.com/suriyel/p/2637094.html
Copyright © 2011-2022 走看看