金山这几年--程序员的信仰(二)

“信仰是指对一个人(同样的对他的能力)、事物、神、宗教的教条或教导、没有经验证据的观点(例如拥有强烈的政治信仰)抱有信心和信任。” 维基百科如是说。 做为一名程序员,在金山的经历也使我拥有了一种编程信仰,我相信通过正确的方式方法可以写出优质没有bug的程序(是真的没有bug,而不是自己的声称)。只有你相信了它,你才有了这种可能去做到。 PS:至今还没有人从Tex的bug悬赏金中大幅获利给了我们这种教徒以极大的曙光。

治大国,若烹小鲜

在诸多中国古籍中,我最爱的是《道德经》,所以我经常跟朋友开玩笑说我信奉道家。(笑)可能稍有了解的朋友听说道家脑子里第一个闪过的词语便是:无为。但我觉得这个词有点过于空泛,这里想说的是在道家里一个很重要的方法论:分治。 说到这个,我特别想提起一个我曾经的故事:有那么一刻,我突然觉得人类非常的伟大,居然可以造出像计算机这样的东西。想象下屏幕上那活生生的3D人物的运动的背后居然是一堆0、1这样的数据,再深入一点,是一个个电子管里通过的不同电压的电流,我相信这世界上应该没有任何一个人可以用机器语言写出一个大型3D游戏,但是人类却真的做到了,完全无法了解,叹为观止! 道家主张若人人皆修道以自治,则天下治矣。用这个思维再来看我刚才的那个疑问。首先3D人物的绘制是要调用引擎的各个API,然后引擎又只需要调用各个平台提供的图像绘制的API,而它们又是通过某种高级语言编写的,而高级语言又是通过汇编语言来的,汇编再转换为机器码,机器码再转为cpu微指令,最终微指令控制各个电路板上的元件。细分为这么多层之后,其实每层只要关心好自己份内的事情,最终这么个庞然大物的怪物也就这么形成了,还是忍不住要为人类的智慧点个赞! 一个好的软件架构是否也应该这么设计呢?每一层只负责自己份内的事情,并保证不出问题,剩下的再由底下一层的各个模块自己去保证自己内部不出问题,这样层层下放下去,最终细分到每一个函数确保它们不会出问题。鹅妹子嘤!保证整个软件的正确性的重量级问题竟然变成了保证函数如何不出错这种小轻量级问题。治大国,若烹小鲜! 其实万事万物均是相通的,不仅仅是软件工程,其他领域也是。很多时候不管是多么复杂的问题,其实如果真的用分治的方法将它们一层层剖开,你会发现最终呈现在你面前的就是一些简单的不能再简单的东西。

如何保证写的代码没有bug?

如果只是写一个hello world这样的程序,我相信几乎没有可能会写出bug,可是当面对比这个复杂几个数量级的程序,要保持没有bug可能就不是那么容易了,难道bug是伴随着代码复杂度凭空出现的么? 什么是bug?我认为凡是我们写出来的程序在运行期间出现了不符合我们的预期的行为就是bug,那么阻止它的办法之一就是让程序的每一步都符合我们的预期。所以我的做法是,首先要求每一个函数对自己内部的每一种可能发生的情况都以返回值的形式返回出来告诉调用者,同时要求调用者对每个函数的返回值都应当进行判断并进行适当的处理来保证不会出现我们预期之外的行为。 仅写完还不够,写完代码之后还要对所有的条件分支做单步调试,确保所有的结果处理都是如我们所愿的,最后如果有条件再找个人来帮忙review一遍,这样子写出来的代码在函数运行层面基本上是很难再出bug了。 PS:这里也介绍下金山内部的一个好的行之有效的方法,KGLOG系列宏及配套用法。这个宏的作用就是出错即跳转,使用goto保证函数做到单入单出(这就是goto有益的例子之一),配套用法就是前面声明一个变量用于保存函数返回值,并在函数的最后返回。它的作用有以下几点: 1. 保证函数一定会有返回值,至少出错会通知上层。 2. 单入单出保证有一个地方可以集中处理错误。这样在针对内存泄漏这类错误时,review的人只要看到内部有new,malloc等函数,就立马去查看错误处理的地方是否有将它们释放就很容易轻松的找到有泄漏的代码。 3. 将错误处理变成一件比较轻松的事情,使新人没有太大抵触情绪。

知易行难

很多时候,即使有些东西我们知道很好,但实际做的时候却往往做不到,比如早睡早起……所以最难的还是要把好的习惯贯彻下来并坚持。飞舟在教导我们的时候也是说,你们现在当前阶段最重要的东西不是去追求高精尖的技术,而是要将你们的代码写稳定。 所以在最近这一两年里,我做的最多的事情也是努力的去提高自己的代码质量,虽然这东西在短期内很难被人所看见,特别是在面试的时候基本很难去体现,但是从长远来看,它决定了你究竟能在这个领域走的多远,复杂的程序架构如果没有良好的代码质量来支撑,就像一个地基没有打好的摩天大楼,坍塌只是迟早的事情。 在此我也与诸位有着与我相同理念的programmer们共勉。 —————————————————— 欢迎关注我的微信订阅号:yestein,或者扫描下面的二维码: qrcode_for_gh_561cc76cad25_258