面向软件工程师的论文 
一份经过精选的论文列表,可能对软件工程专业的学生或从业者感兴趣。 请参阅下方的来源和选择标准。
按主题划分的论文列表
-
冯·诺依曼的第一个计算机程序。Knuth (1970).
计算机历史;早期编程- 计算机的教育。Hopper (1952).
- 递归编程。Dijkstra (1960).
- 编程作为一种人类活动。Dijkstra (1965).
- Goto 语句被认为是有害的。Dijkstra (1968).
- 通过逐步求精进行程序开发。Wirth (1971).
- 谦逊的程序员。Dijkstra (1972).
- 计算机编程作为一门艺术。Knuth (1974).
- 编程范式。Floyd (1979).
- 文学化编程。Knuth (1984).
-
Computing Machinery and Intelligence. Turing (1950).
早期人工智能- Some Moral and Technical Consequences of Automation. Wiener (1960).
- Steps towards Artificial Intelligence. Minsky (1960).
- ELIZA—a computer program for the study of natural language communication between man and machine. Weizenbaum (1966).
- A Theory of the Learnable. Valiant (1984).
-
一种构造最小冗余码的方法。Huffman (1952).
信息论- 印刷英语的预测与熵。Shannon (1950).
- 一种用于序列数据压缩的通用算法。Ziv, Lempel (1977).
- 香农理论的五十周年。Verdú (1998).
-
工程化排序函数。 Bentley, McIlroy (1993).
数据结构;算法- On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem. Kruskal (1956).
- A Note on Two Problems in Connexion with Graphs. Dijkstra (1959).
- Quicksort. Hoare (1962).
- Space/Time Trade-offs in Hash Coding with Allowable Errors. Bloom (1970).
- The Ubiquitous B-Tree. Comer (1979).
- Programming pearls: Algorithm design techniques. Bentley (1984).
- Programming pearls: The back of the envelope. Bentley (1984).
- Making data structures persistent. Driscoll et al (1986).
-
可靠软件系统的设计方法论。 Liskov (1972).
软件设计- On the Criteria To Be Used in Decomposing Systems into Modules. Parnas (1972).
- Information Distribution Aspects of Design Methodology. Parnas (1972).
- Programming with Abstract Data Types. Liskov, Zilles (1974).
- Designing Software for Ease of Extension and Contraction. Parnas (1979).
- Programming as Theory Building. Naur (1985).
- Towards a Theory of Conceptual Design for Software. Jackson (2015).
-
面向初学者的编程范式:每个程序员都应知道的知识。 Van Roy (2012).
编程范式- 符号表达式及其机器计算的递归函数。 McCarthy (1960).
- 谓词逻辑作为编程语言的语义。 Van Emden, Kowalski (1976).
- Smalltalk-76 编程系统的设计与实现。 Ingalls (1978).
- 编程中的类型多态性理论。 Milner (1978).
- 编程能否从冯·诺依曼风格中解放出来? Backus (1978).
- 应用型语言的语义优雅性。 Turner (1981).
- 论理解类型、数据抽象和多态性。 Cardelli, Wegner (1985).
- 为什么函数式编程很重要。 Hughes (1990).
- SELF:简洁的力量。 Ungar, Smith (1991).
- 函数式编程的本质。 Wadler (1992).
- QuickCheck:Haskell 程序随机测试的轻量级工具。 Claessen, Hughes (2000).
- 丘奇论题与函数式编程。 Turner (2006).
-
编译器构建的增量方法。 Ghuloum (2006).
语言设计;编译器- 接下来的 700 种编程语言。 Landin (1966).
- 编程珠玑:小语言。 Bentley (1986).
- 使用延续进行编译的本质。 Flanagan et al (1993).
- 即时编译的简史。 Aycock (2003).
- LLVM:用于终身程序分析与转换的编译框架。 Lattner, Adve (2004).
- 垃圾回收的统一理论。 Bacon, Cheng, Rajan (2004).
- 用于编译器教育的 Nanopass 框架。 Sarkar, Waddell, Dybvig (2005).
- 使用 WebAssembly 提升 Web 速度。 Haas (2017).
-
没有银弹:软件工程的本质与偶然。 Brooks (1987).
软件工程;项目管理- 委员会如何发明? Conway (1968).
- 大型软件系统的开发管理。 Royce (1970).
- 人月神话。 Brooks (1975).
- 关于构建注定失败的系统。 Corbató (1991).
- 软件老化。 Parnas (1994).
- 重访软件演化定律。 Lehman (1997).
- 大教堂与集市。 Raymond (1998).
- 走出泥潭。 Moseley, Marks (2006).
-
通信顺序进程。Hoare (1978).
并发- 并发程序控制问题的一个解法。Dijkstra (1965).
- 监视器:一个操作系统结构化概念。Hoare (1974).
- 关于操作系统结构的双重性。Lauer, Needham (1978).
- 软件事务内存。Shavit, Touitou (1997).
-
UNIX 分时系统。Ritchie, Thompson (1974).
操作系统- 一个实验性分时系统。Corbató, Merwin Daggett, Daley (1962).
- "THE" 多道程序设计系统的结构。Dijkstra (1968).
- 多道程序设计系统的核心。Hansen (1970).
- 关于信任信任的思考。Thompson (1984).
- 日志结构文件系统的设计与实现。Rosenblum, Ousterhout (1991).
-
大型共享数据库的关系数据模型。Codd (1970).
数据库- 共享数据库中锁的粒度与一致性程度。Gray et al (1975).
- 关系数据库管理系统中的访问路径选择。Selinger et al (1979).
- 事务概念:优点与局限。Gray (1981).
- POSTGRES 的设计。Stonebraker, Rowe (1986).
- 数据工程中的经验法则。Gray, Shenay (1999).
-
用于分组网络互连的协议。Cerf, Kahn (1974).
网络- 以太网:用于本地计算机网络的分布式分组交换。Metcalfe, Boggs (1978).
- 系统设计中的端到端论证。Saltzer, Reed, Clark (1984).
- 一种在扩展局域网中分布式计算生成树的算法。Perlman (1985).
- DARPA 互联网协议的设计哲学。Clark (1988).
- TOR:第二代洋葱路由器。Dingledine et al (2004).
- 互联网为何仅仅勉强可用。Handley (2006).
- 网络是可靠的。Bailis, Kingsbury (2014).
-
密码学的新方向。Diffie, Hellman (1976).
密码学- 一种获取数字签名和公钥密码系统的方法。Rivest, Shamir, Adleman (1978).
- 如何分享秘密。Shamir (1979).
- 一种基于常规加密函数的数字签名。Merkle (1987).
- Salsa20 流密码族。Bernstein (2007).
-
分布式系统中的时间、时钟与事件排序。 Lamport (1978).
分布式系统- 尽管存在分布式控制,系统仍能自稳定。 Dijkstra (1974).
- 拜占庭将军问题。 Lamport, Shostak, Pease (1982).
- 存在一个故障进程时分布式共识的不可能性。 Fisher, Lynch, Patterson (1985).
- 使用状态机方法实现容错服务:教程。 Schneider (1990).
- 实用拜占庭容错。 Castro, Liskov (1999).
- Paxos 简化版。 Lamport (2001).
- Paxos 落地 - 工程视角。 Chandra, Griesemer, Redstone (2007).
- 寻找可理解的共识算法。 Ongaro, Ousterhout (2014).
-
为可用性而设计:关键原则与设计者的思考。 Gould, Lewis (1985).
人机交互;用户界面- 我们可能如何思考。 Bush (1945).
- 人机共生。 Licklider (1958).
- 关于可访问计算社会影响的一些思考。 David, Fano (1965).
- 面向首次计算机用户的教程。 Al-Awar, Chapanis, Ford (1981).
- Star 用户界面:概述。 Smith, Irby, Kimball (1982).
- 人机界面设计原则。 Norman (1983).
- 人机交互:作为设计科学的心理学。 Carroll (1997).
-
大规模超文本 Web 搜索引擎的解剖。 Brin, Page (1998).
信息检索;万维网- 检索中术语特异性的统计解释。 Spärck Jones (1972).
- 信息管理:一项提案。 Berners-Lee (1990).
- PageRank 引用排名:为 Web 带来秩序。 Page, Brin, Motwani (1998).
-
Dynamo,Amazon 的高可用键值存储。DeCandia et al (2007).
互联网规模数据系统- The Google File System. Ghemawat, Gobioff, Leung (2003).
- MapReduce: Simplified Data Processing on Large Clusters. Dean, Ghemawat (2004).
- Bigtable: A Distributed Storage System for Structured Data. Chang et al (2006).
- ZooKeeper: wait-free coordination for internet scale systems. Hunt et al (2010).
- The Hadoop Distributed File System. Shvachko et al (2010).
- Kafka: a Distributed Messaging System for Log Processing. Kreps, Narkhede, Rao (2011).
- CAP Twelve Years Later: How the "Rules" Have Changed. Brewer (2012).
- Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases. Verbitski et al (2017).
-
On Designing and Deploying Internet Scale Services. Hamilton (2007).
运维;可靠性;容错- Ironies of Automation. Bainbridge (1983).
- Why do computers stop and what can be done about it? Gray (1985).
- Recovery Oriented Computing (ROC): Motivation, Definition, Techniques, and Case Studies. Patterson et al (2002).
- Crash-Only Software. Candea, Fox (2003).
- Building on Quicksand. Helland, Campbell (2009).
-
Bitcoin, 一种点对点的电子现金系统。Nakamoto (2008).
去中心化分布式系统;点对点系统- 实时群组编辑器中的操作变换:问题、算法与成果。Sun, Ellis (1998).
- Kademlia:基于 XOR 度量的点对点信息系统。Maymounkov, Mazières (2002).
- 激励机制构建 BitTorrent 的健壮性。Cohen (2003).
- 无冲突复制数据类型。Shapiro et al (2011).
- IPFS - 内容寻址、版本化、P2P 文件系统。Benet (2014).
- Ethereum:下一代智能合约与去中心化应用平台。Buterin (2014).
- 本地优先软件:尽管有云,你仍拥有你的数据。Kleppmann et al (2019).
-
关于机器学习需要知道的几件有用的事。Domingos (2012).
机器学习- 统计建模:两种文化。Breiman (2001).
- 数据的非理性有效性。Halevy, Norvig, Pereira (2009).
- 使用深度卷积神经网络进行 ImageNet 分类。Krizhevsky, Sutskever, Hinton (2012).
- 使用深度强化学习玩 Atari。Mnih et al (2013).
- 生成对抗网络。Goodfellow et al (2014).
- 深度学习。LeCun, Bengio, Hinton (2015).
- 注意力就是你所需要的一切。Vaswani et al (2017).
仅限顶级论文
-
冯·诺依曼的第一个计算机程序。Knuth (1970)]
-
计算机器与智能。Turing (1950)]
-
一种构造最小冗余码的方法。Huffman (1952)]
-
工程化排序函数。Bentley, McIlroy (1993)]
-
可靠软件系统的设计方法论。Liskov (1972)]
-
面向初学者的编程范式:每个程序员都应知道的内容。Van Roy (2012)]
-
编译器构造的增量方法。Ghuloum (2006)]
-
没有银弹:软件工程的本质与偶然。Brooks (1987)]
-
通信顺序进程。Hoare (1978)]
-
UNIX 分时系统。Ritchie, Thompson (1974)]
-
大型共享数据库的关系数据模型。Codd (1970)]
-
分组网络互连协议。Cerf, Kahn (1974)]
-
密码学的新方向。Diffie, Hellman (1976)]
-
分布式系统中的时间、时钟与事件排序。Lamport (1978)]
-
为可用性设计:关键原则与设计者的思考。Gould, Lewis (1985)]
-
大规模超文本 Web 搜索引擎的解剖。Brin, Page (1998)]
-
Dynamo,Amazon 的高可用键值存储。DeCandia et al (2007)]
-
关于设计和部署互联网规模服务。Hamilton (2007)]
-
Bitcoin, A peer-to-peer electronic cash system. Nakamoto (2008).
-
A Few Useful Things to Know About Machine Learning. Domingos (2012).
按时间顺序排列的所有论文
-
我们如何思考。 Bush (1945).
-
计算机器与智能。 Turing (1950).
-
印刷英语的预测与熵。 Shannon (1950).
-
计算机的教育。 Hopper (1952).
-
一种构造最小冗余码的方法。 Huffman (1952).
-
关于图的最短生成子树与旅行商问题。 Kruskal (1956).
-
人机共生。 Licklider (1958).
-
关于图论中两个问题的注记。 Dijkstra (1959).
-
递归编程。 Dijkstra (1960).
-
自动化的某些道德与技术后果。 Wiener (1960).
-
迈向人工智能。 Minsky (1960).
-
符号表达式的递归函数及其机器计算。 McCarthy (1960).
-
快速排序。 Hoare (1962).
-
一个实验性分时系统。 Corbató, Merwin Daggett, Daley (1962).
-
将编程视为一种人类活动。 Dijkstra (1965).
-
并发程序控制问题的一个解。 Dijkstra (1965).
-
关于可访问计算的社会影响的一些思考。 David, Fano (1965).
-
ELIZA——一个用于研究人与机器之间自然语言通信的计算机程序。 Weizenbaum (1966).
-
接下来的700种编程语言。 Landin (1966).
-
Goto语句被视为有害。 Dijkstra (1968).
-
委员会如何发明? Conway (1968).
-
“THE”多道程序系统的结构。Dijkstra (1968).
-
冯·诺依曼的第一个计算机程序。Knuth (1970).
-
允许误差的哈希编码中的空间/时间权衡。Bloom (1970).
-
大型软件系统的开发管理。Royce (1970).
-
多道程序系统的核心。Hansen (1970).
-
大型共享数据库的关系数据模型。Codd (1970).
-
通过逐步求精进行程序设计。Wirth (1971).
-
谦逊的程序员。Dijkstra (1972).
-
可靠软件系统的设计方法论。Liskov (1972).
-
关于将系统分解为模块时应使用的准则。Parnas (1972).
-
设计方法论的信息分布方面。Parnas (1972).
-
检索中术语特定性的统计解释。Spärck Jones (1972).
-
计算机编程作为一门艺术。Knuth (1974).
-
使用抽象数据类型进行编程。Liskov, Zilles (1974).
-
监视器:一个操作系统结构化概念。Hoare (1974).
-
UNIX 分时系统。Ritchie, Thompson (1974).
-
分组网络互连协议。Cerf, Kahn (1974).
-
尽管存在分布式控制,系统仍能自稳定。Dijkstra (1974).
-
人月神话。Brooks (1975).
-
共享数据库中的锁粒度与一致性程度。Gray et al (1975).
-
谓词逻辑作为编程语言的语义。Van Emden, Kowalski (1976).
-
密码学的新方向。Diffie, Hellman (1976).
-
一种用于顺序数据压缩的通用算法。Ziv, Lempel (1977).
-
Smalltalk-76 编程系统的设计与实现。Ingalls (1978).
-
编程中的类型多态性理论。Milner (1978).
-
编程能否从冯·诺依曼风格中解放出来?Backus (1978).
-
通信顺序进程。Hoare (1978).
-
关于操作系统结构的对偶性。Lauer, Needham (1978).
-
以太网:用于本地计算机网络的分布式分组交换。Metcalfe, Boggs (1978).
-
一种获取数字签名和公钥密码系统的方法。Rivest, Shamir, Adleman (1978).
-
分布式系统中的时间、时钟和事件排序。Lamport (1978).
-
编程范式。Floyd (1979).
-
无处不在的 B 树。Comer (1979).
-
设计易于扩展和收缩的软件。Parnas (1979).
-
关系数据库管理系统中的访问路径选择。Selinger et al (1979).
-
如何分享秘密。Shamir (1979).
-
应用语言的语义优雅性。Turner (1981).
-
事务概念:优点与局限。Gray (1981).
-
面向首次计算机用户的教程。Al-Awar, Chapanis, Ford (1981).
-
拜占庭将军问题。Lamport, Shostak, Pease (1982).
-
星形用户界面:概述。Smith, Irby, Kimball (1982).
-
人机界面设计原则。Norman (1983).
-
自动化的讽刺。Bainbridge (1983).
-
文学化编程。Knuth (1984).
-
可学习性理论。Valiant (1984).
-
编程珠玑:算法设计技术。Bentley (1984).
-
编程珠玑:信封背面的计算。Bentley (1984).
-
关于信任信任的思考。Thompson (1984).
-
系统设计中的端到端论证。Saltzer, Reed, Clark (1984).
-
编程即理论构建。Naur (1985).
-
论理解类型、数据抽象和多态性。Cardelli, Wegner (1985).
-
一种在扩展局域网中计算生成树的分布式算法。Perlman (1985).
-
存在一个故障进程时分布式共识的不可能性。Fisher, Lynch, Patterson (1985).
-
为可用性而设计:关键原则及设计师的思考。Gould, Lewis (1985).
-
计算机为何停止以及能做什么?Gray (1985).
-
使数据结构持久化。Driscoll et al (1986).
-
编程珠玑:小语言。Bentley (1986).
-
POSTGRES 的设计。Stonebraker, Rowe (1986).
-
没有银弹:软件工程的本质与偶然。Brooks (1987).
-
基于传统加密函数的数字签名。 Merkle (1987).
-
DARPA 互联网协议的设计哲学。 Clark (1988).
-
为什么函数式编程很重要。 Hughes (1990).
-
使用状态机方法实现容错服务:教程。 Schneider (1990).
-
信息管理:一项提案。 Berners-Lee (1990).
-
SELF:简洁的力量。 Ungar, Smith (1991).
-
关于构建将会失败的系统。 Corbató (1991).
-
日志结构文件系统的设计与实现。 Rosenblum, Ousterhout (1991).
-
函数式编程的本质。 Wadler (1992).
-
工程化一个排序函数。 Bentley, McIlroy (1993).
-
使用续体进行编译的本质。 Flanagan et al (1993).
-
软件老化。 Parnas (1994).
-
重访软件演化定律。 Lehman (1997).
-
软件事务内存。 Shavit, Touitou (1997).
-
人机交互:作为设计科学的心理学。 Carroll (1997).
-
香农理论的五十周年。 Verdú (1998).
-
大教堂与集市。 Raymond (1998).
-
大规模超文本 Web 搜索引擎的解剖。 Brin, Page (1998).
-
PageRank 引用排名:为 Web 带来秩序。 Page, Brin, Motwani (1998).
-
实时群组编辑器中的操作变换:问题、算法与成果。Sun, Ellis (1998).
-
数据工程中的经验法则。Gray, Shenay (1999).
-
实用拜占庭容错。Castro, Liskov (1999).
-
QuickCheck:一种用于 Haskell 程序随机测试的轻量级工具。Claessen, Hughes (2000).
-
简化的 Paxos。Lamport (2001).
-
统计建模:两种文化。Breiman (2001).
-
恢复导向计算 (ROC):动机、定义、技术与案例研究。Patterson et al (2002).
-
Kademlia:基于 XOR 度量的点对点信息系统。Maymounkov, Mazières (2002).
-
即时编译简史。Aycock (2003).
-
Google 文件系统。Ghemawat, Gobioff, Leung (2003).
-
仅崩溃软件。Candea, Fox (2003).
-
激励机制构建 BitTorrent 的健壮性。Cohen (2003).
-
LLVM:一个用于终身程序分析与转换的编译框架。Lattner, Adve (2004).
-
垃圾回收的统一理论。Bacon, Cheng, Rajan (2004).
-
TOR:第二代洋葱路由器。Dingledine et al (2004).
-
MapReduce:大型集群上的简化数据处理。Dean, Ghemawat (2004).
-
用于编译器教育的 Nanopass 框架。Sarkar, Waddell, Dybvig (2005).
-
丘奇论题与函数式编程。Turner (2006).
-
An Incremental Approach to Compiler Construction. Ghuloum (2006).
-
Out of the Tar Pit. Moseley, Marks (2006).
-
Why the Internet only just works. Handley (2006).
-
Bigtable: A Distributed Storage System for Structured Data. Chang et al (2006).
-
The Salsa20 family of stream ciphers. Bernstein (2007).
-
Paxos made live - An Engineering Perspective. Chandra, Griesemer, Redstone (2007).
-
Dynamo, Amazon’s Highly Available Key-value store. DeCandia et al (2007).
-
On Designing and Deploying Internet Scale Services. Hamilton (2007).
-
Bitcoin, A peer-to-peer electronic cash system. Nakamoto (2008).
-
Building on Quicksand. Helland, Campbell (2009).
-
The Unreasonable Effectiveness of Data. Halevy, Norvig, Pereira (2009).
-
ZooKeeper: wait-free coordination for internet scale systems. Hunt et al (2010).
-
The Hadoop Distributed File System. Shvachko et al (2010).
-
Kafka: a Distributed Messaging System for Log Processing. Kreps, Narkhede, Rao (2011).
-
Conflict-free Replicated Data Types. Shapiro et al (2011).
-
Programming Paradigms for Dummies: What Every Programmer Should Know. Van Roy (2012).
-
CAP Twelve Years Later: How the "Rules" Have Changed. Brewer (2012).
-
A Few Useful Things to Know About Machine Learning. Domingos (2012).
-
使用深度卷积神经网络进行 ImageNet 分类。Krizhevsky, Sutskever, Hinton (2012).
-
使用深度强化学习玩 Atari。Mnih et al (2013).
-
网络是可靠的。Bailis, Kingsbury (2014).
-
寻找可理解的共识算法。Ongaro, Ousterhout (2014).
-
IPFS - 内容寻址、版本化、P2P 文件系统。Benet (2014).
-
Ethereum:下一代智能合约和去中心化应用平台。Buterin (2014).
-
生成对抗网络。Goodfellow et al (2014).
-
迈向软件概念设计理论。Jackson (2015).
-
使用 WebAssembly 提升 Web 速度。Haas (2017).
-
Amazon Aurora:高吞吐量云原生关系型数据库的设计考量。Verbitski et al (2017).
-
注意力就是你所需要的一切。Vaswani et al (2017).
-
本地优先软件:尽管有云,你仍拥有你的数据。Kleppmann et al (2019).
来源
本列表受到(并取材于)多本书籍和论文集的启发:
- Papers We Love
- Ideas That Created the Future
- The Innovators
- The morning paper
- Distributed systems for fun and profit
- Readings in Database Systems (the Red Book)
- Fermat's Library
- Classics in Human-Computer Interaction
- Awesome Compilers
- Distributed Consensus Reading List
- The Decade of Deep Learning
元阅读
以下是来自 Papers We Love 及其他来源的一些关于阅读论文的有趣资源:
- Should I read papers?
- How to Read an Academic Article
- How to Read a Paper. Keshav (2007).
- Efficient Reading of Papers in Science and Technology. Hanson (1999).
- On ICSE’s “Most Influential Papers”. Parnas (1995).
选择标准
- 列表应保持简短。例如,不超过 30 篇论文。
- 其目的并非收录我遇到的每一篇有趣论文,而是维护一份具有代表性的列表,使其能够以与通读一本技术书籍相当的精力从头到尾读完。
- 我尝试为每个主要主题和作者各收录一篇论文。由于在此过程中我发现了许多值得注意的替代方案、相关或后续论文,并希望同时记录这些内容,因此我将它们作为子列表项包含在内。
- 论文不应过长。基于与上一条相同的原因,我尽量避免收录超过 20 或 30 页的论文。
- 它们应当是自包含的,并且足够易读,以便普通技术读者能够轻松入门。
- 它们应当可以免费在线获取。
- 尽管考虑了历史相关性,但在以下情况下我省略了开创性论文:当我发现它们难以入门时,当论文的主要主题并非使其具有影响力的原因时,等等。
- 这方面的例子包括冯·诺依曼、图灵和香农的经典著作。
- 话虽如此,在可能的情况下,我倾向于选择每个主题的原始论文,而非现代更新或综述论文。
- 我倾向于偏好那些与我专业实践相关的主题,通常是源自工业界 或关于后来被广泛采用的创新的论文。
- 同样,我倾向于跳过更多理论性论文,例如那些专注于计算机科学数学基础、硬件电子学等方面内容的论文。
- 我按照主题相关性和模糊的时间顺序混合对列表进行了排序,以便按照建议的顺序阅读是合理的。例如,历史性和开创性的主题排在前面,当代互联网时代的发展排在最后,网络学先于分布式系统等。