2000年08月22日 计算机科学中三个错误的想法 - Three Wrong Ideas from Computer Science
Contents[hide]
|
作者:周思博 (Joel Spolsky)
译:Paul May 梅普华
Tuesday, August 22, 2000
属于Joel on Software, http://www.joelonsoftware.com
我并不是要泼大家冷水,不过坦白讲计算机科学里有三个重要的想法是错的,而且大家也开始注意到了..为了你自己好请忽略它们。
我相信还有其他的,不过这是最让我感冒的三个:
嗯,我只能说,
让我们来个简短的巡礼。
大部份搜寻的学术研究都一定会被类似的问题所困扰:比如「如果搜寻"car",可是想要的文件內用的却是"automobile",这时要怎么处理?」
事实上极大量的学术研究在探讨多形态(stemming)之类的概念,在这个概念下你所搜寻的字会被去结合(de-conjugated),所以用"searching"来搜寻时,也会找到內含"searched"或"sought"的文件。
所以当Altavista这种大型Internet搜索引擎刚出现时,都在宣传他们可以找到很多很多的结果。用Altavista搜寻Joel on Software会得到1,033,555个网页。这种结果当然是无用的,目前已知Internet大约有十亿个网页(译注:当时是西元2000年),Altavista把十亿个网页缩减成一百万个,对我来说是完全没有意义的。
搜寻真正的问题在于如何将结果排序。不过要为电脑科学家辩护一下,除非有人开始拿Internet这么巨大的资料来做索引,否则根本不会有人注意到这一点。
不过还是有人注意到了。Google的Larry Page和Sergey Brin了解到,以正确的顺序呈现网页ranking,比把所有可能的网页都抓来要重要多了。他们的PageRank演算法是个很好的方法,可以对很庞大的结果进行排序,让你所要的结果很可能列在前十项。事实上用Google搜寻Joel on Software就会看到它出现在第一项。用Altavista搜连前五个网页都不是,我都懒得去找究竟排在哪了。
去锯齿处理是1972在麻省理工学院的Architecture Machine Group(后来合并到著名的Media Lab)发明的。它的想法是针对低解晰度的彩色显示,可以用灰阶来产生解析度的「幻觉」。下面是它看起来的样子:
注意左边的正常文字漂亮又锐利,而右边去锯齿文字的边则显得模糊。如果你斜著看或是退后一点看,正常文字会因为电脑解晰度有限而出现怪异的「阶梯状」。而去锯齿的文字看起来反而比较平滑好看。
所以这就是大家对去锯齿都很兴奋的原因。现在到处都会用去锯齿,甚至连微软Windows都有一个开关可以打开所有系统文字的去锯齿效果。
那问题呢?如果你尝试去读一段去锯齿的文字,感觉起来就是模糊。事情就是这样,我也没法子。比较一下这两个段落:
左边的段落没有去锯齿;右边的则是用Corel PHOTO-PAINT去锯齿的段落。坦白地说,去锯齿的文字看起来就是不好。
终于有人注意到这个问题了:Microsoft Typography group。他们创造了一些非常好的字型,像是Georgia还有Verdana等等,都是针对容易在屏幕上阅读而设计的。他们基本上放弃先创造高解晰度字型再塞入像素格子的作法,而是把像素形成的方格视为先天限制,然后依照限制设计一个能配合的字型。不过也有些人没有注意到这件事:Microsoft Reader group使用了另一种他们称之为"ClearType",针对彩色LCD屏幕设计的去锯齿技术。不过很遗憾的看起来还是模糊,即使在彩色LCD屏幕上看也一样。
(在读者中有绘图专家生气抗议之前,我应该要先澄清一下,就标题和图案而言去锯齿仍然是个很好的技术,因为这些应用的整体外观比维持可阅读性更重要;另外对照片也很有用,去锯齿可以有效地把照片缩成较小的尺寸。)
远从第一个网络开始,提供让存取远端资源和本地资源完全相同的程序介面就一直是网络运算的「圣杯」。有了它就可以让网络变成「透明的」。
网络透明化有个著名的例子RPC (远端程序呼叫),这个系统能让你呼叫在网络上另一台电脑执行的程序(副程序),就像这些程序是在本机电脑执行一样。大家在这上面投入了相当多的工夫。另一个例子是建立在RPC之上的微软分散式COM(DCOM),它可以存取在另一台电脑上执行的对象,就像对象是在自己的电脑上执行一样。
听起来很合逻辑,对吧?
错。
别台机器资源和本地机器资源在取用上有三个非常大的差异:
当你要取用别台机器的资源时,很有可能该机器或是网络无法使用。其次网络的速度意味著需要一段时间去处理该要求,比如你可能是透过28.8kbps的数据机执行的。另外对方的机器可能会当掉,网络也可能会在通讯过程中断线(比如猫突然跌倒压到电话线)。
可靠的软件在使用网络时绝对都得考虑这些问题。程序设计介面把这些都隐藏起来,对写烂软件来说真是助益匪浅。
来个简单的例子:假设我的软件要把文件由一台电脑复制到另一台。Windows平台中传统的「透明」作法,是呼叫常用的CopyFile方法,并传入\\SERVER\SHARE\Filename之类的UNC路径作为档名。
如果网络一切正常,这种写法就会正常运作。不过如果文件大小有1 MB又是透过数据机连接网络,什么问题都可能发生。在传送这个1 MB的文件时,整个应用程序都会停住没有反应。也不可能显示进度,因为CopyFile当初设计时就假设一定会是「快」的。如果电话断线也不可能续传。
如果真的想透过网络传文件,用像FtpOpenFile系列函数之类API会比较好。这和在本机复制文件是不一样的,使用上也比较困难。不过这个函数在设计时就考虑到网络与本机端的程序设计是不同的,另外它提供挂入(hook)功能可以显示进度或在网络不存在或断线时优雅地处理,还可以用非同步的方式运作。
结论:下次当某人想卖你一套程序设计产品,声称可以让你存取网络资源有如本机资源一般,请往反方向全速逃离。
这些网页的內容为表达个人意见。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.