今天终于结束了公司为期七天的软件培训,虽然培训的是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,只要实现其功能,提交上去,平台就会根据设定自动评分。
实战的收获在于,自己动手过一遍,才算是真正的掌握知识要点。