Why’s THE Design 是一个深度剖析计算机程序设计决策的系列文章。它不提供简单的定义,而是通过探讨具体设计背后的“为什么”,分析不同方案的权衡(Trade-off)及其对实际实现的影响,帮助开发者构建底层的技术直觉。
完整系列可访问:https://draven.co/whys-the-design/
知识图谱
网络协议
- 连接与传输: 为什么 TCP 建立连接需要三次握手 (001)、为什么 TCP 协议有粘包问题 (020)、为什么 TCP 协议有 TIME_WAIT 状态 (021)、为什么 TCP/IP 协议会拆分数据 (017)
- 协议分析: 为什么 DNS 使用 UDP 协议 (005)、为什么 UDP 头只有 8 个字节 (013)、为什么 HTTPS 需要 7 次握手以及 9 倍时延 (019)
- 性能与架构: 为什么 TCP 协议有性能问题 (012)、为什么流媒体直播的延迟很高 (018)、为什么集群需要 Overlay 网络 (028)
- 寻址与标准: 为什么 MAC 地址不需要全球唯一 (026)、为什么 IPv6 难以取代 IPv4 (027)
数据库与存储
- 数据结构: 为什么 MySQL 使用 B+ 树 (009)、为什么 MongoDB 使用 B 树 (011)、为什么 OLAP 需要列式存储 (036)
- Redis 专项: 为什么 Redis 选择单线程模型 (003)、为什么 Redis 快照使用子进程 (010)
- 工程实践: 为什么数据库会丢失数据 (015)、为什么 MySQL 的自增主键不单调也不连续 (024)、为什么数据库不应该使用外键 (031)
- 其他: 为什么比特币可以防篡改 (016)
操作系统
- 内存管理: 为什么 Linux 需要虚拟内存 (023)、为什么 Linux 默认页大小是 4KB (030)、为什么 HugePages 可以提升数据库性能 (034)、为什么 Linux 需要 Swapping (035)
- 硬件与交互: 为什么系统调用会消耗较多资源 (029)、为什么 CPU 访问硬盘很慢 (032)、为什么 NUMA 会影响程序的延迟 (033)
- 磁盘与碎片: 为什么早期的 Windows 需要整理碎片 (038)、为什么 Linux 和 macOS 不需要碎片整理 (039)
软件工程与语言
- 工程方法论: 为什么使用通信来共享内存 (002)、为什么你应该使用 Git 进行版本控制 (004)、为什么基础服务不应该高可用 (007)、为什么总是需要无意义的 ID (008)、为什么 Kubernetes 要替换 Docker (037)
- 安全与计算: 为什么使用 MD5 存储密码非常危险 (006)、为什么 0.1 + 0.2 = 0.300000004 (022)、为什么 0.1 + 0.2 = 0.3 (025)
- 编程语言: 为什么 Go 语言没有泛型 (014)
适用场景
该系列非常适合那些 不满足于「如何使用」而希望探索「为何如此设计」的开发者。无论是在准备技术面试、优化系统性能,还是在进行架构设计时需要权衡方案,都可以将其作为参考资料。
正文完