成长总是很痛苦的,每天总是不舒适的,尤其是被问到一层又一层的点时,很多人总是说自己精通这个精通那个,实际飘的很,最表面的东西,谁都想得到,能在表象之上想通一个局部,也是很费功夫,如果能从系统上和全局上考虑的认少之又少。每一行代码的用意的揣摩,每一个细节的深挖,都是需要很痛苦的折腾。你不去深入理解,只是浅层次的实现某个功能,在很多时候,并不能得到别人的认可。因为任何东西写出来后,希望以后尽量都是少的改动,这样才有时间做其他事情,否则永远陷入在恶性循环中,Bug永远解不完,代码永远是那样千疮百孔。修也修不过来,下个来维护的人,只能是重写。所以,如果你在代码非常苛刻的公司,恭喜你,你是幸运的。因为当下你确实很痛苦,心也累。但是长远看,你是受益的。因为你的代码可以承受住各种压力和并发测试。这样的代码会永远保留下去,而那种一次性代码,不到几天就到垃圾站去了。优秀的代码总是惊人的相似,不好的代码有是不谋而合。学习优秀代码本身就是很费功夫的事。优秀代码有它的思想,原则,界限,范围。能做什么,不能做什么。什么可以暴露,什么不可以暴露,函数/方法的命令,规范及风格。很多人在进度的压力下潦草应付,只要测试通过就算搞定。表面上看,开发速度很快,进度有保障;但实际上,这样的程序连开发者自己都很难读懂,一旦有bug,很难调试,将来维护升级都非常困难。这样的代码多半只能重写,浪费自然严重。如果每个人写程序的时候当艺术品来写,写每行都认认真真、干干净净的,虽然速度略微慢了一点,但综合的开发成本会低很多。如何写像诗一样美的代码呢?雷布斯曾用到过几个方法:
一、买几本经典的编程书,把书上所有例程全部重新写一遍,逐个比较和书上范例的差距,一步一步改善自己编程的风格和技巧。时间长了,自然就能写出象书上例程一样的代码,甚至可以比书上写得好。
二、基础扎实后,多看看Linux 等系统级的源代码,看看高手是如何写的,就有感觉了。
三、通读一下MSDN中所有的资料,这样,“读书破万卷,下笔如有神”。
还有,一定要牢记软件工程的铁律:可能出错的地方一定会出错。每个变量都做初始化,引用每个参数都会做有效性检查,在可能出错的每个地方都会做边界条件检查,这样开发出来的程序一定会稳固很多,就是出错也会很容易修改。野路子出来的高手,一般开发速度很快,但做完后bug很多,经常需要很长时间修改。而真正的高手,追求的境界是 bugfree code(零缺陷代码)。
我也有一些总结如下:
1、看那些Bug很少的人代码,他们的代码,每行逐字的读,用了什么技巧?有哪些思想?我自己来写,会想到这些么?想不到的原因是什么?基础不够扎实?还是有知识黑洞?为什么要用某个API,而
不用另外一个相近的API?if条件里的判断是否也可以想到?重复代码巧妙用过变量或求同存异的方式抽离走了。
2、记下别人review后批评点,做人有韧性。批评你的代码恰恰说明要有很多要改的地方。当时尽管不爽,过一段时间,review你的代码,问题越来越少了,说明你也得到提高了,但是我知道很多公司很少有人逐行逐字代码review,出现问题,还是由写代码的人去修。隐式隐藏了潜在的问题以及可能会遇到的问题。
3、对于一个简单系统API,如Android或是C++库函数,要去搞清楚局限,场景,包括参数的边缘测试。正常逻辑往往不会出问题,都是一些边缘性导致,如nullptr,越界,单元测试方法健壮性,至少传入4种以上不同场景参数。有时还伴随多实例,并发等。是否能顺利通过。这样写出来的才有自信。系统的API,没有理解背后的局限和优缺点,也可能误用而出问题。
4、字字如刺,每一步都是一步一步淬炼,成长也是一刀一刀削在心底。然后不断变得更好。