晚上睡不着觉,忽然想起许多小时候的事情。印象比较深的一件事可能是至今为止遇到的最危险的事情,也是记忆中唯一出先过空白的几分钟。那时好像是小学三年级还是四年级的暑假,家还在老家农村。中午睡醒午觉就骑着家里那辆老式的大轮自行车就出去了,也忘了出去干什么,可能是去游泳。骑到乔家堰子的桥的时候迎面遇上有人牵着头牛过来,名字可能叫乔绪站,安我妈那边的辈份应该叫他老老爷。我靠右侧走,乔右侧没有栏杆。牛慢慢靠近时我刹车减速,当牛完全到我的左侧时,突然它摇头了,我当时非常害怕,我觉得它要把我抵下桥去,因为我已经在没有栏杆的桥的最边上了。太紧张了,以至于后面的几分钟直接失去了知觉,记忆也便成了空白。当我恢复知觉的时候发现自己坐在桥下的石头砌的地上,周维围了一圈人,至于自己怎么掉下来的一点儿印像也没有了。后来听人说我当时做了一个高难的动作,左腿迈过横梁,整个人从自行车的右侧跳了桥。桥其实有七八米高,下面全是石头,如果不出意外断个胳膊折个腿的是比较正常的,可是我确安然无样,自行车一半横在桥上,另一半也悬在空中,如果掉下来砸个半身残废也很有可能,可是它也没有掉下来。后来去医院查好像只有后脚根的骨头稍微有些受伤,记的父亲请了司机开着村里的五十马力大拖拉机拉着我去很远的梁庄找骨科世家买膏药贴上,好像没多久就好了。现在想想还真有些后怕,真不知道当时是怎么做出那么高难度的动作飞身桥下却安然无样,难道真的有神灵护佑?不过多少有些影响,我现在的扁平足可能就是那时候摔的,以致现在走路时间一长就受不了,不过已经是最好的结果了。
Quake-III Arena (雷神之锤3)是很多人爱玩的经典游戏之一。Quake系列的游戏,不仅画面和内容都很吸引人,更重要的是在很多配置很低的机器上Q3A却能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake……每次都把3-D技术推到极致。他的3D引擎代码资极度高效,几乎是在压榨PC机的每条运算指令。当初MS的Direct3D也得听取他的意 见,修改了不少API.最近,QUAKE的开发商ID software 遵守GPL协议,公开了QUAKE-III的原代码,让世人有幸目睹Carmack传奇的3D引擎的原码。
我们知道,越底层的函数,调用越频繁。3D引擎归根到底还是数学运算。那么找到最底层的数学运算函数(在game/code/q_math.c), 必然是精心编写的。里面有很多有趣的函数,很多都令人惊奇,估计我们几年时间都学不完。
最令人惊讶的是平方根函数sqrt()。课本里说的,基本上是牛顿跌代法,通过若干步的叠代,结果越来越接近真实结果。
但q_math.c里面却给出了这样奇异的平方根函数:
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0×5f3759df – ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs – ( x2 * y * y ) ); // 第1次叠代
// y = y * ( threehalfs – ( x2 * y * y ) ); // 第2次叠代,可以删除
return y;
}
注意到这个函数只用了一次叠代!(牛顿迭代法)(其实就是根本没用叠代,直接运算)。编译,实验,这个函数不仅工作的很好,而且比标准的sqrt()函数快4倍!要知道,编译器自带的函数,可是经过严格仔细的汇编优化的啊!
关于这个函数,还有一些可说的:
普渡大学的数学家Chris Lomont看了以后觉得有趣,决定要研究一下卡马克弄出来的,这个猜测值有什么奥秘。Lomont也是个牛人,在精心研究之后从理论上也推导出一个最佳猜测值,和卡马克的数字非常接近, 0×5f37642f。卡马克真牛,他是外星人吗?传奇并没有在这里结束。Lomont计算出结果以后非常满意,于是拿自己计算出的起始值和卡马克的神秘数字做比赛,看看谁的数字能够更快更精确的求得平方根。结果是卡马克赢了…
最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴力得出的数字是0×5f375a86。
Lomont为此写下一篇论文,”Fast Inverse Square Root“。
可是卡马克到底怎么推出这个常数,谁也不知道,庸才永远理解不了天才的想法。
从小到大,其实老师都不喜欢我,不是因为学习不好,不是因为不聪明,原因恰恰相反:太聪明、太好玩、太不刻苦了。
其实我这个人是非常不喜欢耗时间的,明明一小时就可以做完的事情别人非要花半天去做,最后结果其实是一样的,但是由于剩下的时间你去玩耍了,所以别人都会觉得你学习不努力。上班以后,发现领导最喜欢的那些员工其实不是能力最强、工作最快的,反而是那些看起来勤勤恳恳,但是效率又不是很高的人,因为领导觉得他们听话、认真、负责。刚工作那会儿其实是有些不平的,同样的工作同样的结果,就因为他们看起来“刻苦”就能赢得老板的青睐,就因为我干完了活看了个电影就开始批判,还有什么公平可言吗?
从小喽罗编程小头目,这种感觉开始慢慢得淡了,自己也开始慢慢喜欢那些听话、认真、勤恳的员工,面对那些能力强点儿又不太好管的员工开始有些头疼,他们确实能很快的完成工作,但是他们开始和你讨价还价,开始怨天尤人,开始抱怨条件。这时候你会发现,让他们认真干活所花的精力成本要远远大于他们提前半天完成工作带来的好处,相反如果时间安排得当,其实干活速度慢的人也不会影响项目的进度。
言归正传,其实到现在我都不喜欢加班,如果白天能把活干完,晚上就喜欢回家陪陪老婆、看看电视,很多时候大晚上的坐在这就无非就两个理由:1)稳定军心;2)讨好领导。这个两理由看似形式,但是确实很重要,如果你小头目走了,小喽罗肯定不会好好干活,因为他们也要找一个心理平衡,只许州官放火不许百姓点灯那谁也不干;第二个理由如果遇到一个工作狂老板那就尤其重要了,因为身为小头目的你也已经认识到,找到一个能和自己同甘共苦,有着相同态度和目标,而又听话认真的属下是一件多么难得的事情啊!如果老板加班你又莫名其妙的走了,这次心理不平衡的就轮到老板了,这个后果可比员工不平衡严重多了。
说到底,上学和工作是有本质区别的,上学的时候虽然这老师那校长的关着你,但是说白了其实他们根本不会影响到你,只要自己够强,老师不喜欢照样也能考上大学;上班以后就不一样了,因为很大程度上你的前途会掌握在别人手中,所以适当得掩盖一些锋芒是必要的,到底做什么暂且不说,首先要有一个看起来听话、刻苦的态度。




