编程资源

June 24, 2026 · View on GitHub

本文档整合了以下源文件:programming.md


来源:programming.md

概述

本文档是一份面向程序员的职业发展与技术学习资源汇编,涵盖从编码技能到系统架构、从职业成长到软技能提升的全方位内容。所有资源均经过筛选,侧重经典与实用。

图例说明:

标记含义
R资源列表
B书籍
V视频/演讲
S幻灯片/演示文稿
P论文

必读书籍

书籍说明
The Pragmatic Programmer最具启发性的编程实践书籍
Code Complete软件构建的实用手册,提供代码讨论的必要框架
Release It!生产就绪软件的最佳实践,相当于约3年的实战经验
Scalability Rules50条Web扩展原则
The Linux Programming InterfaceLinux与UNIX系统编程手册,理解软件演进与接口设计
SICP(免费)MIT经典教材,计算机科学最有影响力的教科书之一

免费书籍资源:

资源链接
Professional Software Development链接
免费编程书籍(vhf)GitHub
免费编程书籍(EbookFoundation)GitHub

必读文章

文章核心要点
Practical Advice for New Software Engineers新手工程师实用建议
On Being A Senior Engineer如何成为高级工程师
Lessons Learned in Software Development多年经验浓缩的教训
Things I Learnt The Hard Way规格先行、测试造就更好的API、文档是给未来自己的信、始终使用UTF-8和时区
7 absolute truths I unlearned as junior developer每家公司都有技术债;架构比细节争论更重要;高级工程师需要编程之外的多种技能
How to Build Good Software软件项目的失败原因往往在于管理方式而非技术选择;软件应被视为团队理解的活体体现
Expert Generalists提出"T型工程师"的新视角:好奇心、协作性、注重基础、兼顾通才与专才
A Bunch of Programming Advice I'd Give To Myself 15 Years Ago评估质量与速度的权衡;磨刀不误砍柴工;调试要深入一层

通用资源

资源列表与路线图

资源链接
开发者路线图kamranahmedse/developer-roadmap
每个程序员应知之事mtdvio/every-programmer-should-know
软件开发著名定律Famous Laws
Amazon Builders' Library链接
程序员常犯的错误认知kdeldycke/awesome-falsehood
编程演讲合集hellerve/programming-talks
CS专业学生应知之事链接

补充书籍

书籍说明
The Imposter's Handbook面向无CS学位开发者
The Computer Science Book计算机科学入门
The Software Engineer's Guidebook软件工程行业完整指南

公理与经验法则

来源核心观点
Urbit Precepts数据优于代码;正确性优于性能;确定性优于启发式;100行简单代码优于20行复杂代码
Embedded Rules of Thumb嵌入式开发经验法则
Reflections on 10,000 Hours of Programming万小时编程反思
20 Things I've Learned in my 20 Years as a Software Engineer20年软件工程经验

课程

课程说明
Google Tech Dev GuideGoogle技术开发者指南
The Missing Semester(MIT)CS教育中缺失的课程:Shell、编辑器、Git、调试、安全等
Mathematics for the adventurous self-learner自学数学指南
coding-interview-university完整的CS学习计划
Teach Yourself Computer Science精选CS学习资源
ossu/computer-science免费自学CS教育

主题分类资源

算法与数据结构

资源类型说明
CLRS算法导论B算法经典教材,配套OCW课程
The Algorithm Design ManualBSkiena的算法设计手册
Project Euler练习算法练习平台
CS 61B Spring 2023课程UC Berkeley数据结构课程
Grokking AlgorithmsB算法图解
Data Structure Visualization工具数据结构可视化
Visualizing Algorithms文章算法可视化
B-trees and database indexes文章B树与数据库索引
Big O visualizations工具大O复杂度可视化
Raft Consensus Algorithm文章分布式系统中的Raft共识算法

实现参考:

API设计与开发

资源说明
Roy Fielding的REST论文REST架构风格的原始论文
REST API设计最佳实践Stack Overflow Blog
Microsoft REST API Guidelines微软API设计规范
Zalando RESTful API GuidelinesZalando API规范
Google API Design GuideGoogle网络API设计指南
AIP-1Google API改进提案
Why links not keys in APIs用链接而非外键表达API关系
Give me /events, not webhooks事件优于Webhook

态度、习惯与思维模式

资源核心观点
Mastering ProgrammingKent Beck论精通编程
The traits of a proficient programmer熟练程序员的特质
Taking Ownership主动承担责任是达成目标的最有效方式
The Product-Minded Software Engineer产品思维工程师:了解边界情况、参与用户研究、提出产品/工程权衡
On Coding, Ego and Attention初学者心态、精通是动量的积累、处理自我干扰
Fixed vs. Growth Mindset固定型思维vs成长型思维
Don't Wait for Motivation, Act for Momentum不要等动力,从微小任务开始积累动量
High Agency高自主性
The Grug Brained Developer自我觉察的程序员习惯

关于拖延症:

认证与授权

资源说明
Authorization in a microservices world微服务中的授权
Authorization Logic授权逻辑:规则随时间演进
The Copenhagen BookWeb应用认证实现指南

职业成长

资源核心要点
Don't Call Yourself a Programmer重新定义程序员的职业定位
Ten Principles for Growth as an Engineer工程师成长十大原则
The career advice I wish I had at 25职业是马拉松不是冲刺;成功来自重复而非新事物;管理是关于人而非事物
What's a senior engineer's job?高级工程师不仅仅是个人贡献者
The Well Rounded Engineer全面发展的工程师:多语言范式、多数据库、多协议、构建工具、调试、部署、架构
Some career advice建立声望储备;优秀的关系会跟随你;早期尽量尝试不同类型的公司
The Forty-Year Programmer越优秀越与众不同;通过基础学习深层原理
Stop Avoiding Politics好的政治就是战略性地经营关系和影响力
Publishing your work increases your luck发布作品增加运气

通往Staff工程师:

资源说明
14 lessons to FAANG Staff Engineer5年成为FAANG Staff工程师的经验
staffeng.comStaff-plus工程角色指南(Will Larson)
Staff archetypesStaff工程师原型

代码审查

资源核心要点
Google代码审查指南Google工程实践文档
How to Make Your Code Reviewer Fall in Love with You先自我审查;写清晰的变更描述;自动化简单检查;用代码回答问题;缩小变更范围
How to Do Code Reviews Like a Human像人类一样做代码审查
Maslow's pyramid of code reviews代码审查的马斯洛金字塔
No code reviews by default责任优于约定

编码与代码质量

资源核心要点
Write code that is easy to delete编写易于删除而非易于扩展的代码
The Ten Commandments of Egoless Programming无我编程十诫
Clean Code敏捷软件工艺手册
Naming boolean variables布尔变量命名:用is/has前缀;避免否定;避免自定义前缀
kettanaito/naming-cheatsheet语言无关的变量命名指南
Cognitive Load认知负荷才是关键
How to create software quality如何创造软件质量

设计(视觉、UX、UI)

资源说明
The Non-Designer's Design Book非设计师的设计书,提供可操作的设计建议
The Visual Display of Quantitative Information数据可视化经典
10 Usability Heuristics10条可用性启发式原则
Visual design rules可安全遵循的视觉设计规则
bradtraversy/design-resources-for-developers开发者设计资源合集

设计(OO建模、架构、模式)

必读书籍:

书籍说明
Design Patterns (GoF)设计模式经典,核心思想:组合优于继承
Patterns of Enterprise Application Architecture企业应用架构模式
Domain-Driven Design领域驱动设计
Clean Architecture整洁架构,利用单一职责原则
Game Programming Patterns(免费在线)游戏编程模式

关键文章:

文章核心观点
No Silver Bullet软件的四大难题:复杂性、一致性、可变性、不可见性
Out of the Tar Pit本质复杂性与偶然复杂性的区分;函数式编程有助于避免状态衍生的复杂性
Cognitive load is what matters认知负荷是关键;精心设计的单体架构往往比微服务更灵活
CUPID可组合、Unix哲学、可预测、惯用、基于领域
Simple Made EasyRich Hickey重新定义简单与容易的区别

数据库Schema设计:

资源核心建议
A humble guide to database schema design至少使用第三范式;用约束创建最后防线;永远不要将完整地址存在单个字段
YAGRI: You are gonna read it存储created_at、created_by等字段

开发环境与工具

工具说明
Glances系统监控
HTTPie人性化的HTTP客户端
jq命令行JSON处理器
tmux终端复用器
htop交互式进程查看器
Visual guide to SSH tunnelsSSH隧道可视化指南
casey/just命令运行器(Rust编写)

Docker

资源核心要点
Best Practices with Docker Compose使用Override文件避免双Compose文件;利用别名和锚点减少重复;在Compose中定义HEALTHCHECK
Docker Best Practices for Python多阶段构建;利用层缓存;最小化层数;使用非特权容器;COPY优于ADD;日志输出到stdout/stderr
Docker Containers SecurityDocker容器安全

文档

资源核心要点
Writing automated tests for your documentation测试文档中的代码示例确保不过时
Keep a Changelog变更日志规范
Architectural Decision Records (ADR)架构决策记录方法
The documentation system文档系统四分类:教程、操作指南、技术参考、解释
Diataxis技术文档系统化方法
ARCHITECTURE.md架构文档
Best practices for writing code comments代码注释最佳实践
Always be quitting记录知识、培训替代者、通过"可替代"释放自己做高影响项目

编辑器与IDE

资源说明
VSCode当前最流行的文本编辑器之一
Seven habits of effective text editingVim作者关于高效文本编辑的习惯

Vim学习路径:

资源说明
Is Vim Really Not For You?Vim新手指南(共6篇系列文章)
Practical VimVim实战
Learn Vimscript the Hard WayVim脚本学习
VimGolfVim挑战练习
Vim anti-patternsVim反模式

数据库

资源说明
CAP Theorem简介CAP定理通俗介绍
PACELC定理无分区时延迟与一致性的权衡
Zero downtime database migrations零停机数据库迁移
Readings in Database Systems数据库系统读物
How does a relational database work关系数据库工作原理
Use the index, Luke索引使用指南
Why you should probably be using SQLiteSQLite的适用场景
Database Internals数据库内部原理

Postgres专题:

资源说明
Safe Operations For High Volume PostgreSQL高流量PostgreSQL安全操作
Transaction Isolation in PostgresPostgres事务隔离级别
PostgreSQL exercisesPostgreSQL练习
Postgres: don't Do ThisPostgres不要做的事
Postgres lock explainedPostgres锁详解
Just use Postgres"直接用Postgres"系列文章

NoSQL:

资源说明
NOSQL PatternsNoSQL模式
NoSQL Databases: a SurveyNoSQL数据库综述与决策指南
Redis ExplainedRedis原理详解

调试

资源核心要点
Rubber Duck Problem Solving橡皮鸭调试法
Five Whys五个为什么根因分析法
The Infinite Hows批评五个为什么方法,倡导用"如何"替代"为什么"进行更广泛的探索
Debugging zine调试指南
The Thirty Minute Rule卡住超过30分钟就求助
How to create a Minimal, Reproducible Example如何创建最小可复现示例
Some ways to get better at debugging学习代码库、系统、工具、策略;积累经验
The Saff Squeeze系统化删除代码直到测试和代码足够小以理解
tcpdump is amazingtcpdump的强大之处
Troubleshooting: The Skill That Never Goes Obsolete故障排除:永不过时的技能

事件响应(值班、告警、故障、事后复盘)

资源核心要点
Incident Response at Heroku事件指挥官角色
Google SRE Book - OncallGoogle SRE值班章节
Writing Runbook Documentation运维手册降低压力和MTTR
Incident Review Best Practices事件审查最佳实践

告警哲学:

原则说明
告警应紧急、重要、可操作、真实来自 My Philosophy On Alerting
宁可减少噪音告警过度监控比监控不足更难解决
基于症状优于基于原因症状能更全面地捕获问题

事后复盘模板:

章节内容
执行摘要影响、根因
影响受影响用户数、收入损失、持续时间、团队影响
时间线检测、解决
根因分析如五个为什么方法
经验教训做得好的、做得差的
行动项预防、检测、缓解任务

学习与记忆

资源核心要点
How I Rewired My Brain to Become Fluent in Math理解的基石是记忆和重复
One Sure-Fire Way to Improve Your Coding阅读代码
Stop Learning Frameworks停止学习框架
Learning How to LearnCoursera学习如何学习课程
Why books don't work书籍作为媒介在传递知识方面出奇地差
How to Remember Anything Forever-ish关于学习的漫画
Against 3X Speed学习是间隔重复而非暴读

间隔重复与闪卡策略:

策略说明
添加图片大脑视觉化处理有助于记忆
不添加不理解的内容确保理解后再记忆
不记忆整个列表避免枚举型卡片
手写手写过程具有冥想效果
持续问"为什么"追根溯源
康奈尔笔记法阅读时在边栏写问题自测
假设要教给别人教学是最好的学习

费曼学习策略:

  1. 持续问"为什么"
  2. 学到能向孩子解释的程度
  3. 寻找让事物显而易见的解释

机器学习/AI

资源说明
Transformers from Scratch从零理解Transformer
A Gentle Introduction to Graph Neural Networks图神经网络入门
The Math Behind AIAI背后的数学

性能

资源核心要点
Numbers Everyone Should Know每个程序员应知的延迟数字
Rob Pike's 5 Rules of Programming无法预知程序耗时在哪里;先测量;n通常很小时简单算法更好;数据结构主导
Four Kinds of Optimisation四种优化类型

可靠性

必读书籍:

书籍说明
Site Reliability Engineering(Google)Google SRE团队著作,全面分析软件生命周期
Incident Metrics in SRETTD/TTM/TTR/TBF的规范定义

关键文章:

文章核心观点
How Complex Systems Fail灾难需要多重故障;"根因"归因从根本上是错误的;安全是系统的特性而非组件的特性
Production Oriented Development生产中的代码是唯一重要的代码;买几乎总是优于构建;让部署变得简单
MTTR vs MTBFMTTR比MTBF更重要

集成模式(依赖管理):

模式说明
Circuit Breaker断路器模式
Rate limiter algorithms限流算法
Good Retry, Bad Retry关于重试、断路器、截止时间的洞察

系统架构

必读书籍:

书籍说明
Designing Data-Intensive Applications数据密集型应用设计
Building Microservices微服务构建
Building Secure and Reliable Systems(Google,免费)构建安全可靠的系统

关键资源:

资源说明
system-design-primer大规模系统设计学习
The twelve-factor app十二要素应用方法论
The Log实时数据统一抽象的日志
Fallacies of distributed computing分布式计算谬误
Patterns of Distributed Systems分布式系统模式
ConwaysLaw康威定律
C4 model软件架构可视化C4模型
AWS Well-Architected FrameworkAWS架构良好框架

微服务vs单体:

资源核心观点
Monolith FirstMartin Fowler:先用单体
Don't start with microservices生产环境不要从微服务开始
Introducing domain-oriented microservice architectureUber:面向领域的微服务架构
Monoliths are the future单体是未来
Death by a thousand microservices千微服务之死

安全

资源说明
OWASP Top TenWeb应用十大安全风险
OWASP Cheat Sheet SeriesOWASP安全速查表系列
API Security ChecklistAPI安全清单
Secure by Design安全代码与好的软件设计有大量重叠
Hacksplaining安全培训
API Tokens: A Tedious SurveyAPI令牌综述:不要使用JWT

测试

资源核心要点
Testing strategies in microservices微服务测试策略
Why bother writing tests at all?测试锁定行为;测试给你信心去修改别人的代码
The practical test pyramid实用测试金字塔
Write tests. Not too many. Mostly integration.写测试,不要太多,主要写集成测试
Software testing anti-patterns软件测试反模式
Just say no to more end-to-end tests对更多端到端测试说不

部署与发布

资源说明
How to deploy software如何部署软件
BlueGreenDeployment蓝绿部署
Move fast and break nothing快速行动但不破坏
Feature Toggles特性标志完整指南:发布切换、实验切换、运维切换、权限切换

版本控制:

方案链接
SemVer(语义化版本)semver.org
CalVer(日历版本)calver.org

版本控制(Git)

资源说明
Git BookGit官方书籍
Git from the inside out从内部理解Git
Atlassian Git TutorialsAtlassian Git教程
Learn Git Branching交互式Git分支学习
Oh My Git!Git学习游戏
How to Write a Git Commit Message如何写Git提交信息
Conventional Commits约定式提交规范
Oh Shit, Git!?!Git急救指南

Shell(命令行)

资源说明
the-art-of-command-line一页掌握命令行
Minimal safe Bash script template最小安全Bash脚本模板
Command Line Interface GuidelinesCLI设计指南
Effective Shell高效Shell
Awk in 20 Minutes20分钟学会Awk

SQL

资源说明
SQL styleguideSQL风格指南
Best practices for writing SQL queriesSQL查询最佳实践
Reasons why SELECT * is badSELECT * 的性能问题
Animate SQLSQL动画学习
Joins 13 Ways13种JOIN方式

函数式编程

资源核心要点
Functional Programming FundamentalsFP基础简介
OO vs FPOO是对函数指针的纪律约束;FP是对赋值的纪律约束
Parse, don't validate解析而非验证;用数据结构使非法状态不可表示
Monads in 15 minutes15分钟理解Monad
functional-programming-jargonFP术语通俗解释

编程语言

推荐学习路径:

类别推荐语言原因
解释型语言JavaScript + Python/Ruby快速自动化脚本、面试最快、JavaScript无处不在
编译型语言Java/C/C++理解编译与类型系统
现代语言Go/Swift/Rust/Elixir了解行业趋势
函数式语言Haskell/Scala/Clojure一流的FP支持

关键文章:

文章说明
Learn more programming languages学习更多语言以获得新视角
The seven programming ur-languages七种编程元语言:ALGOL、Lisp、ML、Self、Forth、APL、Prolog
Static vs. dynamic languages静态vs动态语言文献综述

可观测性(监控、日志、异常处理)

日志:

资源核心观点
Do not log日志在监控和错误追踪中意义不大;使用更好的工具
Lies My Parents Told Me About Logs日志并不便宜;分级日志不是分离信息的好方法
Structured Logs Guide结构化日志指南

错误/异常处理:

资源说明
Writing Helpful Error Messages解释问题、解释解决方案、清晰书写
The Error Model编程语言层面的错误建模

监控:

资源核心要点
Google SRE - MonitoringGoogle SRE监控章节
How to Monitor the SRE Golden SignalsSRE黄金信号:延迟、流量、错误、饱和度
USE Method利用率、饱和度、错误
RED Method速率、错误、持续时间

低级编程与汇编

资源说明
Back to Basics学习低级编程的重要性
The Elements of Computing Systems从第一原理构建现代计算机
Memory Allocation内存分配(交互式文章)
Putting the "You" in CPUCPU工作原理
Why does 0.1 + 0.2 = 0.30000000000000004?浮点数原理

网络

资源说明
Everything you need to know about DNSDNS完整指南
Computer Networking Fundamentals计算机网络基础
How Does the Internet Work?互联网工作原理
Choosing an HTTP Status CodeHTTP状态码选择指南

编译器

资源说明
The Compiler Writer Resource Page编译器编写者资源页
kanaka/mal实现一个Lisp
Let's Build a Compiler构建编译器

正则表达式

资源说明
The Best Regex Trick最佳正则技巧
regex101正则表达式构建、测试与调试

技术债

资源核心观点
TechnicalDebtMartin Fowler的技术债定义
Ur-Technical DebtWard Cunningham发明债务隐喻是为了向经理解释迭代开发
3 Kinds of Good Tech Debt三种好的技术债

练习与项目

资源说明
build-your-own-x从零重建你喜爱的技术
Challenging projects every programmer should try文本编辑器、太空入侵者、编译器、迷你OS、电子表格、游戏机模拟器
More challenging projects光线追踪、键值存储API、Web浏览器、股票交易机器人
7 GUIs7个GUI项目学习UI编程基础
Fly.io Distributed Systems Challenge分布式系统挑战
CodinGame编程游戏
Codewars编程挑战
Exercism编程练习

写作与沟通

资源核心要点
Writing Well Handbook写作指南:构思、初稿、改写、风格、练习
Write SimplyPaul Graham论简洁写作
It's time to start writingBezos禁止PPT的原因:好的4页备忘录比20页PPT更能促进深入思考
George Orwell's Six Rules for Writing避免陈词滥调;能用短词不用长词;能删就删;用主动语态
Technical Writing One(Google)语法、主动语态、清晰简短的句子

持续更新

网站与RSS:

来源说明
Hacker News技术新闻
High Scalability系统架构博客

安全:

来源说明
Schneier on Security安全专家博客
Krebs on Security安全调查报道

通讯:

来源说明
BytesJavaScript
PyCodersPython
Tech Talks Weekly技术演讲

核心概念速查

概念说明链接
BDD行为驱动开发Wikipedia
CAP定理一致性、可用性、分区容错性不可兼得Wikipedia
DDD领域驱动设计Wikipedia
DRY不要重复自己Wikipedia
GRASP通用职责分配软件模式Wikipedia
KISS保持简单Wikipedia
OOP面向对象编程Wikipedia
SOLID五大设计原则Wikipedia
TDD测试驱动开发Wikipedia
YAGNI你不会需要它Wikipedia
两将军问题分布式共识的基本限制Wikipedia

关键要点总结

  1. 基础优于工具:深入理解原理(操作系统、网络、数据结构)比追逐框架更重要
  2. 简单优于复杂:能用单体解决的问题不要用微服务;100行简单代码优于20行复杂代码
  3. 先测量再优化:不要过早优化,先用数据说话
  4. 代码是负债,业务价值是资产:代码应易于删除而非易于扩展
  5. 持续学习是必须的:行业知识每年都在过时,保持初学者心态
  6. 沟通与写作是核心技能:好的4页文档胜过20页PPT
  7. 测试给你信心:主要写集成测试,不要太多,不要写端到端测试
  8. 故障是学习机会:事后复盘应无指责,关注系统改进而非个人追责
  9. 买优于构建:组织的专业能力有限,不要把精力花在非竞争优势上
  10. 记录一切:文档是给未来自己的信,也是团队知识传承的基础