在上一篇
这篇文章,我们就来一起走完这‘最后一公里’。我们将把 PoC 架构一步步演进为稳健的生产级架构,并深入探讨在功能日益强大的同时,如何精打细算,将每一分钱都花在刀刃上,实现功能与成本的双赢。
某个深夜,在完成一次的码重构后,我靠在椅子上,忽然有了一个想法:我们如此痴迷于为软件寻找最佳架构,那我们的人生呢?我们是否也应该成为自己人生的首席架构师?这个想法最终促成了这篇文章,希望能与每一个在世界里探索的你,共同思考。
作为一名开发者,我们常常痴迷于寻找“最好的架构”。是微服务,还是单体?是事件驱动,还是分层设计?我们争论不休,试图在项目启动之初,就绘制一张完美的蓝图,一劳永逸。
但或许,我们早已在无数次深夜的重构中领悟:最好的架构,不存在于图纸上,而存在于一次次的迭代、试错和优化之中。
这像极了我们的人生。
在之前的物联网项目中,由于历史原因,我们的设备通过 HTTP 轮询的方式与服务端交互,这套机制在项目初期看似简单直接,但随着业务量的增长,问题也逐渐暴露出来。
这种模式的痛点非常具体:
痛定思痛,我们意识到必须寻找一种更现代、更高效的通信方案。团队需要的是一套无状态、易拓展、支持双向通信的架构。经过一番调研和技术选型,MQTT 协议进入了我们的视野。考虑到公司所有基础设施都在 AWS 上,我们自然而然地将目光投向了 AWS IoT Core。
本文将完整复盘我们团队是如何从零开始,基于 AWS IoT Core 构建 MQTT 通信体系的全过程,分享其中的架构设计思考、关键决策和一些“踩过才知道”的实践心得。
注:本文基于 AWS 架构,需要您对 AWS 服务有基本的了解。对于 AWS 官方文档已有的详细步骤,本文将不再赘述,而是聚焦于架构设计和经验分享。
又是一个被加班修复生产 Bug 支配的深夜。
起因是欧洲团队一个看似“微小”的提交,却像一只南美洲的蝴蝶,在上海办公室里掀起了一场关于版本发布的巨大风暴。作为负责平台稳定性的上海团队,我们不得不紧急加班,逐行排查代码,那种感觉,就像是走在摇摇欲坠的钢丝上,而远在地球另一端、早已下班享受家庭时光的同事,就是那个时不时晃动一下钢丝的人。
不久前,我将博客从 Hexo 迁移到了 Vuepress 并启用了 Plume 主题。内容搬迁完成后,在迁移 Google Analytics 来统计流量时遇到了问题。
之前在 Hexo 中,我使用的主题支持 Google Analytics 插件,只需要在主题配置文件中设置 Google Analytics ID 即可。
Vuepress 作为一个知名的项目自然也少不了这些插件。在官网搜索后发现果然有一个名为 @vuepress/plugin-google-analytics
的插件,它可以在 Vuepress 中插入 Google Analytics 脚本。
于是照着官方文档一步一步做了下来,结果并没有像预想中那样正常工作。由于对 Vuepress 并不熟悉,我陷入了困境。
这是一篇拖了有些日子的文章,记录我参加 AWS 2025 上海技术峰会 Day 1 后的一些观察和思考。今年的主题毫无意外地聚焦于 AI,与四年前“上云”的主题相比,技术的浪潮又翻涌到了新的高度。
峰会上,许多 AWS 的合作伙伴分享了他们的成功经验,其中安克创新的案例让我印象深刻。然而,真正触动我的,并非这些成功故事本身,而是背后揭示的几个关键趋势。接下来,我将围绕三个核心主题,分享我的见解。
在聊聊我用过的机械键盘里介绍了我在去年入手一把 HHKB Type-S。在 渐渐熟悉了 NeoVim 后也是越来越顺手。
在上个月还入手了一套山葵键帽来增加一下春天的气息。
然而在换好键帽不久就发现在电脑唤醒后,键盘蓝牙链接不上的问题。
之前 AWS 的工程师来公司介绍 AWS Q Developer(以前的 Code Wisper)。其突破对话框,可以直接在命令行执行各种指令的能力着实让人心动。
后面和朋友聊天时,朋友推测应该是 MCP 集成的比较好。于是在想有没有不用打开 Windsurf 就能调用 MCP 的客户端?(其实 Claude 就是,只是当时并不知道)
在 Windsurf 的一次更新后,发现多了个 MCP 服务选项。外加多次在猫鱼周刊上看到相关文章,便开始了解和关注 MCP。
我自己理解大模型和 MCP 类似 VSCode + 各种插件。MCP 可以让大模型通过通用协议调取不同资源。
利用 MCP 的能力可以让大模型跳出对话框,直接对系统进行操作。人就可以免去复制黏贴的步骤,直接下指令。
黄叔有一篇非常易懂的实践文章 10分钟搞定高德地图MCP!我用AI解决了约会地点选择难题 ,看完就能明白 MCP 在其中的作用。
原文地址: Node.js Now Supports TypeScript Natively: Everything You Need to Know 作者: Lizz Parody
原本发表于 2025 年 3 月 18 日。因为工作关系对 Node.js 支持 TypeScript 比较关注,就顺手记录一下自己关注的部分。
本文并非原文的直接翻译,仅挑选出了个人关注的部分。感兴趣的朋友可以去原文查看完整内容。
上周看了阿猫的使用 Cursor 进行 Code Review(简易版)后,大受启发。随即打开我的 Windsurf,看看能否也通过配置相关规则,挖掘一下潜力。
作为构建浏览器的人,我需要解析大量的 URL。一部分是为了验证它们,另一部分是为了规范或者获取 URL 中的某些部分。浏览器中的 URL API 可以让你做到这一点,但其体验并不理想。
new URL()
的 new
代表它可以被用作构造函数:调用它可以创建一个新的 URL 实例。但当你传入一个无法被解析的 URL 时,它就会抛错。因此,你需要编写错误处理的代码。
如果你不这么做,那得不到处理错误会中断你的 JS 代码。下面的代码看上去不错,但如果 urlstring
格式错误,它就会终止:
const urlstring = "this is not a URL";
const not_a_url = new URL(urlstring);
// Uncaught TypeError: URL constructor: "this is not a URL" is not a valid URL.
因此,你需要将它们放到 try/catch 中,用来捕获错误。
码农 10 年,用过近 10 把键盘。从有线到无线、全配列到 60% 配列都有。恰好翻到了一些键盘的照片,索性也来聊聊我用过的那些键盘。
键盘是需要磨合的,根据每个人的使用习惯、使用场景以及个体感受不同而不同,并没有一个固定的标准。尽管用过不少,我自认还是属于键盘小白范围,也没有玩过客制。本文也完全是个人主观感受。
第一把机械键盘,在日本工作时跑了半个秋叶原才找到的一把英语配列键盘。当时并不懂,只听说青轴声音清脆手感好,就入手了。
- 原文地址:https://betterprogramming.pub/typescript-with-go-rust-errors-no-try-catch-heresy-da0e43ce5f78
- 作者:Mateusz Piorowski
那么,让我们先从我的一些背景开始。我是一名十年左右经验的软件开发者。最初使用 PHP,后来转到了 JavaScript。
我开始在 5 年前使用 TypeScript,从那时起,我便再也没有回到过 JavaScript。在我使用 TS 的那一刻,我认为它是世界上最好的编程语言。每个人都喜欢它;每个人都会用它……它就是最好的,不是吗?是这样吗?真的是这样的吗?
- 原文地址:https://www.builder.io/blog/structured-clone
- 原文作者:STEVE SEWELL
你知道现在 JavaScript 有一种原生的深拷贝方法吗?
没错,就是 structuredClone
方法。该方法已内置于 JavaScript 运行时中。(译者注:Nodejs > 17)
const calendarEvent = {
title: "Builder.io Conf",
date: new Date(123),
attendees: ["Steve"],
};
// 😍
const copied = structuredClone(calendarEvent);
你是否注意到在上面的例子中,我们拷贝整个对象同时也拷贝了内嵌的数组甚至是 Date
对象。
一个爱折腾的技术宅
上海