八卦John Carmack(下)

我们再来看看JC大哥非技术方面值得我们学习的地方吧。这里面,最值得提的就是JC老大退学的事乐。这件事有下面两种传说。一种是说:他不满意大学里面的教授,他曾经说过,最讨厌大学里面填鸭子式的教学,“那些教授为什么不给些项目我们做呢?他给我们一个项目,想做成怎么样,我们就一定做到”,终于最后他忍无可忍,在两个学期后就退学了!(天哪,你们美国都填鸭啊!那我们中国岂不是在喂猪了?)另一种说法是:他考试的时候,说卷子做的太简单了,能不能难一点儿的?老师说不行,别的同学有意见!然后他就不爽了,一怒之下就退学了。当然了,他因此和他的父母产生了隔阂,而他的父母后来看到他比他老子还牛,比他那老老实实念完大学的兄弟还牛N倍的时候也就开始支持他的工作乐。这是后话。在我看来,JC大哥对待大学的态度是非常正确的,在这里引用一下来教训一下悲哀的国人!

JC认为:“如果你是为了正确的理由上学,那么学校将是一个很好的学习知识的场所,大学可以提供极为丰富的信息。‘我现在回想起自己的大学生活,觉得浪费了很多宝贵的时光,我当时应该使用他们的图形工作站和其它设备学习知识’。如果你只是为了获得一个学位,以便找到一份满意的工作,那么我并不支持;但是如果是为了结识聪明人、拓展知识面和学习新知识,那么我完全支持。我并不认为大学是不好的地方,但我并不支持这样的观点——‘你必须上大学,这是唯一的成功之路’。原因很简单,它并不是唯一的成功之路。我认为,对于一些年轻、迅速发展的行业,例如互连网和游戏设计而言,才能和工作经验比学位更加重要,我在招聘的时候从不问别人‘你是否有学位?’我更关心的是‘你做过什么? 能做什么?’。”
(每个被中国教育毒害过的人都应该好好读读上面JC老大的话,然后深刻反思一下自己。)

JC另一点很值得我们学习就是他对待金钱的态度了,这 一点他和Gates差不多。Gates就不说了,人家是世界首富同时也是世界最大的慈善家,Gates夫妇现在已经捐献了他们所有财富的70%!再对比丁x、陈xx这些中国顶级富翁,实在是让人觉得汗颜呀。JC认为,现在他已经拥有了足够的财富,足以维持自己的生活,不必听命于任何人,也不需要想法赚更多的钱,因此没有任何人、任何公司对他产生严重的影响。再想想中国的很多贪官,本来已经很富有,但他们仍然屈从于拥有更多财物的诱惑,不惜使用不正当的手段,最终锒铛入狱……自食其果的说~~!

JC的传奇就讲到这里乐,想知道更多关于此牛的故事就请买一本《Masters of DOOM》读读吧!静下心来,我们掩卷沉思一下:为什么我们不能成为牛人?牛人牛肯定也是有原因的,JC老大本身就是美国梦的样本,他结婚前可是每天坚持编程14个小时!牛是用时间砸出来的!你能做到你也照样牛!恩,这是乐观的结论。悲观一点儿,当然了,有些牛人牛也是靠天分的,比如Bill Joy和Donald Knuth这等牛。哎,不得不承认,有些东西还真是先天的,再努力也改变不了……

八卦John Carmack(上)

今天闲来无事,和一个搞游戏开发的老兄聊起John Carmack来乐。也正赶上博客没啥好写的,那就八卦一把John Carmack吧!

搞图形的不知道John Carmack简直就赶得上学物理的不知道牛顿,学数学的不知道高斯,学编程的不知道Donald Knuth,不可原谅啊!……(怎么又是这个开头?)

JC大哥获得赞誉无数,什么名人堂啦,什么连比尔很多门先生都赏识的程序员啦,什么世界最顶级程序员啦……当然了,这些牛轰轰的荣誉人家都不在乎,他更喜欢被我们看作金属乐队(Metallica)的成员。不愧是牛人,和我们凡人自然不一样……当然当然,这还没完,还有更恐怖的呢,那就是他特别喜欢火箭和法拉利……如果世界上还有觉得法拉利不够快的人,那JC大哥肯定就是其中一个乐!他光买法拉利就买好几辆乐,而且自己总是觉得不够快,还得亲自改装,可见其追求速度达到了何种程度!

好乐,回到正题上来吧。JC大哥做过的游戏几乎个个都是石破天惊的说,别的不说了,就光Doom3 ,Quake3和Return To Castle Wolfenstein中的任何一个拿出来都够吓人了,而况还远不止这三个乎!玩过Quake的都知道里面的3D在当时已经很NB的了,可那还是造出个3D就已经很牛的“远古”时代啊,遥想当年偶一个哥们一出去就必然叫偶去网吧玩Quake……(扯远乐……打住)而Doom3就更不用说乐,里面那超炫的3D和光影效果足以让人怀疑这究竟是不是人类在PC机上实现的,真可谓把计算机3D推向新的极致乐!(当然还有里面那超残酷的情节,如果你还没玩过Doom3,赶快找个带得起来的机器玩一把吧!)

JC大哥不光是ID Software的lead programmer,还是founder,据说在管理方面也很出色。话又说回来了,ID Software还有一个John,John Romero,也很牛的说,不过后来因为和JC大哥就公司发展持不一致意见而愤然离开了。JC大哥有自己的观点,他可不想把ID Software弄成一个出售游戏CD的公司,也不想弄成微软式的大公司,于是ID Software至今为止也只有数十人而已,但里面个个都是腰缠万贯的百万富翁。而就是这么一个小公司,却出了N多火得不行的游戏,连nVIDIA和Microsoft这样的大公司也不得不巴结它。你想啊,如果不好心巴结它,nVIDIA的显卡就买不出去啊,M$的DirectX就大打折扣啊。

而今,JC大哥虽然已经声名在外,但仍然每天坚持研究3D引擎的优化,这一点足以让我们这些小辈学习乐。JC不光自己极力推崇技术,而且还乐于把自己知道的东西和别人分享,从Wolfenstein3D开始,JC就一直适时地将自己的游戏源代码公开,让全世界的程序员分享他的技术结晶,Quake自然也在其中。而即使这样也没有使他的技术和开发出来的游戏逊色于任何行业竞争对手,他的技术、他的游戏仍然是世界最顶尖的。我想这位大牛大概是想通过这激励自己更努力地学习吧!

(题外话1:有些自私的人总担心把自己的知识和别人分享,生怕别人知道会超过他,而实际上呢,你和别人分享得越多自己就收获得越多!题外话2:Quake也好,Doom也罢,在Windows和Linux上都可以玩儿。再对比国内某些做游戏的厂商,就一味盯着Windows,很鄙视的说!说白了还是他们技术不行!)

电话面试

如约,今天下午接到了Critical Links的电话面试。只是比约定时间稍微晚了十几分钟,CTO还单独发了封邮件说明这个情况,我当然是回复”Never mind”了~

今天一天基本上没干别的,就一直在准备这个面试,在网上找了一些英语电话面试的经验和技巧,准备了四五个常问的问题并做了一份“答案”。 把这些问题和我的英文简历,和Critical Links的介绍都摆到桌子上,然后就一直等电话。

刚接到电话时还不太适应,电话声音有些小,我就一直说”Would you please speak a little louder? I can’t hear you.” 。后来他们把声音调大以后才知道打电话的是CTO本人,然后他又介绍面试我的人,结果我连人家的名字都没听清楚……然后就慢慢适应了,逐渐能听懂他说的话,但仍然说了N多”Pardon?”和”Could you please rephrase your question? I can’t understand your sentence”,惭愧惭愧……不过还好,我说的话他居然都能听懂,他还说他在做笔记……

问题都很简单,基本上没有很多技术含量,问的都是和我简历上相关的东西,先是问my skills如何?我就说俺C很好,而且还会C++,Python,Java,Perl,还懂kernel。然后就开始朝kernel问,问你喜欢kernel哪些方面?给kernel提交过哪些patch?kernel的coding style你读过没有?感觉如何?如果让你来我们这做network device driver如何?netfilter接触过没有?我只有照实回答了,还好这部分英语俺天天碰,不在话下,貌似中间还用了几个定语从句,感觉还英语口语还没那么烂~!^_^..

后来就问得比较杂了,还问了你做开发时怎么构架软件的?俺说it depends,要是用OOPL的话就得UML一把,否则就是split functions了~他还问俺用什么IDE?Eclipse用不用?俺说俺喜欢Linux下的do-one-thing-do-it-well,用vim+gcc/javac/python/perl,不用IDE~Emacs呢?No,I prefer vim personally。;) 还问了我们小组活动,我们的FTP项目,还要我讲讲FTP server的原理,这自然更不在话下了,用英语也一样搞定~还顺带秀了秀俺组织的Software freedom day~!

最后有点汗,还以为要结束了,就忙着说thanks for calling,结果人家还有问题要问……剩下的问题就完全非技术了,问你什么时候毕业啊?什么时候能来我们这实习啊?有没有问题要问我们?好在我准备周全,把提前想的那个两个问题拿出来晒晒,总算到我发问了!哈哈!然后就问来葡萄牙适应不适应啊?要来的话要不要我们做什么?问到最后这个问题时郁闷,想说最需要签证,可怎么也想不起这个单词是什么了,又想找”大使馆”来描述,可”大使馆”这个单词我也忘了!情急之下就说了个ticket,结果他当成了airplane ticket,还说of course……再汗一把!-_-U

最后他说继续和我保持联系,然后互相thanks之后就goodbye了。over!

这次面试最大的感受还是英语,感觉英语这东西还得多用才行,考试完全没用!我今天用的英语可以说没一个是从四六级考试中背出来的,都是自己平时积累的!放弃英语考试吧,孩子们!!

最后,给以后准备英语电话面试的同学留几个常问问题,后面加x标记的是我今天遇到的。希望对大家有所帮助!

Please introduce yourself.

Please tell me your working experience (or skills). (x)

What will you plan to do in the future? (x)

What’s your hobby? What do you do in your spare time?

Now, you could ask me questions. (x)

杂事,杂技,杂想

最近有很多杂事,今天刚忙完实验室的事,接着就得待在宿舍憋aka-kernel的论文去,还得准备明天的电话面试,靠,还是说英文的老外…… 然后过几天还有google的面试……然后然后……

最近学得东西非常杂。因为fmail的原因,又学了点儿C++(我自己都数不过来这是第几次学C++了,总感觉这东西学不完……);因为解答别人问题的缘故,又学了点儿bash;因为董溥同学激励,学了不少vim技巧;因为要写论文,要学LaTeX;因为准备google面试,还得准备算法;因为准备科研训练(训练个毛线,要是真会还用你训么?要不会你训一下就能训好了么?),Linux内核也不能放松……

最近感想也挺多。感情那个丰富啊,生活那个多彩啊,姑娘们那个漂亮啊,回忆那个美好啊,毕业那个临近啊,找工作那个麻烦啊,十七大那个伟大啊……

拉倒吧,啥都不说了…… 我在看一姑娘……

T-shirt图片选定

经过千筛万选,终于敲定印到T-shirt上的图片。感谢董溥同学帮忙处理图片。我们明天就准备出去印~~欧耶~!^_^..

图片如下:

至于上面的图片嘛,有点儿少儿不宜,所以未满18岁的小p孩就请自觉离开好了~!

要是您满18周岁了,还看不懂,可能说明下面几个问题:

1. 八成您不懂Unix/Linux;

2. 如果1不成立,那就是您太单纯了,不懂如何泡妞……恩,三好学生~!

3. 如果2不成立,那就是您反应太迟钝了……抑或是您还要在Linux上运行一下试试?

本人不会对上图作任何解释!!

这词好美~

烟花三月

牵住你的手相别在黄鹤楼
波涛万里长江水送你下扬州
真情伴你走春色为你留
二十四桥明月夜牵挂在扬州
扬州城有没有我这样的好朋友
扬州城有没有人为你分担忧和愁
扬州城有没有我这样的知心人
扬州城有没有人和你风雨同舟
烟花三月是折不断的柳
梦里江南是喝不完的酒
等到那孤帆远影碧空尽
才知道思念总比那西湖瘦

I Try

Sung By “Macy Gray”

Games, changes and fears
When will they go from here
When will they stop
I belive that fate has brought us here
And we should be together babe
But we’re not
I play it off, but I’m dreaming of you
And I’ll try to keep my cool, but I’m feenin’

I try to say goodbye and I choke
Try to walk away and I stumble
Though I try to hide it, it’s clear
My world crumbles when you are not here

Goodbye and I choke
I try to walk away and I stumble
Though I try to hide it, it’s clear
My world crumbles when you are not here

I may appear to be free
But I’m just a prisoner of your love
And I may seem all right and smile when you leave
But my smiles are just a front
Just a front, hey
I play it off, but I’m dreaming of you
And I’ll try to keep my cool, but I’m feenin’

I try to say goodbye and I choke
Try to walk away and I stumble
Though I try to hide it, it’s clear
My world crumbles when you are not here
Goodbye and I choke
I try to walk away and I stumble
Though I try to hide it, it’s clear
My world crumbles when you are not here

Here is my confession
May I be your possession
Boy, I need your touch
Your love, kisses and such
With all my might I try
But this I can’t deny
Deny

I play it off, but I’m dreaming of you
(but I’m dreaming of you babe)
And I’ll keep my cool, but I’m feenin’

I try to say goodbye and I choke (yeah)
Try to walk away and I stumble
Though I try to hide, it’s clear
My world crumbles when you are not near
(when you are not near aahh)
Goodbye and I choke (yeah, yeah, yeah)
I try to walk away and I stumble (hey, hey, hey)
Though I try to hide it, it’s clear (say it Lord)
My world crumbles when you are not here

Goodbye and I choke (I’m choking)
I try to walk away and I stumbe
Though I try to hide it, it’s clear
My world crumbles when you are not near
(when you are not near, yeah, yeah yeah)
Yeah, yeah..

一道智力题引发的数学问题

林小峰同学在其博客上贴了一道智力题,我上次回复没仔细看题,还以为是老掉牙的称8个球的问题。刚才仔细一看原来不是,这题以前还真没见过。于是就仔细想了想,抱着“不走寻常路”的观念,花了15分钟本以为想出乐,结果发现其实不对。题目如下:

题目:有12个乒乓球特征相同,其中只有一个重量异常,现在要求用一部没有砝码的天平称三次,将那个重量异常的球找出来。 (尤其特别注意:是异常,但不知是轻了还是重了

对比网上的答案又看了一下,发现以下两个问题:

1. 其实分4组是不可能称出来的。

2. 三步其实最多能从13个球中称出。

网上流传甚广的解法如下:

把12个球编成1,2……12号,则可设计下面的称法:

左盘 右盘
第一次 1,5,6,12
2,3,7,11
第二次 2,4,6,10 1,3,8,12
第三次 3,4,5,11
1,2,9,10

此法的巧妙之处在于,通过合理的安排三次称重中球的位置,使得不同的结果能够得出不同的结论。这似乎涉及到信息论的知识(香农老先生好伟大啊……) 。

如果我们把它抽象成数学来看,大体如下:

用一个12bit的数表示称量状态,第N(1<=N<=12)bit表示第N个球被选中来进行称量。

首先,我们必须分三组来称量,直观上来看,是因为3^3=27刚好大于12x2=24,通过裁剪我们有可能把27削减到24。而如果分4组,3^4=81,削减到24的可能性很小。(谁能给出准确证明?)

其次,若分三组的话,我们如何通过合理设计把结果可能性削减到24?最基本的一个要求不能动:就是每个球必须放过,即:每一位都至少被置过一次1,这样才能保证不会出现三次称量都平衡的局面。这样也把27削减到了26。还有两种情况应该也能排除,那就是三次均为左或三次均为右的情况,这很简单,我们只要保证一个球不是三次都在左边或右边就行。

好了,我们把上面的要求转化成数学。先是每次放法的数学表示,可以用这样一个二维数组,里面有三组元素,代表三次称量,每组又有两个元素,第一个代表该次称量天平左边放入的球,第二个代表右边的球。上面的两个要求就变成了:

u12_t balls[3][2] ;

balls[0][0] | balls[0][1] | balls[1][0] | balls[1][1] | balls[2][0] | balls[2][1]==0xfff

balls[0][0] & balls[1][0] & balls[2][0] == 0

再往下走就是对这些数的筛选和判断了。筛选很简单,每个数必须是12位上的某4位置了1,其它8位均为0。这样的数共(12x11x10x9)/(4x3x2)=495个。我们每次要从里面挑6个,来进行判断,判断的方法是:对于上面说的24种情况,其中一半又是对称。这12种情况中每个情况下得出的结果必须是12位上只有一位置1的数,它就表示处于该位上的球是异常球,而且还不能重复。操作过程如下:

1. 对于每组元素,要么取其第一元素,要么取其第二个元素,要么取这两个元素的同或(至于为什么是同或,就留给您思考了)。

2. 把上面得到的三个结果进行按位与。

3. 遍历完这12种情况,把每次得到的结果或起来。若是0xfff,符合要求;否则淘汰。

这样,一个程序的雏形基本上就出来乐,如果不再进行优化的话,大概要进行237832111537020次计算。有兴趣的同学可以用Python来完成整个程序。(友情提示:Python里面的位操作和C里面的一样。)

写程序,过中秋

王小敏同学昨天给俺出了道题,还非得要求用C,结果差点儿没累死……换我们可爱的Python,结果一会儿就搞定了。题目是这样的:

“有一个3x3的矩阵,现在要往里面填9个不同的数字。唯一的要求是:相邻的数字相加不能为质数。注:数字的取值范围为:1~N。(N为一个>=10的数)请用程序解出尽可能多的符合要求的矩阵。”

俺穷举了一把,就得出结果乐~~我的程序如下:

! /usr/bin/env python

def Perm(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[:i] + items[i+1:]
for p in Perm(rest, n-1):
yield v + p

neighbors = [[1, 3], [2, 4], [5], [4, 6], [5, 7], [8], [7], [8]]

def IsPrime(x):
for i in range(2, x/2+2):
if (x%i == 0):
return False
return True

def WantIt(listobj):
for i in range(len(listobj)-1):
for j in neighbors[i]:
if(IsPrime(listobj[i]+listobj[j])):
return False
return True

enum = Perm(range(1, 11), 9)
for k in enum:
if(WantIt(k)):
print k

打住,这道题就到此为止吧。

接着说那令人心醉的patch。前几天做的一个patch提交了3次终于被Andrew给纳入-mm树了,呵,不容易啊!当中还正好赶上-mm树更新,不过quilt push一把居然没错!好险!要不今天也见不到akpm的确认邮件……说不定我还在那里痛苦地wiggle……

由于mm同学今天来不了,所以俺就闲得没事干了,又正好赶上-mm又更新,干脆又把内核编译一把。N个小时后,把我搜集的warnings打开一看,发了,N多。挑了其中两个好修复的,又提交了两个patch。欧也!

说patch不能不提我们的fmail,昨天一口气提交了N个patch,Carlos都给apply上了。我对Carlos的名字很感兴趣,其实他的全名是Carlos Daniel Ruvalcaba Valenzuela,太长了!貌似应该是俄罗斯人。

T-shirt候选图片

按照往年惯例,今年也准备自己去印个T-shirt。为了推陈出新,这次我拿出几个新颖的方案,希望大家各抒己见,多多发表自己的看法。

1. 冒充数学家

用此作为T-shirt图案最大的坏处就是怕被追问:“哥们,您这公式是啥意思?来,给你张纸,给俺证明一下吧?”……

2. 科幻派

啥都不说了,科幻粉丝都知道这是什么意思~

3. 实力派

(待定)因为没找到当初comp.lang.c上的那个很酷的签名,所以此方案暂时搁置……

如有其它更好的方案,还望不吝赐教!