给软件开发者准备的优质简报,每日阅读 10分钟


Tesla kills Autopilot, locks lane-keeping behind $99/month fee

340 pointsLinkComment(361)Share

特斯拉取消Autopilot,车道保持功能纳入99美元/月FSD订阅

  • 特斯拉宣布停用Autopilot品牌,2月14日起将车道保持等辅助驾驶功能统一纳入FSD品牌,原有的8000美元一次性购买选项被取消,仅保留99美元/月的订阅服务
  • 加州一名行政法法官裁定特斯拉存在欺骗性营销——暗示车辆可自动驾驶,暂停其在加州的汽车销售许可(暂缓60天执行),这一监管裁决是促成此次品牌变更的直接催化剂
  • 马斯克在社交媒体上表示"99美元月费将随FSD能力提升而上涨",并强调真正的价值跃升在于实现"无人监督的完全自动驾驶",届时用户可在车内使用手机或睡觉
  • 特斯拉正面临销售下滑、利润萎缩及排放信用额度减少的多重困境,寻求经常性收入以应对财务压力,这与通用汽车、宝马等车企推出订阅服务的行业趋势一致
  • 有评论指出此举可能旨在刺激Q1销售——消费者若得知一次性购买选项即将取消,可能加速购车决策,这与去年特斯拉通过税收优惠刺激Q3销量的策略类似

How I estimate work

503 pointsLinkComment(298)Share

我作为资深软件工程师如何进行工作估算

  • 软件项目估算本质上是不可能的:软件工程的大部分工作都是探索性的"研究"——识别先例、梳理系统影响等,只有非常小且被充分理解的任务才能被准确估算,而未知工作总是占据90%的时间。
  • 估算的政治工具属性:估算并非由工程师真正决定,当某个VP非常想要某个项目时,团队会被施压降低估算;而对于不重要或用来"占位"的项目,估算则会被鼓励提高。估算是供非工程人员用于项目优先级谈判的工具。
  • 估算流程是颠倒的:不是根据工作来确定估算时间,而是管理层已有预期时间,团队再根据这个时间限制反向设计可行方案——有一周时间就做一周能完成的事,有六个月就做六个月能完成的事。
  • 作者的估算方法:首先收集政治背景信息,带着管理层的预期估算去检视代码,关注未知风险而非已知工作,向管理层返回风险评估和多方案选择(如直接完成但有延期风险,或绕过某些模块以赶上deadline),而非具体的"四周"数字。
  • 建立信任,只在真正必要时说"不可行":如果团队总是对所有估算都push back,当真正遇到技术上不可能的项目时就不会被信任;只有平时做出务实的估算来积累信任,关键时刻才能用估算向上传递项目确实无法完成的信号。

A macOS app that blurs your screen when you slouch

321 pointsLinkComment(117)Share

Posturr:macOS姿势检测提醒应用

  • Posturr是一款macOS应用程序,利用苹果Vision框架进行实时姿势检测,当检测到用户弯腰驼背时,屏幕会渐进式模糊以提醒用户调整坐姿,姿势改善后模糊立即消失
  • 应用采用本地化图像处理技术保护隐私,所有检测在本地完成,支持渐进式屏幕模糊和多显示器显示,采用通用二进制格式(arm64 + x86_64)
  • 菜单栏提供完整的控制选项,包括状态显示、监控开关、灵敏度调节(四档)、盲区容错设置、兼容模式切换以及重新校准功能
  • 该开源项目采用MIT许可证,提供基于文件的命令行接口,系统要求macOS 13.0或更高版本,需授予摄像头权限,支持外接摄像头选择
  • 首次启动需通过右键"打开"方式绕过Gatekeeper安全验证(因应用未签名),目前项目获得298个star和8个fork,有2位贡献者

I added a Bluesky comment section to my blog

289 pointsLinkComment(100)Share

我为博客添加了 Bluesky 评论功能

  • 作者的博客采用静态生成并托管在 CDN 上的架构,原本一直没有评论功能,因为维护动态评论服务需要额外租用 VPS 或云服务,充当"无偿兼职运维工程师"既昂贵又耗时
  • 选择 Bluesky 而非 Disqus、Twitter 或 giscus 的原因:Bluesky 基于开源社交协议 AT Proto 构建,不易被恶意收购方控制;作为成熟的社交平台,Bluesky 能处理账户验证、托管、存储、垃圾信息和审核等全部复杂工作,且拥有开放的公共 API,便于直接嵌入网站
  • 技术实现基于 React Server Components 和 Parcel 构建,使用 MDX 写作,在每篇文章的 metadata 中添加 bskyPostId 字段(通过 Zod schema 验证),使用 TypeScript SDK (@bluesky/api) 调用 Bluesky 的 getPostThread API 端点获取回复,并采用 TanStack react-query 管理请求状态和错误处理,整个实现约 200 行代码
  • 作者选择自己实现而非直接使用 Cory Zue 的 bluesky-comments 包,主要是为了自定义样式以完全匹配网站风格,同时为未来功能扩展保留灵活性——实现代码量小,其他人也可以参考源码自行构建
  • 最初曾计划支持 OAuth 发帖功能(作者确实让认证流程运行成功),但因构建良好的发帖和回复 UI 难度高,会迅速演变成开发一个完整的 Bluesky 客户端,且用户仍需登录认证,过程并不比直接在平台上发帖更简便而放弃;目前实现为只读模式,仅提取回复的纯文本内容,通过缩进和左边框展示嵌套结构以适配移动端,暂不支持图片等富媒体附件
  • 文章发布后收到大量积极反馈,许多用户表示想要借鉴这一方案,有人专门创建账号测试功能,有人询问是否可发布独立包以便 Pelican 等静态站点使用,WordPress 用户希望能更简便地集成;还有人询问是否支持点赞/转发数显示、附件显示、垃圾评论管理以及嵌套深度限制;作者表示由于实现相对简单且部分选择较为定制化,暂不考虑发布独立包,但指出 Cory Zue 的版本可以通过脚本标签轻松集成

Doom has been ported to an earbud

242 pointsLinkComment(78)Share

通过耳机游玩《DOOM》的互联网连接项目DOOMBUDS

  • 这是一个将1993年经典游戏《DOOM》移植到Pinebuds Pro开源固件耳机上并支持互联网远程游玩的实验性项目,玩家可通过排队系统远程游玩运行在耳机的DOOM
  • 控制方式包括:WASD移动、方向键左右视角、空格射击、Shift冲刺、E键与物体交互/复活、数字键切换武器、Tab键显示地图,失败后按E复活
  • 系统架构由四部分组成:耳机端DOOM移植程序、串口服务器(桥接设备与Web服务器并将MJPEG流转码至Twitch)、Web服务器(管理队列、转发按键请求、显示视频流)及静态网页前端
  • 视频传输采用UART串口方案(2.4Mbps可用带宽),DOOM帧缓冲为320×200像素(96KB),配合MJPEG压缩技术,理论帧率范围22.2-27.3 FPS,实际运行约18 FPS,受限于JPEG编码的CPU性能
  • 硬件优化措施:将CPU从默认100MHz超频至300MHz并禁用低功耗模式;使用Squashware将4.2MB的DOOM 1共享软件资源压缩至1.7MB以适应4MB闪存限制;内存通过禁用协处理器从768KB提升至992KB可用,并采用预生成查找表、常量优化等手段减少内存占用
  • 排队机制:当玩家排队至前5位时,系统自动切换至低延迟MJPEG视频流以降低带宽成本,项目完全开源,代码仓库包括DOOMBuds(耳机端DOOM移植)和DOOMBUDS-JS(浏览器交互端)

Using PostgreSQL as a Dead Letter Queue for Event-Driven Systems

107 pointsLinkComment(27)Share

使用 PostgreSQL 作为事件驱动系统的死信队列

  • 失败场景与死信队列的引入:在 Wayfair 参与事件驱动的业务报表系统时,面临 API 故障、消费者崩溃、事件字段缺失或格式错误等多种失败场景,需要将无法处理的事件重定向到死信队列而非直接丢弃或阻塞整个管道
  • 为何选择 PostgreSQL 而非 Kafka:Kafka 作为死信队列存在严重的可见性问题——难以按失败原因查询、无法灵活重试特定事件子集,回答"昨天哪些事件失败及原因"需要额外工具支持,而 PostgreSQL 的查询能力使其成为更优选择
  • DLQ 表结构设计:使用 JSONB 存储原始事件 payload 保持灵活性,status 字段(PENDING/SUCCEEDED)简化生命周期管理,retry_count 和 retry_after 字段控制重试行为,所有时间戳字段支持审计和运维分析
  • 分布式安全重试机制:结合 ShedLock 实现分布式锁确保单实例执行重试任务,利用 PostgreSQL 的 FOR UPDATE SKIP LOCKED 语法在多实例环境下安全地并发处理不同记录,配置为每 6 小时运行一批次、最多重试 240 次
  • 架构价值与设计哲学:PostgreSQL 负责持久化存储和故障可观测性,Kafka 继续承担高吞吐量事件摄入的核心职责,通过让每个系统发挥所长,最终实现故障处理的可预测、可审计,达到"无聊但可靠"的运维目标

Show HN: TUI for managing XDG default applications

91 pointsLinkComment(27)Share

xdgctl:管理 XDG 默认应用程序的 TUI 工具

  • 项目定位:基于终端的用户界面工具,用于在 Linux 系统上可视化管理 XDG 默认应用程序,无需直接操作 xdg-mime 命令
  • 技术栈与授权:采用 C 语言开发,依赖 GLib/GIO 和 termbox2 库,遵循 BSD-2-Clause 开源协议;目前拥有 96 颗星标,由 2 位贡献者维护
  • 核心功能:支持按类别(浏览器、文本编辑器等)浏览应用程序,当前默认应用以 * 标记显示,可在界面中直接设置默认应用程序
  • 操作方式:上下箭头导航类别或应用列表,右箭头或 Tab 键切换到应用列表,左箭头返回类别列表,Enter 键确认设置,Esc 或 q 键退出
  • 构建与安装:需安装 glib-2.0、gio-2.0、gio-unix-2.0 开发库及 clang 或 gcc 编译器;通过 git 克隆后执行 make 编译和 make install 完成安装,支持自定义 PREFIX 路径

ANN v3: 200ms p99 query latency over 100B vectors

79 pointsLinkComment(27)Share

ANN v3:百亿级向量搜索实现200毫秒p99延迟

  • turbopuffer发布ANN v3,在单一索引中支持1000亿个1024维向量(f16精度,总计200TiB数据),目标是在超过1000 QPS的高并发下实现**≤200毫秒**的p99查询延迟
  • 采用分层聚类技术(基于SPFresh算法并扩展SPTAG图索引),构建100倍分支因子的宽浅树结构;冷查询时将对象存储往返次数限制为树的高度,仅需搜索500个数据簇(每簇100向量)即可达到目标召回率
  • 引入二进制量化(RaBitQ算法),将向量压缩16-32倍,使量化向量能够驻留在更高带宽的内存层级;通过置信区间估算进行初步筛选,仅重排序<1%的原始精度向量以保持召回质量
  • 二进制量化使算术强度提升64倍(f16每2字节对应1次操作→二进制每2字节对应16次操作×4次复用),系统从存储带宽受限转变为计算受限,理论吞吐量从100 QPS跃升至10,000 QPS
  • 实际生产负载下系统饱和在1000 QPS(目标的10%),通过AVX-512的VPOPCNTDQ指令优化popcount操作,微基准测试性能提升30%,端到端吞吐量提升5%
  • 采用随机分片将索引分布至多台存储优化型虚拟机(配备10-40TiB本地NVMe),查询广播至所有分片后合并全局top-k结果,实现任意规模的横向扩展

Show HN: Bonsplit – Tabs and splits for native macOS apps

150 pointsLinkComment(22)Share

Bonsplit - 原生 macOS 标签栏与分屏布局库

  • 专为 macOS SwiftUI 应用设计的自定义标签栏和布局分割库,支持通过 Swift Package Manager 安装(.package(url: "https://github.com/almonk/bonsplit.git", from: "1.0.0")),提供开箱即用的 120fps 流畅动画、拖拽重排功能和完整的键盘导航支持
  • 核心功能涵盖创建带图标和脏标记的标签、水平或垂直分割任意窗格、动态更新标签属性(标题、图标、脏状态),以及程序化焦点导航(支持在窗格间按方向移动焦点或直接聚焦特定窗格)
  • 提供三大核心 API 组件:BonsplitController(主控制器,负责标签和窗格的全部操作)、BonsplitDelegate(事件回调协议,涵盖标签创建/关闭/选择/移动、窗格分割/关闭/聚焦等生命周期钩子)、BonsplitConfiguration(精细的行为与外观配置)
  • 内容视图生命周期管理支持两种模式:.recreateOnSwitch(切换时重建,低内存占用,适合简单内容)和 .keepAllAlive(保持所有视图存活,保留完整状态,适合复杂视图和表单);新标签位置策略支持 .current(插入至当前聚焦标签后)和 .end(始终插入列表末尾)
  • 包含三种预设配置:.default(所有功能启用)、.singlePane(单窗格模式禁用分割)、.readOnly(只读模式禁止所有修改),并支持自定义外观参数如标签栏高度(默认 33)、标签宽/高度限制、窗格最小尺寸和动画时长(默认 0.15 秒)
← 2026-01-24 2026-01-25 → 2026-01-26