本堂课重点内容
今天主要是学习了一些代码规范,以及性能调优的方法和一些性能调优工具的使用。
代码规范部分
首先,编码要符合简单性可读性和适应生产力的原则
- 简单性:这里的简单是指的代码的逻辑清晰简单,减少不能被自己和他人理解的代码,以方便后期修复改进。
- 可读性:代码是给人看的而不是给机器看的。之前这一部分我一直难以理解,后来发现代码在机器那只有编译通过和不通过之分,修bug还是要让人看懂代码。而且如果后期有维护环节,维护的人员(包括自己)不一定看懂当时写的代码,所以代码能够被看懂至关重要。
- 生产力:这个就涉及到团队协作了。go语言的开发者 Dave Cheney曾经说过,"团队整体工作效率非常重要"
那么,如何编写高质量的Go代码? 可以从代码格式 注释 命名规范 控制流程 错误和异常的处理这几个方面来进行阐述。
代码格式规范推荐使用gofmt,gofmt是go语言官方提供的工具,可以自动格式化go的代码,使其变成官方统一的style,(据说go语言是google的几个大佬写的,果然程序员最懂程序员)。go imports也是官方提供的工具,相当于gofmt+依赖包管理,依赖包的引用可以自动增删,依赖包按照字母排列(强迫症者的福音)。
那么接下来就是注释的规范,注释有什么规范可言呢?私以为注释规范的重要程度和代码规范的重要程度相当,是让别人读懂你代码的重要补充说明,在学校各种小组作业(虽然大多数小组作业代码都是我写),但是最后老师提问的时候可不管代码是谁写的,直接随机提问然后计入小组分,所以说让别人读懂自己的代码非常重要。 随后就到了讨论注释都应该突出什么的时间,所谓注释,标注解释的一种工具,注释应该注明代码是什么功能,如何实现(接口的实现不需要注明,因为接口抽象出来就是去干特定工作的),为什么可以实现,以及什么情况下,代码会出错(最后一点自我感觉非常难)。一份好的代码有着很好的注释,同样一份很烂的代码需要很多注释去标注代码是做什么的。
命名规范之前有过一定了解,今天又加深了印象。对于variable即变量来说简洁胜于冗长,缩略词全大写,但当其位干变量开头且不需要导出时,使用小写。eg.use ServeHTTP not ServeHttp XMLHTTPRequest or xmlHTTPRequest,变量距离其被使用的地方越远,则需要携带越多的上下文信息 ,全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义。函数名不需要携带包名,函数的名称尽量简短,又例如当名为foo 的包某个函数返回类型Foo 时,可以省略类型信息而不导致歧义,当名为foo的包某个函数返回类型T时(T并不是Foo),可以在函数名中加入类型信息 package名全用小写,简短并包含上下文信息,不要和标准库重名避免冲突。 总之,一句话,命名规范是为了降低代码的阅读难度,考虑上下文信息并尽量简洁。 流程控制方面,要遵循线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支,正常流程代码沿着屏幕移动,提升代码可维护性和可读性,故障问题大多出现在复杂的条件语句和循环语句中。
性能调优部分
性能调优也遵循4个原则
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
然后就认识了性能分析工具pprof,他是一个可视化分析性能分析数据的工具,然后学习了如何用他通过各项指标的显示去排查预埋的“代码炸弹”相关的指标在下图可视
接着就是关于他的原理部分,这部分老师讲的比较通俗易懂,各种指标如下
对于cpu而言,采样的过程是这样的
如何去实现这一过程呢,主要以下图所示的方法
对于Heap而言,他的采样方式和原理是这样的
而对于协程和线程的创建,采样的主要方法如下图所示
对于锁和阻塞,采样方法如下图
所以这个原理和采样的方式都清楚了以后,对于我们写程序排查调优而言着实方便了许多。
课后个人总结
这节课确实学到了许多关于性能调优的一些方法和工具,对于我个人后期进行开发有着很大的帮助