邓世龙的自留地

兼济天下则达 独善其身则穷

月度归档: 2011年9月

试用Google Reader


不知从什么时候起,不能登录徐宥的博客。昨天闲着没事,试用RSS,于是试用Google Reader,可以订阅徐宥的博客。由于GFW的存在,具备翻墙能力还是有必要的。本以为是由于Google Reader的翻墙能力,我才能订阅徐宥的博客。但今天早上没有使用Google Reader,可以登入徐宥的博客。我觉得Google Reader白底黑字太刺眼了,而且没有办法保留网站的设计风格,所以还是直接登录博客比较好。

在徐宥的博客上逛了一会,才知道徐宥同学去Google了,厉害。没想到徐宥同学已经结婚了,今天一位大师兄要结婚了,去看看。之前一直没有试过在博客里贴图片,贴一张徐宥同学结婚的靓照吧。

适合小朋友玩的游戏


假期将至,推荐一个游戏给大家,学习之余,放松放松。游戏名字是Crayon Physics,在任晓祎的博客上看到这个游戏,但没有玩。某日,看到陈秀娜小朋友在玩QQ游戏,而我一直都不喜欢玩QQ游戏,于是就推荐这个游戏给陈秀娜小朋友。当然如果要推荐的话,自己要先玩玩这个游戏,好玩的话才能推荐。很快,我迷上了这个游戏。游戏的画风很朴素,但玩起来饶有兴趣。

相信大家小时候都有一个想法,那就是摘下天上的星星,但后来发现这是不可能的。如果你至今还对无法摘到星星而耿耿于怀,不妨玩玩这个游戏,游戏的任务就是摘星星。

以下是我与陈秀娜小朋友的对话,对话如下:

邓世龙:陈秀娜小朋友,你玩过这个游戏之后有什么想法没?是否勾起你童年的回忆?

陈秀娜小朋友:我觉得这个游戏挺好玩,挺适合女生。背景音乐给人一种很喜悦很舒心的感觉,这个游戏中利用物理原理来完成,稍稍动动脑子还是挺好的。

邓世龙:小朋友,竟然会懂物理原理,不错不错。

陈秀娜小朋友:玩这个游戏,不知不觉中,你就会懂物理原理的。

邓世龙:游戏过程很像在创作一幅图画吧?

陈秀娜小朋友:是的,很像,我有点想画画了。

关于是否读计算机研究生的讨论(转)


在Felicia的博客中看到这篇文章,很不错,于是转载。看完之后,只能感叹,自己还不符合计算机研究生的要求。

哪些人才适合读计算机的研究生呢?

读计算机研究生最好要有实际际开发经验,这里所说的“有实际开发工作经验”通常应该具备:

  • 你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用;
  • 你完全理解STL为什么这么重要;
  • 你能够在30分钟之内想到正确的五子棋算法设计思路和方向;
  • 你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人;
  • 英文网站是你的首要信息来源;
  • 能够读懂英语写成的国际标准,比如NTFS磁盘格式标准。
  • 你经常站在集合论的角度思考算法问题;
  • 能够理解一个简单的驱动程序,能够理解一个简单3D交互程序;
  • 你能够认识到线性代数和概率论在实际编程工作中的极端重要性;
  • 你完全理解COM的设计思想,尤其能够理解COM为什么要设计成这样;
  • 当我说到虚函数的重要作用时,你不会急着去找书来翻;
  • 你能够说出C++为什么比其他语言优秀的理由,记住这种理由应该来自于你的开发体会,而不是因为其他人都这么说。 此外还有很多判断标准,但如果你同时具备5条以上,可以认为你已经具备相应的开发经验了。在这种状态下读研,你将取得读研效益的最大值。

当然,如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择。因为计算机学院才能让你在理论上更上一层楼。当然能不能更上一层楼最终还是完全取决于你自己。需要特别说明的是,工作经验并不一定等于开发经验,我见过很多工作2-3年的人,但是没有一点开发经验。比如我。我原先的室友,研究生毕业,现在留校当老师,他好象从来都不写程序,好象也写不来程序。还需要说明的是,考计算机的人未必个个都是高手,严格来说,大部分都不会编程序。也就是说,庸庸碌碌之辈仍然占绝大多数。我的许多研究生毕业的师兄都只有到高校教书等,甚至找不到工作。所以不要寄希望于拿一张研究生文凭出去赚高薪。但是,对于有实际开发工作经验的人,要想自己在3年之中有一个真正的提高的话,计算机学院提供了广阔的平台。

为什么要读计算机研究生

读研最重要的是要明白你自己要干什么,不能等导师来告诉你你应该干什么。研究生的优势在于理论功底深厚,思维具有穿透力,当然编程能力首先要过关,不要读完研究生还不知道MFC程序的WinMain函数在哪里。所以,研究生期间,你一定要做有理论深度的算法设计,比如大规模数据的搜索算法,性能是首要考虑因素,不要奢望SQL函数能够帮你解决问题,所有的问题你都必须自己解决,你必须解决内外存交换的性能瓶颈。再比如极品飞车的3D场景生成,图形变换,碰撞检测,物性模拟,纹理映射,灯光模型等等,这些都是可以保证你能拿到2万以上月薪的技术。如果你认为这些东西太难,不可能做得出来的话,那么你就不适合读研。真的,要是你认为读研之后还是要去搞一般的程序设计,如信息管理系统之类的软件,那么你读研的价值就完全不会得到体现,因为这些工作根本就不需要读研。 如果你只想成为软件开发高手(比如认为会编驱动程序或杀毒软件就是高手的那种),建议工作,不要考研;完全没有工作经验的,也不建议考研,你进来了只有瞎混一通。如果你有上述工作经验且想成为高级软件工程师(能够独立理解并设计出快速傅立叶变换算法的那种软件工程师)的话,那么强烈建议考研。考研让你有3年放松思考的机会,也有3年让你思想和技术积累沉淀的机会。非常难得的机会。不考研的话,这种机会就是一种奢侈,可望而不可即的那么一种奢侈。同时,不管你是哪一种情况,都不建议考软件学院。除非你是女生,把能够成为一个研究生当着一生最大满足的那种女生。

读计算机研究生投入与产出分析

  • 机会成本。这是个经济学问题。读研的机会成本的确是很高。任何人都可以简单地计算出来。所以,我也不赞成所有的人都去读研。读研只适合那些痛感数学在编程中的极端重要性的人。如果对理论工具和理论思维的极端重要性没有切肤的认识,那么读研的价值几乎为0;读研的好处在于:A,把你自己放在一个学术和工程的交叉点上;B,让你具备了进入微软等世界顶级软件研发机构的可能性;记住只是可能性。但是不读研这种可能性为0;C,如前所述,如果没有读研的机会,你也就没有静下心来好好钻研几年理论的机会;一边工作拿高薪,一边深入地学习各种理论,诸位认为这可能吗?我反正认为不可能,我觉得学习钻研理论最需要的就是一个长期安静独处的环境,一边工作一边读书是不可能有这样的环境的,你会觉得每天都在疲于奔命。而读研正好可以提供这样一个环境。我同时还反对整天跟着导师的屁股后面跑,这样会浪费很多时间。读计算机的研究生,主要依靠自己去查阅最新文献,自己去研读文献,和导师的口头交流一个月一次就足够了,前提还需要导师的水平足够牛。如果导师的水平不牛,这也没关系,不理他就是了,自己做好自己的事情即可。
  • 教学质量。就如网上一个人说,全国都是“洪桐县中无好人”,尤其在计算科学领域,大牛极少。那为什么还要去读研?大哉问!把读研的收获寄托在名校或名师的名我认为气上,是注定要失败的。读研全靠自学,研究生之间的差距全部体现在自学能力上面。又有人问,既然是自学,为什么非要读研?回答是:因为读研就是为你买一份保险,就是买一份你自学三年之后不会失业的保险。这份保险主要是一种心理上的后盾,让你在自学过程中经得起诱惑,能够从容镇定地去追寻计算机理论发展的坚实足迹,从欧拉,费马,高斯,康托,图灵等巨匠那里寻找方法论的珠宝。倘若没有这份保证,你在家里面自学3个月,保证你会被失业的压力压得喘不过气来,何谈安心学习?
  • 理论与实践。这没有定论,如前所述,管理信息系统,设备驱动开发,工具软件开发,软件病毒剖析等等这些工作不太需要创造性,需要的是耐心和经验,需要的是对既有规范的准确理解,这类开发工作最适合在实战中提高,理论学习没什么作用。但是在人工智能,模式识别,图像压缩,虚拟现实,巨量数据检索,自然语言理解,计算机图形学等等领域,理论学习就占据着绝对的统治地位!这些领域的突破对人类的生活的影响是极其巨大而深刻的。某些领域处于一个极其快速发展的态势之中,比如计算机图形学,相信诸君能够从众多3D游戏的灿烂辉煌中体认到我的这种说法。在这些领域,如果没有扎实的理论功底,一切都是那么遥远,不管你花了多少时间在编程上面。
  • 知识结构。首先声明,我不是一个纯粹理论激进分子,即认为除了理论之外,一切都不重要。我认为,纯熟的编程技能是最基本但也是最必不可少的技能。没有这个基础,一切计算机理论就是空谈(研究图灵可计算性理论的研究者除外)。有了这个基础之后,一些基本理论学习方向必须重点突破。

读计算机研究生应具备的理论素养

  • 科学哲学。这是核心中的核心!可惜国内不开这门课。不但不开课,而且还作为批判对象来引用,实在是遗憾至极!这是一门教你如何“钓鱼”的学科,在一切科学研究中居于最核心的地位。它是古今科研方法和思维方法的集大成者,很难想象一个成熟的研究者没有一套自己的方法论体系。科学哲学最需要的是领会与总结,它的思想与启示会伴随我们的一生。
  • 康托集合论,矩阵方法,离散结构,图论方法,群论方法之间的紧密关系。最重要的认识这些理论对实践的重要启示和方法引导。我始终认为,如果你学了一门理论之后,却不知道这门理论有什么作用,那么你的理论就白学了,你什么东西都没有捞着。所以,学习任何理论之前,先问自己:它有什么用?在哪里用?如何用?带着这些问题去学习理论,你才会真正地学到东西。用这三个问题去问你的理论课老师,他的回答就是判断其实际水平的最佳标准。
  • 思维要有极强的穿透力,学会看透文献作者没有写出来的动机。绝大部分大师都有隐瞒自己最具有方法论启示意义的思考环节的习惯。牛顿和华罗庚先生都有这个坏习惯。这让大家认为他们是天才,因为很多问题他想到了,我们想不到。但是为什么他们能想到,我们想不到?他们是怎样想到的?没有人告诉我们牛顿发现万有引力定律时的思考过程,当然,牛顿可以慷慨地把他的思考结果告诉我们,但是,他那可以点石成金的“金手指”却没有教给我们。我们的任务就是要培养透过文章看穿作者背后意图和动机的能力,在这方面,台湾的侯捷和美国的Donbox是绝佳典范。这两只老狐狸(呵呵,是爱称)凭着其猎犬一般的嗅觉,抽丝剥茧,一个把COM背后的幕后设计动机揭开并暴露到了光天化日之下,另一个把MFC的宏观架构做了一次完美的外科手术。其非凡的思维穿透力令人惊叹。
  • 最后,英语这个狐狸精。英语本身不重要,但是用英语写成的文献就极其重要了。所以,专门把英语作为一个重头戏列出来。大家不要相信英语无用论的鬼话。对于搞计算机的而言,英语就是你的母语!英语是科学家的工作语言,就如普通话是教师的工作语言一样,一个不会普通话的老师,一定是最早该下课的老师,一个讲着方言的人,一定是没有什么文化含量的人,一个到处是方言的学校,一定是三流或者三流一下,甚至是Y学校,一个只讲方言的寝室要么是不团结,要么是地方学校,要么都是一群没有眼光的人,没有什么出息。

其它的具体理论还有很多,但是都不如这几个个方面重要,因为我觉得这几个个方面是最具有根本性,全局性的能力培养环节。需要指出的是,很多高深理论对你的工作是无意义的,当心时间陷进去。一定要把效率最高的时间段用在最具有决定性意义的理论学习上。关于读研之后的出路是否光明的问题。我们应该承认,读研之后,你的工作机会不是变多了,而是变少了。而且越是高手,他的工作机会和工作范围就越少。这是因为,越是搞前沿研发的公司,其数量越少,在这个圈子的人也就越少。你找工作的范围就越小,试问:如果微软的OS设计专家出来找工作,能够让他选择的公司能有几家?但是,这种公司数量的减少是以工资待遇的急剧上升为补偿的,同时,你在工作中所受到的充分尊重也是在一般公司中体会不到的。所以不要担心学了高科技用不上,呵呵,你只会越来越感觉自己学的不够用。既然选择了理论深入,那么就应该把眼光放得更远。

综合起来,我并不具备良好的计算机理论背景,尽管我对算法类的课程并不恐惧,对程序题自认为有一定的悟性,但是我根本就没有什么编程经验,甚至对许多应用软件都很陌生,况且我还许要相当的时间恶补英语,我对数据也很敏感,但我觉得去做心理学的统计分析、理论假设,调查研究,似乎更合适。所以我觉得不适合读计算机研究生,至少没有这个时间,我把这些精力和我的基础很好的应用于心理学上,无论是基础心理还是应用领域,我觉得比较有信心学好的。希望大家给予指点,尤其上上次匿名的博友一定要来指点啊,你的分析还是很不错的,谢谢。 文章出处http://csfelicia.blogbus.com/logs/40001261.html。作者:Felicia

整数对中找规律


以下是一些整数对,你能发现其中的规律吗?

1      2

3     5

4     7

6     10

8    13

9    15

11   18

12   20

14   23

16   26

17   28

19   31

21   34

......

如何快速判断一个整数对是否是这个规律中的数? 当然你可以按照这个规律一直写下去,然后再来判断是否满足,比如22 36,24 39是,23 38,25 40不是。但如果这两个数很大的话,不知道要写多久呢?有没有更简便的方法呢?

这个冬天不太冷


新生开学,后勤部的那些人又来卖草席,棉被等等,让我想起很多。

去年开学,独自一人背着个包,提着一个箱子前来报到,所以需要购置草席,毛毯等等生活用品。可惜运气不佳,那天下大雨,对华工周围的环境也不熟,只能就近原则,在学校里买。当时在学校里有两个卖家,一个是世博超市,一个是后勤部,我的第一选择是后勤部。因为这毕竟是学校的后勤部,价格相对来说会公道一些。草席,蚊帐,枕头必不可少,我喜欢喝开水,所以开水壶也必须买,毛毯也要买,晚上可能会有点冷。考虑到现在还不冷,被子就不用买了。于是就买下这些。枕头25,水壶23,毛毯65.吃过晚饭后,又去看了一下被子,看到后勤部的阿姨们挺辛苦的,在吃便当,下着大雨还要忙来忙去的,问了一下被子要90.我觉得有点贵,但考虑到这里是广州,物价可能会贵一点,这也是我第一次买被子所以不知道行情。我说我还是到外面去买吧。卖被子的阿姨说可以,但千万不要到世博买,世博坑人。就因为这句话,我心软了,想想后勤部的多辛苦,下着大雨还来卖东西,为了方便学生,吃便当也在所不惜,还会给你忠告。于是买下了这床被子。后来的事实证明,世博确实坑人,后勤部也坑人。

很快秋天就到了,拿出被子,总觉得被子短了,但还好现在不冷。不久冬天到了,这时发现问题了,被子只有180cm,而我身长170cm,所以稍不留意,双脚就要着凉,于是只能缩着双脚睡觉。但冬天依然寒气逼人,某日偶感风寒,于是去穗石买了一床毛毯(30元),顿时暖和许多。但是,去年冬天,广州冷得出奇,一床被子加两床毛毯还是难以御寒,晚上双脚冰凉冰凉的,只好穿着袜子睡觉。冷的时候就以那句话来鼓励自己。故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。就这样,冬天过去了。(擦擦汗先)

寒假归来,想想这样下去也不是办法,于是又去穗石村的琼琼百货买了一床被子,60元,是200cm。比后勤部卖给我的便宜30元,而且质量还更好。受不了,问了一下其它东西的价格,枕头20,水壶18。看来这后勤部除了方便学生之外,也赚了不少钱。这枕头和水壶多赚5元钱也就算了,可这被子赚得也太狠了吧。由此想到宿舍安装空调这档事,自从安装空调之后,住宿费每年多交200元,还要交100冷气费,也就是说4人一个宿舍要一年要交1200,四年就要交4800.应该可以买两台空调了。看来华南地区的商业气息太浓厚了,严重渗透到学校。华工要想成为研究型大学,还有很长很长的一段路要走。

在此给穗石村的琼琼百货做一下广告,这里的草席啦,被子啦,毛毯啦,价格相当公道,如有需要,可以去这里买。当然你还可以还价,但是希望你不要这样做,还是把你的讨价还价的能力留给房地产开发商,这个才是重点。

还好,有了两床被子和两床毛毯,这个冬天不太冷。

逆波兰式


最近在看《C语言名题精选百则--技巧篇  冼镜光》问题6.2是有关逆波兰式的,一下介绍一下逆波兰式。所谓逆波兰式是用来表示一道表达式的常见写法,是由波兰学派的逻辑学家发展出来表示逻辑式子用的。它有一个很重要的特性,就是不会用到括号。在普通的算术式中,运算符在操作数之间,而在逆波兰式中,运算符在操作数后面。例如普通式子a+b,如果写成逆波兰式则是ab+;普通式子a+bc,写成逆波兰式则是abc+;式子ab+c,写成abc+.现在解释这是为什么。对于a+b,+的操作数是a和b,把运算符写在操作数后面,很明显写成ab+;对于a+bc,要先算bc,得到bc,这时+的操作数是a和bc,所以是abc+;同理可得到ab+c的逆波兰式。

如果算术式子中有括号,括号中的部分对运算而言就是一个完整的操作数。例如在(a+b)(c+d)中,a+b写成ab+,c+d写成cd+,最终整个式子写成ab+cd+.对于式子a(b+c)-(e+f)/g,a与bc+是的操作数,这一部分写成abc+;ef+与g是/的操作数,这一部分写成ef+g/,最终式子写成abc+ef+g/-.

可以看出,一旦写成逆波兰式,括号就没有了。这是它方便的地方,那么如何将算术式转变成逆波兰式呢?冼同学给出了提示。对于a+bc,读入+就无法知道这个加法能不能计算,一直到出现才能做出决定。同样,对于a+b(x+y),读入也无法知道这个乘法能不能计算,要等到x+y算出之后才能算*。其实就是在下个运算出现之前,并不知大目前这个运算可不可以算。如此,用栈是个好方法,把不能算的运算先压在栈中,于是现在的这一个就在栈顶,当下一个运算出现了,就看看顶上这个与下一个运算的关系,如果栈顶上的这个可以算,也就是栈顶上的运算的优先级大于等于下一个运算的优先级,就把它输出,如果不行,将下一个运算入栈。这里很关键要处理左右括号。

冼同学还说,其实,可以在其他书上找到答案,但建议不要这样做,因为在计算机刚问世是这是个难题,如果能够独立解决它而不求助外力的话,是很值得自豪的。正因为后面这句话,我没有立刻去找答案。折腾了一个上午,总算有点眉目,但我竟会想到用递归。还算我有点常识,递归程序一般都可以用栈实现的,既然在程序中已经用了栈了,就不应该再用递归了。困惑之际,上网查了一下逆波兰式,可恶,我看了算法,最终还是借助了外力。

与《C名题精选百则--技巧篇》相识,是在大一时,也就是四年前了。那时只会写求素数等基本程序,看了序言就知道这是本好书,做了序曲中最长平台这一题,被这本书折服了,之后就没有再看这本书。时隔四年,再次拿起这本书,总算可以坦然面对。看来算法水平有所提高了。这本书是台湾人写的,于1989年出版,中国大陆于2005年出版。差距。想到《计算机程序的构造和解释》作为MIT计算机科学的入门教材,而我国计算机科学的入门教材是什么呢?我也不知道,反正我是《C语言程序设计》。差距啊。

空闲时玩的游戏manufactoria


在matrix67的博客上看到这个游戏,于是玩这个游戏,确实有难度。翻开日志,看了一下玩游戏的整个过程。

2011年1月2日,20:36通过任晓祎的博客访问到matrix67的博客。花费40分钟。

1月3日,15:26玩游戏“manufactoria" 花费3小时。

1月5日 10:30 去实验室,玩manufactoria。花费30分钟,11:16玩manufactoria 花费40分钟。

1月7日 11:30 玩manufactoria。花费30分钟   18:15 回实验室,玩manufactoria花费 40分钟。   21:27 玩manufactoria 花费30分钟。

1月9日,被有一关卡住了,没办法通过,于是叫同学玩,希望他们能解决。 18:00教杨俊玩manufactoria。花费1小时。  21:42 教陈海龙玩manufactoria。花费44分钟。后来发现是由于对题意理解错误,之后这关很快解决。

3月18日  18:26 去实验室,玩manufactoria,花费2小时。

3月20日,9:30 又被一关卡住了,教黎扬玩manufactoria,他解决了这关。花费2小时20分

3月26日, 14:20 玩manufactoria 花费2小时10分。

5月25日 15:23 玩manufactoria 花费2小时

7月25日 至 8月1 晚上睡觉是考虑manufactoria,试着像特斯拉一样在大脑中想象机器的运转过程,但终究比不上特斯拉,没有那么精确,但想通了加一,减一,逆序输出字符。

8月11日   20:30 玩manfactoria 解决加减,逆序输出字符 花费2小时。 23:30 玩manufactoria 花费1小时10分

8月12日, 9:40 玩manufactoria 解决对称 花费1小时20分。

总游戏时间为22小时14分钟。当然还没有加上吃饭时考虑这个游戏,睡觉时考虑这个游戏的时间。总游戏时间相当长,而且很遗憾的是,现在还没有将游戏通关。想想matrix67花费一个下午加晚上的时间就把游戏通关了。但我想他之所以能做到这样,此前必定付出很多努力。于是在他的网站中寻找证据,果然被我找到一条,在他的博客中《我中学时代的作文一:换一个角度思考问题》。matrix67考虑的是这样一个问题:22, 2, 53, 10, 19, 0, 53, 7, 0, 79, 28, 8, 69, 1, 100, 104, 0, 74, 18, 39。每一个数字代表一个字母,合起来组成一个简单的英文句子,用通常的方法无法的到答案,需要换一个角度思考。读者会在某特定的场合下想出答案。为了这个问题,读初三的他竟会探索半年之久。这也证实了我的想法。

希望有哪位空闲的能人异士将游戏通关,然后告诉我最后一关的算法。