圣杯与银弹 · 没用的设计模式

学习设计模式与设计优秀的软件并不相关,盲目追求和套用书中的设计模式只能使项目变得更加糟糕,本文并不是要批判《设计模式》中提出的通用的设计模型,我们需要对书中的内容多一些批判性的思考,想清楚究竟什么样的设计才是能够保留下来的。需要注意的是,这篇文章充满了作者的主观意见和个人经验,如果读者不认同本文的观点,欢迎在文章下面留言并讨论。 »

Go 语言垃圾收集器的实现原理

我们在上一节中详细介绍了 Go 语言内存分配器的设计与实现原理,分析了运行时内存管理组件之间的关系以及不同类型对象的分配原理,然而编程语言的内存管理系统除了负责堆内存的分配之外,它还需要负责回收不再使用的对象和内存空间,这部分职责就是由本节即将介绍的垃圾收集器完成的。 »

为什么 TCP 协议有 TIME_WAIT 状态 · Why's THE Design?

在这个系列前面的文章中,我们已经多次讨论 TCP 协议的设计原理,其中包括 TCP 协议的三次握手、流量控制和重传机制、最大数据段以及粘包等问题。本文将继续分析 TCP 协议的实现细节,今天要分析的问题是为什么 TCP 协议需要 TIME_WAIT 状态以及该状态的作用究竟是什么。TIME_WAIT 仅在主动断开连接的一方出现,被动断开连接的一方会直接进入 CLOSED 状态,进入 TIME_WAIT 的客户端需要等待 2 MSL 才可以真正关闭连接。 »

为什么 TCP 协议有粘包问题 · Why's THE Design?

粘包并不是 TCP 协议造成的,它的出现是因为应用层协议设计者对 TCP 协议的错误理解,忽略了 TCP 协议的定义并且缺乏设计应用层协议的经验。本文将从 TCP 协议以及应用层协议出发,分析我们经常提到的 TCP 协议中的粘包是如何发生的。很多人可能会认为粘包是一个比较低级的甚至不值得讨论的问题,但是在作者看来这个问题还是很有趣的,不是所有人都系统性地学过基于 TCP 的应用层协议设计,也不是所有人对 TCP 协议也没有那么深入的理解,相信很多人学习编程的过程都是自底向上的,所以作者认为这是一个值得回答的问题,我们应该传递正确的知识,而不是负面的和居高临下的情绪。 »

如何管理自己的时间资产

时间是我们最重要的资产,对时间的使用和管理决定了我们的个人成长。人的注意力是有限的,我们不能将同一份时间投入到不同的事情中,一旦选择花费时间做一些事情,就不得不放弃做其他事情的可能性。如果我们能够静下心来思考应该如何使用自己的最重要资产,一定能获得更大的个人成长和回报。时间管理是一个非常大的话题,每个人都使用不同的工具和思想来管理和分配时间,因为之前有读者希望作者分享一下时间管理的经验,所以在这里我也跟各位读者简单分享一下自己在时间管理上的方法。 »

为什么 HTTPS 需要 7 次握手以及 9 倍时延 · Why's THE Design?

HTTP 协议已经成为互联网上最常用的应用层协议,然而其本身只是用于传输超文本的网络协议,不会提供任何安全上的保证,使用明文在互联网上传输数据包使得窃听和中间人攻击成为可能,通过 HTTP 传输密码其实与在互联网上裸奔也差不多。HTTPS 是对 HTTP 协议的扩展,我们可以使用它在互联网上安全地传输数据,然而 HTTPS 请求的发起方第一次从接收方获取响应需要经过 4.5 倍的往返延迟。本文将详细介绍请求发起和响应的过程,分析为什么 HTTPS 协议需要通过 4.5-RTT 的时间获得服务提供方的响应: »

为什么流媒体直播的延迟很高 · Why's THE Design?

通信技术的发展促进了视频点播和直播业务的兴起,4G 和 5G 网络技术的进步也使得流媒体技术变得越来越重要,本文不会介绍网络对直播业务的影响,而是会分析一个直播中常见的现象 — 主播和观众之间能够感觉到的明显网络延迟。除了业务上要求的延迟直播之外,有哪些因素会导致视频直播的延迟这么高呢? »

Go 语言系统监控的实现原理

很多系统中都有守护进程,它们能够在后台监控系统的运行状态,在出现意外情况时及时响应。系统监控是 Go 语言运行时的重要组成部分,它会每隔一段时间检查 Go 语言运行时,确保程序没有进入异常状态。本节会介绍 Go 语言系统监控的设计与实现原理,包括它的启动、执行过程以及主要职责。 »

为什么 TCP/IP 协议会拆分数据 · Why's THE Design?

当应用层协议使用 TCP/IP 协议传输数据时,TCP/IP 协议簇可能会将应用层发送的数据分成多个包依次发送,而数据的接收方收到的数据可能是分段的或者拼接的,所以它需要对接收的数据进行拆分或者重组。本文会分别从 IP 协议和 TCP 协议两个角度出发分析为什么应用层写入的数据包会被 TCP/IP 协议拆分发送。 »

Go 语言数组的实现原理

数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是非常重要的,除了数组之外,Go 语言引入了另一个概念 — 切片,切片与数组有一些类似,但是它们的不同之处导致使用上会产生巨大的差别。我们在这一节中会从 Go 语言的编译期间运行时来介绍数组的底层实现原理,其中会包括数组的初始化、访问和赋值几种常见操作。 »

为什么比特币可以防篡改 · Why's THE Design?

如果我们对比特币等区块链技术稍有了解,就会发现它是一个设计巧妙的分布式数据库。作为在公网运行的分布式数据库,比特币和其它区块链网络都会面对网络中的恶意节点的攻击。因为比特币需要面对复杂的网络环境以及不可靠的节点,所以它在设计和实现上也做出了应对,我们可以看看它是如何组合现有的技术防止恶意节点对交易和账户数据进行篡改的。 »

调度系统设计精要

调度是一个非常广泛的概念,很多领域都会使用调度这个术语,在计算机科学中,调度就是一种将任务(Work)分配给资源的方法。本文会深入研究调度系统的设计原理并从源代码的角度分析操作系统 Linux 进程调度器(Scheduler)、Go 语言运行时调度器以及 Kubernetes 工作负载调度器的历史、从无到有的演变过程以及设计与实现原理。 »