为什么 Go 语言没有泛型 · Why's THE Design?

Go 是一门语法元素少、设计简单的编程语言,简单的设计往往意味着较弱的表达能力,工程师也需要使用更多时间编写重复的逻辑。Go 语言从发布到今天已经过去了 10 多年,向 Go 语言添加泛型的讨论也从 2010 年一直持续到今天。很多人都认为 Go 语言永远不会加入泛型,然而这不是正确的结论,Go 语言很可能会在第二个主要版本中加入泛型。 »

2019 年总结 · 拥抱变化

又到了写年终总结的日子,这应该是博客里少有的扯淡文章,写这篇文章的初衷是想让自己认真思考一下与去年相比,今年的自己有哪些成长和变化。如果说 2018 年是作者服务端技术成熟的一年,那么 2019 年是思想转变、心态开放的一年,作者能以更加开放的心态面对不同领域的知识。 »

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

TCP 协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过 TCP 协议传输,然而 TCP 在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折磨时,你可能都不知道这一切可能都是 TCP 协议造成的。本文会分析 TCP 协议为什么在弱网环境下有严重的性能问题。 »

为什么 Redis 快照使用子进程 · Why's THE Design?

虽然我们经常将 Redis 看做一个纯内存的键值存储系统,但是我们也会用到它的持久化功能,RDB 和 AOF 就是 Redis 为我们提供的两种持久化工具,其中 RDB 就是 Redis 的数据快照,我们在这篇文章想要分析 Redis 为什么在对数据进行快照持久化时会需要使用子进程,而不是将内存中的数据结构直接导出到磁盘上进行存储。 »

为什么 MySQL 使用 B+ 树 · Why's THE Design?

为什么 MySQL 使用 B+ 树是面试中经常会出现的问题,很多人对于这个问题可能都有一些自己的理解,但是多数的回答都不够完整和准确,大多数人都只会简单说一下 B+ 树和 B 树的区别,但是没什么真正回答 MySQL 为什么选择使用 B+ 树这个问题,我们在这篇文章中就会深入分析 MySQL 选择 B+ 树背后的一些原因。 »

为什么基础服务不应该高可用 · Why's THE Design?

作者在去年使用过 Google Cloud 平台提供的 Kubernetes 来管理生产环境的集群,然而在托管的过程中却经历了一些比较严重的线上事故。事故刚刚出现时作者曾经也想去责怪和质疑谷歌云服务的稳定性,但是在随后的分析中得出了另一个结论『你的基础服务其实不应该高可用』,我们在这篇文章就会为各位读者分享作者产生这一观点的原因。 »

技术文章配图指南

这可能是一篇很多博客的读者都期待的文章,我最终还是决定说一说『如何为技术文章配图』这一话题,过去的几年一直都有非常多的读者在博客、微博和公众号下面提出这样的问题 —— 『你的图是用什么工具画的?』,希望在这篇文章之后不会有人再问『你的图片是用什么画的』,因为使用什么工具并不重要。 »

为什么 MD5 不能用于存储密码 · Why's THE Design?

很多软件工程师都认为 MD5 是一种加密算法,然而这种观点其实是大错特错并且十分危险的,作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞,我们在生产环境的任何场景都不应该继续使用 MD5 算法,无论是对数据或者文件的内容进行校验还是用于所谓的『加密』。这篇文章的主要目的是帮助读者理解 MD5 到底是什么,为什么我们不应该继续使用它,尤其是不应该使用它在数据库中存储密码,作者也希望使用过 MD5 或者明文存储密码的开发者们能够找到更加合理和安全的方式对用户的这些机密信息进行存储。 »

为什么 DNS 使用 UDP 协议 · Why's THE Design?

相信 DNS 使用 UDP 协议已经成为了软件工程师的常识,对计算机网络稍有了解的人都知道 DNS 会使用 UDP 协议传输数据,但是这一观点其实不是完全正确的,我们在这里就会详细分析『为什么 DNS 会使用 UDP 传输数据』以及『为什么 DNS 不止会使用 UDP 传输数据』两个问题,希望能够帮助各位读者理解 DNS 协议的全貌。 »

为什么你应该使用 Git 进行版本控制 · Why's THE Design?

Git 是 Linus 在 2005 年开发出的版本控制系统(Version Control System),演化至今已经成为了最流行和最先进的开源版本控制工具,不过仍然有很多的公司和团队还在使用 SVN 或者 CVS 对项目进行版本控制,部分公司确实有一些可能合理的原因来维持现状,但是使用 Git 在绝大多数的场景下都能让我们的开发和合作变得更加高效。很多关于 Git 与其他版本控制工具的对比文章和讨论都已经有着相当久的年头了,我们目前面对的开发场景与几年前有很多不同,而这些不同的版本控制工具也各自演化,不过作者始终认为 Git 是目前最高效的工具,这都是由顶层的设计思想决定的,我们今天就来看一看『为什么你应该使用 Git 进行版本控制』。 »

为什么 TCP 建立连接需要三次握手 · Why's THE Design?

TCP 协议是我们几乎每天都会接触到的网络协议,绝大多数网络连接的建立都是基于 TCP 协议的,学过计算机网络或者对 TCP 协议稍有了解的人都知道 —— 使用 TCP 协议建立连接需要经过三次握手(three-way handshake)。如果让我们简单说说 TCP 建立连接的过程,相信很多准备过面试的人都会非常了解,但是一旦想要深究『为什么 TCP 建立连接需要三次握手?』,作者相信大多数人都没有办法回答这个问题或者会给出错误的答案,这边文章就会讨论究竟为什么我们需要三次握手才能建立 TCP 连接? »

为什么使用通信来共享内存?· Why's THE Design?

『不要通过共享内存来通信,我们应该使用通信来共享内存』,这是一句使用 Go 语言编程的人经常能听到的观点,然而我们可能从来都没有仔细地思考过 Go 语言为什么鼓励我们遵循这一设计哲学,我们在这篇文章中就会介绍为什么我们应该更倾向于使用通信的方式交换消息,而不是使用共享内存的方式。 »