计算机科学与计算机⼯程的区别吴军
我们前⼏天讲了计算机科学⾥的⼀些思维⽅式,但是科学要通过⼯程才能变成产品,才能改变世界,具体做⼯程时,思维⽅式和科学研究⼜有所不同,今天我们就来看看它们之间的不同之处。我在昨天讲,提⾼两倍的速度对科学并没有什么意义,因为还是在⼀个量级上,但是对⼯程确实有意义,假如你的计算机快了两倍,你肯定会很⾼兴。很多⼈问我,计算机科学和⼯程有什么差别?今天我们就这个话题聊⼀聊,我们从三个⽅向分析。
1. ⽅向和道路之分别。
2. 科学和⼯程需要关注不同的事情,⼯作的环境也不同。
我在周⼀讲,计算机科学家需要聚焦在量级上提⾼性能,为了做到这⼀点,他们需要构建理想的环境,摒除⼀些不必要的⼲扰,把主要⽭盾突出出来。⽐如提⾼计算机算法的速度时,不要过分考虑加载数据的处理器时间、计算机内存的极限等边界效应,要想办法把所有没必要的数据⽐较都省略掉。
但是,具体到⼯程上,节省⼏倍的时间,甚⾄20%的时间是很有意义的。另外,理论上最好的解决⽅案,
遇到极其糟糕的情况,可能会失去通常的表现,这种时候需要有预案,这就是⼯程师们要考虑的问题。对于⼀个好的⼯程师来讲,他最重要的能⼒是了解最新的科学进展,并且根据实际情况使⽤最新的技术解决实际问题。
在⼤学教育上,⼀个巨⼤的缺陷在于科学和⼯程分不清,⼤学做了很多原本是公司应该做的事情,⽐如今天中国⼀些⼤学津津乐道于制造超级计算机,这根本就是⼯程的事情,应该是联想这样的公司去做。这样的教育导致了创新性的研究⾮常少,虽然发表论⽂不少,但⼤多是别⼈提出问题并给出了初步的答案后,中国的⼤学来完善。中国在今天,计算机⼯程做得不错,科学还是⽐较弱。
3. 科学家和⼯程师跟钱的距离不同。交朋友
坦率地讲,科学家通常是离钱⽐较远的,即使是因为发明快速排序算法⽽获封爵⼠头衔的霍尔,也没有多少钱。相反,在⼯程上实现了⾃⼰所发明的"⽹页排名算法"搜索的佩奇和布林,即使所创办的Google公司不上市,钱也少不了。要想当科学家,就要离短期的利益远⼀点,这样才能把⽬光放远。不仅⼤学教授挣钱可能没有⼯程师多,即使在⼤公司⾥,搞研究的收⼊常常不如做产品的。我在Google挣钱最少的四年,就是中间单纯做研究的四年。
0首付分期付款车⽽科学家要想成为⼯程师,也不是说变就变的,思维⽅式需要改变,要从理想状态进⼊到现实状态。我们经常发现,很多教授办公司反⽽不如他们的学⽣,因为教授是科学家,思维⽅式不适合做产品。
接下来,我就讲讲⾃⼰的亲⾝经历,说说我的关注点是怎样从⼯程到科学,再到⼯程的,从这个过程中你可以看出计算机科学家和⼯程师在不同⾝份时所应该采取的不同做事策略。
我27年前在中国做语⾳识别,那时中国这⽅⾯的⼯作刚起步,我们通常是把英语的⽅法改⼀改⽤于中⽂的识别。在此之前世界上也没有什么⼈做中⽂的识别,这种⼯作算是科学还是⼯程呢?其实很难说清楚,但是⼯程的成分⼤⼀些。等我在美国做博⼠论⽂时,就必须做⼀些别⼈没有做过的研究了,具体讲,主要的⼯作是提出⼀个新算法,这个算法今天⼤家还在⽤,⽽且还时不时写邮件向我询问细节。直接联系我的原因并⾮我论⽂写得不通顺,⽽是⼤部分计算机专业的博⼠⽣懒得读我的博⼠论⽂,因为它读起来更像是⼀篇数学论⽂,⾥⾯有20%的篇幅是公式的推导,我所提出的⼏个引理和定理的证明。
这样⼀项研究带来什么结果呢?它⽐过去的机器学习算法简化掉了很多重复的计算,以⾄于可以让运⾏速度提⾼⼏百倍到上千倍。在2000年之前,世界上做语⾳识别和机器翻译的⼈开始尝试⼀种在数学上⾮常漂亮的机器学习算法,当时IBM⼀个⾮常聪明的科学家,想办法把整个沃森研究中⼼所有的计算机在空闲时都拿来使⽤,这样计算了两年,才得到⼀个结果,发表了⼀篇论⽂。于是接下来的两年,全世界所有做语⾳识别的科学家对这种算法都望洋兴叹。
当时我也想使⽤那种机器学习⽅法解决⼀些实际问题,但是要按照过去的速度运⾏程序,我显然就不
⽤毕业了。对我来讲,三五倍地提⾼速度是没有意义的事情,要提⾼就得从根本上提⾼,提⾼⼏⼗甚⾄⼏百倍。于是在⼤约半年的时间⾥,我就是⼀沓纸,⼀⽀笔地⼯作,推导数学公式,最后终于让我发明了⼀种在量级上更好的算法,于是计算速度提⾼了好⼏百倍,使得原来需要计算两年的事情在当时缩短到⼀周左右。就这样我得以在半年内做了⼗⼏次实验,完成了论⽂。狡兔三窟是什么意思
不过,当时我在写程序实现我⾃⼰的算法时,并没有去省最后10%、5%的计算机资源,因为即使再将程序速度提⾼10%,也不可能让我早⼀天毕业,更何况那么做还会花更多写程序的时间。从这⾥可以看出,计算机科学所关⼼的问题是什么,是将注意⼒放在量级上,⽽不要太在意细⼩的成本。
好了,等到我毕业加⼊了Google,思维⽅式就不得不再从科学转变成⼯程了。我的第⼀个项⽬是搜索反作弊,具体的⽅法是⼀种简单的机器学习。既然是机器学习,就需要⽤数据训练⼀个统计模型,当然模型就要占内存。我当时产⽣的模型有多⼤呢?⼤约20M,也就是今天⼀张2000万像素照⽚原图的⼤⼩。这对搞科学的⼈来讲,根本不是个事⼉。
但是⾟格博⼠(曾经⼀度负责Google整个搜索部门)和我讲了,你的⽅法很有效,但是我⽆法给你这么多内存空间,因为我们是很多⼈⼀同在写服务器的代码,如果每个⼈都将代码增加20兆字节(20MB),程序就太⼤(内存),装不下了。后来他教会我⼀种⾼度压缩的、近似的模型,使得占⽤的内存从20MB降低到3MB。20M和3M只差⼀个六倍的常数,从算法的空间复杂度上讲是毫⽆意义的事情,但这就让我们的⼯作成果可以⽤于产品了。这是Google给我上的⼀堂计算机⼯程课。
口红排行榜前十名我在那⾥接受的第⼆堂课是在⼯程上需要计较2%的运⾏时间。2002年,我在Google写了它的中、⽇、韩⽂处理算法,由于要对这些语⾔采⽤特殊的搜索排序算法,使得搜索运算的时间长了2%。这在计算机科学上也不是个事,因此当产品部门的⼈要我提⾼速度时,我⾮常不愿意再花⼏周时间修改代码,于是我和产品部门的⼈争执了起来。
我的观点是,随着摩尔定律让计算机的速度不断提升,半年后新的服务器会让我这点"减速"的副作⽤变得可以忽略不计。不过产品部门的⼈不是这么算账的,他的负责⼈和我讲,Google当时有2万多台服务器服务于全球搜索,⼤约10%的流量是中⽇韩⽂的,也就是说占⽤掉了2000台服务器,增加2%的计算量,相当于多⽤40台服务器,当时⼀台服务器⼀年的折旧和使⽤成本⼤约是1000美元,40台服务器就是4万美元,⾜⾜值得⼀个⼯程师花⼀个季度的时间优化代码。没办法,我只好花了⼏周时间优化代码,才获准推出相应的服务。
柯蓝的爷爷是谁我在后⾯还会不断地讲我在Google接受的⼯程训练。总之,在从事了⼏年的⼯程⼯作,我想问题的出发点就和过去不同了。等到⼏年后,我离开⼯程部门,⼜跑到Google做研究了之后,想法⼜改变了,⼜不太在意⼯程的细节了。这倒不是我偷懒,⽽是对于搞研究的⼈来讲,是要不断尝试新⽅法的,很多代码只有我和⼩组的⼏个⼈⽤,⽤不了⼏个⽉就得更新,因此花很⼤的时间改进代码,让算法运⾏的时间快个⼀两倍,最后节省⼀点运⾏时间没有意义。
有没有好看的电视剧
从这⾥,你可以看出不同的⽬的,对边际成本的看法是不⼀样的。因此,在现实⼯作中,没有绝对的最好,只有在给定条件下相对⽐较好。
从计算机科学到⼯程的转变,在思维上以下两点最为重要。
第⼀,前者要在⼀个相对理想的状态下⼯作,这样可以将注意⼒集中在量级的改进上,也就是捡西⽠上。但是在产品中,并不存在理想的条件,各种细节都要考虑周到。
第⼆,也是最重要的,在⼯程中必须⾸先使⽤在科学上最好的⽅法,然后再作细节的改进。否则在细节上改进,提⾼了⼀点点效率,但是在宏观上损失了⼏⼗、上百倍的效率,⼀定做不成好产品。我在2007年之所以要写《数学之美》,就是告诉从事IT的⼈别丢了西⽠。
发布评论