天天看点

码如其人

古人云【字如其人】,在互联网时代,对我们码农来说,也可以说【码如其人】。

孤独者:字与字之间的距离极小。

豪放者:字体较大,笔画舒展。

谨慎者:字体较小,基本上不会写或不写潦草的字。

有毅力者:笔压很重。

热情的人:字体大、笔画柔、书写流畅。

……

        可以从一个人的字看出他的修养,但也不是说字写得好的人修养好,写得不好的人没有修养;可以肯定的是,字写得好的人肯定是下过功夫的。看别人写一手好字时我们会感慨字写得真好,与看到【鸡抓】字相比,心里感觉是不一样的。

        对码农来说,我们每天都面对着代码,可以相当于我们中学时代每天写的字,老师看我们试卷时,字写得好和不好有时也会影响分数,那现在我们写的代码当别人看到的时候,他的心里感觉也会跟着代码好坏而变化,也会对代码作者有一些评价,这将影响你在他人的心里地位,从而影响你的职业发展。

        字有书法,码有码艺。现在很少看到书法了,但偶尔在公园或者道路上遇见一些老大爷用粉笔写的书法时,心里也默默地为他点赞。我工作中每天面对着haproxy、nginx、varnish源码,心里也膜拜着源码作者,这些代码真的写得太好了,nginx是这几个中代码风格、模块化、思想等等写得最好的,这也是它比另外两个更出名的原因之一吧。

        我们团队主要是基于这几个开源软件做二次开发,从中发现了很多问题,比如代码风格不一致、源文件随意乱放、源代码随便改、重复造轮子、代码臃肿可读性差、忽略编译器告警……,下面细说一下这几个问题的严重性:

一、代码风格不一致:

        这个可以直接体现出上面所说的码如其人,从代码风格上可以直接看出代码的修炼如何,如果你的代码写得烂,那么与他人格格不入,如果一个资历比你低的人去看或者修改你的代码,那么他可能看都看不懂,修改之后可能写出烂或者更烂的代码,如果一个资历比你高的人去看或者修改你的代码,那么对他更是一种折磨,重写吧浪费时间不重写吧看着难受。就好比在一条被别人随意扔垃圾的街道上,当你经过时你可能也会跟着随意扔垃圾,但是在一条非常干净的街道上,你好意思扔么。所以写代码也一样,一定要保持一个好的风格,这里推荐nginx或者linux kernel的风格,真的很不错。

二、源文件随意放:

        我们自己写的模块应该都放到一个特定的目录上,而不是跟其他一些不相关的文件放到一起,这也是模块化思想之一。如果你写的源文件随便放了,那么对团队其他人和项目是没有好处的,团队其他人也可能写他自己的文件,他看到你放到那里了,那他也放到那里,这样久而久之项目大了之后问题也就突显出来了,团队小而且稳定还好,但团队大了或者有人离开团队了,那么项目的维护成本就上去了。

三、源代码随便改:

        对haproxy、nginx、varnish这些非常好的开源软件做二次开发时,如果随便改人家的源代码,那么代码的升级就有难度了,必须得用beyond compare这种图形对比工具去一个文件一个文件的合并代码,这个过程也是费力费时的。所以,迫不得已时我们才修改人家的代码,尽量不要修改或者少修改。

四、重复造轮子:

        这个问题是怎么出现的呢,我们要基于nginx做一个waf,也要做一个类似nginx的proxy模块,当我看到代码时,真的感觉很无语啊,居然有个文件是复制了proxy模块的整个文件过来,只修改一个函数,问了写的人他说原因是不想修改proxy模块的代码,我对比了一下,他的文件里面只是引用了proxy模块的一个函数而已,但要引用的这个函数在proxy模块里是加了static限制的。我把static关键字删除,再把那一堆重复的代码删除之后,文件从几千行缩小到600行左右,一下就感觉好多了。我们说要尽量不修改别人的代码,但并不是说不能修改,要合理的修改。

五、代码臃肿可读性差:

        这个也能从代码中一眼看得出来,代码中一坨一坨的,没有注释,不对齐,该用宏的地方不用,重复的进行一些数字计算,这样在我看来肯定不是好代码,好代码应该具有这些特点:易懂、简洁、优美。

        我们都知道代码臃肿,可读性差,易出BUG,维护成本高。代码首先是写给人看的,其次才是给机器运行的。如果自己一个人随便怎么写都行,但在团队里面如果写的代码臃肿,一是别人看不懂,二是如果别人刚刚接手你的代码,也可能写出跟你一样的代码,这样就恶性循环了。现在回头看看前几年自己写的代码有时也不忍直视啊,所以为人为己,一定要写易懂简洁优美的代码,即使现在写不出,也是有这种意识,慢慢修炼。

六、忽略编译器告警:

        很多人只要把程序编译出二进制文件就行而忽略编译器告警,跟他们交流过也提醒过,但得到的回复是哪有时间管那么多,先编译成功再说,而且很多都是变量定义不使用的告警不用管它,比如:warning: unused variable ‘i’ [-Wunused-variable],但我还是说这样也很危险,在众多告警信息中可能隐藏着危险的BUG,最近搞的waf项目中就出现了,我有看告警的习惯,所以在项目编译完成之后细看了所有告警信息,就发现了这条:warning: assignment from incompatible pointer type [enabled by default],这是给一个指针变量赋值一个类型不符的指针时编译器发的告警信息,这就很危险了。所以我的建议是自己写的代码一定不要出现编译器的告警,否则很容易把自己或别人的BUG隐藏在其中,增加Debug难度。

        总之,码如其人,如果你写得一手好字,那应该也能写出一手好码,如果你错过了练一手好字的机会,那还有练码的机会,练码比练字容易多了,好码和烂码都是从键盘中敲出来的,不是吗。练码,你要的只是一个习惯,并坚持下去。

        最后推荐几本码农自我修养的书吧:

      《代码大全》、《程序员修炼之道——从小工到专家》、《UNIX编译艺术》、《高效程序员的45个习惯》、《程序员的自我修养》……