从Jao的Programming Musing 看到的:Babar Kazar 整理了一堆经典论文。Jao强烈建议每个严肃的程序员读每篇论文,说它们都或多或少有意思。粗粗扫了一下,很多论文都没读过。挑了些俺多少知道一点的介绍。
·
An axiomatic basis for computer programming C. A. R. Hoare
Tony Hoare
名下的公理化语义(
Axiomatic Semantics
)。著名的
Hoare Triples, P{C}Q,
就是从这里来的。论文不长,双列
6
页。前辈们就是这样的,
6
页纸就能开宗立派。不像俺,
6
页纸连介绍部分都写不周全。哪位老大想知道怎么证明程序正确。前置条件,不变条件,后置条件的妙用,可以用这篇论文开牙。
·
Communicating Sequential Processes (CSP) C. A. R. Hoare
Hoare,
又见
Hoare
。其实也正常。牛人之牛,就在于成就深广。链接的文档应该不算论文,而算专著。
260
页。从
1985
年推出到现在
20
多年过去,这本书的引用率在
CS
历史上排名第三,可见其影响之深。对并发编程有强烈兴趣的老大可以去钻研一把。我没读过。
·
Call-by-name, call-by-value, and the lambda calculus Gordon Plotkin
没读过。只见
LtU
介绍过。
Gordon
老大这篇论文的要点之一是要想顺利地对程序进行推导,就需要有合适的
lambda
理论。想深入理解
call-by-name
,
call-by-value
,和
lambda
算子的老大们可以上了。
·
Towards a theory of type structure John C. Reynolds
号称经典中的经典。不过也没读过。类型系统一直是编程语言研发的热点,也是非常有趣的方向
――
类型系统的编程好比让机器证明一系列定理。
Reynolds
在论文里讨论了什么才是正确的类型结构,和句法正确必须独立于任何具体的类型表达形式,并且给出了带类型的
lambda
算子的一种扩展,允许他描述用户自定义类型和多态函数。满篇公式,有勇气去读的老大要有心理准备。
·
Structured Programming with go to Statements Donald E. Knuth
这篇论文详细结构化编程时讨论了什么时候用
goto
,什么时候不用
goto
。高爷爷精细务实的态度非常值得学习。高老太爷用了一辈子
goto(MIX
和
MMIX
程序里没了
Goto
怎么玩儿得转嗫?
)
,岂能轻易被
Dijkstra
对
goto
的批评吓退?他仔细探讨了几种不同的程序,考察
goto
用在那些程序里的利弊。最后得出结论,
goto
在某些程序里仍然高效实用。虽然论文是
30
年前的,但里面的分析手法和利用
goto
的优化技术至今可用。
·
Definitional interpreters for higher-order programming languages John C. Reynolds
这篇文章俺喜欢。
”Metacircular”
这个性感的概念就是在这篇论文里首次提出的。想深入了解用一门语言写出的解释器定义这门语言自身的神奇理念,这篇论文是必读材料。有兴趣的老大可以先读
SICP
的第四章。
·
An APL Machine 1970 Philip S. Abrams
只知道
APL
是门有历史意义的语言。顺便说一句,
APL
这个名字太土了。
A Programming Language
==
APL
。象什么话嘛。
·
The Anatomy of a Large-Scale Hypertextual Web Search Engine Sergey Brin and
Lawrence
Page
网络是个大的矩阵
(transition probability matrix of Markov Chain)
。网页的声誉
(page rank)
就是这个巨大矩阵的
principle eigenvector
的某个元素。嗯,反正我只有佩服的份儿。
·
No Silver Bullet: Essence and Accidents of Software Engineering Frederic P. Brooks, Jr.
地球银都知道。不用俺多嘴了。
·
A Mathematical Theory of Communication Claude Shannon
Bell
实验室当年辉煌一时。出了名的叫人做
A
,结果发明了
B
。香农老大就是其中杰出代表。香农进了
Bell
实验室后,居然没人吩咐他干嘛。香农老大转念一想,自己喜欢数学,
Bell
的生意尽在通讯,干嘛不看看把数学应用到通讯上有什么结果呢?于是
1948
年这篇论文问世乐。搞通讯的人崩溃乐。现代信息理论就诞生乐。
·
Bayesian Networks without Tears
贝叶斯理论热了好几年了。估计还会继续热下去。现在信息越来越多,我们已经审美疲劳。大家渴望的不是信息,而是知识。靠个人的力量把信息提炼成知识太慢,我们需要机器的帮忙。机器学习不热都难,而贝叶斯理论在机器学习里有很好的应用。这篇文章行为浅显,可以轻松读完。对了,那个人人喝骂的微软回形针的智能引擎就是用贝叶斯网络实现的。
·
A Universal Algorithm for Sequential Data Compression
没读过。无耻地找个借口:我们系开信息理论课的时候,俺刚好毕业。
·
A Relational Model of Data for Large Shared Data Banks 1970 Edgar F. Codd
没有关系代数,人类将会怎样?
Codd
划时代的论文奠定了现代数据库的基础。嘿嘿,其实俺也没有读过这篇论文。顺便说一句,现在的
ORM
试图把
data schema
和对象系统映射起来。问题是,
data schema
只是对关系的一种表达方式而已,还和具体的系统实现有关。也许把对象间的结构和关系映射起来才是正道。
·
Let's Build a Compiler 1988-1995
教你一步一步写出一坨编译器。不算论文吧。一篇相当不错的指南。
·
Gauging Similarity via N-Grams: Language-Independent Sorting... Marc Damashek
第一次听说
·
Worse Is Better Richard P. Gabriel
网上脍炙人口的文章。很有教育意义。简单说,
worse is better
包括下面几点:
--
简单:设计要简单。但如果接口和实现不能两全,追求实现的简单。文章里给出的
Unix vs Multics
的例子非常有意思。
--
正确:程序必须在所有可见的方面正确。其它地方,如果简单和正确不能两全,追求简单。
--
一致性:程序不能太不一致。但为了简单,可以在少数地方不一致。
--
完备性:程序应该尽可能照顾到重要的地方,但是不能牺牲简洁。
强烈推荐。
·
Hints on Programming Language Design C.A.R. Hoare
Hoare
对设计语言的经验总结。这些经验至今有效。文章很容易读,读后绝对增长程序设计的功力。
·
Why Functional Programming Matters John Hughes
为普通程序员准备的大餐,所以写得通俗。没有公式,也没有拗口的术语。着重展示了
Fold
和
Map
的强大抽象能力。不由想到我在大学里修的一门课,编程语言。课是好课,老师是一流老师。课上我们学习了浅显的程序语言理论,重点学习了函数编程(用
Common Lisp
)和逻辑编程(用
Prolog
)。这门课彻底改变我对编程的理解,明白了
imperative programming
和
OO programming
外还有精彩世界。至今想来都觉得幸运。那门课的作业也很有意思,实现一个驻留内存的数据库,支持关系代数里的常见操作。
·
On the Expressive Power of Programming Languages Matthias Felleisen
没读过。待读。
·
The Early History Of Smalltalk Alan Kay
还有什么好说的呢?
Alan Kay
这个名字说明一切。
30
年前
Alan Kay
就做出来
Smalltalk
,现在想来仍然让人惊叹。引一段文章
Alan Kay
评述
Smalltalk
的话:
In computer terms, Smalltalk is a recursion on the notion of computer itself. Instead of dividing "computer stuff" into things each less strong than the whole--like data structures, procedures, and functions which are the usual paraphernalia of programming languages--each Smalltalk object is a recursion on the entire possibilities of the computer. Thus its semantics are a bit like having thousands and thousands of computer all hooked together by a very fast network. Questions of concrete representation can thus be postponed almost indefinitely because we are mainly concerned that the computers behave appropriately, and are interested in particular strategies only if the results are off or come back too slowly.
·
Computer Programming as an Art Donald E. Knuth
高老太爷在
1974
年图灵奖仪式上的致词。真是顶尖
geek
的风范啊。高太爷在文章里解释了问什么他的书取名为《编程的艺术》。明显他对人们谈到编程时把科学置于艺术之上很不了然。高爷爷追溯“艺术”的词源,说艺术的本意就是技能,也是技术和技巧两次的起源。从这里开始,他开始讨论艺术和科学的关联,讨论艺术在编程里的表现形式和意义。用他的话说,他作为教育者和作者的毕生目标就是叫人写美妙的程序。读起来让人心潮彭湃的说。
·
The next 700 programming languages Peter J. Landin
42
年前的论文,影响深远。
Peter
在论文里描述的函数语言
ISWIM
(
If You See What I Mean
)现在没有几个人知道了。但他对
lambda
算子的推崇和对函数语言的论述影响了后来的函数语言设计。
·
Recursive Functions of Symbolic Expressions and their Computation by Machine (Part I) 1960 John McCarthy
47
年前提出
LISP
的那篇著名论文。没读过。动态类型检查,
Garbage Collection,
递归函数,
S-expression,
程序及数据。。。可谓贡献辉煌。
·
FORTH - A Language for Interactive Computing Charles H.Moore
只知道
Forth
是一门
stack oriented
的编程语言,影响了后来的一些语言,比如
CAT
。其它的就不知道了。
·
Teach Yourself Programming in Ten Years 2001 Peter Norvig
大牛之所以为大牛,原因之一就是目光深远。这篇文章批评那些《
24
秒学会
C
++》之类教材的无稽,讨论了学习编程,从菜鸟变成鲲鹏的方法。中文版已经传得满世界都是,赶快找来看吧。
Peter Norvig
的网站上还有很多高质量的文章。强烈推荐一读。
·
The Definition and Implementation of a Computer Language based on constraints Guy Lewis Steele Jr.
好像是
Guy Steels
的硕士论文。没读过。
·
Growing a Language Guy Lewis Steele Jr.
好文!
G
老大在
OOPSLA 98
上的主题演讲。
G
老大主张应该采取渐进的方式设计一门可以被自由扩展的语言(
LISP
圈子里的牛人们多半都持这种观点吧?)。这篇演讲稿针对该观点做了精练地论述。说起进化的观点,可以参看另外一篇好文章,
SICP
作者之一,
Jay Sussman的近作
。
·
Epigrams on Programming Alan J. Perlis
A
老大发表的一系列关于编程的格言。幽默而深刻。每读必笑。笑后必哭。嗯嗯嗯,夸张一下。不要当真。
·
The Complexity of Theorem Proving Procedures Stephen A. Cook
仙风道骨的库克爷爷的成名作。这篇文章一出,好比有人在加州荒漠里发现第一块狗头金,立刻掀起开发加州的狂潮。计算复杂性理论迅速遍地开花。相比这篇论文开创性的贡献,库克因此得到图灵奖不过小小点缀。
NP-Complete
在这篇论文里被严格定义。更重要的是,库克证明了第一个
NP-Complete
的问题,
SAT(Boolean Satisfiability Problem)
。有了
SAT
,再加上折磨了无数学生的
Polynomial Reducibility
,
无数的
NPC
问题就出现乐。。。别看俺在这里唾沫横飞,当年做有关计算理论的证明题还是相当吃力的,没有少熬夜。奇怪的是,某一天我给同学讲解我的解法,
NPC
的相关定义突然变得清晰起来。当初让我绞尽脑汁的证明竟然变得相当机械。后来知道,给人讲解(包括写作)是非常有效地学习方法。怀着备课的目标读文章,假设自己给别人讲解正在读的文章,有助快速理解所读内容。SAT的证明相当复杂,我反正没有耐心读完。
·
Steps Toward Artificial Intelligence Marvin Minsky
AI
的奠基论文。不过我没读过。
·
The Original 'Lambda Papers' Guy Steele and Gerald Sussman
一系列讲解
lambda
算子和
scheme
设计的经典论文。学
scheme
时读过,对理解
scheme
的设计理念很有帮助。
·
The UNIX Time-Sharing System Dennis Ritchie and Ken Thompson
作者不用介绍了吧?这篇文章里介绍的
Unix
特性早为人熟知。不过第八部分
(VIII Perspective)
讨论了作者的设计理念,仍然值得一读。