嗯,这也是由感而发的一篇博文,和前一篇一样,都是因为网友ZhaoLS的一篇博文引发的。
原文在这里:《生成不重复的随机数序列》 http://student.csdn.net/space.php?uid=127131&do=blog&id=32861
我在回复ZhaoLS网友的时候,始终有种感觉,就是他这么做,“不好”,究竟哪不好,我也是想了一下,才想清楚。ZhaoLS网友别见怪啊,我也是 有一说一,对事不对人,仅仅是借用你这篇博文举例子而已,·见谅。
还是那句话,一家之言,欢迎拍砖啊。
我是这么看的。
大家看了他的程序,有什么问题没有?作为一个C#程序员,我不是啊,但是,我也了解过一点,写试验性代码,没必要这么复杂的。ZhaoLS网友做这个试验,专门写了一个很漂亮的界面,嗯,是很漂亮。并且,里面精心拼接字符串,为的是整齐地显示到EditBox里面。最后出来的效果确实很好。
只有一个小问题,有没有必要?
一般我的习惯,做一些算法试验,或者一个kernel级的模块的试验,都是使用控制台,直接用C的printf打印就好了。为了这个事情,我还专门请教了做C#的同学,C#到底有没有控制台输出,我同事说有,并且帮我找了一个网址,专门论述C#是可以控制台输出的。有兴趣的C#朋友可以参考这里:http://www.mybuffet.cn/html/0/324.htm
其实,大家看这个问题可能是个小问题,觉得我有点吹毛求疵了,没有必要,更有甚者,还可以说人家网友ZhaoLS做事情严谨有什么不好,试验代码也应该写认真一点,不能因为是试验代码就放松要求。我写这篇博文,纯属扯淡,呵呵。
嗯,这个论点其实我也一直在坚持,就是说,试验代码的品质,一定要比正式代码相同,或者高才行,精品的测试代码才能测出精品的程序,这是对的。
但是,我这里,想说另外一件事,就是试验的时候,大家最好不要带太多UI相关的东东,我的习惯,试验代码品质是必要的,但是,我一般做到PI层,就是Programmer Interface,程序界面层就好了,最好不要带太多UI的东东,User Interface,原因很简单,处理图形化UI,一来使程序员分心,关注不到自己想要研究的算法本身,二来,引入了太多的不可控参量,导致测试不准确。
我以前就有过经验,刚开始,嗯,2000年左右,第一次写WinMain的程序,就是给Windows开发代码,上来先“纠结”了一周左右,为啥,没有一个好的输出环境,我熟悉的printf没法用,为了打印一行输出,我得先画个窗口,再准备一个EditBox或者ListBox什么的,再输出过去,好麻烦哦。
最后怎么着,我想啊想啊,突然想通了,Windows下写代码,代码还是C代码嘛,C++也一样,语言本身就是与平台无关的,我的目标运行平台是Windows的窗口程序,但是,并不是说我的每段代码都要在窗口下调试和测试。模块化的原则,只要该模块计算逻辑正确,接口好用,别人能调用,你管它在哪个平台上编写和调试呢?
所以,后来我就慢慢养成了习惯,程序开发分为两部分,功能实现,业务UI,我一般专注于功能实现,即保证核心逻辑算法正确,效率能满足要求,至于UI,初期设计的时候可以先放一放,甚至,现在发展到,UI丢给C#、PHP、Java这些同事去做,他们其实现在也不是自己做,做出标准UI的api,然后,请个界面设计师,直接用css、html画界面,很漂亮,然后,里面的热链接Call内核的api实现功能好了。
我后来又打听了一下,客户端相关的应用,现在越来越多这种模型,除了游戏开发啊,程序员一般已经很少去做界面相关的事情了,为啥,我们做不好,不专业,UI相关要美术功底,程序员的数学脑袋瓜,画出来怎么都像列方队,不好看,远不如人家专业做美工和界面的,画出来的好看。这也慢慢变成了目前大多数公司的一个工作模型,殊不见,一个企业数据库应用,都采用B/S模型,以IE访问网页来实现客户端功能,这中间,我理解,分布式运行是一个考虑,还有个主要考量,使用IE的html画界面,UI要美观得多,用户友好度更好。大家觉得呢?
当然,说了这么多,也仅仅是我想说的一个方向,还有个很重要的方向,测试的结果准确度。
很多时候,我们评估一个kernel级的内核模块,不仅仅要评估其正确性,0bug是最低指标啦,出来都要挂,先打回去重做,ok?我觉得更多问题是,我们要评估其效率。
但是,如果测试代码中带有太多UI相关的内容,这个图形界面GUI,画点、画线,输出文字,要不要占时间?大家去想。
这样测试出来的结果,还准吗?
正如ZhaoLS网友文中所说,他发现String的拼接很占用时间,其实已经影响到测试的结果,他没办法,只有分别测时间才行,这无形中又增加了程序的复杂度,请大家记住:“ 我们增加的任何一行代码,都是以机时为代价的!
所以,从“客观”、“严谨”的工作态度上讲,我建议,大家以后做任何测试,最好尽量减少对测试结果的干扰因子,用最简单,最直接的办法,直接求出结果,不要刻意为了美观、好看,去增加无谓的运行时开销,影响测试结果。
在我们的实验报告中,最好看的,其实是表格里面的数据,而不是这份报告排版漂不漂亮,图好不好看,“ 真实的数据是最美的!”。大家能理解吗?
也正是因为这个原因,大家可以发现我的《0bug-C/C++商用工程之道》中,我虽然给了一个跨平台工程库,但是,大家在里面看不到一行UI相关的代码,为啥,这是kernel级的多任务执行机,最核心的内存管理模块和锁,这些功能,任何平台都是相同的,永远工作在底层,不见天日的。
它的实现和测试,要UI做什么?我所有的测试都是控制台打印,debug和syslog也是这么来的。
至于以后大家要应用到Windows平台,或者Linux的XWindow平台,外面自己加UI好了,我底层的功能,就这么多,并且基本正确,效率很高,业务层自然可以依托平台,把界面做得很漂亮。
我再说句话,看大家同意不?“ 内核高效了,UI层才有时间画漂亮界面!
以前我做游戏测试,要求1024*768下,每秒钟至少刷屏70次以上,就是重绘70次,为啥这么定,我们要构建动画,根据电影上面视觉残留的理论,每秒要25~30帧,人才会感到画面自然动起来。
我内核能力做到70帧,实际使用时,用30帧,这是不是意味着,每秒钟有半秒我在做屏幕重绘,我为业务逻辑,什么碰撞判断,什么敌人的控制,什么精灵特效,什么游戏逻辑的,每秒钟我留出了半秒的工作时间。
这才是游戏嘛。如果为了一个精美的效果,我每秒钟只能达到30帧,那完蛋了,这样出来,不叫游戏了,叫做Demo,或者电影,为啥,用户的输入,游戏逻辑,没有时间处理了,那还玩什么玩啊?直接看电影好了。
所以,追求内核高效,要尽量去掉很多不必要的测试开销,以及很多不必要的干扰因子,这样测出来的数据才准确,才有意义。
我说这么多,主要是希望广大程序员朋友,或者有志于成为程序员的朋友,在做每件事情的时候,“专注”于自己要做的事情,不要被其他东东干扰,还有就是,尽量客观和准确,科学是来不得半点虚假的。
就好比我前面写的一篇博文《实际中常用的一个随机数产生器(分类别概率随机)》( http://tonyxiaohome.blog.51cto.com/925273/296530),我在文中的代码里,明明实现了O(1)的复杂度,但是就有人,为了攻击我本人和我的书《0bug-C/C++商用工程之道》,专门撰文,说用其他办法,O(7)的复杂度也可以实现,我这个办法不值得提倡。
我晕,我们做算法优化,有时候,O(n)这个值,能减少1都是巨大的成功,因为程序是有循环的,循环次数是被乘数哦,这是乘法关系,这个核心算法复杂度减少1,放出去就是几千万甚至几亿的时钟开销,效率提升就是巨大的。很多时候,我做优化,都在为了减少这个1在努力。
不过,这毕竟是少数人,准确的讲,说这话的人不能算技术人员,因为针对到科学的,算法的,优化的问题上,一是一,二是二,不能带着个人感情讨论。这是技术人员,特别是程序员基本的职业道德。
这里,我希望广大程序员朋友一定要养成一个习惯,“ 客观”和“ 严谨”是程序员的基本职业修养,也是我们能在这个行业里面立足的根本,千万不要丢掉了。
嗯,最后呢,还是要称赞ZhaoLS网友一句,做事情很严谨,虽然做实验的方法不是很准确,这个呢,算经验,以后慢慢补好了,但是,给出来的代码命名规范,格式清晰,一目了然,很认真的,尤其是测试报告,给出了详细的测试平台论述,这为大家做数据参考打下了很好的基础。我也学习了。
谢谢ZhaoLS网友,你写了一段很好的程序,写了一篇很好的博文,引发了一次很愉快的讨论,我也欢迎你针对这个问题,继续探讨,大家互相促进哈。


本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/313399 ,如需转载请自行联系原作者