Archive for 十月, 2009

柯里生平

Posted on 十月 31st, 2009 in 翻译 | 4 Comments »

翻译:ssword
作者:J J O’Connor and E F Robertson
原文:http://www.gap-system.org/~history/Biographies/Curry.html


Haskell Brooks Curry

哈斯克尔•柯里的父亲塞缪尔•塞拉斯•柯里是波士顿Expression学校的校长,他母亲安娜•布里特则是这所学校的一位院长。高中时代的哈斯克尔并没有表现出对数学的特殊爱好,到1916年高中毕业的时侯,他还认为自己会成为一名医生。不久后,他进入了哈弗大学读本科,在医学的课程之余选修了数学。

影响他研究方向的一个重大事件就是1917年春,美国宣布了参与第一次世界大战。欲为祖国效力的柯里认为数学要比学医更有用—-当然,他也是喜欢数学,而且成绩非常好—-他就转到了数学系,并于1918年10月18日加入了学生军事训练营。战争不久就结束了(当年11月),12月9日柯里复员回到学校,继续数学专业的学习。1920年,柯里得到了一个A.B学位,顺利毕业。

柯里在通用电气公司找了一份电气工程师的工作,这一来就可以在业余时间中在麻省理工大学进修电气工程了。不过他很快就发现了自己与别人的不同:别人对待学习,都只是“答案正确即可”,而他则关心“答案为什么正确”。意识到自己更适合搞理论研究而非应用科学后,柯里于1922年转专业到物理学。在理论研究上,哈弗要更好,于是柯里作为了P W Bridgeman 在1922-1923学期的助教,回到了哈弗。1924年,柯里得到了物理硕士学位。也正在这时,他意识到自己不属于物理—-数学才是他的归宿。他开始在哈弗攻读数学博士学位。

转业期的柯里也有其他劳心事。他父亲在1921年不幸去世,其所有不动产都由柯里继承。而其中最大的不动产自然就是波士顿Expression学校。1924年他母亲去世的三年后,这所学校成为了一个股份公司。从创立伊始,柯里就一直担任公司的会计,不过1928年他就卖掉了它。

如果觉得柯里在1924年从此投身数学事业,那你就错了。他的研究方向本是George Birkhoff的微分方程理论,不过与此同时他开始接触了一些逻辑学的书籍,而且发现自己对逻辑更感兴趣。于是他咨询了哈弗的几位教授以及MIT的Norbert Wiener,自己是不是可以转专业到逻辑学,结果遭到了他们的一致反对。在担任1926-27的第一学期兼职讲师的时候,他阅读了罗素和怀特海的《数学原理》。这为他后来的研究奠定了基础,也就是使用组合子来分析复杂的代换规则的设想。他又去咨询哈弗的教授们和Norbert Wiener,问自己可不可以写篇逻辑方面的博士论文。这时他得到的回应却与上次大不相同,其中最典型的当属Wiener—-他说:如果你有话可说,就别碰逻辑;不过你显然有话可说!

于是,柯里转了最后一次专业。他放弃了微分方程的研究,而准备撰写一篇逻辑方面的博士论文。在Birkhoff的强烈推荐下,他决定在开始新专业的研究之前先去普林斯顿做一年讲师。随后他一边与Velben商讨着他的研究计划,一边翻着普林斯顿大学图书馆里的Mathematische Annalen,其中他们发现1924年M Schönfinkel的一篇论文über die Bausteine der mathematischen Logiküber die Bausteine der mathematischen Logik里有提到一种类似组合子的想法。Velben向柯里保证这是项有意义的研究,不过Alexander告诉他Schönfinkel现在在精神病院里而无法继续这项研究。柯里需要一名最好的博士导师,Velben就向他推荐德国哥廷根的Bernays。为了便于申请经费,柯里便事先公开了他关于组合子的想法,也就是1929年他的第一篇论文《逻辑代换的分析》(An analysis of logical substitution)在《美国数学报》(American Journal of Mathematics)的发布。

动身去哥廷根之前,1928年7月3日,柯里完成了与玛丽•弗吉尼亚•威利的婚事。他们在波士顿Expression学校初识,当时的玛丽还是个学生。随后,两人一起踏上了去德国的旅程。大约一年之后(7月24日),他提交了论文Grundlagen der kombinatorischen Logik。名义上虽是希尔伯特审阅,而天天给予对他帮助的人其实是Bernays。他的论文最终发表于1930年的《美国数学报》。

回到美国之后的1929年9月,柯里被宾夕法尼亚州立学院(即现在的宾夕法尼亚州立大学)聘请。次年7月27日,哈斯克尔和弗吉尼亚的女儿安妮•莱特•柯里出生了,1934年7月6日,他们的儿子罗伯特•威利•柯里出生。在大萧条刚开始时候,柯里能搞到这份工作是很幸运的。随后在大萧条期间,对数理逻辑学家而言就少有工作机会了。柯里在宾夕法尼亚大学担任教员直至1966年退休,他也在其他学校中呆了不少时间。尤其是芝加哥大学,他在1931-1932年间担任其国家研究委员;他也在1938-39年间担任普林斯顿的高级学会会员。其间他发表了一些论文,包括《组合子逻辑的全称量词》(The universal quantifier in combinatory logic,1931),《组合子理论的补遗》(ome additions to the theory of combinators,1932),《显式变量的组合逻辑观点》(Apparent variables from the standpoint of combinatory logic,1933),《组合逻辑中相等性及推导的几个性质》(Some properties of equality and implication in combinatory logic ,1934)。

1936年符号逻辑学会成立。作为创办者之一,柯里在1936-1937的两年里担任学会的发言人,后于1939-1940年间担任会长。1942年,他的离职演说《数理逻辑的组合子基础》发表于《符号逻辑期刊》(Journal of Symbolic Logic)。在里面,柯里先阐明了组合子逻辑的提纲,展示了与Church的lambda演算之间的密切联系,随后开始阐述他的近期工作。他检验了几种从不相容系统中导出悖论(如理查德和罗素悖论)的简便方法。他还为组合子逻辑引入了未定义的概念,如量词、形式推导。这一来,类似Church和Rosser的完备系统就可以推导出来。

40年代的柯里已经成为了世界顶尖的数理逻辑学家之一。此时,他被邀请做一个数学演说来解释下形式主义的基础概念,并提几个新的建议。这次演说的内容被记录在论文《数学严谨性问题的几个方面》(Some aspects of the problem of mathematical rigor)中,后发表于1941年的《美国数学论坛》。其中囊括了对非形式化理论的评论、形式系统的概念、演算的概念、对元理论的讨论、数学的定义、形式系统的可接受性,并讨论了直觉主义与形式主义之争。同在40年代,柯里与波士顿Expression学校重新建立了关系,此时该学校已更名为柯里学院。1940年,他加入了该校校董,并担任了十年。

第二次世界大战期间,柯里开始研究应用数学。1943年,他发表了《Heaviside演算》(the Heaviside operational calculas)。在其中,他阐述了一个简单的代数方法,对着它的不足也有所留意:

…优点,自然就是导出了方程解的约束条件,不过它只对有理数运算,如常项系数的线性微分方程适用。对于更一般的情况而言,如偏微分方程、小数运算等,数值变换理论必然是不可或缺的。

1942年5月到1944年1月,他在Frankford Arsenal工作。离开Frankford Arsenal之后,他在John Hopkins大学的应用物理实验室工作至1945年5月。随后,他去了一个军用武器测试点,即阿伯丁实验场。在那里他接触到了使用ENIAC电脑做的一些研究。1946年,《使用ENIAC的逆向插值法研究》和《使用ENIAC的四阶插值法研究》发布。1946年他回到宾夕法尼亚州立大学后,曾试图说服校领导购置一台电脑,不过失败了。

他的主要著作有《组合逻辑》(同Robert Feys合著)和《数理逻辑基础》(1963)。《组合逻辑》的编写工作始于1950年,当时柯里刚刚获得福尔布莱特奖,从而可以在Louvain与Robert Feys合作。柯里回到美国之后,他们依然保持着此书的合作,最后于1956年完成。E J Cogan论及此书,给了组合逻辑以极高的评价:

组合逻辑解释了数学中一般被认为是直觉而不予考虑的概念。像代换,一般就认为是变量的使用;像系统的类型抽象,通常是通过辅助手段引入,而不被当作系统的一部分。但在组合逻辑中,这些基础性的问题都可以由组合子理论解决。

在《数理逻辑基础》一书中,柯里使用Gentzen方法阐述了一个代数基础的论题。J Tucker说:

这方法最引人注目的地方就是,有循序渐进的规约:先是连词和或,再在后面章节中引入否定和量词。不像传统方法那样在开头将基本连词的含义一一列出,而是使用逻辑的推理将其一一导出。

1966年,他接受了阿姆斯特丹的逻辑学、逻辑史、科学哲学教授的职位。工作四年之后,他回到了宾夕法尼亚州立大学开始自己的离休生活。

[3]的作者高度评价了柯里和他的妻子:

柯里夫妇为人友善,美名远扬。哈斯克尔对同事和学生所做的一切,远多于自己。人若想找他说话,他会随时欢迎,在一同探讨问题的同时给予对方一切能及的鼓励…他办公室的门总是开着。这无疑也对我们研究组合子提供了莫大的鼓舞。不管住在何地,柯里的好客都是很有名的。他经常在家举行派对,而不拘泥形式。我想,弗吉尼亚的厨艺也烘培了我们对组合逻辑的兴趣!

银弹是什么东西?

Posted on 十月 27th, 2009 in 杂碎 | 11 Comments »

有个软件工程的大师(软件工程的大师太多了,记不过来)说《no silver bullet》,貌似是说没有万能的解决方案,OO啊FP啊都解决不了所有问题。没读过那大师的文章,可是银弹又是什么东西?

上星期舍友放一部电影,里面是狼人和吸血鬼扛着枪相互扫…(其实觉得这个创意挺囧的,狼人和吸血鬼应该咬才对啊,囧)。不过西方貌似有传说吸血鬼就是不死的恶灵,那么狼人怎能对付吸血鬼?

舍友说,狼人的子弹都是银色的,吸血鬼怕光。那么“银弹”就是可以杀死一切生物的子弹咯。

这就是银弹这典故的来源么?

note on ruby

Posted on 十月 13th, 2009 in 备忘 | 18 Comments »

Ruby和python这两门语言貌似不应该有可比性。C\C++出身的程序员们都喜欢Python带来的生产力,而ruby被发明则是为了取代perl—-做为脚本语言。脚本语言么,效率不必太高,要容易书写,容易读貌似倒不是很重要…瞧瞧bash和perl吧。而Ruby强大的表达能力就弥补了可读性的不足,再加上已经足够多的第三方库(gems),可以算是一门理想的语言了。可惜就这门语言而言(不谈rails),在国内(国外github上ruby可是第一语言啊)一直没能很成气候呢(CpyUG这个社区太强大了,ruby在国内就没有对应物)。貌似大家都在搞rails的敏捷开发,没人搞ruby?

呃,跑题了。这两天用ruby写点小玩具,记几个小tricks就是了。玩具而已。玩具而已。

判断类型,可以这样obj.is_a? Array 。如果不喜欢问号,可以Array === obj,貌似要好看点?注意的地方就是类型对象要放在前面。

单元测试是好东西,一般源码会位于src文件夹,而测试文件会放在test文件夹。测试文件需要require源码的文件,这就要修改require的路径,要不然会乱套。也就是这样:

$:.unshift "../src"

update:$:其实是个全局数组。require的路径皆来自于此。

正则表达式,模式匹配。好吧,玩haskell后遗症。

test=
    case content
    when /^abc(.*)/
         $1
    when /^abcd(.*)/
         $1
     end

ruby里所有的语句都是表达式。正则表达式匹配的时候会修改几个全局变量,
$& 整个匹配
$1 第一个匹配
$2 第二个匹配
$` 位于匹配前的字符串
$’ 位于匹配后的字符串

很明显,都是继承自perl。Perl那堆带美元符号的变量可是饱受扣病啊,在《the ruby way》这书里作者貌似刻意地回避这种全局变量的使用。不过自己看着办就好了。

谈到模式匹配,haskell可以用(x:xs)这样的模式切开一个list得到首元素。Ruby可以这样:

x, *xs=[1,2,3,4]

在变量名前面加*的含义貌似就是将它里面的元素看作一个整体:

def add(a,b)
a+b
end
paras=[1,2]
add(*paras)

在处理可变长度参数时候也是如此:

def add(*paras)
paras.inject{|acc,i| acc+=i}
end

呃,inject就是python的reduce,haskell的fold。

block在ruby中应该是无所不在了,也算是函数式吧,不过搞的比较自然,谁也不会想到那儿去。(话说,貌似有不少同学都是在python的那个lambda关键字才了解到函数式编程的…ruby倒也有个lambda,不过只是个Proc类的实例,貌似没谁用 – -!)。在带block的函数递归的时候一定要记得传递这个block。

def travel(arr, &block)
  x,*xs=arr
  block.call(x)
  travel(xs, &block)
end

幸为程序员

Posted on 十月 1st, 2009 in 翻译 | 8 Comments »

作者:Gustavo Duarte
翻译:ssword
原文:http://duartes.org/gustavo/blog/post/lucky-to-be-a-programmer


前几个星期我们一直都在忙于一个项目。经过大家的一番呕心沥血,这个项目终于得以顺利结束,我们的作息也恢复正常。现在同事们每谈起那段疯狂的时光,总是唉声叹气。我觉得这不大应该,我就很少发牢骚。其实我觉得,只要环境对头,编程这项工作总是有一种难以言传的乐趣。

对这一观点,许多同行都表示赞同,不过其他一些人则不以为然。都怪万恶的制度,它能够把一切事情的乐趣都消灭无形—-学校可以把生动的知识搞成一堆冷冰冰的公式,企业也可以把挑战性的工作仅当成员工挣钱糊口的手段。

这样很不好。又有什么工作,能好过在一个创作环境里为自己杰作的出世而绞尽脑汁、废寝忘食呢?我这可不是在怂恿人们做工作狂—-一个稳定的作息是相当必要的—除却偶尔的狂欢。我要表达的是:编程是解题、写作和工艺的完美结合,在创造中你可以体会到超乎寻常的乐趣。

编程中存在许多诱人的挑战,并为创造提供了充足的空间。一些问题是研究性的:这段代码为什么如此慢?造成这个bug的原因究竟是什么?一些问题是建设性的,比如设计算法和架构。你若喜欢搞研究,这些怪物们都将变得可爱起来:malware、路由、缓存、协议、数据库、图和数。

这些研究就像个策略游戏,是程序员与编程距离最近、也是最有趣的地方。不过对于大部分软件开发而言,“交流”才是重中之重:通过代码与程序员的交流,通过界面与用户的交流。所以比起“解题”来,编程更像是“写作”。它要求你将灵感与设计清晰地表达出来,做到简洁明快。在代码与界面的设计中,创造的乐趣无所不在。

编程的另一个乐趣在于,编程中存在美。这话可能听起来像是狗屎,不过确实是实话。编程可以帮你找到更多的生活乐趣。如欧几里德关于素数无限多的两行证明,我相信很多人可以体会到其中的美感—-如此简洁、如此惊人!这便是数学的美:严谨、朴素。软件也是如此,这种美弥漫于精妙的算法(像quicksort)、内核和编译器的源码、巧妙的溢出攻击以及日常技巧之中。看到这些方法,不管是大名鼎鼎的算法还是稀松平常的技巧,你都可以会心一笑:“太妙了!”—-这感觉很棒。

编程中的美感并不仅限于数学。它还存在于良好的设计—-用少量的代码、整洁的方法来完成功能的实现。一些语言实现起来会比较困难,因而不是所有程序员都能做到游刃有余,但也正因为如此,搞这种代码就有了挑战性;若是用一种表达能力强的语言与同事合作,生活就更加明朗了。

再谈谈工艺。软件是抽象的—-除了人的思维,还有什么可以搞编程?说是“构造软件”,也是有道理的。程序都是一个特性一个特性地慢慢成型,从模型开始,渐渐增长成架构。同时也得考虑上用户界面,bug的修复以及瓶颈上的优化。它可以给人一种工艺上的满足感:由纯粹的想法出发,一步步“构造”出来,使之可以运行,从而能够给别人提供帮助—-没准还能彻底改变人类的生活。

就拿医学说吧。虽然经过了400年的科技革命,但今天的医学对病毒性感染或癌症等绝症依然是无能为力。领域内的很多成果都是出自偶然,像抗生素。你在搞肺炎药的临床试验—-唔—-病人们都勃起了!伟哥诞生。虽说机遇总是垂青有准备的头脑,但是物理和化学都依靠强大的理论基础取得了长足的进步,而医学却依然被限制到有限的运气上。要治疗癌症?给病人做放疗、化疗,然后祈祷它们先杀死癌细胞吧。这是个很出色的发明,我会乐于接受它们。不过在精度上,它们还是差得很远。

软件正在改变这一切。大约50年前,人类发现了DNA的结构。现在,每个人都可以浏览或下载上百个基因组,或是检索上千个基因(如DLEC1)的核苷酸序列以及对应的氨基酸序列,可以按照名字找到详细的介绍。或许你也可以通过一台廉价的设备检测自己的基因序列,再到基因数据库中检索,得到一份详细的匹配报告。使用标准的串搜索工具—-BLAST算法,将基因片段从数据库中按照匹配程度评分,因而完全不用怀疑其精确性。这将为药物研发提供巨大的突破。医学正借软件之力,进入了新的纪元。

当然,医学只是一小部分:P,科学、文化以及商业都从程序的进步中获益良多。如今第三世界的孩子都可以到wikipedia浏览资料,这也是我们的成就!是我们定义了RFC和协议栈,开发了浏览器和MediaWiki、操作系统和HTTP服务器。篇幅有限,我就不提wikipedia上的无数条目了。从字节到比特,技术的影响力已经无所不在:是程序员发明了wiki和blog。Henry Mencken说:“媒体的自由受其主人约束。”(freedom of the press is limited to those who own one)。很可惜,他没能见到我们的发明对传统新闻业产生的巨大影响。我们开发的应用使得生产力大为提高并且影响到经济,这在历史上也是少有的。

三年前我本科毕业(之前已编程多年)本打算学医,当时是有两次不爽的经历使得我差点对编程失去热情。很庆幸,我坚持了下来。到今天我依然对医学研究持有兴趣,但若再给我一次机会,我依然会选择编程。其中有太多乐趣。我妈妈则一直以为我的工作就是打字,也罢。

如果你发现自己被困在一个地方,使得自己对编程的热情不停地为之消磨,那就去他妈的,闪人!不要在平庸的地方浪费自己的热情。有热情的人千金难买,而这就是你的资本;靠谱的雇主多的是—-尤其是创业者。对于拿不准自己是不是喜欢编程的人们,你们的能力或许有高有低,但我强烈希望你们能选择编程。不提工作上的光明前景,更应认识到,软件的应用已经越来越广,身为程序员,可以亲身参与技术带来的变革。毫无疑问,我会乐于参与其中,用我拥有的艺术和工艺。


译者注:请参考国情。