阅读视图

发现新文章,点击刷新页面。

科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计

这里记录每周值得分享的科技内容,周五发布。

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

封面图

中国首艘火箭回收船"星际归航"本月成功下水,它的40米x60米的甲板,将用于火箭在海上降落。该船的拥有者是民营航天公司"星际荣耀"。(via

GitHub 工程师谈系统设计

上周,我读到一篇文章,作者是 GitHub 的高级工程师肖恩·戈德克(sean goedecke)。

文章题目是《我所知的良好的系统设计》

读完后,我觉得写得不错。GitHub 工程师总结经验,教大家设计一个良好的系统,不是空泛之谈。下面是我的一些摘录。

1、

程序设计是组装代码,系统设计是组装服务。

程序设计的组件是变量、函数、类等,系统设计的组件是服务器、数据库、缓存、队列、事件总线、代理等。

2、

如果一个系统很长时间不出错,它的设计就是良好的。

如果你进一步看了代码,脱口而出:"哈,这比我想的要简单",或者"这个部分不用我操心,即使出问题也容易解决",它的设计就是优秀的。

3、

良好的系统设计,总是从一个有效的简单系统发展而来。千万不要从零开始设计一个复杂的系统。

4、

系统设计的难点在于状态。尽量采用无状态组件,最小化"有状态组件"的数量。

状态的复杂性在于,你无法简单地重启服务。一旦出错,往往需要手动修复状态。

5、

状态需要保存在数据库。数据库是最重要的系统组件,用来管理状态。

数据库的设计目标是每张表易于理解:打开看一下表结构,就能大致了解存储的数据内容及其原因。

千万不要采用复杂的表结构(也就是数据结构),会给代码带来极大的复杂性和性能约束。

6、

数据库往往是系统瓶颈,因为每个页面请求可能要调用数十次、数百次数据库,而且是按顺序调用。

为了避免瓶颈,数据库可以做成一个写入节点和多个只读副本。数据查询都发往只读副本,数据写入发往写入节点。

写入节点与只读副本之间,存在数据复制延迟。如果更新一条记录后,你需要立即读取它,那么可以将数据放入内存,写入数据库成功后从内存读取。

7、

耗时的操作要拆分出来,放在后台作业(即系统外部的单独服务),排队完成。

后台作业主要分成两个组件:一个队列服务,一个作业运行器(从队列中获取任务并执行)。

队列任务的软件,可以用 Redis(需要尽快执行的任务),也可以用数据库(不着急的任务)。

8、

如果数据的生成速度和读取速度不匹配,经典解决方案就是缓存。

缓存的最简单做法,就是把数据保存在内存,否则就使用专门的键值存储软件(比如 Redis 或 Memcached),后者的好处是多个服务器可以共享缓存。

初级工程师希望缓存所有内容,而高级工程师希望尽量少用缓存。因为缓存是状态的来源,不可避免需要校验状态和处理状态过期。

9、

除了缓存和后台作业,大型系统通常还有事件中心,一般用的是 Kafka。

事件中心也是一个队列,存放的是"某件事发生了"的消息。比如,用户注册触发了"新帐户创建"事件,该事件就放入事件中心,然后由事件中心去通知订阅该事件的多个服务:发送欢迎电子邮件、设置个人空间等等。

事件中心适用于,发送事件的代码不关心其他服务如何处理事件,或者事件量很大且对响应时间不太敏感。

不要过度使用事件,很多时候,更简单的做法是让一个服务请求另一个服务的 API。

为了便于除错,所有日志最好都放在一起,你可以立即看到另一个服务的响应。

10、推拉

如果数据需要传送到多处,有拉取(pull)和推送(push)两种选择。

一般来说,拉取比较简单(比如大多数网站采用的轮询),推送更节省资源,不需要用户主动请求数据,一旦后端数据发生变化,服务器主动将数据推送给每个客户端。

如果你确实需要向100万个客户端提供最新数据(就像 GMail 那样),应该采用推送还是拉取?这要视情况而定。如果采用推送,就要把每次推送放入一个事件队列,并让一大群事件处理器从队列中拉取数据并推送。如果采用拉取,就要部署一堆(比如100台)快速的只读缓存服务器,处理所有读取流量。

谷歌的两个 AI 新产品

谷歌本周公开了两个新产品。

1、Imagen 4 模型

这是谷歌最新的"文生图"模型,可以在官网免费使用,参见介绍文章

我觉得,图片生成速度很快,效果相当好(比如下图"机器人拿着一块红色滑板")。

2、Learning About

Learning About 是谷歌的新型学习平台,使用 AI 生成学习教程。

先输入你想要学习的主题,比如 Java 语言。

它会返回一篇简单的教程,

除了总体介绍,里面还会列出各种学习主题,可以进一步深入学习。

科技动态

1、英国内政部宣布,英国的警车将加装面部识别系统

警车一边开,一边扫描路上行人的面孔,跟警方的数据库比对。如果发现可疑人士,就发出警报。

据称,该技术在伦敦试运行期间,12个月内已抓到了580名嫌疑人。

2、很多人喜欢旅行时邮寄明信片,作为纪念。

但是,明信片需要手写,而且只能传递文字,在手机时代显得很落伍。

一家美国公司最近推出了 Keeps(上图)。用户在它的网站,上传照片,并留下一段语音(下图)。

它会把照片打印成明信片,背后是一个二维码,然后把明信片寄给你指定的收件人。对方收到后,手机扫描二维码,就能听到你留下的语音。

3、维基百科的条目,有各种语言的版本。你知道最多语言的条目,是哪一篇吗?

出乎意料,居然是一个名不见经传的艺术家,名叫大卫·伍德沃德(David Woodard)。

他的条目居然有335种语言版本,是所有条目中最多的。

他的大部分语言版本都是一个叫做 Swmmng 的用户创建的,而且 IP 地址也一样,时间跨度持续了十多年。

很显然,这是一起自我推销行为,这个艺术家为了出名,为自己生成各种语言的维基百科条目。现在,他的大部分语言版本已被删除,只留下20种语言。

文章

1、GitHub Models 的免费 AI 服务(英文)

我刚刚知道,GitHub 提供免费的 AI 模型调用,有 GPT-4o、DeepSeek-R1、Llama 3 等模型,不过有用量限制。

2、用 JavaScript 生成迷宫(英文)

本文用通俗的语言,介绍一种生成迷宫的简单算法,给出 JS 的实现。

3、Cloudflare 不是 CDN(英文)

Cloudflare 提供无限流量的免费 CDN,那么为什么它还有收费的 CDN?本文告诉你,除了流量,CDN 还有其他指标。

4、Git 如何处理大文件(英文)

几十 MB 的大文件,不适合放入 Git 仓库。如果一定要放,要使用一个扩展 Git LFS。但是它不太好用,作者提出改进建议。

5、10个有用的 VS Code 插件(英文)

作者介绍10个他已经离不开的 VS Code 插件。

6、TCP 初始拥塞窗口的问题(英文)

TCP 协议有一个"拥塞窗口"的设计,会根据网络状况,自动调整发送数据包的数量。本文通俗地解释这个概念,并提出改进的方案。

工具

1、doxx

终端查看 docx 文件的命令行工具。

2、IntraScribe

面向企事业单位内网环境的一个"语音转文字"的管理协作平台。(@weynechen 投稿)

3、P2P Remote Desktop

一个开源的 Windows 远程桌面工具,直接运行可执行文件打开远程桌面,无需配置和安装。(@miroslavpejic85 投稿)

4、CuteClock

一个开源硬件项目,基于 ESP8266 的智能时钟,可以显示时间和天气,支持小爱同学语音控制,自带 Web 和小程序客户端。(@AkenClub 投稿)

5、CleanYourMac

开源的 Mac 应用,智能清理工具,使用 AI 分析要删除的文件。(@GitDzreal93 投稿)

6、Next QR Code Generator

Firefox 浏览器的开源插件,为页面生成类似 Chrome 的二维码。(@liuliangsir 投稿)

7、Translator 快速翻译

Chrome 浏览器的离线翻译插件,基于浏览器新的 Translator API 和 Language Detector API,不用网络也能翻译。(@AnYi-0 投稿)

8、Jupyter Notebook 转换网站

这个网站可以将 ipynb 文件转化为 PDF、HTML 和 Python。(@CurioChen77 投稿)

9、Docker Pull Script

一个 Python 脚本,用于从指定镜像源下载 Docker 镜像,支持并发下载、智能缓存(layer 增量更新)。(@luckfu 投稿)

10、Make Graph

在线图表制作网站,支持主流图表类型,可导出 SVG。(@bimohxh 投稿)

另有一个类似工具 ChartFromText,输入数据,在线生成各种图表。(@StevenWuHao 投稿)

AI 相关

1、OpenAI Progress

OpenAI 的官方项目,展示 AI 的发展历程:每一年,同样的提示语,不一样的输出。

2、MCP Playground

这个 Web 应用可以用作 MCP 客户端,指定 AI 模型和 MCP 服务器,在线使用。(@mcpexplorer 投稿)

3、Coro Code

基于终端的 AI 编码代理,Claude Code 的开源替代品。(@Blushyes 投稿)

4、Claude Code Status Bar Monitor

Claude Code 的插件,实时显示使用量和重置时间等信息。(@leeguooooo 投稿)

资源

1、中小学语文示范诵读库

中央人民广播电台中小学语文示范诵读库的 Web 前端,课文按年级、学期分类。(@ZedeX 投稿)

2、在线硬件测试平台

网页测试各种硬件(GPU、屏幕、网络、摄像头、声音、鼠标、键盘)。(@linhuaqian 投稿)

3、业余无线电执照考试模拟(2025 题库)

基于官方最新题库构建的在线模拟与练习的 Web 应用。(@AlliotTech 投稿)

4、Citywalki

这个网站让你感受在世界200多个城市步行/开车/飞无人机。选择城市和移动方式后,它会全屏播放相应的 Youtube 视频,体验不错。

图片

1、滚动时间最长的滚轮胎

推荐 Youtube 的一个视频

一群艺术家爬上智利最高的沙丘之一,在上面扔下一只轮胎,用无人机全程拍摄,看看它会滚动多久。

轮胎在沙漠里,差不多滚动了三分钟,视频就是这三分钟的全程滚动,非常壮观和纾压。

文摘

1、沃兹尼亚克的故事

今年8月11日,是苹果公司联合创始人史蒂夫·沃兹尼亚克 (Steve Wozniak) 75 岁的生日。

网络论坛 Slashdot 转载了新闻媒体关于他的生日报道。有人留言,惋惜地说,如果他没有卖掉苹果股票,早就是世界数一数二的富翁了。

沃兹尼亚克本人看到这条留言,在下面回复了一段话。

"我卖掉和捐赠了所有苹果股票,原因是财富和权力不是我生活的目的。

我更希望自己拥有快乐和幸福。我资助了圣何塞(我出生在那里)的许多博物馆和艺术团体,他们还以我的名字命名了一条街道。

二十年来,我一直公开演讲,收入可能达到1000万美元。这足够我用了。"

这段话令人想起一本介绍苹果公司历史的书籍,里面曾经提到沃兹的故事。

从学生时代起,他就对自己的财富漫不经心。后来有钱了,也依然如此。

他从不记录自己的开销,也懒得听取理财建议。别人寻求帮助时,他经常当场开出支票。

与乔布斯严格保管自己的苹果股票不同,他送给了父母、姐姐和弟弟400万美元股票,送给了朋友200万美元股票。父亲在他车里捡到过25万美元的未兑现支票,感叹说:"像他这样的人不应该有那么多钱。"

有一次,他来到苹果公司大声宣布:"我的律师建议多元化投资,所以我刚刚买下了一家电影院。"但这件事后来引起了一些麻烦。这家电影院位于圣何塞东区贫民窟,放映了一部黑帮电影,引发了社区的抗议。他参加了几次社区会议,听取了当地居民的意见,承诺他的剧院不会放映暴力或色情电影,然后他在空荡荡的、黑暗的剧院里度过了几个下午,坐着不停看电影,扮演审查员的角色。

言论

1、

我计划写一本 Gleam 编程语言的书。但是,AI 已经能非常清晰地解释 Gleam 了,而且还能回应读者的任何要求。

虽然我自信,自己目前写得要比 AI 好,但是实在没有理由,说服自己去这样做。你花数百小时写书,赚到的钱根本不值得这样付出。

有了 AI,我不知道,人们以后写书的动力是什么,大概只会为了乐趣而写作。

-- 《AI 引发的身份危机》

2、

让我难以抗拒的是,与中国打交道比与世界其他任何地方打交道都容易得多。我给中国某人发邮件,对方肯定会在24小时内回复,更有可能在4小时内。

给一家欧盟或美国公司发邮件,通常要等上好几天才能收到回复。在与中国公司打交道时,我从未见过这种情况,一次也没有。而且,他们的 B2B 大型电商平台几乎总是提供全天候在线客服和采购支持。

-- Hacker News 读者

3、

AI 不会减少你掌握新技能所需要付出的努力,只会让你产生不必学习就已经学会的错觉。

-- 《AI 让人产生虚假的掌控感》

4、

可靠、透明的程序通常不符合程序设计者的利益。

-- 尼克劳斯·维尔特(Niklaus Wirth),计算机科学家,图灵奖得主

往年回顾

一份谷歌离职报告(#315)

WiFi 的后面是 LiFi(#265)

互联网最喜欢的行为模式(#215)

全端 App 的时代(#165)

(完)

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2025年8月22日

nvm 安装pnpm的异常解决

关于nvm 如果你是用nvm来管理node版本,正常情况下你的nvm文件夹下是有多个node版本的,像这样: 一般我们通过nvm ls命令就可以查到当前系统中安装的node版本,如果是要切换node版

工程项目中.env 文件原理

概述 目前的工程化前端项目中,不可缺少需要配置环境相关信息,根据环境区分,使用什么变量内容等。 .env 文件在我们项目中非常常见,在 vue-cli 、 create-react-app 、vite

C++之模板函数

你好!很高兴为你讲解C++模板函数。作为初学者,这是一个非常重要的概念,理解它会极大提升你的编程能力。我会用非常详细、循序渐进的方式为你解释。

KLineChart 绘制教程

对前端开发者而言,KLineChart 是个不错的选择 —— 这款基于 HTML5 Canvas 的开源金融图表工具,零依赖压缩包仅 40K,轻量特性很适合集成到各类金融应用中。它不仅支持多数据源渲染
❌