Why’s THE Design是一系列关于计算机领域中程序设计决策的文章,作者在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响,文章写的非常详细,下面是目录,喜欢的可以前往学习。

Why’s THE Design:

https://draven.co/whys-the-design/


按分类组织


网络

  • 001 为什么 TCP 建立连接需要三次握手
  • 005 为什么 DNS 使用 UDP 协议
  • 012 为什么 TCP 协议有性能问题
  • 013 为什么 UDP 头只有 8 个字节
  • 017 为什么 TCP/IP 协议会拆分数据
  • 018 为什么流媒体直播的延迟很高
  • 019 为什么 HTTPS 需要 7 次握手以及 9 倍时延
  • 020 为什么 TCP 协议有粘包问题
  • 021 为什么 TCP 协议有 TIME_WAIT 状态
  • 026 为什么 MAC 地址不需要全球唯一
  • 027 为什么 IPv6 难以取代 IPv4
  • 028 为什么集群需要 Overlay 网络


数据库

  • 003 为什么 Redis 选择单线程模型
  • 009 为什么 MySQL 使用 B+ 树
  • 010 为什么 Redis 快照使用子进程
  • 011 为什么 MongoDB 使用 B 树
  • 015 为什么数据库会丢失数据
  • 016 为什么比特币可以防篡改
  • 024 为什么 MySQL 的自增主键不单调也不连续
  • 031 为什么数据库不应该使用外键
  • 036 为什么 OLAP 需要列式存储


操作系统

  • 023 为什么 Linux 需要虚拟内存
  • 029 为什么系统调用会消耗较多资源
  • 030 为什么 Linux 默认页大小是 4KB
  • 032 为什么 CPU 访问硬盘很慢
  • 033 为什么 NUMA 会影响程序的延迟
  • 034 为什么 HugePages 可以提升数据库性能
  • 035 为什么 Linux 需要 Swapping
  • 038 为什么早期的 Windows 需要整理碎片
  • 039 为什么 Linux 和 macOS 不需要碎片整理


编程语言

  • 014 为什么 Go 语言没有泛型


软件工程

  • 002 为什么使用通信来共享内存
  • 004 为什么你应该使用 Git 进行版本控制
  • 006 为什么使用 MD5 存储密码非常危险
  • 007 为什么基础服务不应该高可用
  • 008 为什么总是需要无意义的 ID
  • 018 为什么流媒体直播的延迟很高
  • 022 为什么 0.1 + 0.2 = 0.300000004
  • 025 为什么 0.1 + 0.2 = 0.3
  • 037 为什么 Kubernetes 要替换 Docker