项目地址:https://github.com/facundoolano/software-papers
作者:facundoolano | 许可证:MIT | 论文总数:148 篇 | 主题分类:20 个
一、项目介绍
software-papers 是一个 精心策划的软件工程论文精选列表 ,由 GitHub 用户 facundoolano 维护。与动辄上千篇的"论文大全"不同,这个项目的核心理念是短而精------它只收录那些"值得像读一本技术书一样从头读到尾"的论文。
项目目前收录了 20 篇顶级论文 (每个主题一篇)和 128 篇相关论文,覆盖从 1945 年 Bush 的《As We May Think》到 2019 年 Kleppmann 的 Local-First Software,时间跨度超过 70 年。
与同类项目的区别
| 项目 | 特点 | 规模 |
|---|---|---|
| Papers We Love | 按编程语言分类,社区驱动,规模极大 | 1000+ 论文 |
| The Morning Paper | Adrian Colyer 每日解读一篇论文 | 持续更新 |
| software-papers | 精选路线图,带 YAML 数据源,可自动生成 README | 148 篇,20 个主题 |
二、论文分类体系全景
项目的 20 个主题按历史发展脉络排列,从计算机起源到现代机器学习,形成一条完整的学习路径:
计算机历史 & 早期编程 (1945-1984)
↓
早期人工智能 (1950-1984)
↓
信息论 (1950-1998)
↓
数据结构 & 算法 (1956-1993)
↓
软件设计 (1972-2015) ← 编程范式 (1960-2017)
↓
语言设计 & 编译器 (1966-2017)
↓
软件工程 & 项目管理 (1968-2006)
↓
并发 (1965-1997) ← 操作系统 (1962-1991)
↓
数据库 (1970-1999) ← 网络 (1974-2014)
↓
密码学 (1976-2007) ← 分布式系统 (1974-2014)
↓
人机交互 (1945-1997) ← 信息检索 & WWW (1972-1998)
↓
互联网规模数据系统 (2003-2017)
↓
运维 & 可靠性 (1983-2009)
↓
去中心化 & P2P (1998-2019)
↓
机器学习 (2001-2017)
代表性顶级论文速览
每个主题都有一篇"顶级论文",以下是各主题的代表作:
- Von Neumann's First Computer Program --- Knuth (1970)
- Computing Machinery and Intelligence --- Turing (1950)
- A Method for the Construction of Minimum-Redundancy Codes --- Huffman (1952)
- Engineering a Sort Function --- Bentley, McIlroy (1993) --- qsort 工程实现
- A Design Methodology for Reliable Software Systems --- Liskov (1972)
- Programming Paradigms for Dummies --- Van Roy (2012)
- An Incremental Approach to Compiler Construction --- Ghuloum (2006)
- No Silver Bullet --- Brooks (1987) --- 软件工程圣经
- Communicating Sequential Processes --- Hoare (1978) --- CSP 模型
- The UNIX Time-Sharing System --- Ritchie, Thompson (1974)
- A Relational Model of Data --- Codd (1970) --- 关系数据库基础
- A Protocol for Packet Network Intercommunication --- Cerf, Kahn (1974) --- TCP/IP 起源
- New Directions in Cryptography --- Diffie, Hellman (1976) --- 公钥密码学
- Time, Clocks, and the Ordering of Events --- Lamport (1978) --- 分布式系统奠基
- Designing for Usability --- Gould, Lewis (1985)
- The anatomy of a large-scale hypertextual Web search engine --- Brin, Page (1998) --- PageRank 原始论文
- Dynamo --- Amazon (2007) --- 高可用 KV 存储
- On Designing and Deploying Internet Scale Services --- Hamilton (2007)
- Bitcoin --- Nakamoto (2008) --- 区块链起源
- A Few Useful Things to Know About Machine Learning --- Domingos (2012)
三、技术架构深度拆解
3.1 整体架构
software-papers/
├── papers.yml # ★ 核心数据文件(YAML 格式)
├── gen_readme.py # README 自动生成脚本
├── check_links.py # 链接有效性每日检查
├── README.md.template # README 模板(含三个占位符)
└── .github/
└── workflows/
└── tests.yml # GitHub Actions:每日运行 check_links.py
核心设计思想:将论文数据(papers.yml)与展示层(README.md)分离,通过 Python 脚本自动生成,确保数据可维护、展示可定制。
3.2 papers.yml 数据结构详解
papers.yml 是整个项目的"数据库",采用 YAML 列表格式,每篇顶级论文是一个列表项:
yaml
- title: Engineering a Sort Function
author: Bentley, McIlroy
year: 1993
link: https://cs.fit.edu/~pkc/classes/writing/samples/bentley93engineering.pdf
topics: [Data Structures, Algorithms]
related:
- title: Quicksort
author: Hoare
year: 1962
link: https://dl.acm.org/doi/pdf/10.5555/63445.C1104357
- title: Space/Time Trade-offs in Hash Coding with Allowable Errors
author: Bloom
year: 1970
link: https://dl.acm.org/doi/pdf/10.1145/362686.362692
字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
title |
string | ✅ | 论文标题,含特殊字符时用双引号包裹 |
author |
string | ✅ | 作者,多人用逗号分隔 |
year |
int | ✅ | 发表年份 |
link |
string | ✅ | PDF 免费下载链接 |
topics |
list | ✅ | 主题标签,用于 README 中的 <sub> 展示 |
related |
list | ❌ | 相关论文列表,嵌套相同结构(不含 topics) |
设计亮点 :topics 字段存储在 YAML 中,生成 README 时渲染为 <sub> 小字,既不干扰主标题,又提供了分类信息。
3.3 gen_readme.py 源码拆解
gen_readme.py 是整个项目的"编译器和渲染引擎",将 YAML 数据转换为三种不同视角的 README 展示。
核心函数一:load_papers()
python
def load_papers():
def markdown(paper, bold=False):
# 生成单篇论文的 Markdown 链接格式
entry = f'{paper["title"]}. [{paper["author"]} ({paper["year"]})]({paper["link"]}).'
if bold:
entry = f'**{entry}**' # 顶级论文加粗
entry += '\n'
return entry.replace('?.', '?') # 标题以?结尾时不加句点
with open('papers.yml') as file_:
papers = yaml.safe_load(file_)
for paper in papers:
paper['markdown'] = markdown(paper, bold=True)
for related in paper.setdefault('related', []):
related['markdown'] = markdown(related, bold=False)
paper['related'].sort(key=lambda p: p['year']) # 相关论文按年份排序
return papers
关键设计:
bold=True/False区分顶级论文和相关论文的渲染样式setdefault('related', [])优雅处理无 related 字段的论文- 相关论文按年份排序,保证时间线清晰
核心函数二:render_readme(papers)
python
def render_readme(papers):
with open('README.md.template') as template:
readme = template.read()
# 1. 完整嵌套列表(顶级+相关论文)
papers_full = ''
for paper in papers:
papers_full += '1. ' + paper['markdown']
papers_full += ' \\\n' # 换行+主题标签
topics = '; '.join(paper['topics'])
papers_full += f" <sub>{topics}</sub>\n"
for related in paper['related']:
papers_full += ' * ' + related['markdown']
papers_full += '\n'
readme = readme.replace('{{ PAPERS_FULL }}', papers_full)
# 2. 仅顶级论文的目录视图
papers_top = ''
for paper in papers:
papers_top += '1. ' + paper['markdown']
readme = readme.replace('{{ PAPERS_TOC }}', papers_top)
# 3. 按时间顺序排列的所有论文(顶级+相关)
all_papers = []
for paper in papers:
all_papers.append(paper)
all_papers += paper['related']
papers_sorted = ''
for paper in sorted(all_papers, key=lambda p: p['year']):
papers_sorted += '1. ' + paper['markdown']
readme = readme.replace('{{ PAPERS_SORTED }}', papers_sorted)
return readme
三个视图的设计意图:
| 视图 | 占位符 | 用途 |
|---|---|---|
| 按主题分类(默认展开) | {``{ PAPERS_FULL }} |
主线学习路径,含相关论文 |
| 仅顶级论文 | {``{ PAPERS_TOC }} |
快速浏览,决定精读哪些主题 |
| 按时间排序 | {``{ PAPERS_SORTED }} |
追踪计算机科学发展史 |
3.4 check_links.py 链接健康检查
这是项目的"持续集成守护脚本",确保 148 篇论文的 PDF 链接长期有效。
python
#!/usr/bin/env python3
import requests
import urllib3
import yaml
urllib3.disable_warnings() # ACM 的证书问题需跳过验证
HEADERS = {'User-Agent': 'My User Agent 1.0'}
with open('papers.yml') as file_:
papers = yaml.safe_load(file_)
# ⚠️ 踩坑点:原代码有 bug,直接 papers += paper.get('related', [])
# 会导致顶级论文列表被污染,正确做法是用另一个列表
exit_code = 0
for paper in papers:
ref = paper['author'].replace(',', '').split(' ')[0] + str(paper['year'])
print(f'{ref}...', end='', flush=True)
if '.acm.org/' in paper['link']:
# ACM 数字图书馆现在拒绝无 JS 的请求
# 此处选择跳过而非移除链接
print('skipping ACM')
continue
response = requests.head(paper['link'], headers=HEADERS, verify=False)
if response.status_code == 405: # HEAD 不被允许,改用 GET
response = requests.get(paper['link'], headers=HEADERS, verify=False)
if response.ok:
print('ok')
else:
exit_code = 1
print(' ERROR')
print(f' failed fetching {paper["link"]}')
exit(exit_code)
踩坑点分析:
-
ACM 反爬:ACM Digital Library 现在会拒绝没有 JavaScript 的 HEAD/GET 请求,脚本只能跳过这些链接。这是该项目论文链接最大的失效风险点。
-
原代码 Bug :
papers += paper.get('related', [])这行会修改原始papers列表(因为+=对列表是 in-place 操作),导致后续遍历出错。正确做法是:all_papers = papers + [p for paper in papers for p in paper.get('related', [])]。 -
SSL 证书问题 :Parnas 1972 年的论文链接存在 SSL 证书问题,脚本用
verify=False跳过验证,同时用urllib3.disable_warnings()屏蔽警告。
四、选题标准深度解读
作者在 README 模板中明确了 7 条选题标准,这些标准本身就很值得细读:
标准 1:保持简短
"想法不是收集所有有趣的论文,而是保持一个有代表性的列表,阅读难度相当于从头到尾读一本技术书。"
这直接回应了"论文大全"类项目的核心问题:列表太长反而让人无从下手。
标准 2:论文不宜过长
尽量控制在 20-30 页以内。Bentley 的《Engineering a Sort Function》只有 15 页,但包含了 qsort 的完整工程实现细节,是"短小精悍"的典范。
标准 3:自成体系、可读性强
普通技术读者可以独立阅读。例如,Lamport 的《Time, Clocks, and the Ordering of Events》虽然理论深度极高,但行文清晰,不需要先验知识。
标准 4:免费在线可获取
所有论文均有免费 PDF 链接。这一点极其重要------它直接决定了项目的可用性和传播范围。
标准 5:历史相关性的权衡
对于难以阅读的开创性原始论文,会选择更易读的替代版本。例如:
- Von Neumann 的原始程序代码难以理解,选择 Knuth 的解读版
- Shannon 1948 年的原始信息论论文过于数学化,选择后来更易懂的综述
标准 6:偏向实践相关
优先选择来自工业界或后来被广泛采用的创新论文:
- Google 的 GFS、MapReduce、Bigtable 三篇论文均来自工业实践
- Amazon 的 Dynamo、Aurora 同理
标准 7:排列有逻辑
按主题相关性和大致时间顺序排列。历史性主题在前,现代互联网时代发展在后;网络在前,分布式系统在后(因为分布式系统依赖网络基础)。
五、项目亮点与局限性
亮点
- 数据驱动架构:YAML + Python 生成,比纯 Markdown 列表更易维护和扩展
- 三个阅读视角:按主题 / 仅目录 / 按时间,满足不同阅读需求
- 链接健康检查:GitHub Actions 每日自动运行,保证链接长期有效
- 选题有观点:不是"越多越好",而是有明确的取舍标准
- 免费可获取:每篇论文都有免费 PDF 链接,降低阅读门槛
局限性
- ACM 链接风险:大量论文托管在 ACM Digital Library,无订阅访问可能受限
- 作者主观选择:148 篇论文是作者个人判断,必然存在遗漏(如缺少 Rust/Go 等现代语言相关论文)
- 机器学习部分偏浅:只收录了 7 篇,对于当前 AI 热潮来说覆盖不足
- check_links.py 的 Bug :如前所述,
papers +=的问题需要修复
六、如何高效使用这个项目
路径一:按主题顺序精读(推荐)
从计算机历史开始,按项目默认顺序逐个主题推进。每个主题先读顶级论文,再根据兴趣深入 related 论文。
路径二:按时间顺序纵览
打开 README 中的 "All papers in chronological order",从 1945 年到 2019 年,感受计算机科学的发展脉络。
路径三:针对性查阅
遇到具体技术问题时,按主题查找相关论文。例如:
- 分布式系统一致性问题 → 读 Lamport (1978) + Ongaro & Ousterhout (2014, Raft)
- 数据库事务处理 → 读 Gray (1981) + Selinger et al (1979, 查询优化)
- 编译器实现 → 读 Ghuloum (2006, 增量式编译器构造)
附:论文阅读方法论
项目还推荐了几篇关于"如何读论文"的元资源:
- How to Read a Paper --- Keshav (2007):三遍阅读法(扫读→细读→深读)
- Efficient Reading of Papers in Science and Technology --- Hanson (1999)
- Should I read papers? --- Michael Bernstein:为什么要读论文
七、总结
software-papers 的价值不在于"全",而在于有观点的取舍。在信息过载的时代,一个经过深思熟虑的精选列表,比一个包罗万象但无从下手的巨大索引更有价值。
对于软件工程师来说,这 148 篇论文是一条经过验证的学习路径------从计算机历史的源头,到现代分布式系统和机器学习,每一步都有经典论文指引。配合项目提供的三种阅读视角和免费的 PDF 链接,这是一个可以真正"从头读到尾"的论文阅读路线图。
项目星标增长趋势:自 2020 年左右开源以来,项目持续获得关注,是 GitHub 上"论文精选"类项目中维护最活跃、设计最优雅的几个之一。