More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Tang Liang's notebookPhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

July 08

这段时间的总结

  离去年北上MSRA的实习已经有1年多了。从本科的时候就把MSRA作为自己一直努力奋斗的目标。这个目标终于在07年实现了,而我的07年大半年时光都在MSRA度过。回想起来,那段时间除了work外没有什么前忧后顾,还有一大帮新朋友,老朋友,过得是挺自在的,舒服的。然而,正是这半年多的实习经历改变了自己现在的人生目标。我相信我从本科一直到研究生的几年内,工程方面的积累已经足够我去竞争国内最顶尖的企业了。但是,或许我自己从小本身就属于热衷未知领域的探索,新事物的发明创造的人,MSRA的经历在某种程度上激发了这种内心本质追求的渴望,从而去追求新的目标,更高的目标。

  从去年年底回到学校,就一直潜心在做学术研究。半年多时间又过去了,收获还是挺大了,NDBC中了一篇,IEEE的某个Conf.中了一篇,还有一篇刚投出去。虽然已经中的两篇虽然都不是顶级的会议,但也是对自己的工作的肯定。实际收获还不光是这些看得到的,诸如自己的阅读论文的能力,查找相关文献,做研究的心态,写作技巧, matlab运用等各方面的提高。想起来,这段时间也过得很辛苦,很多时候都是每天几乎14小时的工作和学习,比起MSRA的工作有过之而无不及。毕竟,自己硕士阶段剩下的时间也不多了,每一天的时间都是很宝贵的。另外,能在这么短时间能取得这些收获,也少不了导师,师兄们的指导和帮助。现在真的很庆幸自己当年能保送到现在的导师和实验室。没有实验室这样的学术氛围,也不可能让我坚定选择走现在这条路。 当我开始走上这条路之后,才发现原来身边有那么多人也在同一条路上,特别是大城市里面有钱人家的孩子。其实,不是每个人都适合走这条路的,甚至可以说,10个人中只有不到1个人才真正适合。记得在MSRA的时候跟年长的employee聊天,他说当初他们读书的时候也是很多同学都不顾一切踏上这条路,到现在,没有一个不后悔的。不过,我觉得我恰好是那幸运的不到一个。

   之前看到同学在注册一个百度之星的编程比赛,于是自己也跟着注册,然后参加比赛。最后的比赛成绩并不理想,但或许是恰好上了某个分数线吧,前天百度发了实习生的邀请函,并且告知说转正的机率很大。上届我们实验室两个师兄也是这样进入百度的,最终都拿到百度的offer。要是一年前的我,肯定马上就回复百度准备面试了,毕竟在国内,百度开的薪水还是数一数二的。下学期就要开始找工作了,自己之前一直努力的目标就是找到一份好的工作。结果真正辛苦了几年,到了最后,却戏剧性地发现这已经不是自己的目标了。

June 19

SCU BSS讨论帖子

==============回复1================ 

算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。
算法与我
当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。” 其实,这点他们彻底弄错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!
网络时代的算法
有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步,数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法来解决。
再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?
最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。
这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法呢?
首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。
问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。
上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范围,一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。
通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小问题,然后再选用合适的算法和数据结构。
并行算法:Google的核心优势
上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱,Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实。
在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访问Google的网站,使用Google的服务,也产生很多很多的日志(Log)。因为Log每分每秒都在飞速增加,我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对log进行一些分析处理的问题,有很多面试者的回答虽然在逻辑上正确,但在实际应用中是几乎不可行的。按照他们的算法,即便用上几万台机器,我们的处理速度都跟不上数据产生的速度。
那么Google是如何解决这些问题的呢?
首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的是超大的并行计算机。但传统的并行算法运行时,效率会在增加机器数量后迅速降低,也就是说,十台机器如果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可以负担得起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。
那么Google是如何开发出既有效率又能容错的并行计算的呢?
Google最资深的计算机科学家Jeff Dean认识到, Google 所需的绝大部分数据处理都可以归结为一个简单的并行算法:Map and Reduce(http://labs.google.com/papers/mapreduce.html)。 这个算法能够在很多种计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。Map and Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个server farm里面的机器down掉一半,整个farm依然能够运行。正是因为这个天才的认识,才有了Map and Reduce算法。借助该算法,Google几乎能无限地增加计算量,与日新月异的互联网应用一同成长。
算法并不局限于计算机和网络
举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气象方面,算法可以更好地预测未来天灾的发生,以拯救生命。
所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益减小,而是在日益加强。
给程序员的七个建议
(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面有一定的功力了。
(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。
(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。
(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。
(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。
(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。
(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境,一个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。
希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来!
所以大家加油哈~~~

=====================回复2======================

其实ACM比赛里面的谈的算法,和现代计算理论的发展还有一定方向的距离。
举个例子,最近ICDE上提出的全世界“十大机器学习”算法,在ACM比赛里面看来,几乎都是连选拔赛都进不了的easy case。不少算法,基本上就是一个求和,相减,相除就可以完成的。为什么呢?
现在计算机学界的发展主流,早就不是细节计算过程的优化,而是针对新的,更好的计算模型,数学模型的提出和改进。数学模型,计算模型的研究,虽然实现的计算过程很简单,但是代表的是一种思想,而不仅仅只是仅仅看成计算机内存单元之间的运算。比如一个朴素贝叶斯的提出,大家都知道其算法实现是多么简单吧,一个刚学C语言的同学都会写,难道能说朴素贝叶斯是一个普通大一学生就能提出的吗?楼主说的别人实验室里面一个O(n*m)做成O(n*n*m)这样的情况其实很多了,并不奇怪。这样就取笑别人,只能让自己捡了芝麻丢了西瓜。我们要学习的,应该是别人做的东西真正的精髓。多学习别人精髓方面做得出色的地方,而不是具体实现的失误。实际上,很多顶尖的学术文章,在讲解算法的时候,往往都是以最简单,最直白的算法写出来,并不是别人不知道怎么优化,而是别人关键要把整个计算的过程阐述清楚。具体实现的时候,你可以运用诸多的动态优化,各种树,各种表,去改进它的时间复杂度。这个在别人研究者面前,不是关心的主要问题。
大家都知道,在计算机领域,最一流的工作都是提出新的问题,二流的工作是提出一个计算模型去解决这个问题,三流的工作才是改进已有的解决办法。中国人现在做科研的时候,往往都是在别人提出一种新的计算模型下,然后运用各种技巧改进别人实现过程。当然,这个工作也是值得称赞的。但是,这只是一个三流工作。为什么中国不能出大师呢?
不要觉得大学开的基础课程都是外功,只有算法才是内功。大学选择的这些课程,都是全世界最顶尖的计算机专家共同协商的,全世界每个计算机本科都上这些课程。如果学好基本算法,就可以走遍天下都不怕的话,那为什么大学里面不主要就开算法课程?难道这些顶尖的计算机专家都是故意让我们走弯路?其实不然,大学里面,关系数据库,计算机网络等,核心的内容在什么地方?绝对不只是算法的实现,而是解决模型的提出。比如说,存储查询的关系模型,网络上的通讯,路由等模型。先提出了模型,才有实现的算法。这个模型不是上上算法课程就能学得会的。我知道ACM算法课里面也是 先讲解很多题目的解决模型,然后讲算法的。实际上解决任何一个问题都是如此。问题在于,大学的这些基础课程讲解的,是现实中用得最广泛的,相对有一套完成的理论体系的。这些课程涉及面很广,任何一个领域都是足够让你消耗一辈子的精力去学习和研究。这些领域提出的各种问题,各种解决模型,不是ACM课上那种光讲讲例题就能完了的,它们在现实应用广泛,问题很多,需要很深入地系统学习和研究,而不只是做几道编程题目就算是学会的。
随便八卦一下,为什么ACM队伍里面那么多牛人,最后没几个选择从事到计算机的研究工作去呢?为什么大家都去做工程了?
【 在 jjjscuedu (jjjscuedu) 的大作中提到: 】
:  算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽

June 05

Continue to study the advanced experimental programming tools

   After having the taste of GSL, somehow, it is not considered as the MATLAB that used in a large group of people. Furthermore, the graphics function  and data visualization of MATLAB are important to many users. Here, I tried to study MATLAB from now on. The list of program  as followed is my first MATLAB programs.

image

May 22

使用GSL来做实验

  熟悉C++做开发的我们,对于matlab, mathematics等软件总是不太习惯。同时,很多research的实验程序需要进行efficiency的对比,所以大部分采用C++是比较合适的。但是诸如矩阵运算,least-squares,随机分布函数等常规数学工具库,matlab实现起来是很直接的。幸好,GNU有一个GSL(GUN Scientific Library)库,里面使用Pure C实现,开放源代码,里面包含了大部分常用数学运算工具。这几天拿过来使用了一下,感觉很不错。这里有Windows版本http://gnuwin32.sourceforge.net/的下载。

  虽然是Windows版本,但是里面似乎只提供了.def和.dll文件。通过Visual C++里面的lib.exe,输入命令:

lib /machine:i386 /def:xxxx.def
  就可以生成.lib文件了。
May 16

5.12地震

  这次5.12地震实在太突然,太可怕了。
  记得一年半以前,自己还参与四川省地震局一些地震监测软件系统的工作。到目前为止,地震的确是不能预测的,只能发生了过后,迅速检测到。不知道我们的数据挖掘技术,是否能提供一些帮助呢?

April 06

学生的职业精神是什么?

  没有姚明的火箭比赛,我依然喜欢看,特别是这个赛季的火箭队。这个赛季,火箭队取得了22连胜历史第二佳成绩,更有一种让人敬佩的精神。从斯科拉兰德里海耶斯巴蒂尔杰克逊这些球员,我们看到一个职业球员为了一个篮板球,地板球,奋不顾身地飞身鱼跃抢夺的那股劲头。他们的拼抢,即使在面对身体更占优势的奥尼尔,高大强壮的内线,位置不占优情况下,明知抢不过,也会依然全力以赴。这不就是我们所倡导的亮剑精神吗?其实,对于他们来说,也就是最基本的职业精神。这里不得不提同样新秀的易建联,拥有更好的身体条件,应该学习一下斯科拉,兰德里这些球员。

  读研究生已经快2年了。实验室开展的论文讨论班参与同学人数越来越少。很多同学基本上一学期只来一次,还有一学期都见不到人的。正式导师所说,讨论班的论文学习,是学习知识快速的捷径。我自身感觉也是如此。很多同学在抱怨论文写不出来的同时,之前又读过多少呢?没有积累,哪里来的发挥?其实,CS的论文是很容易发的,各个新的领域不断产生,新的应用层出不穷,稍有积累便可一发不可收拾。可是,不少同学就连那么一点点的积累都不愿意去付出。

  在NBA我们经常看到很多新人,在1-2赛季打过场均2-3分钟的垃圾时间过后,就从NBA赛场永远消失了。各位研究生同学们,是否愿意在人生的赛场上也是如此地消失?

April 05

头脑VS心灵

  到中国可以不看三大殿,不可不看辜鸿铭。1915年辜鸿铭的《中国人的精神》出版,英文出版。这本书写于上个世纪初的一战期间,正值欧洲文明陷入危机之时,辜鸿铭的目的很明显,为陷于危机的欧洲文明、甚至整个世界文明指出一条出路。书中指出中国人的精神,有一条叫做Simple,不是“简单”而是“淳朴”。

  中国人的淳朴,往往都是过着小孩一般的心灵生活。为什么说是小孩的心灵,因为从古到今,中国人自身始终难以吸取现代主流文明所崇尚的理性思想,理性精神,很难去理解和研究西方理性哲学。心灵对中国人做事为人的影响大于头脑。这样的中国人很可爱,但是不可敬。

  西方有过针对意大利人和德国人的比较。德国人喜欢意大利人,但是不尊敬意大利人;意大利不喜欢德国人,但是尊敬德国人。大家都知道,整个欧洲,意大利这样的国家很多,都崇尚心灵上生活,对生活的享受。德国人的理性是出了名的。于是,这样的差异,造成德国无论在经济,军事等国力上远远高于欧洲其他所有国家。他们两次从废区中崛起,两次发动世界大战,横扫整个欧洲。

  辜鸿铭对中国人的描述,应该是100多年前的中国人。这100年来,中国发生了很多变化,但是在人本质上,还依然遗留很多共同之处。可以说,当前的中国,虽然已经拥有了很多西方现代理性文明科技的成果,但是,真正理解到西方现代文明最基础的理性哲学思想人还是不多。理性哲学的思想,强调看待问题要透过事务,抽象到内部最本质的东西,不受心灵与情感的影响。马克思唯物哲学的思想恰好正是如此。大家也都知道马克思是德国人。西方文明的这种理性哲学,才是当前人类文明,最宝贵的财富。它不仅仅是现代科学技术的根基,也是现代国家社会行政,司法建设,国防军事指挥的立足之宝。

  中国还是有很多愤青,有很多拍脑袋的领导。心灵支配着大脑,还是大脑支配着心灵?

March 30

江安的水吧

  传说四川大学江安校区的图书馆是全国Top级别的。在图书馆旁边,还修了一个不大不小的江安水吧,名字还叫XX咖啡。这个水吧的地理位置太爽,从外面窗户外面,直接就可以看到江安的超大人工湖,很清净的地方。今天,参加了微软亚洲研究院MSRA的搜索技术中心STC的几个领导在江安的座谈会。几位领导针对STC做了一些介绍,然后就开始和大家的提问互答的阶段。因为对于搜索引擎的infrastructure的东西比较熟悉,以前在DIT组实习的时候,也都接触过,所以问了相关的几个问题。STC做的东西更加贴近产品,而之前DIT里面搞得,似乎更接近探索性的研究模型。本以为这次去座谈会,会有一些面试的考察,结果之前废寝忘食地复习《Introduction to Algorithms》。不过,还是有收获,至少已经把最重要的DP看完了,对于我们这些没有经历ACM集训的同学来说,DP是一个很值得学习的地方。

  进入今年以来,什么事情都在赶,什么事情都很急,下周三还要报告ICDE08的一篇论文。为了准备座谈会,已经花费了整整两天的时间去准备算法,于是论文报告的事情就耽搁下去了。现在还有3天时间,只能尽量抓紧了。下一篇论文的deadline也快临近。事情总是堆在自己身前。算命的说我这一年会十分辛苦,十分累,需要有坚韧的意志去扛住这些事情,最终会有相应的回报的。现在看来,估计真的是这样的。

March 25

First paper comes out!

  这两天,总算把第一篇文章赶出来了。每天都活在一大堆数据里面,一次实验就要跑半天。幸好我有两台机器可以使用,否则实验一跑起来,CPU占用就100%了,什么事情都不能做了。第一篇paper居然做得那么不容易,中间题目换了又换,相关文章读了不知道多少篇。大家都说,第一篇文章最好找一个简单点的来做,那样容易获得信心。可是我的第一次,却偏偏选了一条困难的路来走,还好这个路上,我的意志还够坚强。总得说来,第一次走得那么辛苦,也并非坏事,至少那么后面的路就要好走一些。正如老板说的,做到这个份上,毕竟是尽力了,也学到了不少东西,即使最后没有中,也无悔了。重要的是走这条路的一个过程,这才是我们最大的收获。很高兴,我已经拿到了80%的收获,剩下的20%,就看审稿人是否愿意给我了。

February 15

Hard Drive

无意中看到博客堂的一篇关于微软创业的帖子。回想当初,自己11岁的时候,就开始学习计算机编程,也是因为一本Bill Gates写的《未来之路》,才激发自己对于计算机,对于编程那么大的热情。

(转自博客堂Vincent Chen)
前一段时间读了一本名为《Hard Drive》的书,它以纪实文体讲述了微软公司的成立和发展历史,其中包含了许多对当事人的真实采访资料,书中还对创始人Bill Gates和Paul Allen的童年经历有很生动的刻画。它涵盖了1975微软成立到1992年DOS 5.0发布期间的历史。非常客观翔实地记录了PC时代的来临,操作系统和语言战争,制表软件和文字处理软件的战争,以及微软帝国的形成。
这是一本非常引人入胜的书,在没有读过它之前,即使我在微软亚洲研究院有过不短的实习经历,对微软的公司文化也算耳濡目染,但一提起Bill Gate和Paul Allen的大名,首先想到的还是一种笼罩在巨额财富光环下遥不可及的形象。人们在谈论这个星球上最富有的人时,往往会感慨他的幸运,他的赚钱手腕,他“邪恶”的商业头脑,但是很少会去思考:“这帮家伙是怎么成功的?他们凭什么能挣那么多钱?”。

在没读过这本书之前,我也从没有考虑过这些问题,和很多年轻人一样,我不屑于微软的一些行为,这种“成见”自然而然地最终转嫁到盖子叔叔身上,毫无疑问,他就是“万恶之源”?。但是在读《Hard Drive》的过程中,我就被他们的创业经历深深吸引住了,因为从他们身上,我看到了曾经在脑海中向往过的那种充满激情和梦想的生活,所不同的是,我们的理想在不停地抱怨现实不如人意、社会不公平、环境不够好、教育制度扼杀了我们的天才和创造力中渐渐被遗忘;而他们,没有任何怨言和借口地将理想一步一步变成了现实!

其实最初我们都是一样的,年轻、精力充沛、喜欢幻想、毫无根据的自信、野心勃勃,但多年以后,我们在不断的抱怨中变得“很现实”,转而去追求各种各样眼前的利益,找一份工作、买车、买房,为年薪比别人高了两三万而沾沾自喜;而那些家伙,他们则把自己变成了这个星球上最富有的一群人。

《Hard Drive》不是国内很多企业在校园宣讲会上发放的那些自吹自擂的小册子(两位作者兼记者专门在前言中阐述了独立的写作背景),它用客观翔实的资料说明了一个事实:微软的成功并非偶然或是幸运,即使它的一些做法饱受争议,但它完完全全是靠一群非常聪明而富有激情的人脚踏实地推动而成的。

“I can do anything I put my mind to.” – Bill Gates P8

信念

记得小时候背课文,我们就经常被教育要像那些革命烈士般有坚定的信念,但是背过课文之后,我们果真理解了“信念”这两个字的含义了吗?还是说我们仅仅知道了“坚定的信念是人实现目标的精神支柱”很有道理呢?这句话是Bill Gates上Lakeside中学的时候给一位教堂牧师说过的话。那时他和一帮对计算机非常感兴趣的伙伴们整天泡在学校唯一的计算机室中摸索计算机这一新生事物,他们用的是纸带和电传打字机,通过远程连接一台DEC公司的大型机学习编程,Bill的第一个程序是Tic-Tac-Tor(井字游戏)。那时的他,就已经很认真地告诉他的好友,他会在25岁之前成为百万富翁。他说到做到,在之后的日子里,只要是他贯彻了“信念”二字的事情,的确都给了他丰厚的回报。

“We always had big dreams.” – Paul Allen P51

梦想

在Bill Gates和Paul Allen都还在中学念书的时候,计算机的使用费用非常高,个人用户必须向大型机拥有者按时间支付费用来获得远程登陆使用计算机的权利,于是他们通过给一家公司找操作系统的bug来挣得免费的上机时间。每天晚上,他们都会集合在公司的机房中,想方设法寻找系统漏洞,谈论对未来的畅想。那时Bill和Paul就都认为,计算机将越来越普及,软件的销售将成为一种新兴的产业。后来,Bill将这种想法用更形象的一句话表达出来,即那句著名的:“每个家庭的书桌上都摆放着一台计算机,上面运行着微软的软件”。我个人非常喜欢这种形式的Vision,因为比起现在一些“华丽”的口号,比如“让企业发挥它的潜力”之类的,它让目标和梦想变得富有现实感。

Gates eventually gave up any thoughts of becoming a mathematician. If he couldn’t be the best in this field, why risk failure? P64

抉择

Bill在刚上哈佛大学的时候,经历过一段时间的迷茫和彷徨,和很多聪明的学生一样,他平时不怎么上课,只在考试前猛学一通,然后照样拿A,剩下的绝大多数时间就是通宵和朋友们打扑克牌(他打完牌后常去找Steve Ballmer聊天…)。因为他很聪明,一度希望自己能在数学上有所建树,的确他也因为把一个有趣的“烙饼问题”的数学下界向前推进了一步而发表了自己的第一篇也是最后一篇论文。但是他后来发现有些同学数学上比他钻研得更深,所以他就放弃了在学术方面发展的念头,而工业界则很幸运地迎来了一位未来的重量级选手。在随后微软公司发展的过程中,对于微软究竟要做什么不做什么,因为软件产业那时还不成熟,Bill有很多可选项。但选择多了未必是好事,英国曾有个诗人说道:“我走到十字路口,于是无力地跪下”,太多的选择反而会干扰人的判断力。Bill最后坚持选择成为平台开发商,通过自己设定行业标准来占领市场的观点,让微软获得了长足的发展。做自己最擅长的事且做到最好,Bill的一次次抉择让微软在上个世纪八九十年代所向披靡。相比起来,我的前半生似乎都在不停地挥霍各种选择的机会,直到最终没得选择……

Gates simply liked pushing things to the edge. “That’s where you most often find high performance,” he said once. P127

执行

每个人都有很多梦想,但是我们的梦想往往因为缺乏执行,大多成为了闲聊时的谈资或者自欺欺人的夸夸其谈而已。Bill却不一样,他不光是要执行自己的想法,而且还要设法将执行的效率推到极致。他保持着从微软公司到机场花费时间最短的记录(也许是全西雅图的…),他总是驾驶着绿色的保时捷从一个地方飞驶到另一个地方(超速太多差点被吊销执照)。同样,对于他的下属,替他打工的经理和程序员们,他也通过持续不断的push把开发效率推到极致。正是这种持续不断的推动,让Bill或英明(比如采用鼠标和GUI界面)或愚蠢的想法(比如Microsoft BoB)一个个地得以成为现实,同时也为他挣得了巨额的财富。如果理想和现实之间存在着难以逾越的鸿沟的话,那么“执行力”就是跨越这条鸿沟的桥梁。

More than one unlucky programmer at Microsoft has received e-mail (from Gates) at 2:00 am. That began, “This is the stupidest piece of code ever written” P50

激情

“最初所拥有的只是激情和毫无根据的自信,但一切就从这里开始。”这是软库公司总裁孙正义说过的一句话。对于创业伊始的微软来说,这句话是再准确不过了。Bill是一个精力充沛的工作狂,在为MITS的Altair维护Basic编译环境时他就常常连续工作,支撑不住就睡在办公室的地毯上(曾经有一次被来MITS参观的客户看见…)。即使到后来不写code,成为管理层,他也依然恨不得每天工作24个小时,在微软的规模还不是太大的时候,Bill Gates事无巨细都会过问,无论是谈生意还是架构设计甚至代码编写,只要一发现问题,他就毫不留情地指出。这种激情,保持了微软不断向前,不断壮大的活力。而Passion这个词也成为了微软的核心公司文化之一,直到今天,还可以在最新的公司格言“Your potential, our passion”中见到踪影。反观自己,在不停地抱怨环境不如人意、命运多舛中,本该属于我们这个年龄的锐气和应有的激情被所谓的“老成”所取代,我们变得患得患失而不敢去尝试新鲜事物,对自己所从事的工作失去兴趣,也就没有了激情,生活变得索然无味,在长吁短叹中耗费了最宝贵的青春,很多机会也不知不觉从手中溜走。

But microkids expected to be challenged. And they expected to be able to challenge Gates. In fact, he wanted them to argue with him. P161

不惧挑战

Bill Gates的风格就是不断挑战别人同时也毫不畏惧别人的挑战,他挑战的对手不光有业界的竞争对手,也有替他打工的经理和程序员们。在项目开发中,他习惯于提出许多尖锐的问题,然后看程序员和经理们的反应,因为他认为不断地发问是把问题clarify的最高效方式,同时对于自己提出的观点,他也非常希望看到手下与他进行辩论,因为他认为这是找到正确解决方案的有效手段;当结果明朗后,他也毫不掩饰自己的错误,而是立刻纠正。在与业界对手的竞争中,无论对手多么强大,即使占据了垄断地位的市场份额,他也毫不畏惧,而是通过自己的执行和推动,做出可以抗衡的产品来,并从失败中不断吸取经验教训,进一步改进对策。就这样,随着历史车轮的滚滚前进,那些曾经叱吒江湖一时的Lotus 1-2-3、CP/M-80、WordStar等软件巨头都一个个轰然倒下,Bill和他的微软则笑到了最后。
回顾微软的发展历史,也是一个官司不断的历史,Bill并没有把这些官司看成是成功路上的阻碍,而是把它们当成一个个的挑战问题,然后花费心力去一件一件地解决。虽然这些官司让微软或多或少背上了许多不光彩的外衣,但它没有因此跌倒,不惧挑战的性格让微软越发壮大。

“Believe me,” he said as the interview ended. “Staring out the window and saying ‘isn’t it great,’ is not the solution to pushing things forward…you’ve got to keep driving hard.” P419

永不满足

在微软刚创立的初期,那时计算机的硬件资源非常有限,优秀的程序员们总是毫不满足地想把程序写得越小越好,而Bill Gates,据说在微软内部一直保持着写出最小体积的Basic环境loader程序的记录。
1985年,微软正式IPO,Bill Gates一跃进入全美最富有的人的行列。按理说,正处于“事业上升期”的Bill可谓是春风得意,可以享受生活了。但是他依然没有满足,在推出MS-DOS击败了CP/M-80操作系统后,他又将矛头指向了WordStar和Lotus 1-2-3,很快微软又推出了Word和Excel与之抗衡。他总是不知疲倦地寻找一个个竞争对手,无论竞争对手有多么强大,他都毫不留情地将之击败。他永不满足地扩展微软的产品线,直到它成为多个领域的翘楚,微软公司在这种永不满足的精神推动下,没有固步自封,而是不断发展壮大,直至成为这个星球上最大的软件公司。Bill那句经典的:“微软离破产永远只有18个月”可以说是鲜明地折射出了他永不满足的心态。

诚如《Hard Drive》一书想要表达的观点:Bill Gates和微软公司能获得今天这样的成功,离不开以Bill Gates为首的一群非常优秀非常聪明的创业者坚持不懈的努力推动。导致微软公司成功的因素有很多,我所总结的只是这些因素中令我感触颇深的几点。我即将结束学业开始自己的事业,这本书让我反思了自己,也燃起了对创业的激情和梦想。努力做一个有坚定信念和伟大梦想,懂得选择,充满激情地执行自己的想法,不惧挑战、不找任何借口,永不满足的人,我相信,这些观点和《Hard Drive》这本书,将会影响我很多!

January 31

最佳论文是怎样炼成的

  前几天看到MSRA拿了ACM SIGMM上的Best Paper,作为曾经也是一个MSRA的人,特此转贴一下关于作者介绍这篇Best paper的博客(http://blog.sina.com.cn/s/blog_4caedc7a01008io7.html)

  文章太长了,摘取了里面我比较认同的几句话。

Q2:对于这篇“最佳论文”,您有什么样的经验能和大家分享吗?

A2:说白了,也没什么秘密(笑)。首先,好论文的背后是扎实的、有理论和实际应用价值的工作,这是好论文的基础。只有好的想法才能最终产生出好的论文。其次,在写作中,我认为应该深入浅出,既要深入——分析问题要深入,又要浅出——清楚地表达自己的想法。我们的论文也是改了很多遍才确定的。当然,在大会上做演示也是很重要的。为了准备这篇论文的现场报告,我们小组内部排练了三次以上,我自己则准备了更多次。

Q4:您提到的这些方法也是比较主流的。

A4:当然对于研究的主流是需要了解的,至少要“知道”。从另一个角度说,视频标注这种问题可以看成是机器学习的理论、方法和工具的一种应用性研究。既然是工具,那么就必须了解,但不一定要全部精读。但是,作为应用性研究,只把这些工具作为黑箱拿过来就用,那多半是不能成功的。这就需要把握尺度了。我主张,还是应该先对工具有个基本的了解,然后针对某个问题,想办法用适合的或改进的甚至创新的工具。另一种说法是直接拿着问题去找工具,这个可能不是我所赞成的。

January 16

原来学习是如此地苦涩

  最近一直在忙第一篇Paper,虽然想法大致的框架成熟了,但是还有一些细节需要完善。这几天在电脑旁边做的事情就两件:看Paper和搜Paper。好不容易找到姜同学一起来合作,于是合作的前期工作就是看前人的paper。除了自己下的paper,大家也互相交流了不少。估计这几天看过相关的SIGMOD,VLDB文章没有10篇也有7-8篇了吧。回想以前研一的时候,一个学期也没读过那么多篇顶级的文章。

  长时间专注一直看paper,人的精力消耗原来是如此之大。特别是同时看2-3篇都看不懂的时候,不仅眼睛都看花了,就连心理障碍也油然而生。原来学习是如此的苦涩。。。其实,读不懂别人的文章,很大程度上是因为自己的基础知识不够扎实。当我们总是抱怨论文上的数学公式太多的时候,恰恰就是自己数学功底不够扎实导致的。最近发现我也不例外,数学方面的确很需要补充一下。于是从学校FTP上找了一本讲解数值计算的经典教程《Scientific Computing - An Introductory Survey》,打算利用寒假的时候好好补习一下。

  前几天看了《特务风云》,讲述整个CIA创始人从耶鲁大学毕业,到最后参与创建CIA中情局的故事。整个电影,给我印象最深的就是耶鲁大学的图书馆。在那种环境下,估计再心浮气躁的人,都会静下心来认真的读书的。

  今天看到姜同学博客上写了一篇关于哈佛大学图书馆上的警句,深受鼓舞,特此转贴一下:

1.此刻打盹,你将做梦;而此刻学习,你将圆梦。
2.我荒废的今日,正是昨日殒身之人祈求的明日。
3.觉得为时已晚的时候,恰恰是最早的时候。
4.勿将今日之事拖到明日。
5.学习时的苦痛是暂时的,未学到的痛苦是终生的。
6.学习这件事,不是缺乏时间,而是缺乏努力。
7.幸福或许不排名次,但成功必排名次。
8.学习并不是人生的全部。但,既然连人生的一部分——学习也无法征服,还能做什么呢?
9.请享受无法回避的痛苦。
10.只有比别人更早、更勤奋地努力,才能尝到成功的滋味。
11.谁也不能随随便便成功,它来自彻底的自我管理和毅力。
12.时间在流逝。
13.现在淌的哈喇子,将成为明天的眼泪。
14.狗一样地学,绅士一样地玩。
15.今天不走,明天要跑。
16.投资未来的人是,忠于现实的人。
17.教育程度代表收入。
18.一天过完,不会再来。
19.即使现在,对手也不停地翻动书页。
20.没有艰辛,便无所获。

附上英文版:

1. This moment will nap, you will have a dream; But this moment study,you will interpret a dream.

2. I leave uncultivated today, was precisely yesterday perishestomorrow which person of the body implored.

3. Thought is already is late, exactly is the earliest time.

4. Not matter of the today will drag tomorrow.

5. Time the study pain is temporary, has not learned the pain islife-long.

6. Studies this matter, lacks the time, but is lacks diligently.

7. Perhaps happiness does not arrange the position, but succeeds mustarrange the position.

8. The study certainly is not the life complete. But, sincecontinually life part of - studies also is unable to conquer, what butalso can make?

9. Please enjoy the pain which is unable to avoid.

10. Only has compared to the others early, diligently diligently, canfeel the successful taste.

11. Nobody can casually succeed, it comes from the thoroughself-control and the will.

12. The time is passing.

13. Now drips the saliva, will become tomorrow the tear.

14. The dog equally study, the gentleman equally plays.

15. Today does not walk, will have to run tomorrow.

16. The investment future person will be, will be loyal to the realityperson.

17. The education level represents the income.

18. One day, has not been able again to come.

19. Even if the present, the match does not stop changes the page.

20. Has not been difficult, then does not have attains

January 06

做研究,没有基础怎么行

  以前听说过很多人一个月,一个星期就可以写一篇文章出来,于是觉得只有有一个idea马上就可以写论文了,特别是对于很多职业写手来说,一年发个7,8篇的EI文章是很轻松的事情。其实,一个普通的idea,平时随时都可以想到,但是99%可能都是前人想过的,甚至做过得。为什么自己会觉得是一个新idea? 我想主要原因还是因为自己看得比较少,读的论文比较少,知识面比较狭窄导致的。一般人要找一个现在没有前人完全没有想过的问题,同时又是有实际意义的新问题,是几乎不可能的。或许现实世界,特别是当代中国,大家太从崇拜传奇了,认为一个人只要聪明,脑袋灵光,不学无术都可以,只要灵光一现,就能解决前人大师都没解决的问题。而实际情况呢,恰恰相反。往往自以为自己聪明的人,都是最傻的人。

  最近做了一个多月的一个高维数据库空间索引方法,后来不断查阅论文,才发现,这种方法,早前10年多以前,就已经有不少人做过,甚至改进了很多。而我现在自己的想法,和前人的是如此地接近,类似。于是乎,我之前做的工作,基本上可以说是白费了,只是重复走了一遍别人在10多年前就走过的道路而已。

   现在总结一下,为什么这样子呢?首先一条,就是连要做的问题本质没有摸清楚,做了大半个月,连这个问题是不是属于空间索引技术都不清楚,查阅的文献方向也错误了,还满以为自己是第一个做这样的问题。当后来查阅空间索引类似的文章才发现,类似的K-D Tree,X-Tree等很多早在10年多以前就做出来了,而自己初步思想还没有别人这些前人想得完善。其次,自己掌握的知识面过于狭窄。说起来都不好意思,虽说自己是学数据挖掘的,可是现在公认的"Top ten Data Mining Algorithms",自己真正掌握的,不到一半。还不要说2000年过后,诸多改进的,新环境下的新算法。而对于数据库,也仅限于课本上的基础知识。

  以前在MSRA听过Harry讲过《How to do research》,收益颇丰。其中说过,第一流的研究者是提出问题的人,第二流的研究者是解决问题的人,第三流的研究者是改善解决方法的人。我觉得对于我们这种小硕来说,应该首先争取做到合格的第三流研究者。先学会follow一些顶级学者的论文,而不要一来就自己提问题,然后自己解决。先把要看别人的文章,如何解决问题的,如何改进问题的,然后在这些顶尖学者的文章下,提出自己新的改进。

  最近每天都在不断阅读各种各样的论文,似乎有点感觉收获很大。感觉自己真的应该好好静心下来,读读课本,看看论文了。项目开发和学术研究的要平衡才行,自己之前过重于偏向项目开发,而忽略的基本的学术研究。这可能是之前比较喜欢做项目开发的原因吧。然而,最近读了不少论文,发觉自己也开始喜欢上做学术研究了,也喜欢看别人做的文章。到底将来走那条路呢?现在又开始模糊了。。。

January 01

2008来了

e23d6c081a3d579b0a7b82e2 

  为了庆祝2008年的到来,在2007年的最后一天,我本本上的开发工具换成了Visual Studio 2008的版本,也算是辞旧迎新吧。本打算写一下2007年的总结的,发现2007年里面总之充满的刺激和总结。我得需要花一些时间来整理,近期是在太忙了,paper,paper...

  最近发现装VS2008的时候,.NET Framework3.5装不上去,后来找了一个dotnetfx_cleanup_tool的工具,可以clean掉以前安装的所有.NET Framework,然后再安装VS2008就可以了。

December 24

C Low-Level I/O functions

以前在看别人的很多代码时候,经常看到低级的C语言文件I/O函数。不过自己却从来还没有用到过低级的I/O函数。在纯C里面就f开头的stream用得多。这次要做SIDB在底层实现数据库存储文件,就得必须依靠低级文件I/O才能做了。因为低级文件I/O提供了某些功能,而高级文件I/O函数中没有。

  这是我在网上找到为什么要使用低级IO的一些原因:

摘自: http://www.linuxtopia.org/online_books/programming_books/gnu_libc_guide/Low_002dLevel-I_002fO.html

  • For reading binary files in large chunks.
  • For reading an entire file into core before parsing it.
  • To perform operations other than data transfer, which can only be done with a descriptor. (You can use fileno to get the descriptor corresponding to a stream.)
  • To pass descriptors to a child process. (The child can create its own stream to use a descriptor that it inherits, but cannot inherit a stream directly.)

 

下面是我总结一些文件必须使用Low-Level的I/O函数的原因:

1. 低级IO没有提供buffer,而我们使用f开头以及C++等很多文件操作,都是带缓冲的。
2. 低级IO在功能上更加强大。据我所知,诸如_filelength和_chsize,获取文件的长度和改变文件的长度,这两个函数,在高级文件IO中是找不到的。

关于Low-Level的文件I/O资料,可以在下面网址找到:
http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_8.html
http://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-I_002fO.html
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=208
http://www.thinkage.ca/english/gcos/expl/c/lib/open.html

December 23

关于Windows下C++开发的64位和32位通讯的问题

  现在64位的系统已经十分普及了。在MSRA实习的时候,几乎所有的Server都是64位的Windows Server,而我自己开发使用的机器还是普通的32位系统。在处理网络通讯的时候,经常需要把整数类型的数据转换成二进制流传输,那么就会遇到32位机器和64位机器之间通讯的情况。

  C++默认的int变量,都是根据具体编译环境来定,如果是32位下编译,就是4个字节宽度,如果是64位机器下就是8个字节宽度。那么在通讯的时候,我们需要强制同意按照一种整数宽度来读和写。Windows SDK里面已经提供了一个自定义的数据类型来实现统一宽度。在windef.h里面,INT, UINT,DWORD等通过typedef自定义的数据类型,无论在32还是64位下,都是统一的宽度。下面是我从MSDN上找到的比较官方的说明:

摘自:http://www.microsoft.com/china/MSDN/library/Windev/64bit/MW6TWPchapter5.mspx?mfr=true

5.3 编码问题

将 C/C++ 应用程序迁移到 64 位时,遇到的大部分编码问题可分为三类:指针转换、指针运算和对齐。在处理内联汇编程序,使用修改后的五个 API 调用之一,以及尝试跨 32/64 位边界通信时,可能会出现其他问题。

由于数据类型 Int 和 Long 的长度保持不变(仍为 32 位),因此需要修改的代码数量非常少。通常,所涉及的代码行数应该不到总代码基的 1%。这与 Unix 不同,其中 Long 要迁移到 64 位。

开发人员必须小心处理变量的对齐。未对齐对性能的影响非常严重。对于 x64,有一些性能影响,但是在 Itanium 系统上,问题更严重;异常将传播到应用程序层并会导致应用程序崩溃