IT狼闲评

笑谈IT,IT谈笑, 笑着,写作、创新与创造 Laugh,Writing and Programming...

Google

星期日, 十月 22, 2006

27年后,中国第一少年超级黑客诞生

27年后,中国第一少年超级黑客诞生
  
除了病毒,少有新闻象黑客这样能够强烈刺激网友们的眼珠子。2006年8月8日,对于QQ的东家腾讯公司,绝对是个难忘的日子,十几台服务器被黑客拿下,腾讯老总马化腾的第一万零一号QQ也被人使用。近来,湖北的一个小镇在互联网上也因此而热了不少,这位黑客就是这里的16岁小伙“菜霸”,随后,他被警察带走,菜霸的名字在互联网上风声鹊起。
而菜霸在互联网上的事件远不止这些,所说他是至今唯一一个可以在天涯社区网站上来去自由的访客,据说他是一位二十一岁将要自尽少女的网络挽救者,据说一位网络女歌手的出名,和他的一记绯闻妙贴有很大干系,现在的官司在在网际飞飞扬扬……而他的一骑绝杀还是因侵入QQ,以警察的出场而告终。

我们将菜霸和美国的超级黑客凯文·米特尼克比较一下,会发现许多惊人的相似之处。
据说菜霸是是湖北天门市干驿镇卢岭村人,今年只有16岁,初三下半学期辍学,性格孤僻,刑满释放的父亲和母亲吵架后只身去深圳打工,与家里断了联系,母亲靠弹棉花维持母子生存。
凯文·米特尼克于1964年出生在美国西海岸的洛杉矶,3岁时,他的父母离异。他跟着母亲生活,很快就学会了自立,但父母的离异在米特尼克幼小的心灵深处造成了很大的创伤,使他性格内向、沉默寡言。1979年,在他15岁的时候,仅凭一台电脑和一部调制解调器就闯入了北美空中防务指挥部的计算机系统主机。美国联邦调查局将他列为头号通缉犯,并为他伤透了脑筋。可以说,米特尼克是真正的少年黑客第一户。法院将米特尼克关进了“少年犯管教所”,于是米特尼克成了世界上第一名“电脑网络少年犯”。1995年2月,米特尼克由于一系列入侵一些公司的举动,被送上了法庭,并住进隔离牢房,实行24小时关押。 2000年1月21日凯文·米特尼克获释,他的出狱又一度成为人们关注的焦点。
27年后的2006年9月13日,菜霸发了份律师声明:截至今天,“菜霸”并没有敲诈任何人,“菜霸”没有向任何人提出任何有关钱和物的要求。处于取保侯审中的菜霸,正在等待黑客成长中最繁重的一笔烦恼!

星期二, 十月 17, 2006

网吧接了教育的屎盆子

网吧是一个颇受争议的地方,这种争议在一个县里达到了极致。
2006年10月12 日,网上看到了某县县委书记封锁网吧的消息。这是2006年5月底发生的一件事让这个吕梁山区深处的贫困县一夜间扬名四海,网吧彻底消失,成为全国唯一的有网络而无网吧的县城。该县取缔所有网吧的消息一出,立刻引发轰动和争议。

网吧的封锁和一封检举信相联系:“一封署名“学生”的匿名信摆在方山县委书记张国彪的办公桌上,信中写到:“张书记您好。我是一 名中学生,由于定力不足,就在同学的带领下来到网吧,从此一发不可收拾,几乎每天到网吧打游戏,看电影和聊天,有时没钱就像同学借,还偷家里的零钱……今 天我终于认识到我错了,想请张书记取缔网吧……”

学生不上学而选择在网吧,为什么不检讨一下为什么没有将学生的心留在学校里呢?小学开始寄宿制度,夜晚的孩子们干什么?还要看他们的书本,做他们的试卷,那九年义务教育加上三年高中下来,一个个都成了彻头彻尾的书呆子!

网吧本无罪,一种信息的集散地,象我们的手机,电话,而网吧带给没有条件自己在家上网的人们的是一个数字化的全球世界,难道想知晓更多的信息也是一个错误吗?

网吧其实是将教育的屎盆子接下来了。将教育生生动动真真正正地搞上,一天两天十年八年都很难完成,但将几个小小网吧整倒,几天足够了。面对庞大的教育,网吧是不听话不接受或不堪忍受这种天天清规课堂教学的“坏孩子”们的一种放松。

检讨网吧容易,提高教育难!




星期一, 十月 16, 2006

VB文本框也玩快捷键

为文本框TextBox 创建快捷键。
VB中使用控件时有一种方便的方法是利用快捷键来完成,但有时用文本框时却享受不到这种便利,为什么呢?添加在窗体上的控件均在其Tabindex 属性中记载其加载顺序,程序运行时焦点按Tabindex 属性规定的顺序在控件间跳转。而为了简化操作,可VB中为任何具有 caption的属性的控制创建快捷键,这通过caption 属性中在想作为快捷键的字母前加&号实现。但有一个问题值得注意,而类似文本框这样的控件无caption 这样的属性,所以VB中的文本框没有快捷键,有时为了输入数据,需用鼠标点一下,如果控件多,不用鼠标就要多次用Tab键,那能不能给它设一个命令按钮类似的快捷键呢?
方法一:偷天换日
使用些法,就是用可以设置快捷键的控件来设上,但最终的焦点要放在文本框上。为 lable创建快捷键,标签 Tabindex 属性设置比文本框小1,又因为label 不能接收按点,焦点会自动跳至文本框。这当于为文本框创建了快捷键。具体步骤如下: (1) 首先绘制标签,再绘制文本框。或随意绘制各种控制,将标签 Tabindex 属性设置比文本框小1; (2) 在标签的caption 属性中使用“&”号设定快捷键,&T表示alt和T键为快捷键。这样就相当于为文本框设定了快捷键,当你按下标签框的快捷键时,焦点就会跳至文本框上。
方法二:编程转化法
这种方法是思路是将焦点从其他控件转到文本框上。假设窗体上有一个命令按钮command1和一个文本框,则焦点在命令按钮上时,只要用下面的代码就可以完成焦点转化了!
Private Sub Command1_KeyPress(KeyAscii As Integer)
If KeyAscii = 97 Then '97代表字母a
Text1.SetFocus
End If
End Sub
还有一种更通用的代码加法,将代码加给窗体的keyDown事件,但这要有个前提,Form的KeyPreview属性设为True。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'将KeyPreview设为True
If Shift = 4 And KeyCode = 65 Then 'ALT+a
Text1.SetFocus End IfEnd Sub
(上代码在VB60 Win XP下调试通过)
这样,字母a,Alt+a和Alt+T就成了转向文本框的快捷键。
(赵玉勇 刘红)

星期四, 十月 12, 2006

飞机加油问题解---地球是圆的啊

1 飞机加油问题的解法 /* 已知: 每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机);一箱油可供一架飞机绕地球
飞半圈. 问题: 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?*/
/* 思路: 在起点,加油机先于目的机起飞没有意义——在空中瞎转悠也是要耗油滴。加油机后 于目的机起飞?。。。。。。。 在任一个加油点,理想的情况是,加油机留够回程(==已飞行路程)用油后将多余 部分平均分配给其他飞机(平不平均无所谓,反正他们可以加来加去)。 因为在前半程,最后的故事总是在1/4路途处,硕果仅存的加油机给目的机加满后安全 返回。 所以我把每次加油时发生的地点设定为加油机能够把剩余的飞机加满后安全返回的 地方。(关于这一点是否最合理我不太能确定~~~~~~ ,先按这么假设吧,以后再慢慢想~~ 木谷实:再想一百万年也不嫌累啊~~~)
设在起点同时起飞n架飞机,半圈的路程对应一箱油所以设为1,每个加油点离上一个 加油点的距离设为kk(当然,起点机场就是加油点id 0),目的机已经飞行的路程为k=0。
那么,第一个加油点距离起点的路程是:
/* kk==(1-2*kk)/(n-1)
/* kk==1/(n+1)
第一架加油机完成使命后,剩下的n-1架飞机飞行的路程是: k += kk; 带着满满滴油箱1继续前行~~~ 现在来看第二架加油机加油的点离第一加油点的距离:
/* (n-1)*kk == 1-k-2*kk
/* kk == (1-k)/(n+1)
飞行路程 k += kk 继续前行的飞机数量 n--
以后每一个加油段都有:
/* (n-1)*kk = (1 - k) - 2*kk /* kk = (1 - k) / (n + 1)
然后 k += kk; n--; 直到 k == 1 / 2,且 n == 2 。
这样,俺们的编码就可以从 k == 1 / 2, n == 2 开始倒推,看看 k == 0 时 n 到底是多少。 */
#include
int main()
{ int n = 2; float k = 0.5, kk;
while(k > 0)
{ kk = (1 - k) / (n + 1);
k -= kk;
n++;
}
printf("%d",n); getchar(); }

/* 结果是5架,4架用来加油,每到六分之一(一指一箱油或半圈的路程)处加一次油 。 后半圈需要5架飞机去迎接目标机,过程和前半圈相同,只是第五架飞机倒了半程 四分之一圈) 时不再往前飞了,而是把一半的油加给目标机然后掉头一起回家。 所以答案应该是10架次吧? 请明白人指点啊~~~~ 在费了半天劲后后头一看,这TMD难道可以算是编程题吗?*/

一道关于飞机加油的问题

飞机加油的问题
一道关于飞机加油的问题
已知: 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈, 问题: 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)

星期三, 十月 11, 2006

老谭C语言挑刺之硬伤

书上的错误可分做两类,很容易分辨的是非分明的错误,可以叫做硬伤。不容易分的错误,对当前产生的不良反应不大,可能对以后产生不良后果的,叫做软伤。前五十页硬伤调查如下:
第1页第1行:…,它适于作为系统描述语言,…
修改建议:系统描述改成“系统程序设计”语言。C语言就是为UNIX操作系统而生的。
第2页表格:if (e) S; if (e) then S
修改建议:if (e) then S ;
在C语言里,分号是普通语句的结束符号。
第2页倒数第三段:C程序比Pascal简练,源程序短,因此输入程序时工作量少。
修改建议:这项工作没人做过统计,但大家看到这里不至于误导,认为录入代码快编程就一定效率高。
第3页第7、8行:例如整型量与字符型数据以及逻辑型数据可以通用。
修改建议:C语言是没有“逻辑型数据”的,可加上其他语言。
第4页,程序:This is a c program.
修改建议:This is a C program。通观世界上所有有关C语言的重要著作,C语言的名字“C”都是用大写表示。
第5页第9行:注释可以出现在程序中的任何位置。
修改建议:注释也不是随便加的,适当时加在适当的位置,一般单独一行或在行尾部。
第6页第13行:可以说C是函数式的语言。
修改建议:以函数为单元或基本结构的语言。而函数式语言是专有名词,很相象数学里的函数,采用与数学里的函数相类似的表 达方式,这与比较常用的C、Basic不怎么相同。
第14页第18行:计算机算法可分为两大类别:数值运算算法和非数值运算算法。
修改建议:算法的分类不要枉下定义,有“数值算法”,但没有“数值运算算法”。
第22页倒数第6行:1966年,Bohra和Jacopini提出了以下三种基本结构,…
修改建议:1960年,在ALGOL 60里这三种结构已经很清楚了。
第26页第1行:全部算法写在一个矩形框内…
修改建议:全部算法由许多矩形框上下堆叠而成一种顺序结构,其中的每一个框还可以…此处没有描给出N-S图的特征。
第28页第18、19行:一个结构化的算法(例图2.12)可以由一个等价的非结构化算法(如图2.35)代替,其功能不变。
修改建议:结构化算法和非结构化算法在更广阔的空间中才有意义,一个小程序说服力不大。
第32页倒数第6段:一个结构化程序就是用高级语言表示的结构化算法,
修改建议:结构化程序其实是剔除了goto之类自由度太大的语句而得到保证的。
第39页倒数第4到2行:变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。
修改建议:首先,变量名根本不是什么符号地址?它不过是在程序中代表变量的一种记号。一个变量也未必有地址(如寄存器变量),未必有唯一的地址,这些都说明,将变量名看成符号地址是不行的,说不通的。其次,系统是给变量分配地址,而不是给“变量名”分配地址。
第41图3.2(b)。
修改建议:两个字节分离,要注意byte order(字节序)问题,将低地址和低位联系起来,实际放起来要将两数倒过来。

第49页第6行:字符型变量用来存放字符常量。
修改建议:到底是变量还是常量?如果一个变量里存放了一个常量,存放之后还能修改吗?要是能修改,那怎么叫常量呢?要是不能修改,那怎么叫变量呢?这里根本就没“常量”什么事!字符型变量里存的东西,大家都称它为“字符值”。

谭浩强《C语言》“挑刺”

谭浩强《C语言》“挑刺



许多人选择学习的计算机语言时,第一想到了C,C语言是一种令许多人感情至深

的语言,许多人的编程,都离不开一个人和一本书,这就是谭浩强和他写的《C程

序设计语言》。
我手头有一本《C程序设计语言》(后面简称第一版)(图1),10多年前,我的计

算机语言教材就是第一版,这本书是1994年12月第11次印刷的,印数已达到

670000,而随着计算机的普及,这本书的最终印数是270万!对于科技书籍,这的

确是个天文数字。我们的C语言老师的课讲得很生动,那时上机时间非常少,大约

两周能有1小时,最终的考试是笔试,我的成绩不错,考了87分。但后来到单位里

,遇到一个实际问题,怎么编却不能将程序编出来,我有点不服气。一直迷惑于

一个问题:为什么我可以考到高分但却编不出程序来呢?许多学计算机语言的朋

友可能也有类似的困惑。

同样买学习资料,很少人认别的版本的,是对谭浩强先生的C语言对中国程序学习

者影响的一个佐证,谭浩强是中国C语言教育的一个品牌。为什么我们对C语言情

感如此浓厚呢?可能就是源于谭浩强先生的发行量超过270万的第一版《C程序设

计语言》吧。

No.1、从“第一程序”说开去


万丈高楼平地起,什么都有开始,那程序员的第一个程序是什么呢?“Hello

World”程序是第一个,正是贝尔实验室的Brian和C语言之父Dennis的英文版《C

程序设计语言》一书,使程序员之间有了一种默契,一种约定。它就好象婴儿出

生后的第一声啼哭,它不仅是程序员们编第一个程序的约定,也是对各种计算机

语言进行比较的最简便方法。如何让程序将当程序员的第一声在电脑上喊出,并

且是用一种最简单最有效的办法,是考验作为程序员的你的最好的办法,也是初

学者最初的历练。我们可以将两本书中的两个程序比较一下:
C版“第一程序”
例1.1 第一版第一章第4页,“第一程序”和Hello World类似。
main()
{
printf("This is a program\n");
}
建议:
用C语言中下面的经典Hello World程序:
#include
main()
{
printf("hello, world\n");
}
不能说原来的程序是错误的,那Hello World这个小程序究竟要告诉我们什么呢?

除了要从最简单的一个程序开始调试,让它首先在电脑上能运行外;还有就是编

程的潜规则,要同国际接轨!编程需要一种开放的精神,程序其实不是编程者一

个人的事情,它可以用来表达思想,也需要交流的,所以它的外表和潜规则是非

常重要的一部分。

No2. 风格是程序交流的窗口


程序的风格,所关心的是计算机编程的交流问题和美学问题——源程序代码规划

布局的问题,这些工作并不影响程序运行速度、内存的使用及其它程序外观方面

的问题,它影响的仅仅是怎样很容易地理解代码、检查代码、日后很容易地修改

代码等,它也影响到别人如何很轻松地去读、去理解、当你不在时去修改代码。

在第一版中有不少类似下面的代码:
例1.2 第4页程序如下:
main()
{int a,b,sum;
a=123;b=456;
sum=a+b;
printf(“sum is %d\n”,sum);
}
例7.5 第110页
main()
{float add();
float a,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f",c);
}
float add(x,y) //过时的声明。
float x,y;
{float z;
z=x+y;
return (z);
}
建议:
上面的代码不很规范,建议如下:
#include 〈stdio.h〉
int main()
{
int a, b, c, sum;
a = 123;
b = 456;
sum = a + b;
printf(“sum is %d\n”,sum);
return 0;
}

#include〈stdio.h〉
float add(float, float);
int main()
{
float add();
float a, b, c;

scanf("%f,%f", &a, &b);
c = add(a,b);
printf("sum is %f",c);

return 0;
}

float add(float x, float y)
{
float z;
z=x+y;

return z;
}
  我们要编程,首先不假思索想到的变量名是a、b、c,循环时最先想到的是

for (i=1;i<=100;i++),适当的嵌套,合用的名字,清晰的行和总体结构,用全

新的符合标准的形式,将过时描述方法淘汰。
我们用C语言的许多风格不很地道,这是非常需要注意的,选择一些有意义的小题

目,好好煅炼自己。


No.3 函数是编程表达的基本单元


  C语言中给我们的另一不好的习惯是将源程序从头到尾都放到main()主函数里

面。这样的结果是当我们遇到长程序时会很麻烦。程序长会带来许多问题:开发

困难,牵涉的情况更复杂,写程序的人更难把握。长程序的阅读和理解也更困难

,这又影响到程序的开发和维护。如果要修改程序,就必须先理解一项改动对整

个程序的影响,防止其破坏了程序的内在一致性。另外,随着程序变大,程序中

也常出现一些相同或类似的代码片段,这使程序变得更长,也增加了程序里不同

部分间的互相联系。
  C是70年代初研制开发的语言,那时人们在这方面的认识还比较粗浅,所以只

提供了对计算过程片段的抽象机制,这就是函数机制。函数的作用是使人可以把

一段计算抽象出来,包装起来,使之成为程序中的一个独立实体。

从求素数
例5.8,第77页,判断一个数是否是素数;
# include ‘math.h’
main()
{
int m,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for (i=2;i<=k;i++)
if (m%i==0) break;
if (i>=k) printf(“%d is a prime number\n”,m);
else printf(“%d is not a prime number\n”,m);
}

例5.9,求100到200间的全部素数。
# include ‘math.h’
main()
{
int m,i,k,n=0;
for (m=101;m<=200;m=m+2)
 {
  if (n%10==0) printf (“\n”);
k=sqrt(m);
for (i=2;i<=k;i++)
if (m%i==0) break;
if (i>=k) {printf(“%d ”,m); n=n+1;}
}
}

建议:
增加函数,专门用来判断某个数是不是素数,函数源程序如下:
int isprime (int n) { /* 判断一个数是否素数 */
 int m = 2;
 for ( ; m * m <= n; ++m)
if (n % m == 0) return 0; /* 发现因子,不是素数 */
 return 1; /* 可能性均考虑过,没有因子,是素数 */
}
上面的两个程序中最核心的部分是一致的,就是我们抽象出的函数,有了函数,

上面的两个程序的主程序将大大缩小。处理复杂问题的基本方式就是设法把它分

解为一些相对简单的部分,分别处理这些部分,然后用各个部分的解去构造整个

问题的解。随着人们对程序设计实践的总结,许多抽象机制被引进了程序语言。

这些机制极为重要,人只有借助于它们才可能把握复杂的计算过程,完成复杂的

程序或软件系统。我们应该抛弃那种从头到尾只有一个程序的形式,从相对小的

程序开始,培养自己的这种抽象意识和抽象能力。


No.4算法是程序的灵魂


算法,又称演算法,正象我们做一道数学题时从原题到结果要经过一定的演算步

骤一样,程序设计过程中的也需要解题步骤,以正确地将问题破解。程序的三种

结构,顺序、分支和循环,巧妙地组合在一起,构成了一幅美妙和程序图景。算

法是程序的基石,不论计算机语言发展方向如何,基本的算法是应该把握的。
求闰年程序
例4.5、59页“编程判断某一年是否为闰年”源程序:
main()
{
int year,leap;
scanf(“%d”,&year);
if (year %4==0)
{if (year%100==0)
{if (year%400==0)
leap=1;
else leap=0;}
else
leap=1;}
else
leap=0;
if (leap)
printf(“%d id”,year);
else
printf(“%d is not”,year);
printf(“a leap year.\n”);
}
建议:
增加算法描述:
设y为被检测的年份,可采取以下步骤:
S1:输入y
S2:若y不能被4整除,则输出y“不是闰年”。然后转到S6。
S3: 若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6。
S4: 若y能被100整除,又能被400整除,则输出y“是闰年”,否则输出“不是闰

年”。然后转到S6。
S5: 输出y“不是闰年”
S6: 结束
算法的描述和源程序两部分内容结合到一起来,是一种有效让学习者理解编程的

不错方案。编程是用来解决问题的,每一个不同的问题,都有自己可能的解题正

确步骤方法,这就是算法。虽然程序的算法不很复杂,对于许多编程初学者来讲

,更要关注算法。

总起来说,《C程序设计语言》是对于非专业计算机爱好者学习编程的不错教材,

但它有些思想却显得十分陈旧,也可能给我们造成一些不良的习惯。但俗话说:

尽信书则不如无书。我们也不能太迷信它们,以开放的精神,面对程序学习,因

为多一种角度,就可能少一份偏见。

星期二, 十月 10, 2006

顶级程序员是如何炼成的

高德纳(Donald Knuth),是计算机程序设计艺术教授,斯坦福大学退休教授.且看看他关于自身经历的一些事情,对于你程序的学习会有不少启示:)


高德纳——计算机程序设计艺术教授
(美国数学学人专访翻译稿)







在密尔沃基还是一个高中生的最后一年,他还在怀疑自己是否能从大学毕业,但到了四年后的1960年,高德纳(Don E. Knuth)获得Case技术学院数学学士,作为一项崇高荣誉,一个特殊的(也是学院历史上第一次的)委员会在这同时授予他硕士学位。1963年,他获得加利福尼亚理工学院数学博士。近年来,他将许多享誉很高的大奖收入囊中,1979年,他41岁时,从卡特总统手中接过了美国国家科学奖。
不论从哪一个方面看,高德纳都是一个非凡的人,他是世界公认的计算机科学方面的顶尖学者,他还是一位娴熟的管风琴演奏家,作曲家和小说家。
他是一位高产的作家,他出版了大量的文献。他的处女作是发表在MAD杂志上,他供稿的刊物有Datamation,Recreational Mathematics期刊,美国数学月刊,和其他数十种数学和计算机科学方面的刊物,如Acta Arithmetic和Acta Informatic。 他更因为写作了跨时代的系列《计算机程序设计艺术》而享誉世界,它已经翻译成多种语言,包括俄语和中文等。七卷中的三卷已完成,第四卷也即将出版。写作此书的过程中,他还用四年时间发明了一套计算机辅助排版系统。

画图使我得了头痛症

MP:您是计算机科学家,然而你却是学数学出身,什么时候您的数学兴趣开始显现的?

Knuth:高中一年级时我对数学产生了浓厚的兴趣。事实上,也正是在昏暗的灯光下,向桔橙色的图纸上不停地绘制了几百张图,而弄毁了我的眼睛。由于画图,使我得了头痛,但我仍然觉得那是件令人着迷的事情。图中是象y=sqr(ax+b)-sqr(cx+d)之类的函数,在图上将b,c,d取定值使a变化,看看画出的图形会有怎样的变化。那时我画了成百上千张这式的图像,以期从中找出函数的变化特点。

MP:这一过程中有没有对您影响深远的老师?
Knuth:数学老师中对我影响最大记忆最深刻的是大学的老师。我高中高年级的老师也向我介绍过象二进制数之类的知识,还鼓励我参加其他课余活动。高中时,我参加了威斯特豪斯科学天才发现计划(Westinghouse Science Talent Search),我有两项发明参赛,其中一个是物理学方面的,而另一个是基于π的数系统研究。我曾思考以虚数和无理数为数基的对数表,虽然最后我没有获奖,但数字系统确实给我留下了很多有趣的记忆。我还研究了一番绝对值函数,当我掌握了这些函数时,我开始做另外一组图像。我还找出一套方法,给我一个由相连的直线组成的图形,我就可以写出它的数学函数表达式,那时我真是对数学中的图像着了魔。物理老师是我高中时最喜欢的老师,对于物理或音乐,陷入两难的境地,但进入大学后我还是选择主修物理课程,我曾练习大量的钢琴演奏和管弦乐谱曲,以致我很难判断自己是主修音乐还是物理。我最后的选择从根本上是受奖学金影响,我选的大学在物理方面比音乐要好一些。如果我当时选择了Valparaiso而不是Case,我会主修音乐。

MP:您的家庭成员中还有没有其他的音乐或数学天才?
Knuth:我爸爸曾是教堂管风琴手,而现在成了我。

MP:您觉得音乐天分和数学才天分之间是否所联系(suggested connection)?
Knuth: 肯定有某种联系在里面。象在德国的Oberwolffach数学学院,每周数学家们都来聚会,音乐是主要的消遣。那里有一个非常大的音乐厅,许多人拿着乐器来到这里,几乎所有的数学家聚会的晚上,大厅里被音乐环绕。现在我们系里也是如此,刚才我还和系里的行政助理讨论这一问题,她以前在法学院工作,有一位教授一度用超过20%的时间去听音乐会,他们对音乐不是很感兴趣。在计算机科学系,她觉得有一半以上的成员本身就是音乐家。

MP:在音乐和数学之间,有没有一套可以作为二者真正联系的理论?
Knuth: 没有,我真地不知道为什么。我猜想Eular喜爱音乐,但是我不能说明多少过去的伟大数学家是真正的音乐家。我没研究过这个问题,但这其中一定有某种联系,斯坦福大学就是很好的例子。
我还从我的挪威朋友Dahl教授那里发现了上述特点,他的公文包时常放着钢琴二重奏,不管他走到哪里,都要找人和他一同演奏,也正是他对双人(four-hand)钢琴曲的介绍,使得我过去十多年来收集了不少此类东西。

MP:我想知道从另外角度——即写作——回顾一下您的早期求学历程,您的写作兴趣是什么时候开始第一次显现的?
Knuth: 我小学英语语法特别棒,在七八年级时有一件很有意思的事情,图形化句子,课后我们一大帮孩子聚在一起干。我们可以将英语书上的句子图形化,但我们却不能图形化其他的生活中的句子,尤其是从赞美诗中看到的句子。我们琢磨不透是什么原因,这些句子不适应我们学到的任何规则,我们很努力地研究着,当时来说也是件艰巨的工作。在高中时我发现我们这一级所有的同学在英语课堂上都能轻易过关,并不只有我如此。

MP:我想知道那是不是所公立学校?
Knuth:那是一所路德教会学校。我爸爸是学校的老师,在Milwaukee我高中上的也是路德教会学校。我念的小不写作教育是很好的,现在我也尽量要求自己的孩子们,要求他们每周写一篇文章。如果他们下周想看电视,前一周就要交上他们的习作。我到大学时发现,写作占了我50%的时间,而另一半则是数学。
另一件有意思的事发生在小学8年级,那是Ziegler’s Giant Bar 公司举办的竞赛。竞赛内容是用“Ziegler’s Giant Bar”里面的字母能组成多少单词。它对我很有吸引力,我和父母撒谎说我胃疼,想请假两周不上学了。在这两个周里,我利用一本完整的词典,从中找出了所有能找到的单词,我找出了大约4500个单词,而他们的答案只有2500个。事后我意识到如果用’号我还能找出更多的单词。爸爸妈妈也为我的投入程度而感动,帮我将写好的答案打印出来。奖品是给学校一台电视机,在课堂上我们可以看电视直播节目了(1952年),生动的节目,第一次从旧金山跨越全国传来。班上的每一位同学还得到了Ziegler’s Giant Bar。
在Case学院时,Guenther教授是我的大一微积分老师,是他第一次给我揭开了高等数学的面纱。Paul Guenther 五年前去世了,对我来说,他是一位伟大的老师,因为他是如此难以取悦和讨好(He was so hard to impress)。每当我有一个建议,他往往拒绝;只有当我最终得出更好的结论时,他才勉强地表示赞赏。我不知道自己为什么对他怀有一种特殊的感动。除了他的不易讨好外,他很有幽默感,他对物理知晓的比物理老师要多,对化学通晓得比化学老师要多。也正是这些暗示我:数学从某些方面来看更有优势。
然而,我曾经害怕自己无法对付数学,(I was scared stiff that I wasn’t going to make it in Mathematics.)我高中的指导老师对我说,迄今为止我是做的最好的,他们觉得我不可能在大学继续保持下去。他们说大学是很苛刻的,校长曾说有1/3的人在大学一年不能通过。在高中时,我取得了空前的成绩记录,我们的评分等级不是用ABCD,而是百分制,我的所有科目平均成绩超过97.5。



我一直有一种自卑感情结


MP:那是不是慢慢给您灌输了一些信心?
Knuth:我一度处在自卑中——那也是我工作非常努力的原因。我有些过度追求成功(over-achiever)。
在Case时,我不停地日复一日研读我们的数学课本——Thomas写的Calculus and Analytic Geometry ——并且做完了书中的每一个补充习题。我们只要做完偶数题号相关的部分就够了,但我将每一个习题结合书后的补充都做完,因为我自己缺乏信心,我认为应该全部做完。开始时进展缓慢,为了做题我要熬夜,这么做的唯一原因就是担心课程不能通过。几个月后在其他伙计只做奇数序号习题时,我全部做完都象他们那样快,我因为熟练,而提高了不少解题速度,很幸运一开始我就遇上了比较难的问题,因而不象刚刚步入时那样艰辛,事情已进展得比较顺利。
我开始主修物理课程,但我第二年转入数学,我选了Green教授的一门抽象数学课程,他现在仍在Case教书,班上用他自己编写的教科书,那里面有布尔代数、逻辑方面的公理。有一天我忽然意识到,自己非常喜欢其中的内容。他还给我们一个不知结果的问题,他告诉大家如果谁解出这一问题将自动得到该门课程的成绩A。然而,没有人去做这个题目,很显然做也是白搭,因为他是非常有声望的。当我们开始尽可能下手,但还是无处着手。
那年秋天,我正要去参加演出,但是却误了班车,正无事可干时,我决定来解一下这个不可能解出的题目,以消磨时光。但上帝垂青,我解出了这个题目,星期一我将结果交给他,他说:“很好,Knuth,这门课程你得了A。”我中止了课程的其余部分,而他也信守诺言。以后对这次中断课程还有些内疚,因为不用做作业,仅凭这道题,本年度的课程我就得了优等。
物理方面,在焊接实验室里渡过了一段糟糕时光。不论是物理还是化学实验,我一直表现很差。我的实验总是做不好,要么东西掉到地板上,且总是最后一个完成,有一次化学实验错误出现140%偏差,我为此而写了一个报告,我反对他们计算实验误差的公式,因为我认为误差不能超过100%,但他们并不听我的。
在焊接时情况更糟,我高出工作台太多,并且我的视力不行,在防护眼镜下面无法佩带眼镜,一切都变得很糟,成百上千伏特的电压令我恐惧,我一点也不想做那些事情,然而物理学却又离不开这些实验。
另一方面,选择Green教授抽象数学方面课程却令我如鱼得水,仅仅由于兴趣,我已经发现了几个独立的所谓三元逻辑公理,有些象逻辑布尔代数,想看看是否可从这些公理得出某些推论,但是我其他课程直线下降,因此我不得不中断当前的研究而好好对待这些课程。
我已经做出一个能分析实数表的操作过程(Operation),我最终证明了一条定理:The absitive of the posilute of two cosmoframmics is equal to the posilute of their absitives.
这里我编造一些数字代表其抽象概念,这使我相信我可以证明诸如De Morgan定律之类的定理。
在学生时期的学习全程,我愉快地投入每一本数学书的第一章,思考事物的定义并尝试着做微小的修改,看看从中究竟能发现什么,能再引申出点什么。我非常喜欢那样做,但物理实验差点扼杀了我,这种结合的直接后果是在大学二年级时最终选择了数学。

探索计算机开始于大学一年级,早于女孩
MP:您能说一下你开始用电脑的地点,是不是那时就很清楚地说明您将同它伴随很长时间?
Knuth:在大一和大二之间,得到在Case当统计员的夏季工作,在我办公室隔壁,有一台电脑。
MP:继续画图了?
Knuth:的确。
MP:是不是走火入魔了?
Knuth:是的;一定程度上,METAFONT(我近来开发的计算机印刷系统)可能也折射出我对做图的情有独衷。
CASE的统计系正好座落在一台新电脑的旁边,那是一个有许多闪光灯的有意思的机器。在初夏,有人向我解释了它是怎样工作的。不久我就上钩了,我费了很多个通宵,在电脑控制台前,只有我一个人在那里,大学二年时我开始交女友,但这是在研究电脑之后。
我还保留了我的第一个电脑程序,此程序用于分解质因数,从控制台输入一个十进制数,将会在卡片上得到打孔数据。源程序大约有70条指令,可从70条中冒出100多条错误,也就是说,我(编程时)犯了不少错。但正是这些错误,使我受益匪浅,程序刚开始是无法运行的,我继续改正,直到它能运行为止。我第二个程序是做进制(Base)转换的。
我的第三个程序是Tic-tac-toe,这个程序还能学习如何玩Tic-tac-toe,我对这个程序非常用心,我定下一个学习原则,如果在一场游戏中,电脑获胜,则每一个位置的参数将增加一点,如果电脑一但输掉,则将全部位置标为坏点。这是自适应的存储方法,一场游戏中,每个位置通过0-9的数字来表示该点的优劣;4代表中游水平,因而平局游戏各点参数趋向4。我还写了另一个可以很精彩地玩此游戏的程序,并将这两个程序一同较量。90局结束后,自学习的程序学会了如何战平后一程序。
在另一试验中,300场对战结束后,两个自学习的原本空白记录的程序学会了如何战平对手,他们走棋非常保守,并不令人振奋,但看到“两个生手相互引领学习”“The blind leading the blind”情况出现,是很值得我们回味的事情。
上面就是我学编程的第一个月,一月中发生了许多有意思的事,之后做的有些不同,我给电脑做了一汇编程序。我开始阅读别人的程序,我对编程如此感兴趣的原因,更大程度上是由于我阅读过的代码写得不太好。做为一个大一学生,我可以将程序(I could look at program and say here I am)写得比那些专业人士更好一点,但那时我还不了解其实有许多人可以写出比专业人士更好的程序。那时编程水平是相当低相当糟糕的。基于此,我隐隐觉得自己在这方面有一点天分。也许我的确存在天分,但现在我觉得自己并不象以前想象得那样特别。而后,我读了Stan Poley的汇编程序,我觉得这些程序是优美、雅致的杰作,因而我决定将他的思想进一步发扬光大。
MP:在上述工作中,自卑感已经不存在了。
Knuth:是的。部分的自我急于对另一部分的自我说证明自己是OK!(part of me was anxious to prove, to the other part that I was OK!)
所以,我常常受读一些专家著作的激励,认为自己完全可以做得更好一点。现在每当我在课堂上出错时,我会告诉学生,这样做的目的是想激励他们。

“学生们没有学到怎样写作”
MP:象您做为主修计算机的大学二年级学生类似的经历,现在初中就有。您觉得会对以后产生什么样影响?
Knuth:学生们没有学到怎样写作(The students aren’t learning how to write)。这是非常严峻的。他们甚至不知怎样拼写“mnemonic”,他们过早地专业化了。没有意识到学习的另一面是非常危险的,这一面是写作,这也正是我担心的。人们对生活中的各类事物都要保持开放的态度是很有必要的,如果对某一亚文化群投入过多,势必会限制以后的发展。

MP:是什么让人对电脑产生两极化的意见?一些人完全不能编写程序,而另一些人又全然被电脑同化。(A lot of people just can’t stand programming. There are others who just get consumed by it.)
Knuth: 部分的原因是基于它象一种奇特的思考方式(a strange way of thinking)。还有很多思考方式,它们还没有真正地为心理学家研究透彻。计算机科学教师一再发现,有2%的选课学生是天生的计算机人才,这些人会对编程产生真正的共鸣。它们好象和数学逻辑有着某种相互联系。我说过我喜欢抽象的代数课程,从中我第一次真正地学习了公理和布尔代数。如果看一下数学系的情况,传统的和计算机科学最近的人员是那些从事逻辑和组合数学的。相反地,对于擅长几何直观的数学家则并不倾向于喜欢象计算机科学这样的离散世界。
另一种区别是在有限和无限数学之间,过去我和在Cal Tech的Peter Crawley说过,可计数的无限(a countable infinity)是我们二人的交集,因为我对超过可数无限的没兴趣,而他曾不看少数可数无限。更高级的无限理论包括的推理和直观,是无法应用在电脑上的。
数学因我们各自的独特想法,而有不同的层面,这不是我们能改变的。人们找寻自己最善长的。至于智力,物理学家和数学家是不同的,正象律师和医生一样。每一个领域象都有占优势地位的思考模式,而人们可以找出自己最好的。至于计算机科学能成长为大学的一个科系,我认为,大约是因为它反映了一种思考模式,是一种计算机科学家们考虑问题的独特的思路。据说,五十人中有一人,有此种能力。
(There are different flavors of mathematics, based on what kinds of peculiar minds we have: we aren’t going to change that. People find out what things are best for them. And as for their mentalities, physicists are different from mathematicians, as are lawyers from doctors. Each of these fields seems to have predominant modes of thinking, which people somehow recognize as best for them. Computer science, I am convinced exists today in universities because it corresponds to a mode of thinking, a peculiar mind-set that is the computer scientist’s way of looking at knowledge. One of the fifty people, say, has this peculiarity.)
长久以来,这样的人士分布在各行各业,而没有一个归属的专业。(Historically, such people were scattered in many walks of life; we had no home to call our own).当计算机科学兴起时,更多地是作为现行专业下的一种工具,并没有它自己的一席之地。但是仅仅用一种实用工具来说明计算机科学在各行各业的大量应用是不够的,举个例子,如电子显微镜,它是一种了不起的工具,但是“电子显微科学”却没有引起世界范围的变革;除了说到计算机的用途之外,还有些别的原因造成计算机科学的快速普及。
生活中真实上演的是,对计算机感兴趣的人们意识到,他们独特的思考方式和其他人的是共通的,因此具有共同志趣的人们走到一起,共同研究。计算机科学就这样开始了,在当我们重读一些老作品时,也能看到,事实上他们中的某些人是真正的计算机科学家。在回溯巴比伦时代和整个历史无不如此。

计算机科学 VS 数学

MP:是不是计算机科学家和数学家真地不同?
Knuth: 我觉得你们能识别其中的不同。

MP:但是我怎样才能从大门口站的人认出他是一个计算机科学家?
Knuth: 通过思考过程(thought process),我会尽量准确地回答这一问题。为了处理此问题,我研究了一些数学著作,以期发现优秀数学家的特质,我应用了随机取例的技术:我选择了颇具代表性的9本数学书,取每本书的第100页,然后对此页进行仔细分析,直至彻底了解该页内容。查找其中所体现的数学思想是一件有趣的事情,我不禁问自己:“如果让我写一个程序,来揭示第100页涉及的数学问题,我该在程序中放入一些什么样的指标好呢?”
我发觉数学家与计算机科学家最显著的区别是:数学家优越的几何推理能力和关于无限的推理(reasoning about infinity)。计算机科学家和数学家的共同点主要体现在抽象的运用及公式的把握。计算机科学家具备而数学家不具的最显著的是,对动态变化过程中状态的把握,此过程中变化状态是不连续的。在计算机科学中当表示n+1赋值给n时,老的数值将会被新值取代。
象理解一个执行到一半的程序(half-excuted),它的状态包括当时所有的数值,以及下一步执行的步骤,如果让数学家来表示,他们会在所有变量上加上序数(subscript)。而统数学中没有很好的序数表示,但在计算机科学中是非常重要的。
另一个非常显著的不同是,计算机科学家倾向于将问题用多种方式来处理(diverse case analyses)。越纯粹的数学家,则从本能上越倾向于是用一个单纯的公式来描绘一切事物所有的状态。但计算机科学家则能很好地说服自己,面对事物处理的不同步骤,第一步,第二步,第三步这样一步步做。数学家则倾向于只有一步,一劳永逸地你可以不断使用的一步。

MP:您刚才的回答使我想起了Edsger Dijkstra 提到的一个问题,他认为计算机科学家对数学推理(process of mathematics)有了深入研究——诸如如何把握公式的处理和事物变化(in terms of how formulas are manipulated and how things change)——可以回馈给数学教学。计算机科学家是否真有足够的数学水平用于教学?
Knuth: 因为人们有不同的思考方式(mode of thinking) ,我怀疑是否有某种共同的针对所有类型学生的最好的教学方法;我也怀疑教育规划者对具有不同思考能力(mind-set)的学生所制定的同一的教学计划。因此,我没有信心相信,对于我来说最好的方法是不是放之四海而皆准。但是很显然,Dijkstra的建议是对于天生的计算机科学家最好的教授办法。对我来说,当我真正理解了一个演算法(an algorithmic formulation )是怎样运做的,我才从真正意义上掌握了此类数学方法。
通过我的书的第2卷为例,我认为基本数论的每一个定理包含于其中某处,但它是包含在人们需要的算法教科书中,这些算法也是必须得到解决的计算问题。
我认为这些思想的最初发现是由于演算的需要,因而我用同样方式表述。同数学相比它如同从一个完全不同的角度审美,从数学式的“精简”走向了似乎不是非常“高雅”的方向(from what is mathematically “clean” to what is not elegant in the same way)。但它只是不同的思考方式,我觉得不能说一种方式比另一种更优越。
我和Dijkstra属于天生的计算机科学家,当我们年纪大了时才终于悟出这一点。而这种组织学习的方式并不是适合所有人的,而仅仅局限于象我们这样一类人,演算法方法(algorithmic approach)对我们来说效果很好。
我们拥有计算机科学家的素质本身也是一种挑战,因为我们必须尽最大努力为其他49/50的不同于计算机科学家思考方式的人们服务;计算机影响着每一个人的生活,我们必须找到那些使人们更容易应用电脑的方法,即使我们并没有真正地了解他们的思考方式,比他们理解我们思考方式更多地了解。需要为介于不同思维模式之间的人们做桥梁的,以易于沟通。
显然,没有明显的界限指明你从计算机科学家转变成数学家、物理学家或其他什么家。人们更倾向于象在一个多维空间中,拥有各种各样的才能,某一个范围的人们更多具有计算机科学家素质,另一些人则更象数学家,可能音乐家也类似,谁又知晓呢?这些差别实际上是一种连续的现象。
计算机科学相关部门的昌盛兴旺,是由于许多人聚焦在我们的“思考空间(thought space)”。过去,有一些我们现在称之为计算机科学家的人,那时可能是数学家、物理学家、化学家、医生或商人。现在他们有了一个家,这也是这一领域的联合。为了更好地发展此领域,如果想让更多人应用计算机科学,我们迫切地意识到我们不能只依靠自己,我们需要具有其他思维方式的人们。
也许Dijkstra想表达的意思是我们的思维模式某种程度上更有力,因为它包括了其他的思维方式。我不想简单粗暴地说应该如何如何,但我提出这种可能的原因,是基于我认识的一个人,他曾学习研究生课程,而后成为墨西哥总统Lopez的顾问之一。他告诉我计算机课程的学习,使他受益匪浅,在同不得不打交道的人的交往中,虽然他现在已经不再编程了,但他觉得他学到的方法使得他可以同许多那些想和他交谈但却彼此并不了解的人沟通。
计算机科学的观点好象在对现实模型的建立上更有力,这是比较贴近实际的,因为计算机科学家长于对多情况建立模型。一个现实的问题分解成几部分,并且数学模型的建立或多或少(better or worse)都要依赖建立模型过程中的统一性。处理过较少统一模型的计算机科学家可能更乐于处理更多的常规性问题。另一方面,当开始处理真正的一致性问题时,计算机科学家的深度不及数学家。一致性(Uniformity)可能真正是两领域最显著的不同点。

MP:有人建议将数学做为计算机科学的一部分,而另有一些人正相反,认为计算机科学可做为数学的一部分。您是怎样想的?
Knuth: 我的真实想法是:它们是两种东西,虽然二者有联系。虽然它们有许多重合的部分,但我往往能说出何时我进入数学思考模式,当然,披着数学家的外衣,我也能体会到何时进入到计算机科学家的状态。
我记得以前做过一个数理论方面的演讲,那正是一个跨两学科的问题。我一开始通过数学方式定义,并使用传统的数学工具将问题推至极限,而后我说:“现在让我们转向计算机科学家的解题方式。”而后,我用十五分钟时间讲述了演算法观点(an algorithmic viewpoint),讲完后补充道:“这是一位计算机科学家可能达到的极限,现在再让我们回到数学家的状态一会儿。”我强烈地觉察到这是真的,有时我会做数学家们铁定做的,而另一些时候,我知道自己做的是一个数学家永远也不会做的。
数学家和计算机科学家都不会囿于对自然的研究,仅仅通过一张纸和一支笔,我们就能准确地把握进行中的工作,说明一种理论是正确的,或它是错误的。数学和计算机科学都是处理一些人为事务的。但是思考过程的十分足以区分二种不同观点——两种抽象组织知识的方式有不少共同点,但各有自己的范畴。

MP:除了对数学和计算机科学智能上的对比外,还在其相互影响中开始出现一些社会和教育上的相关问题。计算机领域的壮大,举例来说,使如此多的人达到学士水平,也使得许多人不能继续他们在数学或计算机科学上更高层的研究工作,不能走入高中教授数学。计算机科学和数学都面向同样有限的人群,但现在的势头好象是人们更倾向于计算机科学。
Knuth:但那是由于经济上的诉求,现在计算机科学学士比其他的可得到更多的薪水,这是一个问题,这些人不是天生的计算机科学家,仅仅是由于金钱而不是对这项事业的热爱而涉足这一行的,这一趋势让数学家沾光,因为现在课堂上的学生是有学习动机的,而不是受外部影响而坐在那里的。(because they’ve got motivated students in their classes instead of people who are just there for some external reason.)
我不同意你的观点“计算机科学和数学都面向于同样有限的人群”,我的不同观点可能是由于我用的是比较突出的示例,最优秀的计算机科学家和最优秀的数学家是不同的。根据大数定律,通过1-10的分值衡量标准,很显然达到10分的人很少,达到9分的人也不会很多。因此,假定某人数学参数为8而计算机科学参数为6,这个人某种程度上更乐于进入计算机而不是数学,因为这样做薪水会更好;因为社会上对计算机科学家有迫切需要,这样社会会更趋向于富足。
我认为经济原因会使数学家中失去一大批分值在7分和8分的人士(请原谅我用数字代表人的无情应用);并且我希望基于计算机科学和数学间不同的理解,9分和10分的不会流失。他们的数学才能对各领域的人们都是很重要的,包括计算机科学。

MP:现在有一种越来越强烈的说法,说关于数学教育的滑坡,还包括其他的学科,有人说是由于计算机和计算器的影响。
Knuth:我儿子的高二数学课本令我非常失望,但他的老师非常负责任并做了补充。这本书最过分的地方是卖弄学问,第二个糟糕的地方是它的三位作者好象写了各自完全不相干的章节,完全没考虑其他作者的工作。但这本书有一些闪光点,象重视图形。我对年轻一辈教数学的建议即是画图!很高兴从这本书中看到了比其他的书中更多的图。
一周前我看过一篇文章,其中有人说已经启用旧的教科书,并且越老的教科书从学生的考试效果来看会越好。他回溯到1900年,并且说那是黄金时代。很显然,对于纯数学来说,匈牙利教育系统是最成功的;因为此成就,它是一个值得仔细研究的模式,按人口平均来看,许多优秀的数学家由此诞生。
现在我看自己孩子的数学学习,发现书中的重点在浮华的事情和记忆公式上,而不是在介绍一些办法适用于什么,或是非记忆式通过几个基本定理重构新的公式。
读完这些书后,你不记得什么是多项式的次数,也不知道怎样组织准确答案,我儿子已学过代数,但仍然不很清楚怎样做分数的加法;真正的东西给掩盖了,需要的仅仅成了一次家庭作业。他会将分布规律记在脑子里几周时间,但这些高级名称因没有实际应用,因此,它最终从记忆中消失了。从我个人来讲,我直到大学二年才知晓这些分布规律的名字,这之前我画了很多图,并且用得很好。

MP:您是不是觉得应该在正式课程中尽早介绍计算(computing)问题?
Knuth:我会很高兴见到以演算法的方式出现,但我很犹豫这么说,怕自己没想清楚而误导别人。我仅有的一次关于基本算法方面的工作经历,涉及内容层次比较高,那时我在Cal Tech教抽象代数的入门课程,我们当时正研究矩阵,并且有一个规范化矩阵问题。在这一点上书中讲得很模糊。我们要解决在什么情况下一个矩阵相似于另一个,怎样揭示这一问题呢?现在有了规范结构:如果两矩阵相似,则它们具有同样的规范结构。书中提得很少,仅仅说这里是结构的名称,下面是结构的定义。
因而那时我们提出,怎样才能确定两矩阵相似?矩阵有些简单的操作,象:“将第二行减去第三行的倍数,然后给第三行加上第二行的相同倍数。”操作要保持一致,虽然此操作很简单,但能使得此矩阵同另一矩阵相似。下面让我们看看上述过程的执行情况。我们要使某矩阵的第一行和第一列尽量变成0值,大多数情形,我们可以用这种简单转化达到目的,但有时却做不到。
最重要的一点是我们开始解题了。我们尽量通过一个演算法一步一步地解题,不久我们就会发现这一标准结构。当然,由于特殊情况,我们也可能解不出,在此情况下,我们不可能使那么多的元素都化为0。上面,我觉得,就是这些规范结构得以第一次发现的方法。但稍后,研究人员发现,可以用更高级地抽象地表示它们。例如,人们使用的子空间线性解题方式,这是优雅的方法,但在教学法上并不尽如人意,因为它隐藏了解题的源起。
我认为你需要上述两种观念,尤其当你第一次接触某一课题时,演算法的观点更倾向于直觉的层面,它对教学的早期阶段帮助很大。但是我要补充一点,我教这些课程时间不长,我个人的直觉可能和学生中的大多数联系不紧密。用演算法的方法教学可能非常成功,但它值得好好实验。

MP:我印象中觉得您对自己的学习式tic-tac-toe程序很得意,现在很多计算机用来玩游戏。您好何看待将游戏作为计算机的入门?
Knuth:童年时,孩子们进入了一个创造游戏规则的阶段,他们喜欢相互争论,他们可以长时间讨论这些规则,因为他们喜欢当一个游戏规则的制定者。我觉得这可以和编程相关,可能儿童有一种尝试简化这些规则的趋向。
显然,我不是基础教育专家。我期望看到一种方法,学生在研究问题时不仅仅是学会遵守规则,还要学会如何说明解释这些规则。假如你正在教孩子学加法,我们会通过大量例子来完成,告诉学生如何从右到左相加、进位等等。如果有一种足够简单的计算机语言给这些二三年级的学生,通过这种语言写一个小程序是一种很好的学习方法。老师会说:“这里是加数字加法的方法,下面让我们教教这台笨机子。”对此法,我觉得很值得一试,如果让此程序画出图形,学生们会学得更快,同样的方法,可用于学算术。
我喜欢规则和它的特例,另有一些人更喜欢没有规则。或许对语言把握较好的人,只是快速吸收了一个词典,而根本不用顾及事物的规则。对他们来说,所有一切都是特例,因此我认为演算法方法对他们毫无益处;我们需要用多种方法教学。

MP:我对一个叫Big Track的游戏印象很深,通过TURTLE编写的,此游戏出自Papert实验室,规则非常明确而富于逻辑。
Knuth: 那是很好的关于演算法的教学案例。我觉得,虽然有了计算器,但是算术是我们仍然要继续学习的内容。用手工计算的加减乘除是非常有益的,而且不仅是非常有益:它传达了很重要的思考模式(patterns of thought)。

MP:您是不是衷情于使用计算器?
Knuth:不是的。计算机科学家是最没有可能迷上计算器的人。我的一同事说,计算机系大概是唯一一个在教员大会期间没有任何人携带计算器的系。这可能是由于我们办公室里就拥有超级计算机。我还可通过MIT做计算问题,虽然有三千英里之遥,可通过计算机网络实现。


篮球和计算机
MP:我们是不是谈一些其他的有意思的事?在case,您的老师告诉我一个很有意思的故事。他说您是1960年case蓝球队成功的绝对致胜关键,是不是真的?

Knuth:有些过奖了。那一年我们获得了联盟冠军,我也会很高兴全归功于我。但事实是这样的:我设计出一个连我自己都已不再相信的复杂公式。这一系统可通过一个神奇的数字来评价每一位球员。这一神奇数字用来说明每一球员对比赛的贡献,不仅是他的得分,如果有球员没能进球,我们球队不能拿到这个球,有一个可能的机率,也就是另一方将得球,这样,他将为每一个失球而失去一些分值。相反地,当球员偷球成功,我们球队赢得了先机,这自然可以得到一些分值。
其实,观看一场篮球赛并推断每一次得控球权就得一分情况是十分有意思的。这种判断在最后的时间可能不准,但是在比赛的大部分时间里却逃不出这一规律:你的球队占控球权,便可算一分。换句话说,当得分牌上是90比85,你可以给任何一个拿球的一方加1分,这对于球赛的分数有更好的估计。如果你用这种方式看球,当某一方投篮命中,得分并没有真正改变,因为此方得到两分的同时也失去了球权,别忘了另一方得到了球,就这样这两分有些相互抵消了。如果另一方回到半场并得分,我们又回到了我们讨论过的起点上。但是当有人偷球成功,才真正加分。
根据这个神奇公式,控球价值的分数在大部分比赛中0.6分,所以给投篮得分的分值提升了。我前面说过,我对这个公式现在已不再相信了,但它的确包括了对诸如截断,失球等的统计数字,我们可以套用它然后得出数值,教练非常喜欢这些数字,他说数字同他对球员表现的评价有共同联系;球员从追求最高直接得分,转向尽量争取这样一个评价的高分。教练认为这是件非常棒的评价机制。在《新闻周刊》和《Walter Cronkite周日新闻》上都有报道。他们派出摄影师拍摄了我将数据输入电脑获得统计信息的照片。


MP:是不是有专业队向您抛橄榄枝,请您当顾问?
Knuth:有意使用电脑的Cleveland Browns 队曾讨论过,但我曾没参与。

《计算机程序设计艺术》的起源

MP:您的系列专著开始的最初动机是什么?
Knuth:《计算机程序设计艺术》是我在Cal Tech研究生二年时开始的,我曾为不同的机器作为写编译器的私人顾问,那时有公司会花几十万美金请人写编译器,但我不了解行情,只要价5000美金帮人写了一个。我猜测由此传出话去,说我了解如何写编译器(compiler)。不久后,Addison-Wesley公司顾问,Richard Varga建议我写一本编译器方面的书。1962年1月,他们找到我并建议:请您写一部编译器编写方面的著作如何?正好我酷爱写作,这是个不错的主意;我从内心也觉得写这样一本书也很有意义。
1961年夏,我结婚了,开始思考怎样向太太说明横空冒出的写书计划。那时我们想象不到写这本书会对我们生活产生多大改变。总之那一天,我回到家,构思了全部12章的标题,我觉得这样是比较合适的,不久后,我签了出版编译器书籍的合同。1962年秋天,作为研究生,我得到了在Cal Tech教课的机会,我上课的笔记来可用来做前三章的内容。
1963年,在我获得博士后不久,我开始为“排序(Sorting)”的章节准备资料,我几乎对排序一无所知,我觉得在写此书时研读相关资料,并将排序内容放入书中是很有意义的,尤其是LARC科学编译器的诞生,据说它就是通过一种独特方式对数据排序基础上实现的。我发现排序问题非常有意思,不久后我也能深入研究一些科技文献了。
我感触最深的是发表的文献中有许多错误,计算机科学是一门新兴学科,没有自己的鉴定标准,没有很完善的出版标准,尤其是涉及到演算法性能的数量化方面,不少出版物上的文章压根就错了,你只有三种可能:错误方法得出错误结论,用错误方法得出正确结论,和正确方法得出正确结论。三种可能中每种你有1/3的机率。
计算机科学方面的资料虽然非常多,但并不可靠,因此甚至在1962-1963年间,将正确部分的资料整理出来,显得很必要,这是很容易理解的。
出版物的质量是如此糟糕,以至于使人不愿自找麻烦去读它,人们重复发现同一个想法就是因为人们发现与其从糟粕中将精华取出,还不如直接去发现。就这样,我的最大动机,就是将文献中糟糕表述时的谎言摆平。
我猜想自己有种尽量组织好事物的本能。那时,我认为,能够写这样一本关于计算机科学的总括性文献的人,已经发现了许多属于他们自己的东西。我觉得他们好象会倾向于用自己的观点表现他们自己特有的一面;与此形成鲜明对照的是,那时,我还没有真正发现属于自己的新东西。我仅仅是一个不错的写作者,在我的脑海里这一点是极为突出的:例如,据我了解,自己是唯一一个没有发现用优先方式编译算术运算符的人。有十个人彼此独立地解决了它,但我却被这个问题难住;我没有在其中找到我的方法。因此我认为我的优势在于,除了尽量好地表述学科发展的真实故事,还比那些在彼此孤立状态下工作的人们,有更少的“偏见(biased)”的视角。我用这种半自以为是半难以想象的态度比其他人更好地进行着诠释。因为了缺少偏见,我仅仅是向自己开刀(I didn’t have any axes to grind but my own.)(之后,很显然,我写作的过程中也捡拾了几件属于自己的东西,现在,我也象上面说到的那些人一样,有了偏见)。
你问的是我最初的动机,最初的动机是写一本关于编译器的书,从此我开始构思章节。我曾认真地计划到我儿子出生时把书写完(他现在已经大学二年了,因此我计划在他开始写自己的书时写完!)我现在发现1965年写的信的一些拷贝,“我期待着今年夏天能拜访你们大学,但很遗憾,我不得不先完成这部书的写作计划。”那时仅仅是写一本书。象前面说的,我开始对排序问题感兴趣,排序中竟然有这么多有意思的东西,因此,书的内容迅猛增长。
最终我给Addison-Wesley写了一封信:“将本书的篇幅加长一点行不行?我想把更详尽的资料放入其中。”他们回信说:“不用担心,您想怎样写就可以怎样写。”因此,我开始搜集越来越多的资料。1965年6月,我完成了全部十二章的第一稿(草稿),大约有3000页手稿。
对我来说,这是有点长的一部著作,因为仅有一卷,据我对书的了解,印刷版的书比手写稿要稍少一些。因此可换算为5页手写纸要合到书中的1页内,而后我开始写第一章,将手写稿打印成书稿,寄给Addison-Wesley,让他们看看是否可行。时间已经到了1965年10月,他们好长时间没得到我的消息了,也正想知道事情的进展。我感觉很好,因为我已经完成了第一章。顺便说一下,那时的第一章和最终出版的第一章基本相同。
我立即得到Addison高层回信,他翻出老黄历说他就是1962年和我最初谈出书意向的人员,但现在他已晋升三次。从第一章的长度看,估计要印刷2000页,他们说:“高先生,你说过你要出一本长一些的书,但你不知您的一页半打印稿是书的一页?”我从心底里却不是这种看法:“我读过很多书,这帮家伙不知道他们正在说什么。”因此我找了一本他们出版的书,Thomas 的书Calculus,我坐下来用打字机打了一页,你瞧,他们说得是正确的!而后我明白为什么会用这么长的时间来完成第一章——三年半时间写完第一章不是件很妙的事情。
这使我看清了这项工作的本来面目,它的浩大的程度。如果在开始时我就认识到这点的话,那我就不会那样愚蠢地开始,并且打死我我也不会去开这个头!
当然,到1965年,我被套牢了,因为我仍然能觉察出对此类书的需求,并且意识到这项工作必须有人做。我仍坚信自己是公正不偏不倚的,以那些发明者或发现者发言人的身份出现。我收集了相当多资料,使我意识到写这部书是自己的责任,虽然完成它用的时间要大大超过我的预期。我已经完成了全部的后台工作,将它转交给其他人来完成是非常困难的。
Addison-Wesley考察了12章的内容,刚开始觉得可以足够出两卷,后来改为三卷。象这种庞然大物式的书,出版商们都发生过可怕的故事。因此我猜测他们向顾问征询过,顾问觉得做为单独版本发行,12章中会有7章卖得很好。因此,他们建议将剩余的5章和市场前景好的七章混合起来,希望能卖出7本书,我认为这可能就是出7卷本的计划。我觉得将章节重组,合理地融入七本书中是可行的。
正如第2卷,是我最初的第二章随机数和第六章的组合,后者原先的名字是“Miscellaneous Utility Routines”。忽然有一天我意识到,MUR中,除了一种外都是算术问题,因此我将这章叫做“Arithmetic”,这一小的改动又使得我必须在其中加入一两节内容,当我加入时,一个不可思议的联想出现,这是一本必须写的书,从一个计算机科学家眼中的算术是什么?结果,那一章几乎独立写成,使我将以前曾未在书中放在一起的许多期刊的精彩内容放在了一起,取了标题“Arithmetic”,并将其放入第二卷,在其中增加了不为人知的一贯性。这其中的大部分文献是由不被其他文献熟悉的作者写的,也不清楚其中的联系。
第二卷的写作过程中我进入亢奋状态,不分昼夜地写着。这么做的后果,使我得了严重溃疡,不得不改正我的生活习惯。第二卷写到一半时我认为自己很快就可以完成了,但1967年夏天,却由于健康原因不得不暂时中止。大约写欧几里德算法的一半时中断的,也就是总计第688页中第二卷现在的第333页,因此我还有大量工作要做,但我明白,我的身体却不容许。
我总是低估工作时间,另一方面,如果不这样,我也不会开始写这部书。
在1990年之前,因为写作,我下决心推掉了斯坦福之外所有的演讲活动,所有写作都是利用业余时间,当我出去演讲时,出去一天就等于去掉五天的写作时间,因为回来后我还要处理那些出去时留下的但仍然不得不处理的事情。因而占用了业余时间。

MP:您从事的计算机业正在飞速发展,要想一直领先不太可能吧?是不是发展速度比您的写作速度要慢一些?
Knuth:是的,可能会如此。我想起小说《Tristram Shandy》,虚构的自传小说,作者从他的第一卷穿越时空回到一岁时,但我仍然相信自己能够完成。第四卷,Combinatorial Algorithms已经激增到最大容量。在我完成图形化排版系统后将会回头完成。我认为可能会出AB卷。

MP:那它真是爆炸式增长?
Knuth:事实上,Combinatorial Algorithms 这一名词在1962年计划的那一天还未想到,是之后决定的。那时几乎没有Combinatorial 算法。我喜欢那种形式的程序设计,因而觉得将它作为一章是很好的,在目前的第4卷中,现在的资料中几乎没有那时的。因此,当人们提到“Combinatorial explosion”时,对我有双重含义:三年前,我认为约有70%在计算机期刊上的文章是关于Combinatorial 算法的;第四卷是最艰巨的,因为这种爆炸式增长。
MP:您二十年前开始的这场宏大的“知识梳理”工作,是否有意保持它的版图?
Knuth:有不少新内容,但我不可能长生不老,将它们全都囊括。象操作系统,我没有计划写它们,所以,当我的信箱中收到一本关于操作系统的刊物,我会很高兴(因为不用去看)。

写作的原则

MP: 您怎样将写作原则和自然的创新精神融为一体?
Knuth:当我写书时,我将写作相关的材料放在身边,其他东西都放在一边,研究某一领域时,我能保证自己专心致志地阅读,当我结束这部分工作时,它们就从我的大脑中溜走了,我再将其它的工作移入。这也就是计算机科学中的“批处理方式(Batch)”,同“交换输入输出”和“颠簸(thrashing)”正相对应。
我不是随机阅读资料的,我先阅读标题和大纲,将这些资料归类后再读,引用名言(quotes)也一样,我将名言记下以备用,例如下面的的Beatles的一句:“没有人在我的树上(There is nobody in my tree)。”用来表示分叉式搜索方式真是太棒了。我想自己之所以希望活得更长一点来完成这项工作,可能就是由于我记录了大量的伟大名言。
当我研究某一专题时,我将阅读60篇相关资料。前两篇我会慢慢研读,但后面的58篇我已知道要讲的是什么内容。当我读这前两篇时,原则上是先看问题后看答案,为后面58篇将出现的词汇和思想做准备。
我还有一本小笔记本,每一天我都在其上写下一天的工作小结,它可以帮我更好地安排自己的时间表,也帮我意识到工作的困难程度以提前做好准备。如果连续很多天里持续记录我很累,非常想睡觉,或者记着“Today I goofed off(今天一事无成)”,它可以帮我调整到合理的进度上去。
为了完成这七卷书,每天我都必须有一个写作的开端,我必须使自己兴奋起来,它是一个漫长的,不断前进的过程;每天结束时,我依然未完成(I know that even after the end of the day I won’t have finished)。每天早上醒来后,我便告诫自己:又一天开始了,可书还没写完呢!我依然觉得这本书对很多人是必需的,这也扮演了一个非常重要的角色,但所有这些逻辑上的论据都不能使我乐于开始。另一方面,只要我一开始,便十分投入,欲罢不能。我不得不强迫自己停下来,不要熬通宵。因此,我睡前会阅读各种书籍,如侦探故事,幻想故事,历史书,诸如此类的东西——在睡觉的时间。

MP:您的大部分写作是在家中吗?
Knuth: 是的,它不是我斯坦福工作的一部分,全部是利用我的业余时间。

MP:Do you do it in long hand?您始终通过手写完成的吗?
Knuth: 我无法通过打字机写作,甚至给亲戚朋友写信我也不用打字机。虽然如此,我是个娴熟的打字员,在我高中暑假里我参加过秘书班培训,我能达到每分钟80单词,我还学过机械式速记法和Gregg速记法,但上面的各种方式都不能用于写作。

MP: Why would a prospective physics major take those courses in high school?一个学物理的学生为什么在高中时做这些训练呢?
Knuth:有一年暑假我做做秘书工作,我认为这些训练有助于我在大学时做笔记,我学的所有东西只有“Dear Sir”和“Yours very truely”之类的缩写,那些对我的化学课一点帮助都没有,我坐在教室的后面,通过速记机创造我新的缩写,后来,我都不能辨别出我记的东西,因而,我放弃了。

Surreal Numbers奇幻的数字
MP:您怎样想起写“Surreal Numbers”?
Knuth:我在挪威的Oslo写的,花了一周时间。它虽然卖得不算好,但我觉得很欣慰,它还是翻译成多种语言,写Surreal Numbers 可能是我一生只有一次的经历。我倍受鼓舞,象有一种天助的灵性告诉我如何去写。写书时一气呵成,我觉得自己不可能再重复此类过程了。那一周是我这一生中最激动的时刻。
那是1972年12月,我正在写《计算机程序设计艺术》过程中,半夜里,突然冒出写“Surreal Numbers”的想法。我叫醒太太:“Jill,你觉得我的七卷系列著作——也就是我们刚结婚6个月时开始写的书——对我们的生活有些什么影响呢?现在我想写另一本书,不过我觉得这本新书不会用很长时间。”我说,如果我集中精力,我认为有一周时间就能完成。令我非常高兴的是,她也很愉快,她说:“这正是写这本书的最好时光。”我们的计划是在奥斯陆城里找一家旅馆,在那里Ibsen曾写过剧本,这样从他的艺术中获得些许灵感。然后我就在里面写书,而我太太会来约会两次(我们老是有在旅店里做点风流韵事的想法)。
在写“Surreal Numbers” 前三周,我们一同散步、滑冰,在我的脑海中构思书的前几页,但却不愿想更多,因为我希望后面的内容想到即写下。我希望它会成为数学发现的忠实记录,因为我不想做数学的任何预言。我仅仅模糊记得John Conway一年前在午餐上谈论的。
我入住旅馆并开始写作,幸运的是,我没有出现电影中经常出现的一幕,一个伙计写出了题目,凝神苦思,然后将此页撕掉。我没有步入上述状态,因为关于书的第一页和第二页的大部分都早已在我脑海考虑好了。这个周的每一天都是一样的情形,早上起来吃一餐惬意的早饭,Saint Olaf学院的学生也在这家旅馆里,我听着他们谈话,分析着他们的措词,而后回到房间写上三四个小时,可能遇到暂时无法处理的问题,因此,我就在Oslo散大约二小时步。有时我会去图书馆,但大部分情形是到大街上看热闹。而后问题的解决方案浮出脑海。我回到旅馆,再工作两小时,将困难克服掉,也许会神奇地将工作推进一步。又到了该好好吃一顿的时候了,吃完后看上一小时挪威台的电视节目,然后回到房间再写,关灯时间就到了。写书下笔如有神助,文思泉涌,水到渠成。事情进展得太顺利了。很显然,我不是很客观,但当我关掉灯后,下一页会映入我的脑海,我不得不迅速起来并记下它来。思绪来得快到我只能记下每一个单词的第一个字母。而后我才象死狗一样关灯大睡。第二天早上,我再从第一个字母破译出单词组成句子。每天同样的模式重复着。
这本书完工的时候是我一生中最高兴的日子。奥斯陆是如此美丽,所有的树上都挂满了白霜,超过1英寸厚。我和妻子看了场电影后在皇家公园里散步,公园里银装素裹的树木蔚为壮观。午夜的天空呈现出深蓝的颜色,我花了一个小时在公园里仰天惊叹与蓝天陪衬下的树姿,而后回到旅馆。那是我能回忆起的美好时光之一。我意识到只要一两页我就可以写完这本书了。接下来,我除了几个不重要的数学细节外,结束了最后一章,放松地进入梦乡。
Surreal Numbers的写作已经用了六天,第七天可以休息。事实上,第七天只要整理一下最后一页就行了,赶快做好,终于可以写“结尾”了。
这之后我一个字也不想写了,但还要给我斯坦福的秘书Phyllis写一封信,告诉她如何把这本书打印出来。然面,将句子写到一半的时候,我却不知用哪个动词好了。突然间,我几乎连很简单的词句都难以写到纸上。我刚刚渡过的一周,所有写的东西象从哪里流淌出的一样,突然间它枯竭了。这也是我珍爱这本书的原因,它是我不吐不快的一部分,我希望每一个人都能有类似的机会——灵感之手垂青于你。

MP:在Surreal Numbers结束时,有一封给教师的信,其中您提议使用该书做为课程的学生,应该做一个计划并将其写出。在您的最后一段,您指出在教学中有两个大问题:缺少写作训练;缺乏创新思考。您觉得几年后的今天,是不是还是和以前一样?
Knuth:是的,绝对是。我尽量在计算机科学系的研究生中实验,我们还尽力将竞争减到最低,我们鼓励合作解题鼓励相互交流。在小学五年级前,还一直鼓励创新,至少我孩子的教育如此。有许多创新项目需要他们去做;但五年级之后,学校象是说:“我们已没有再做那些事情的时间了,也没有时间自己发明自己的东西了。我们现在只要吸收已有的知识就足够了。”那是不对的。我们应该将教的重点放在怎样发明创造上。现在我一直要求自己的学生在读技术资料时也这么做;也就是说,只有好好思考过下一页上可能有些什么东西后,再翻到这一页,因为这样做后你就可以更快阅读该页。在你看解决一个问题的答案前,先自己思考一番。怎样才能解开它?为什么你要解它?在你看到最终结果前,所有上述问题先向自己提问一遍。十之八九你自己是解决不了的,但你会对看到的答案有更好的了解,并且你要对数学发展做尽可能深的研究。
我觉得这就是我在大学时对教科书第一章投入很多时间的原因,我非常喜欢问“为什么”,为什么它是那样的?从最开始的时候,人们怎样考虑的?每一个人应该继续问此类问题。这将提高你的吸收能力。当你弄懂了数学的某一小部分是怎样构成的时,你就可以重新组织此部分的内容了。在几何学中我们教学生探本索源,但大部分时间练习题测试的是他们弄懂了定理没有,而不是证明它。将数学学好,你应该学方法,而不是结果,并且还要研究这些方法是怎样发明的。

人工智能

MP:我们今天正好处在一下新兴的人工智能领域,您是否注意到它?
Knuth:我喜欢阅读这方面的内容,在第4卷中很多算法就是通过人工智能方式来解有趣的问题。他们一对一地对应于电子工程师解决问题的方法,另一方面我也喜欢将内容而在两个领域内的资料放到一起(They turn out to be in one-to-one correspondence with things that electrical engineers use for other purposes, and again I enjoy bringing together two literatures that are talking about the same thing.)。例如,最短路径问题,就以许多不同的形式出现,在人工智能中,我们证明理论和解决问题的演算法,只是用不同的语言来表达象在电子学中遇到的电路分布同样的问题。
我虽然不是AI专家,但我可以从Pamda McCorduch(思考的机器)书中的说法,她指出:“电脑能思考吗?”然而到目前为止,同思考相联系的东西,电脑全做了;而人能做电脑却不能做的是人根本不用思考的那方面东西。事实正是如此,我们不用思考就做出的正是电脑绝不会做或几乎不会做的,象散步。要控制一台机器人象蚂蚁一样走,或编一个程序能识别长出胡须的脸,是非常难的。儿童能说几种语言;但电脑却不能很好地翻译东西。我们下意识干的事,正是人工智能还不能做的,这是这一领域最值得关注的。最大的秘密是我们不通过思考做的事是如何运做的。蚂蚁在没有人指导的情况下是怎样解开这样复杂的难题的?它们体积很小的大脑是怎样做出决策,彼此交流共渡难关的?这些都还不被我们所知,我虽然对这些很着迷,但不会去写一本此类的书。
MP:那你是非常乐观的了?
Knuth:我觉得在AI方面,更深入研究这些事情是如何做的比通过电脑系统直接做更重要。尽量实现自动操作是一项伟大的科学成就。当你完成了某项自动化,最重要的是你在这一过程中所学到的,而不是现在电脑确实能干一项复杂的工作了。
当您向电脑解释一个问题时,你必须自己理解它,比你向人解释时还要深入。有句古语:“教会别人才是真正的学会You don’t learn something until you have taught it to someone else.”古语引伸成现代语如下:“教会电脑才是真正的学会You don’t really know something until you have taught it to a computer.”这就是学习的奥秘。计算机是对理解的很好测试,你不能对电脑打马虎眼:“现在用常识来做好了。”你必需理解得更清楚了,这里没有模糊随便的空间——There’s no room for wishy-washiness。这也是我认为电脑冲击了教育的原因,如果学生能教会电脑,那么你就明白他已经将此问题牢牢地掌握在自己脑海中。

MP:你花多长时间研究开发TEX和METAFONT?
Knuth:1977年春天开始,花了四五年时间做完,我觉得用一年时间就能完成。

MP:您觉得付出那些时间值吗?
Knuth:不错,我觉得我研究的内容是真正令人兴奋的,并且在印刷方面起到了很好的推动作用。对于一个数学家来说,从一个领域涉足另一个领域,这可以改变一个领域或改变他的工作方向,他和其他他人有不同的背景,因而会有不同的洞察力。例如,我听说Larry Shepp的女儿得了脑瘤,他因此发明了一种能定位脑瘤的设备,这是一项重要的突破。由于这样那样原因,你将会经常看到类似情况出现:数学家步入其他领域,他会用他的知识观念应该在该领域,这将会使此领域的人们受益匪浅。
以我自己的情况,我认为打字排版是很重要的,我也很感兴趣,这也是我用了四五年时间而不是一年来开发的原因。如果这些想法在应用中不是很成熟,我会保持沉默而不去张扬,自己用用就足够了。但是现在数学和计算机科学的许多概念对排版来说非常重要,因此,我想精益求精。同时,希望在第4卷变得更大前,赶快回去第4卷的写作中。

阅读体会:
1、图形化和做图是一种很好的学习方法;
2、做笔记;
3、全神贯注地做件事,象电脑的批处理方式;
4、独到的读书方法,做事也要总结方法;
5、写作是生命的一半;
6、有一个好老婆,生活会精彩不少。
7、可控制的思想是可怕的,也是最有力的。

星期一, 十月 09, 2006

推箱子作者李果兆和他的一篇文章

记得几年前,《推箱子》在PC机上刮起了一股不小的益智类游戏的旋风,现在许
多资深玩家也都对《推箱子》赞不绝口,可见有深度的益智类游戏是非常受大家
欢迎的。
推箱子游戏出现在计算机中最早起源于1994年台湾省李果兆开发的仓库世家,又
名仓库番,箱子只可以推, 不可以拉, 而且一次只能推动一个,胜利条件就是把
所有的箱子都推到目的地。
推箱子游戏是一种老少皆宜的益智游戏,既可以开发青少年学生的智力,又可以
防止老年痴呆症,全家一起攻关还可以促进家庭和睦,何乐而不为?

漫谈游戏修改
李果兆
  所谓修改游戏呢,就是藉由一些工具程式修改游戏档案或使用的记忆体,把原来的资料变成自己想要的数值。有的人一听到『修改』两个字,就马上投以鄙视的眼光过来....『游戏改了以後还有什麽乐趣嘛』,『实力坚强的人是不需要修改的呀』....是的,原本的游戏工作小组都会设定一些剧情及叁数,让玩家一步一步的叁与。不过是你在玩游戏啊,又不是给游戏玩,你也可以自行设定啊。除了一些所向无敌,无中生有,打死不完的修改外,甚至可以变化出一些原本游戏中享受不到的乐趣呢。例如我在玩『终极动员令』时,不喜欢一边在前线杀个你死我活,一边又要顾及後方的采矿作业,在手忙脚乱忙不过来时,就可以祭出传说中的修改大法,当场改出源源不绝的资金,除了可以专心於前线的 作战外,甚至可以把游戏变成另一种『Z 字特攻队』来玩。我在玩『仙剑奇侠传』时不喜欢到处去找怪物来练功时,那麽可以再度使出修改的绝技,瞬间变成武林第一高手,当场省下宝贵的练功时间,而且可以马上享受当武林大侠,打遍天下无敌手的快感。
  我在玩『极道枭雄 2』时,可以在第一关就改出最终极的武器,惨电肉肉的对手,顺便屠城一下,如果没有修改,到後面的关卡敌人也会变的很强,到时候反而遭到惨电,这也是没有修改就不能体会的快感。笔者甚至在在网路上看过一位网友把『大富翁三』敌手的钱改的很多,然後再盖大楼让他们慢慢的花过路费,不会太快破产,延长游戏的乐趣。那我们要怎麽来修改游戏呢?因为我们是更改游戏中原本的设定或程式,所以我们得具备一些电脑存放资料的基本知识,例如...
  1. 表示资料的十六进位制及二进位制,最好还会一些基本十进位和 十六进位制的转换。
  2. 记忆体上的位址观念,IBM PC 上设计是低位元对应低位址,所以 如果十六进位的 12AB,会存成 AB12,记忆体和磁碟档案上大部份都是这样储存的,不过有些工具会自行帮你转换成这些排列。
  3. 游戏中使用的数码及资料结构,一般来说萤幕上如果看见『10』 ,记忆体中存放的方式是十六进位的『0A』,不过如果是 BCD 码 ,会存成十六进位的『10』或是『01 00』。还有其他数种方式,需要大致了解一下。4. 游戏中连续数值的排列。如在 RPG 游戏中看到 500/500 在记忆 体中大概就是 500,500 连续排在一起的。
  这些观念我们等一下会用到。除了基本知识外我们还需要一个好用的工具程式。一般来说依据修改的方式我们可以把这些工具分成下面四类:
一、直接修改游戏存档、
二、使用常驻修改软体、
三、使用某游戏专用修改软体、
四、使用欺骗码(CHEAT CODE)
  前面两类是利用搜寻符合要修改的目标数值,判断找出游戏储存这些目标的地方,加以改变就行了,所以前两类的工具重点放在『搜寻』的功能上,大部份的游戏都可以以这两种方法 加以修改,不过需要自己动手,有点麻烦。後面两类的重点在於游戏程式设计师或有热心又闲闲没事做的人帮我们找出来,并写成程式,我们直接用就可以了,不过要他们肯写,而且我们每一种游戏几乎都要各别找的到该游戏专用的修改程式或欺骗码才行。以下以我们已经成为武林第一高手来代表我们已经成功的修改游戏,修改 RPG 游戏就是为了要成为武林第一高手的嘛:
  一、修改游戏程式码或游戏储存档:这是笔者看过的最早游戏修改方式,当时游戏还一片卖 60 元哦,不过当时游戏只是用简单的线条组成,声光效果当然没有办法可以和现在比。在那时候就已经有杂志刊登 xxx 游戏要用 PCTOOLS 找 ooo 字串改成 zzz 这类的修改方法,甚至有人去追踪游戏程式码,只为了能让某某游戏无敌而以呢。不过现在除了要 crack,已经没有人做这种事了,因为现在除了游戏很大,追踪会很累外,还有常驻型的修改程式可以不必那麽麻烦。所以现在这类的方法都以修改游戏储存档为主。当时修改存档的工具以 PCTOOLS 功能最方便也最有名,不过目前国内也有一些免费而且比较适合修改游戏存档的工具出现,如 FH、FE等等,不过大家还是习惯使用 PCTOOLS,所以我们以 PCTOOLS 为这类的代表。除此之外,直接去修改游戏存档还需具备一台可以把十进位和十六进位互转功能的工程计算机,就是卡西欧 xx00 型的那一种,因为 PCTOOLS 毕竟不是设计用来专门修改游戏存档的,功能实在有点阳春,我们必须藉助工程计算机帮我们转换,才能正确找到要改的地方。如果你有『汉书』这套软体,她里面有个 cal.exe 的计算机,可以拿来代替工程计算机。如果你是用其他如 FE、FH 的软体, 可能就会把转换的功能加到程式里面了。在正式修改游戏前,先介绍一下修改游戏存档的原理。所谓的『游戏存档』,就是游戏的程式设计师为了让我们把现在的游戏进度储存起 来,以便下次再玩游戏时能够从本次的进度开始,所以就设计把一些叁数集中存到某个档案,下次再读回来这些叁数,就能回复能原来的进度,又那麽的恰巧,这些叁数又大部份刚好是我们要修改的,集中起来改又很方便,所以我们乾脆改游戏存档,让游戏下次读回去时就以为我们已经成为武林第一高手了。 直接修改游戏的存档的好处正如上所说,集中起来改很方便,有时候还可以改出一些新奇又好玩的东东,而且改了後只要不要储存进度覆盖掉这个档案,下次再去读这个进度还是有用,你还是位武林高手,而且可以改存档的工具很多又不用花钱,多好啊!不过真的有这麽完美这麽好改吗?那可不一定!讲到这边笔者忍不住要吐一下修改游戏存档的苦水。对一般人来说要构成能够修改的游戏存档.... 第零,它必须要存在。废话,没有存档我们怎麽修改咧?虽然大部份 的游戏都有,不过还是有的游戏偏偏没有或用过关密码代替, 我们对於这种游戏也无可奈何,总不能去海扁游戏设计师吧?第一,它必须小,因为太大的重复数值太多,很容易改错,必须要用比较两个相同进度但是有些叁数不一样的方法来找出要改的地 方,这边笔者推荐使用 NORTON UTILITY 的 DISKEDIT 来进行比较游戏存档,它可以开两个视窗比较出不同处,该有的功能 也都有,蛮方便的。不过这就需要技术和经验,不大适合一般 玩家修改了。
  第二,它必须没有经过编码或检查码。有的游戏程式设计师为了怕玩家乱改游戏存档,改错了当机,然後就认为是游戏设计师的错,,所以会在游戏储存叁数到档案时先经过一番逻辑运算,让玩家用 PCTOOLS 会找不到要找的值,然後要读回游戏时再进行反向逻辑运算。这 类的游戏除非是高手,否则是很难改游戏存档的。 游乐器的游戏大多有设计检查码(checksum),为的就是查证 存档的正确性,修改存档也会导致检查码的不正确。(例如:炎龙骑士团二存档经过编码,暗黑破坏神(diablo)经 过 checksum 检查)
  第三,它必须是固定长度。通常如果储存两次的游戏进度,发现两个存档大小不一样,那很可能游戏采取了复杂的记忆体结构,你找出这次,下次他又变地方了,不如用常驻的修改软体来改比 较方便。
  第四,它必须没有经过压缩。『C&C 红色警戒』就是这种例子,因为这个游戏要存放的资料太多了,不压缩的话太占硬碟,所以你 在存档时发现要等一段时间,大概就是在压缩。这类型的也是没办法直接修改的。如果一个游戏存档都符合上面的限制,还是有相当多的缺点的,例如修改游戏存档是没有办法持续锁定某个数值的,这些叁数还是会随游戏而减少,这样就无法无敌,可能会让相当多的玩家失望了。其次要修改的目标必须是游戏设计师有设计在储存档的叁数才能修改,这当然要看游戏设计师的高兴了,说不定游戏设计师会用一些阶段代码来记录而不会用实际的叁数,那会很难修改的,所以并不是什麽东西都可以改的。
  在 Windows 95 游戏盛行的今天,一般游戏存档都设计蛮复杂的,所以以後的游戏要修改游戏存档可能没有那麽方便了。 另外一提,在Windows 95 下,PCTOOLS 并不适合使用,建议改用其他的档案编辑工具。 讲了半天,我们到底怎麽修改游戏存档呢?别急,网路上有很多人讨论改某某游戏的存档,有的时候我们不用亲自动手,直接去看别人研究的成果就可以了,不过笔者还是做一番示范,才能达到主编的要求。我们找一个数值越大越好的目标来修改,因为数值越大占的位元组数越多,比较不会找错到其他的叁数。以一个主角经验值 20000 的 RPG 游戏为例。首先把游戏存档找出,我们可以看游戏目录下所有档案得日期,找一个日期是今天的,大概就是游戏存档了,通常会是 .sav 或 .dat 的。而 20000 的十六进位是『4E20』,不过正如前面基本知识所讲的,IBM PC 倒过来储存把『4E20』存成『20 4E』,所以我们找到游戏存档後,以 PCTOOLS的搜寻(FIND)功能找十六进位的『20 4E』,如果只找到一个大概就是了,如果我们想改成 60000 十六进位是『EA60』,如同前面,填入『60 EA』就可以了。不过如果你找到两个以上相同的就很悲惨了,需要技术或者是好运气随便选一个修改。如果一个都没找到呢?那不是没有储存这个叁数,就是游戏存档经过编码。这两种情况笔者都会建议你用下面所讲的常驻修改程式进行修改。
  二、常驻型的游戏修改程式:话说在笔者最早还在边看杂志边修改游戏存档的同时,有一天晴天的早上,一位笔者的死党突然大驾光临,并且带来一份惊天地、泣鬼神的礼物....陈伟谷先生所撰写的『电动克星 5.19 版』,它的随呼随到,多功能的修改真是令只会 PCTOOLS 的笔者眼睛为之一亮,差点中风瘫痪。这就是笔者见过的第一个常驻型修改程式。不过当时『电动克星』只支援单色萤幕,而且只有高阶扫瞄,但是那时『电动克星』就已经能够连续扫瞄字串了,如 01 02 03,而且还能十进位、十六进位混合输入,如 01 $1A 02 $1B,比後来的一些修改程式还先进呢,现在的 FPE 就是受到它相当大的影响。 继『电动克星』後,接下来就是这类常驻修改工具的战国时期了,一堆修改工具纷纷出笼,比较有名的有精讯出版且具有低阶分析能力的GB4、小弟我的 FPE 2.5、雄中的 GBP、可以改 DOS/V 的 DGB、不可考的 GBH、加拿大的 GW、兼具 debug 能力的GAMETOOLS.... 等等。 不过後来记忆体技术翻新,推出了可以切入保护模式的DOS EXTENDER 这种东东,许多工具因为技术问题没有再出新版,只剩下 GW32 和 FPE 4.1a 可以修改保护模式的游戏,但是在 Win95盛行的今天,大概只有 FPE 5.0(就是目前市面上的游戏修改大师5.0)称霸了。常驻修改程式看起来虽然很神奇,不过它的原理其实和 PCTOOLS 修改存档类似,『搜寻』,不过它是比 PCTOOLS 高级一点的工具,算是分析的工具,而不再是简单的搜寻工具而已。常驻修改工具不但自己可以记住所有符合修改条件的位址,而且我们只要告诉常驻修改程式我们在萤幕上看到的数字或大小变化,它就能够藉着这些数值或大小的变化,过滤掉一些不是正确的位址,值到完全找到正确为止,不像 PCTOOLS 需要另存两个档以人工技术分开比较,也因为它会常驻在记忆体的关系,所以能够帮我们固定锁住某一个目标,造成无敌或野草烧不尽的死不完效果,而且藉着它能够在游戏中呼叫,也能够增加一些非修改游戏额外功能进去,如抓图、阅览中文档案、听 CD 音乐、储存游戏进度、甚至随时修改游戏存档。 哇!听起来很强大,那用常驻修改程式不都可以搞定所有的游戏了嘛?呵呵,因为常驻修改程式必须在游戏中呼叫,所以拦截键盘的能力,相容性及稳定性必须要很好,不过这是这些程式的作者(如小弟我)要做的工作,一般使用者只需要挑一套比较好的来用就可以了,目前在 DOS 下表现比较好的是 FPE 5.0 和 GW32。不过遇上一些比较奇特的游戏就需要使用者本身的技巧了。而且现在游戏设计在记忆体使用上越来越复杂,在某些游戏,遇到某些状况时都必须重新分析寻找,比较麻烦。常驻修改软体当然也是可以改出一些新奇又好玩的东东的,不过由於改的是记忆体,有可能会被游戏程式设计师分散处理,所以就不像用 PCTOOLS 改集中管理的游戏存档那麽方便了,更需要一点技巧。 PC 是被设计成所有 CPU 能够存取的东西,都必须放在记忆体内,包括指令及资料,所以能够修改整个记忆体的常驻型修改程式,理论上就可以修改所有游戏的东西了。不过毕竟是理论上,因为有的资料会以特异的格式存放,你又不是游戏设计师,怎麽猜的到咧?幸好大部份的游戏设计师不会这麽无聊,不会没事设计这些增加难度来整自己。所以只要具备一定的电脑知识,是可以改出一些新奇又好玩的东西来的。至於这个电脑知识,就必须使用者自行加强了,一般来说修改软体的说明书都会教你一些基本的修改技巧,抱着说明书猛 K 是一个不错的方法。如果笔者讲到这边就收工好像太对不起读者了,所以简单说明一下 FPE 5.0 几个被问烂的修改技巧。(GW32 不大适用下面技巧,GW32 没有字串连续搜寻的能力,也没有低阶分析 word 的能力。)1. 一般来说如 RPG 等数值叁数很多的游戏,游戏程式设计师很喜欢把它们放在一起,如 HP 200/200, MP 100/100,这样的话,通常输入『200,200,100,100』应该一次就可以找到正确的位址了,如 果没有,可以试试把资料型态改为 word。(FPE 5.0 有按键可以直接设定资料型态)此外也能够如『电动克星』十进位十六进位 混合搜寻,如『200,C8h,100,64h』。 2. 什麽是『资料型态 word』?这个就是基本的记忆体单位啦,IBM PC 设计把 8 个 bit 结合成一个 byte,2 个 byte 结合成一个word。因为一个 byte 它能储存的范围只有从 0 到 255,但是用 两个 byte 结合起来可以储存 0 到 65535 的数值,所以程式设计师如果想存放超过 255 的数值怎麽办呢?当然就会用 word 来 存了。後面当然还有用两个 word 组合的 double word 及更多的种类。所以在上面那个例子游戏设计师就很可能会用 word 来存放,变成『200,0,200,0,100,0,100,0』,不要忘记 IBM PC 会把这两个 byte 倒过来,所以本来的『00C8』会变成『C8 00』,也 就是十进位的『200,0』了。不过 FPE 5.0 不需要在原来输入数值的中间都插入『0』,只需把资料型态改为 word 即可。
  3. 那麽一些用光棒显示,看不到真正数值的生命值也有可能以 word来存放罗?是的,如『Z 字特攻队』生产单位所需的时间,C&C 中型以上坦克的血量也都是以这样储存,所以在以 FPE 5.0 进行低阶分析时必须先把资料型态设为 word。4. 正如游戏存档会编码,萤幕上看的到资料也可能会『骗』你哦,不过正如前面所说,因为记忆体是随时要用的,如果编码实在是 游戏设计师自讨苦吃,所以他可能会用比较简单的,如在实际数值後面多加一两个零,本来应该是 10 的变成 100 或 1000,萤 幕上也会比较好看,但你分析时要有经验的猜出原本的数值,这就是要本身的经验了。
  其实还有许多许多的修改技巧的,请叁考你的修改软体说明书罗。 在 Windows 95 盛行的今天,DOS 下的常驻修改程式还能一样的帮助我们在游戏中如鱼得水、虎虎生风吗?很抱歉,DOS 下的常驻修改软体到了 Win 95 下全挂了,因为 Win 95 的记忆体策略,资源管理方式和 DOS 下截然不同,连最新上市能够修改 Windows 3.1/95 游戏 的 FPE 5.0 也都必须分两个版本来执行,才能够和 Win 95 相容。其实 FPE 5.0 在 Win 95 下也是扫瞄整个记忆体,因为 PC 硬体就是这样设计,找记忆体的就没错啦,不过为了相容 Win 95,所以在Win 95 底下一些抓图等的功能就无法使用了。在 Win 95 底下的FPE 5.0 已经不是一个『常驻』的程式了,因为 Windows 系统有多工的特性,所以它把呼叫及切换的工作交给 Win 95 去做,而自己做最核心的分析扫瞄部份,应该支援标准的 Windows 3.1/95 的 VGA 卡或音效卡都可以支援,应该不会有相容性的问题,不过由於目前多家 VGA 卡的 Win95 驱动程式都未成熟,如果在你的电脑上有问题时,请去更新你的驱动程式。至於 GW 32 为什麽没有能够在Win 95 下使用的版本?据笔者推测可能是 GW32 在 DOS 下存取延伸记忆体的方式不适合拿到 Win 95 下用,而且程式架构已经固定在DOS,要改写太过复杂,所以就没有了。
  三、某某游戏专用的修改程式: 这个的历史就无从考据了,最早应该是发生在国外的吧,因为台湾似乎到现在还没看过都少人再写这种专用的修改程式的。大部份的这些程式都是免费流传的,所以努力去网路上找应该可以找到一堆的。 不要一听到『专用』,就感觉很伟大的样子,其实并没有那麽伟大啦,其实它的原理也非常的类似 PCTOOLS,只是是有非常热心的玩家先帮你分析出这个游戏要改哪里,然後他就自己写个可以直接修改档案的小程式去专门修改这个地方了,我们直接用就可以,不需要再拿PCTOOLS 来改。所以这些也没有办法拿到其他的游戏使用罗,『专用』就是这麽来的。至於这些专用的程式都是修改哪里呢?大部份还是都改游戏储存档,因为这是最好找也是最容易改的。也有一部份是直接修改游戏资料或游戏程式码的,不过正如前面所说,这需要花大量的时间和精神,所以蛮少人写的。甚至还有人也写出可以常驻在记忆体,然後按个键就能修改的程式,这个就要考虑呼叫热键及常驻的问题了,算是不小的工程,下次看到这种程式时,不要忘记立正敬礼一下啊。这些程式的好处就是不用自己动手,执行它就帮你改,很方便,而且说不定会帮你改一些有的没有的。不过缺点就一大堆了。假设某天我一时兴起突然想用专用的程式来修改我正在玩的游戏。首先,我必须翻遍网路,还不一定找的到该游戏的专用修改程式。就算找到了,该程式我也可能看不懂怎麽用,因为大部份都是英文的说明。就算我知道怎麽用了,它也不一定有改到我想要改的目标。就算它改到我想改的目标,也不一定能达到我想要的效果,如持续锁住啦,我要改的它不给我改等等。该程式功能完全决定於那位写作该程式的热心玩家,我们是没有插嘴的份的。所以一个好的专用修改程式是可遇而不可求的。不过由於目前 Win95 盛行,写程式变的需要比较多的知识,所以开始和大部份都是在 DOS 下执行的专用修改程式格格不入,常驻型的专用修改程式完全没有作用,这也是一大缺点。这一类型的工具,最有名的大概是可以修改『终极动员令』的『CCEDIT』了。它的作用不是改里面的钱,而是改各项武器或建筑物的叁数,如你可以让你一百块钱的机枪兵人手一把雷射枪,四五个机枪兵就能击垮敌方的坦克大队。你可以让你的直升机场建筑费仅需一块钱,然後盖满整的地图,生产有史以来最庞大的陆军直升机军团。听起来很神奇吧?是的,它就是直接修改终极动员令的档案叁数,如果只改储存档是很难有这样的效果的。而且它有着漂亮的图形介面,分门别类也很清楚,可惜的就是全部以英文显示,而且没有该单位的图形,而且它还从早期的免费软体变成後来的 shareware 咧,这类的专用修改软体实在是很少人把它当 sharware 的。最近从数本电脑游戏杂志开始送光碟後,因为这类型的软体大部份是免费的,所以也这些杂志也有部份收集,有兴趣的玩家可以去找找看。不过由於它们都是只针对固定的游戏,所以如果习惯修改的玩家,前两种方法还是必备的,而且前两种方法的变化也比较大,不会被限制住只能改什麽。
  四、使用游戏内建的欺骗码(CHEAT CODE):其实最早游戏会内建一些密技发生在电视游乐器上,相信玩过任天堂的玩家对於『上上下下左右左右 BABA』一定非常的熟悉。对,这也算是一种 CHEAT CODE,在早期游乐器没有常驻修改软体,软体又存放在不能修改的 ROM 上面,又没有磁碟机可以转录下来的时代,这种方法变成唯一修改游戏的方法了。那在 PC 上呢?一听到『IDDQD』很多人也许会马上回答:『毁灭战士』! 没错,IDDQD 是毁灭战士(DOOM)无敌的密码,这也就是传说中的CHEATCODE。为什麽打 IDDQD 就会无敌呢?这可不是神看我们玩游戏太辛苦,为了体谅我们而发生的神迹,这是游戏程式设计师故意加了一段程式码到游戏程式里头,只要我们按对了密码,它就发生作用去修改一些游戏的叁数,达到无敌的效果。『毁灭战士』就是最有名就具有相当多种类 CHEAT CODE 的例子,後来有一大堆游戏见闲思齐,也增加了 CHEAT CODE 进去,方便我们修改。 很多人就会觉得奇怪了,为什麽游戏程式设计师会加这些程式码到里头去,游戏写完就算了嘛,难道吃饱闲闲没事做吗?我们都知道,一套游戏要发行前必须经过完整的测试除错,确定都没问题後才能上市发行。(不过国内有因为延误太久又赶着赚钱,草草测试就上市的错误的示范)所以他们就会找很多人来测试,不过找来的人难道大家都还要在这个游戏上练半天功,把技术练纯熟全破後才能整个测试过一遍吗?这未免太没有效率了,所以游戏设计师就会加一些密技进游戏里面,让测试人员能够按一按就能早日整个测试一遍。有的游戏设计师觉得这样设计对於玩游戏来说也是蛮有趣的,所以游戏上市後也就 没有拿掉这些密技啦,这就是 CHEAT CODE 了。如同专用的游戏修改软体,CHEAT CODE 也是专用的,它也是专门被写出来的,只不过这次换成是游戏设计师自己写而已,所以当然功能也被游戏设计师自己决定罗,从包括穿墙、瞬间移动、武器物品全满都有到仅仅只帮你补一次弹药的 CHEAT CODE 都有,不过这个和专用的游戏修改程式最大的不同就是它很『安全』,是的,因为别人去分析而找出来的地方难免有可能找错,毕竟他不知道游戏到底如何如何处理这些地方。而游戏设计师呢?游戏是他设计的耶,用了 CHEATCODE 後如果还会发生当机的话,那他该切腹以谢国人了。而且因为CHEAT CODE 是内建在游戏内,所以游戏能够执行 CHEAT CODE 就能生效,不用担心 DOS 或 Win95 的相容性问题。CHEAT CODE 的缺点呢?游戏程式设计师为了避免扛下『切腹』的责任,所以大多数都不愿意再花工夫去设计个 CHEAT CODE,呵呵,其实最主要的原因是他们为了延长游戏的生命,不要让玩家太早破关而不玩了,所以都不大会加 CHEAT CODE 在里面。而且正如前面所说,CHEAT CODE 是『专用』的,所以我们不要想拿 IDDQD 在『红色警戒』内无敌,所以又要抓破头到处去找该游戏的 CHEAT CODE 了。最悲惨的状况可能就是在你找了半天後,人家却告诉你『本游戏没有CHEAT CODE』。如果你因为不小心踩到狗屎(走狗屎运)而找到CHEAT CODE 的话,它的功能也很可能也无法使你满意,因为大部份都是补充体力物品而已,无法持续保持,很多甚至也无法无敌。不过话说回来了,国外还是有一些提供蛮多 CHEAT CODE 的游戏。早期游戏杂志所刊登用 PCTOOLS 修改的专栏都变成专刊 CHEAT CODE及游戏的 BUG 所产生可以变相修改的技巧了,我个人认为游戏的BUG 实在难登大雅之堂,不过有兴趣的读者倒是可以网路上讨论区或是去把杂志翻翻看,说不定会挖到宝呢。恭禧!看到这边你已经快把本文看完了,太辛苦你了,我们赶快来下一下结论吧。关於专用的修改软体和 CHEAT CODE 其实都算可遇而不可求的,而且品质也叁差不齐,不过如果你某天在网路上或杂志上看到一些有趣的 CHEAT CODE 或专用修改程式时,不妨把它抄起来,以後不小心玩到这个游戏时就可以拿出来用,增加一点游戏的乐趣。
  目前国际上非常有名的游戏,如 diablo 大概都会有人主动去写专用的修改程式的,有心的话不妨去找找。 而以 PCTOOLS 修改游戏存档虽然有悠久的历史,不过有相当多的限制,甚至不少的游戏或要修改的目标根本没有办法修改,而且它还不能无法达到无敌或持续保持的功能,所以笔者建议你如果对游戏存档已经很有研究,或是在网路上看到某人发表某某游戏的超级完美游戏存档修改法时,可以赶快拿出PCTOOLS 来伺候游戏。如果自己想修改刚买来或是网路上没有人发表修改法的游戏,或是常常以修改游戏为乐的话,至少应该有一些常驻的修改工具来辅助你分析整个游戏,然後以 PCTOOLS 为辅助的工具。不论是 PCTOOLS 或常驻修改工具,你都必须具备基本的电脑知识,改起来才会得心应手,所以想做个快乐的玩游戏而不被游戏玩的专家,赶快充实你的电脑知识吧。

电脑、编程和机器人

电脑,编程和机器人是相互联系着的三样东西。
Lego乐高“头脑风暴”机器人创始人Mitchel Resnick有不少有意思的议论。

The best learning experiences happen when we are designing and creating things that we care about.最好的学习体验是在我们设计和建造我们关心的东西时发生的。——Mitchel Resnick(米切尔.瑞斯尼克)
米切尔.瑞斯尼克,麻省理工学院Papert教授,著名乐高“头脑风暴”机器人专家。LOGO语言之父西蒙的弟子,他在麻省理工学院还领导着一个有意思的小组,名称为“终身幼儿园”,开发了各种教学工具,包括“可编程式积木”,这也正是乐高“头脑风暴(又称智力风暴)”机器人的核心部件。米切尔于1978年获普林斯顿大学物理学士,1988年获麻省理工学院计算机科学硕士,四年后,获得该校博士。在上研究生之前,曾有五年时间为《商业周刊》做科学与技术记者。现在,他的研究精力放在如何帮助人们,尤其是孩子们学习未来的新东西上。米切尔是“计算机俱乐部”的创始人之一,这是一个为低收入家庭的孩子们课后提供新技术,展示自己创造力的场所,在中国的成都的英特尔电脑俱乐部就是其中之一。米切尔的小组最近还研究了一种新式的图形化程序设计语言,叫做Scratch,它能够更简单地帮助孩子们建立活生生的,动画游戏或交互式艺术创作。
从小就不安分的“好”学生






图:童年的米切尔
顽皮的孩子,是好孩子。米切尔的童年,是幸福的童年,顽皮的童年。父亲对孩子要求很宽松,当他把自己家的后院挖翻了天,开辟了一个迷你高尔夫球场时,父亲一点都没有责备他的意思,还要和他搞一场比赛。正是类似的生动示例,使他很小时就没有对“犯错”的畏惧感,孩子的各种富有创意的想法,是十分可贵的东西,也正是这种经历,使他觉得体验、尝试是一种很好的学习方法。在哪里最允许体验、尝试呢,又是哪里是我们至今最怀念的校园教育呢?是幼儿园里。提起幼儿园的历史,可追溯到三百年前的德国教授弗来依保,是他创立了第一个幼儿园,米切尔认为幼儿园是进行有效学习及培养创造力的最佳环境――在幼儿园里,你会不断受到鼓励,可以大胆犯错误,还能得到很多动手的机会。为此,他领导的小组开发了各种教学工具,通过与著名积木玩具商乐高公司的紧密合作,该项目组开发出可编程的乐高玩具,帮孩子们学会在数字时代进行设计活动。为此,米切尔提出了“终身幼儿园”计划。(图:弗来依保的新玩意)为什么是“终身幼儿园”呢?如果我们的一生中受到的教育都和幼儿园时一样,那该有多好啊!这看似是一个天方夜谈的故事,因为在幼儿园里时,我们学习的是非常简单的形态和概念,从小学中学一直到大学,和幼儿园里的学习知识相比,要复杂很多。如何既保持幼儿园的生动性,又可以学习丰富的知识呢?米切尔首先给大家一个问题。 这个问题是:我们列出了三处东西,电视,电脑和画笔,请大家选择一种和另外两种不同的东西?看到这样一个问题,大家有一个很显然的答案,但却又有点不相信自己,我们大部分选择什么呢?是画笔。但米切尔的选择是“电视”,他的角度不是电子产品,角度站在学习的方式上:电脑和画笔都可以生动地用来表现自己,但电视却不能,电视的特点仅仅是被动地接受信息。电脑的出现,使得这种不可能成为了现实。做为学生,应该如何面对这个问题呢?将电脑已有的各种功能发挥得淋漓尽致,不是最终的目的,要将它做为一种表达我们思想的工具,而不仅仅是执行者或传达者。电脑可以让人们利用新技术,重拾幼儿园时期的学习方式,让各个年龄层次的人都能通过设计性活动进行学习。应用得当的话,电脑可以为你提供更为广阔的设计空间。一个人的设计活动不再局限于堆沙堡、搭积木,电脑可以让一个人设计很多东西,启发产生更多想法,帮助完成复杂的项目,教人理解更加复杂的概念。在他的这个项目中,他把自己最富有成效的“头脑风暴”机器人称为弗来依保在21世纪的新玩意,他开玩笑地说,如果弗来依保活着,也会发明这种“头脑风暴”机器人。

世界需要创造,电脑是创造的武器
图:米切尔亲切地抚摸着电子猫,小猫发出“喵喵”声
米切尔谈论的另一个重点,是创造力。他反复强调:未来的成功,不论对于个人、社会、公司还是整个民族,不是因为我们拥有多少知识,知道多少东西,而是取决于我们的思考和行动的创新性,而这是我们的教育系统应该检讨的,因为对于年轻人的成功,也来自其创新性和创造性思维。关于创造力,米切尔有许多精彩的论断,他说,在大约1980年代,很多人谈论“工业社会”向“信息社会”转变,而到了1990年代,人们更多地是谈论“知识型社会”,而米切尔更喜欢用一个词,“创造型社会”。
“头脑风暴”机器人是麻省理工和玩具商乐高公司共同合作的创造性产物,自1998年推出系列“机器人发明系统”,在积木上装电脑芯片,透过计算机软件可以无线遥控这些积木堆栈小汽车或者半个人高的机器人,“头脑风暴”一发布,三个月内在美国热销八万套,1999年,在热情的机器人迷自行成立网站的推波助澜下,销售数字成长三倍,坊间出现二十多本书籍,专门讨论计算机乐高。而米切尔就是这个开发团队中的重要成员。当问到他的这段历史时,他不无感慨地回忆说,大约二十年前,和麻省理工的同事开始研究能够用电脑控制的玩具,那时我们从他的老师西蒙发明的Logo语言中受益颇大,Logo是通过一个小海龟来控制屏幕画图的,既然可以控制整个屏幕,那控制更多的东西也并非不可能。沿着这样的思路,1984年,他们开始将乐高积木块同电脑相连。怎样连接呢,通过发明一种智能块,通过导线它可同乐高积木块相连,通过导线,它还可同电脑相连接,所以,电脑上的程序就可以控制乐高积木了。1988年,他们开始同乐高公司正式合作,刚开始称它们为“乐高 Logo”,为什么呢,因为建造这种玩具是通过乐高积木,而控制的语言是Logo。红过十年努力,他们终于实现了它的商业化,1998年,乐高公司通过“头脑风暴”将这种乐高积木片命名,也就是我们现在用的乐高头脑风暴机器人。而现在,“头脑风暴”又进一步升级。在演讲中,前台的小桌上放着三个小玩意:电子生日蛋糕、电子猫和电子风车(图5:米切尔的三个新做)。当接通电源后,生日蛋糕上的小灯亮了,象闪闪的蜡烛,“扑”吹上一大口气,灯就灭了;第二个是只小猫,当用手轻轻触摸它时,会发出“喵喵”的叫声;第三个风车则会根据叫声的大小,调整不同的转速。这就是他关于“头脑风暴”机器人的最新升级产品“蟋蟀”,同乐高“头脑风暴”机器人相比,不论交通还是灭火机器人,都象是男孩子们的专利,“蟋蟀”增加了布料和道具,它的有趣的外形,一定也会让女孩子喜欢的。“蟋蟀”是对“头脑风暴”机器人的继承和发扬,面“头脑风暴”机器人是对乐高原有产品的继承和发扬。乐高公司原有的积木等产品本身就是非常棒的工具,可以使孩子们充分发挥自己的创意,在用传统的乐高积木搭建房子和城堡的过程中,孩子们可以充分发挥自己的想象力,创造各种各样的造型,并且从中还可以了解怎样才能使建筑的结构稳固,还可以掌握物体的形状、大小、数量、颜色方面的知识。他们通过乐高积木学到了建筑知识,而把电子程序植入乐高积木后的“头脑风暴”机器人,孩子们不仅可以搭建出物体的结构,还可以塑造出物体的活动姿态。在和乐高合作的二十年,一直非常好,因为双方有许多相同的理念,比如什么对于孩子们的生活是最重要的,怎样鼓励孩子们的创造性,以及如何培养他们的创造性思维。这其中最需把握的是乐高产品的精神实质,及在此基础上进行扩展和丰富。在乐高积木中植入了电子程序,进一步提升了乐高的学习方法和乐高的价值观。这样孩子们就可以将计算工具应用到他们的创造中,去实现他们的创造。新加坡的教育部门发现了一个这样的事实,好多学习成绩不错的孩子,但在毕业工作之后却表现平庸,到商业工业环境中,缺乏创造力。米切尔和他们的合作也着有成效,通过乐高“头脑风暴”机器人的利用,取得了不错的效果。

找出自己的兴趣点,学习最有效率
怎样进行有效的学习呢?米切尔将他的名言重新书写了一遍,以与同学们共勉:最好的学习体验是在我们设计和建造我们关心的东西时发生的。他的这句话不是凭空塑造的,而是基于他多年的教育实践和科研。随着乐高“头脑风暴”机器人的普及,这样的示例有许多许多。在美国波士顿的一个女孩子,利用乐高机器人给自己的宠物老鼠建造了一个房子,更有意思的是这个房子上有一个自动门,因而,她就可以通过上面的记录知晓宠物老鼠的活动记录;受此启发,她还做了一个旱冰鞋的里程计和日记本的报警系统。正是这些同生活相关的示例,由于和她关心的东西联系上了,使得她非常乐于实践,在解决问题的过程中,也学会了不少相关知识,如在做旱冰鞋的里程计时,她要用到转速和英里的转换,以前在数学课上学习的速度与距离的关系,在这里得到了生动的体现。
图:利用乐高做宠物老鼠记录的女孩冰岛的一个女孩子发挥自己的聪明想象,发明了一种“闹钟”系统,早上太阳出来时,会放出音乐,一个机械小手会伸出来摸摸你的脸蛋叫你起床。为此,她还专门做了一个广告,此产品不适合冰岛居民,专供出口之用,我们知道,冰岛在高寒带,太阳要么出来的很早,要么非常晚。对学生来说,有趣是非常重要的,从他们关心的事物的实践上,会学到不少知识。他前面列举的三个“蟠蟀”小创意,也属于类似的东西。其实成年人又何尝不是如此呢?从他翻自家后院建高尔夫球场时,他就体会到,主动地去实践,去干自己喜欢的事情,对一个人成长是至关重要的,他的工作经历也是很好的印证。他喜欢向别人表达自己的想法,把自己觉得正确的想法,想让更多人知晓,所以,他当了五年美国《商业周刊》记者,目标是如此,现在在麻省当老师,目标也是如此,通过各种手段,包括文章,将自己的想法告诉更多的人。幼儿园中另外一项最好的东西在于,让孩子们做他们真正想做和他们乐意做的事情。
米切尔指出:做为一个教育工作者,在教育孩子们时,有一种重要的平衡就是给人们自由限度于其喜好的事物,和重要知识点之间的平衡,教育要做的正是将喜好同兴趣相连,将喜好同重要知识相连,这也是在工作中的一个最大挑战,所以,不仅不会带来负面影响,可能对这些科目会有极大的促进!对于我们的同学,最重要的也是要找到一个自己喜欢的兴趣点,去实现创意,去创造。

我的像片

不可不读的10个寓言

有很多人去听一位哲学家讲授人生成功的秘诀,结果那位哲学家给每位听众一本小册子,上面有10个寓言故事,人们看了以后,都觉得受益匪浅。
  ▲ 相信自己是一只雄鹰 ▲
  一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。 这只鹰渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。 主人试了各种办法,都毫无效果,最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来!
  秘诀1:磨练召唤成功的力量。
  ▲五枚金币 ▲
  有个叫阿巴格的人生活在内蒙古草原上。有一次,年少的阿巴格和他爸爸在草原上迷了路,阿巴格又累又怕,到最后快走不动了。爸爸就从兜里掏出5枚硬币,把一枚硬币埋在草地里,把其余4枚放在阿巴格的手上,说:“人生有5枚金币,童年、少年、青年、中年、老年各有一枚,你现在才用了一枚,就是埋在草地里的那一枚,你不能把5枚都扔在草原里,你要一点点地用,每一次都用出不同来,这样才不枉人生一世。今天我们一定要走出草原,你将来也一定要走出草原。世界很大,人活着,就要多走些地方,多看看,不要让你的金币没有用就扔掉。”在父亲的鼓励下,那天阿巴格走出了草原。长大后,阿巴格离开了家乡,成了一名优秀的船长。
  秘诀2:珍惜生命,就能走出挫折的沼泽地。
  ▲ 扫阳光 ▲
  有兄弟二人,年龄不过四、五岁,由于卧室的窗户整天都是密闭着,他们认为屋内太阴暗,看见外面灿烂的阳光,觉得十分羡慕。兄弟俩就商量说:“我们可以一起把外面的阳光扫一点进来。”于是,兄弟两人拿着扫帚和畚箕,到阳台上去扫阳光。 等到他们把畚箕搬到房间里的时候,里面的阳光就没有了。这样一而再再而三地扫了许多次,屋内还是一点阳光都没有。正在厨房忙碌的妈妈看见他们奇怪的举动,问道:“你们在做什么?”他们回答说:“房间太暗了,我们要扫点阳光进来。”妈妈笑道:“只要把窗户打开,阳光自然会进来,何必去扫呢?”
  秘诀3:把封闭的心门敞开,成功的阳光就能驱散失败的阴暗。
  ▲ 一只蜘蛛和三个人 ▲
  雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来…… 第一个人看到了,他叹了一口气,自言自语:“我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。 第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。 第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。 秘诀4:有成功心态者处处都能发觉成功的力量。
  ▲ 自己救自己 ▲
  某人在屋檐下躲雨,看见观音正撑伞走过。这人说:“观音菩萨,普度一下众生吧,带我一段如何?” 观音说:“我在雨里,你在檐下,而檐下无雨,你不需要我度。”这人立刻跳出檐下,站在雨中:“现在我也在雨中了,该度我了吧?”观音说:“你在雨中,我也在雨中,我不被淋,因为有伞;你被雨淋,因为无伞。所以不是我度自己,而是伞度我。你要想度,不必找我,请自找伞去!”说完便走了。 第二天,这人遇到了难事,便去寺庙里求观音。走进庙里,才发现观音的像前也有一个人在拜,那个人长得和观音一模一样,丝毫不差。 这人问:“你是观音吗?” 那人答道:“我正是观音。” 这人又问:“那你为何还拜自己?” 观音笑道:“我也遇到了难事,但我知道,求人不如求己。”
  秘诀5:成功者自救。
  ▲ 让失去变得可爱 ▲
  一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:“这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!”
  秘诀6:成功者善于放弃,善于从损失中看到价值。
  ▲ 请不要开错窗 ▲
  一个小女孩趴在窗台上,看窗外的人正埋葬她心爱的小狗,不禁泪流满面,悲恸不已。她的外祖父见状,连忙引她到另一个窗口,让她欣赏他的玫瑰花园。果然小女孩的心情顿时明朗。老人托起外孙女的下巴说:“孩子,你开错了窗户。”
  秘诀7:打开失败旁边的窗户,也许你就看到了希望。
  ▲ 人生的秘诀 ▲
  30年前,一个年轻人离开故乡,开始创造自己的前途。他动身的第一站,是去拜访本族的族长,请求指点。老族长正在练字,他听说本族有位后辈开始踏上人生的旅途,就写了3个字:不要怕。然后抬起头来,望着年轻人说:“孩子,人生的秘诀只有6个字,今天先告诉你3个,供你半生受用。” 30年后,这个从前的年轻人已是人到中年,有了一些成就,也添了很多伤心事。归程漫漫,到了家乡,他又去拜访那位族长。他到了族长家里,才知道老人家几年前已经去世,家人取出一个密封的信封对他说: “这是族长生前留给你的,他说有一天你会再来。”还乡的游子这才想起来,30年前他在这里听到人生的一半秘诀,拆开信封,里面赫然又是3个大字:不要悔。
  秘诀8:中年以前不要怕,中年以后不要悔。
  ▲ 司机考试 ▲
  某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:“悬崖边有块金子,你们开着车去拿,觉得能距离悬崖多近而又不至于掉落呢?” “二公尺。”第一位说。 “半公尺。”第二位很有把握地说。 “我会尽量远离悬崖,愈远愈好。”第三位说。 结果这家公司录取了第三位。
  秘诀9:不要和诱惑较劲,而应离得越远越好。
  ▲ 狮子和羚羊的家教 ▲
  每天,当太阳升起来的时候,非洲大草原上的动物们就开始奔跑了。 狮子妈妈在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,你要是跑不过最慢的羚羊,你就会活活地饿死。” 在另外一个场地上,羚羊妈妈也在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,如果你不能比跑得最快的狮子还要快,那你就肯定会被他们吃掉。”
  秘诀10:记住你跑得快,别人跑得更快。

GSnewsBar Sample
Loading...