我只提示几个词语,希望你们可以自己找到:
最近、代码、猴子、安全、国内

模型:
glm-4.7 (免费)、 sonnet-4.5(think_mode 加上提示词可以思考)

方法:
firecracker 内部、ssh、.claude/setting.json

如何薅:
可以直接对接到 cc 里面用,20000 积分能用很久很久。重点来了直说关键字:删了 task、key、额度

结束了,最好 github 登录,溯源难。且账号可以 (提示 qq 邮箱),好了教程到这里。

注意!!
国内大安全厂商的东西,抓人一流自己考虑好,别送自己进去(号商无视进去)

本教程只作为安全交流,如果你乱搞那你就自己承担责任雨我无瓜。


📌 转载信息
原作者:
beingS
转载时间:
2026/1/21 21:27:04

项目地址 GitHub - lianwusuoai/img-router

是一个让你使用对话方式 /v1/chat/completions 进行生图和图片编辑的智能路由。

v1.7.3~1.8.9版本升级内容
1.新增webui设置,不用手敲配置文件,直接在webui改即可,可视化改配置
2.新增后端模式,key少的话,直接 客户端-img-router对话即可,key多的话用newapi/gptloat管理
3.增加AI提示词优化引擎,直接中文输出,自动翻译英文,自动扩充美化提示词,言出法随
4.支持文字生图,图片修改(图片编辑),带上下文改图/生图的融合生图
5.支持模型重定向,多渠道一个模型id输出
6.图片画廊,查看生图的提示词和图片
7.本次终于支持多图片生成(会慢,毕竟生成图片多,比较草台)
8.一件修改端口号,点击重启docker就修改,不用去改配置了。
9.输入图片过大自动压缩,减少生图错误。

测试环境 win11+Cherry Studiov 1.7.13,使用/v1/chat/completions 
进行中转件/后端模式进行单图/多图生成。

架构图

Docker Compose 快速安装

git clone https://github.com/lianwusuoai/img-router.git
cd

老用户最好清除下缓存重建下

docker-compose down; docker-compose build --no-cache; docker-compose up -d

我觉得有 bug 按理说应该也有 bug 但是我还没遇到 bug 那就是没 bug 嘻嘻
(有问题可以留言 / 提 issue)







最后,开启赛博打赏
【打赏 1 LDC】【打赏 10 LDC】【打赏 50 LDC】


📌 转载信息
原作者:
lianwusuoai
转载时间:
2026/1/21 21:25:13

知名 AI 图像模型评测平台 DesignArena 近日悄悄开始测试两款此前从未曝光的隐形图像生成模型,代号分别为 「Summerset」 和 「Winterfall」。早期评测显示,这两款模型在对比评测中表现相当亮眼。

当被要求自我识别时:

  • 「Summerset」 始终声称自己是 OpenAI 的模型
  • 「Winterfall」 则表示自己是 Google 的模型

而经过进一步测试,发现根据 Google 的 SynthID 浮水印检测工具,两款模型 生成的图像都包含 Gemini 浮水印。这暗示它们可能来自同一实验室,尽管它们自称的身份不同。




这代表「Winterfall」 可能是 「Nano-Banana-2-Flash」


📌 转载信息
原作者:
BunnHack
转载时间:
2026/1/21 21:23:49

项目开发背景:
主要是为了解决一个很实际的问题:我们想随时快速输入某些提示词,但现有的方案都有点麻烦。

比如说你用 Claude Code 或者 Cursor 这些工具,它们都有自带的 slash 命令。但问题是,每个 slash 命令都要在每个不同的终端里专门配置一遍,我就觉得特别麻烦。而且很多其他提供 AI 服务的项目,根本就不提供 slash 提示词快捷短语这种功能。这时候你要么自己打开文件夹去找,然后手动 Ctrl+C、Ctrl+V,要么就没办法了,特别不方便。

所以我就想,能不能仿照 Windows 上 PowerToys 这个工具箱的设计思路,做一个专门给提示词用的快速粘贴板。就像 PowerToys 一样,你可以通过快速搜索,迅速把指定文件夹下的内容复制出来,简单快捷方便。

而且我们还可以专门为每个提示词打标签,方便管理。为了简化操作,直接用快捷键呼出就好了,然后搜索,还能自动粘贴到对应的输入框里面,相当简单方便。

另外还有个好处,我们可以直接在搜索框里创建新文件,这样就不需要专门跑到提示词目录下去调整了,也可以直接删除和编辑内容。我个人觉得写得还是挺简单方便的,目的就是简单高效。

当然,由于这个项目只是我用一条提示词让 Cursor 跑了几个小时自己跑出来的,所以 UI/UX 上可能会存在一些小缺陷。但比较基础的功能,经过我自己实际使用之后,基本上已经没什么问题了。后续大家如果想要自己二开或者定制化,我个人觉得还是非常好用的。

下面是项目的实际截图。



项目支持直接通过搜索框来添加新提示词,这样就省得打开编辑器专门创建文本了。底层我们直接使用了 VS Code 来作为编辑器,所以如果没有 VS Code 的朋友,可能需要通过其他方式来解决一下编辑器的问题。



📌 转载信息
原作者:
0.6
转载时间:
2026/1/21 21:23:28

从「抄作业」到 AI 自动生成视频的完整方法论

很多创作者在做视频号时都会遇到同一个问题:
为什么看起来很努力,却始终没有稳定的高播放?

原因往往不在执行力,而在起点就错了——
从“原创灵感”开始,而不是从“成功案例”开始。

事实证明,当前阶段最容易跑通的方式不是凭空创作,而是:

先抄作业,再用 AI 把成功经验规模化复制。

下面是一套已经被反复验证、且非常适合短视频平台的完整方法。


一、核心思路:不是抄内容,而是抄「爆款结构」

这里的“抄作业”并不是搬运视频,而是反向工程爆款

  • 不关心某条视频讲了什么
  • 只关心它为什么能火
  • 把“感觉”拆成可复用的结构

整个流程可以拆成四个关键词:

采样 → 归纳 → 再创作 → 自动生成

二、为什么这个方法能跑通?

1️⃣ 爆款不是偶然,而是可重复的结构结果

绝大多数高播放视频,并不是随机出现的,而是满足了以下条件:

  • 前几秒有强烈视觉或行为异常
  • 中段存在明确冲突或失控
  • 结尾有情绪释放或反转
  • 风格高度统一,利于算法识别

单个视频看不出规律,但同一 channel 的 Top 视频几乎一定有共性


2️⃣ 从 YouTube 入手,是最稳妥的起点

YouTube 的优势在于:

  • 样本量大
  • 数据透明
  • 爆款生命周期长

选择一个已经跑通的 YouTube channel,本质是在复用:

  • 已验证的受众偏好
  • 已适配的平台算法
  • 已成熟的内容节奏

3️⃣ NotebookLM 的价值:把隐性经验变成显性规则

NotebookLM 的核心作用并不是“写文案”,而是:

从多个成功样本中,提炼共性模式。

例如:

  • 开头平均在第几秒出现刺激点
  • 冲突是否围绕“规则 / 强迫 / 对抗”
  • 情绪是逐步升级还是瞬间爆发
  • 是否存在固定角色关系(支配 / 反抗)

这一步完成后,爆款不再是“感觉”,而是结构模板


4️⃣ 文本转视频,是 AI 当前最成熟的短视频应用场景

当前 AI 在短视频领域的优势集中在:

  • 夸张动作
  • 强对比画面
  • 明确情绪
  • 简单故事线

当“创意结构”已经由 NotebookLM 给出,
AI 更适合承担的是从创意到画面的执行过程


三、完整可执行流程(SOP)

Step 1:查找 YouTube 火爆 Channel

筛选标准:

  • 同一类型内容
  • 至少 3–5 条百万播放
  • 风格高度统一

Step 2:选取 Top 10 爆款视频

重点关注:

  • 播放量
  • 明显被算法推荐的迹象
  • 评论区情绪密度

Step 3:将视频链接输入 NotebookLM 分析

分析重点放在结构层面:

  • 前 3 秒发生了什么
  • 冲突第一次出现的时间点
  • 情绪如何被放大
  • 是否存在“规则被打破”的瞬间

最终得到的是一个可复用的爆款结构模型


Step 4:让 NotebookLM 生成“类似结构”的新创意

在结构不变的前提下,替换:

  • 场景
  • 道具
  • 主题设定

NotebookLM 在这一阶段输出的,是已经符合爆款结构的新视频创意


四、演示案例:厨房灾难——机器“闹鬼”事件

根据前述步骤,选择一个由 NotebookLM 生成的视频创意,用于展示从创意到视频生成的全过程。

创意名称

厨房灾难:机器“闹鬼”事件(The Haunted Mixer Prank)

创意概念

在制作节日甜点的过程中,人为制造厨房设备故障,形成短暂混乱,再用反转完成喜剧闭环。

核心情节点

  • 设备失控
  • 人物恐慌
  • 荒诞解释
  • 快速反转恢复秩序

五、让 AI 根据该创意生成文本转视频 Prompt

在演示中,并不直接人工编写提示词,而是:

将该创意输入给视频生成模型或多模态 AI,要求其根据创意自动生成文本转视频 Prompt。

并对 AI 提出明确约束:

  • 视频总时长:20 秒
  • 镜头数量:4 个
  • 每个镜头 1 个核心事件
  • 强调视觉、动作和情绪变化

🎬 AI 生成的 Text-to-Video Prompt(20 秒)

A 20-second comedic kitchen prank video.

Scene 1 (0–4s):
Bright home kitchen.
A cheerful female character is happily making holiday desserts.
She overloads a stand mixer with too many ingredients.
The mixer begins shaking violently.

Scene 2 (4–9s):
The mixer malfunctions.
Smoke rises dramatically.
Ingredients splatter everywhere.
The character panics, shouting:
“Unplug it! Unplug it now!”

Scene 3 (9–14s):
The mixer stops.
Close-up of the burnt mixer head.
She stares at it and asks nervously:
“Did I summon a ghost?”

Scene 4 (14–20s):
Comedic reversal.
She pulls out a brand-new mixer.
Smiles calmly and continues cooking as if nothing happened.
Bright, cheerful ending.

Style:
Fast-paced, exaggerated comedy.
Strong facial expressions.
Short-form video style.
No subtitles, no text overlays, no watermarks.

然后选一个文本转视频的模型将提示词输入。


六、为什么这个演示案例具有代表性?

  • 创意来源于结构分析,而非灵感碰运气
  • Prompt 由 AI 基于创意自动生成
  • 冲突、节奏、反转完整可复用
  • 非常适合短视频平台算法偏好

这说明:
当结构正确时,AI 的执行能力已经足够支撑内容生产。


七、结语:内容创作正在进入「工程化时代」

当内容生产开始遵循:

  • 用数据筛选方向
  • 用模型总结结构
  • 用 AI 生成与执行
  • 用批量测试验证结果

创作就不再是玄学,而是一套可以被复用和放大的系统

在这个体系中,“抄作业”不是捷径,而是最低成本、最高成功率的起点
当结构被掌握,所谓的“原创”,自然会不断出现。

本文由mdnice多平台发布

基于 YOLOv8 的电网绝缘子破损与闪络缺陷智能检测系统识别项目 [目标检测完整源码]

一、研究背景与工程问题分析

随着电力系统规模的不断扩大,输电线路和变电设备的运行安全已成为电网运维中的核心问题之一。在众多电力设备中,绝缘子承担着电气隔离与机械支撑的双重任务,其运行状态直接影响电网的稳定性与可靠性。

在长期运行过程中,绝缘子通常会受到以下不利因素影响:

  • 长期高压电场作用导致材料老化
  • 风沙、盐雾、工业污染物附着
  • 高湿环境下易发生表面放电
  • 外力冲击造成瓷裙破损或脱落

由此产生的典型缺陷主要包括 绝缘子破损绝缘子闪络。这类缺陷具有隐蔽性强、分布范围广、人工巡检成本高等特点,一旦未能及时发现,极易引发线路跳闸、设备损毁,甚至区域性停电事故。

传统的人工巡检方式已逐渐暴露出明显不足:

  • 巡检效率难以覆盖大规模线路
  • 高空、野外作业存在安全风险
  • 检测结果依赖个人经验,缺乏一致性

在此背景下,结合无人机巡检、固定摄像头采集手段,引入基于深度学习的视觉检测技术,构建自动化缺陷识别系统,已成为智能电网发展的重要方向。
在这里插入图片描述

源码下载与效果演示

哔哩哔哩视频下方观看:
https://www.bilibili.com/video/BV1Qk8uz6E9f/

在这里插入图片描述
包含:

📦完整项目源码

📦 预训练模型权重

🗂️ 数据集地址(含标注脚本

二、系统总体设计思路

本项目以 YOLOv8 目标检测模型 为核心算法,面向电力巡检场景进行专项训练,并通过 PyQt5 图形界面 实现完整的工程化封装,最终形成一套可直接投入使用的 电网绝缘子缺陷智能检测系统

系统设计目标包括:

  1. 高检测准确率:能够稳定识别破损与闪络缺陷
  2. 实时推理能力:满足视频流与在线巡检需求
  3. 良好可用性:非算法人员也可直接操作
  4. 可扩展性强:便于后期模型升级与功能拓展

在这里插入图片描述

三、整体系统架构

系统采用典型的分层架构设计,各模块职责清晰、相互解耦:

┌───────────────┐
│ 数据采集层    │  图像 / 视频 / 摄像头 / 无人机
└───────┬───────┘
        │
┌───────▼───────┐
│ YOLOv8 推理层 │  缺陷检测与分类
└───────┬───────┘
        │
┌───────▼───────┐
│ 结果解析层    │  类别 / 置信度 / 坐标
└───────┬───────┘
        │
┌───────▼───────┐
│ PyQt5 界面层  │  可视化展示与交互
└───────────────┘

该架构的优势在于:

  • 算法模块可独立替换或升级
  • UI 与模型完全解耦,降低维护成本
  • 支持本地部署或后续服务化改造
    在这里插入图片描述

四、检测目标定义与业务建模

4.1 缺陷类别建模

结合电力运维业务需求,本项目共定义三类检测目标:

类别业务含义
绝缘子正常完整的绝缘子本体
破损瓷裙缺失、裂纹、结构破坏
闪络放电痕迹、污染导致的表面闪络

这种分类方式不仅能够识别缺陷类型,还可为后续缺陷定位、统计分析与风险分级提供基础数据支持。
在这里插入图片描述


4.2 数据集构建原则

为了保证模型在实际场景中的泛化能力,数据集构建阶段重点考虑:

  • 不同拍摄高度(模拟无人机巡检)
  • 不同光照条件(逆光、阴影、强反射)
  • 复杂背景(山地、树林、建筑)
  • 正常与缺陷样本的合理比例

数据统一采用 YOLO 标准格式,便于训练、推理与工程复用。


在这里插入图片描述

五、YOLOv8 模型选型与训练流程

5.1 YOLOv8 在工业场景中的优势

YOLOv8 作为 Ultralytics 推出的新一代检测模型,在工程实践中具备以下优势:

  • Anchor-Free 设计,减少人工调参
  • 更合理的损失函数设计,提高收敛稳定性
  • 推理接口高度封装,工程接入成本低
  • 兼容 ONNX、TensorRT 等多种部署形式

对于绝缘子这类尺度变化大、形态细长、背景复杂的目标,YOLOv8 在精度与速度之间取得了良好平衡。


在这里插入图片描述

5.2 模型训练流程

训练流程主要包括:

  1. 数据清洗与标注校验
  2. 训练 / 验证集划分
  3. 模型初始化与参数配置
  4. 多轮迭代训练与性能评估

训练过程中重点关注以下指标:

  • mAP@0.5:整体检测能力
  • 混淆矩阵:破损与闪络的区分效果
  • Loss 曲线:模型是否稳定收敛

当模型在验证集上表现稳定后,即可用于推理部署。


在这里插入图片描述

六、推理流程与缺陷结果解析

YOLOv8 提供了简洁高效的推理接口,推理阶段主要完成以下工作:

  • 加载训练完成的权重文件
  • 对输入图像或视频帧进行检测
  • 输出目标类别、置信度与边界框

在视频与摄像头模式下,系统采用逐帧检测方式,并通过合理的帧率控制,确保检测效果与实时性之间的平衡。


七、PyQt5 图形化系统设计

为了提升系统的可用性,本项目引入 PyQt5 构建桌面级可视化应用,核心功能包括:

  • 多种检测模式切换(图片 / 视频 / 摄像头)
  • 实时显示检测结果与缺陷标签
  • 一键保存检测结果图片或视频
  • 自动管理输出目录,便于后期复核

该界面设计使系统能够直接服务于运维人员与巡检人员,而不仅仅局限于算法研究。


在这里插入图片描述

八、典型应用场景与扩展方向

8.1 实际应用场景

  • 输电线路无人机巡检
  • 变电站设备日常检查
  • 电网缺陷快速筛查与统计
  • 智能运维示范项目

8.2 可扩展方向

  • 缺陷严重程度自动分级
  • 与巡检工单系统对接
  • 缺陷时序变化分析
  • 多模型协同检测(如分割 + 检测)

九、总结与思考

本文围绕电网绝缘子破损与闪络缺陷检测这一典型工业视觉问题,系统性地介绍了一套 基于 YOLOv8 的智能检测系统 的完整实现过程。从问题背景、系统架构、模型训练,到可视化应用与工程部署,展示了深度学习技术在电力运维场景中的实际价值。

实践表明,只有将算法能力与工程需求深度结合,AI 技术才能真正落地并产生长期价值。本项目不仅适合作为电力巡检智能化的参考方案,也为其他工业缺陷检测场景提供了可复用的技术范式。

大家好,最近在折腾虚拟网卡(TUN)模式下的分流逻辑,踩了一个非常经典的坑:网页浏览正常,但 Reeder 等原生 App 在开启 TUN 后死活无法同步。
结论先行:在 TUN + fake-ip 模式下,把业务域名加入 fake-ip-filter,可能会因为同步 Real DNS 失败,导致原生 App 在握手前直接断连。

折腾一圈后发现,这不仅是规则问题,更涉及底层 DNS 解析逻辑。分享出来供大家参考,也想请教下各位在大规模节点和自动化维护上有什么高招。

在我的案例中,App 同步失败的根源在于我把个人域名放进了 fake-ip-filter

过程:开启 TUN 模式后,由于域名在 Filter 列表中,Clash 会强制进行真实解析(Real IP)。
当时上游 DNS 刚好返回了 SERVFAIL,导致 Clash 拿不到目标 IP,连接在握手前就直接断开,报 dns resolve failed

解决办法:将域名移出 Filter,让 Clash 直接返回 Fake-IP 给 App,解析给 Clash 后台异步处理。

目前我搭建了一个简单的“三通道”入口,方便日常使用(配合 zeroomega 等工具):

  • 7897 (Mixed):通过订阅的规则表来分流。
  • 7898 (Direct):直连。
  • 7899 (Proxy):代理。

虽然目前的方案解决了“能用”的问题,但维护起来还是不够优雅,想请教下大家:

  • 是否有基于访问日志 / DNS 请求的自动化方案
  • 能否自动归纳并同步更新 Clash 的 rule-providers 或 fake-ip-filter
  • 在多节点、大规模配置下,有没有更优雅的维护思路

之前团队上线了一个 AI 全自动多角色配音的有声书工具,主要解决的是小说多人配音、角色情绪区分和自动生成的问题。
项目地址: https://voicenovel.org

在实际使用和用户反馈中,有一个问题一直很明确:
使用 AI 多角色配音时,价格是最明显的门槛。

短期内受限于成本和技术结构,单价暂时没法做出明显的大幅下调,所以我们换了个方向,先从「参与方式」上做调整。

于是我们尝试上线了一个 拼单 / 拼书模式

  • 需要 拼单完成后 才能开始听书
  • 主要目标是把 拼单的个人参与成本拆小
  • 目前最低 1 个积分即可参与拼单
  • 任何人都可以发起 自己感兴趣小说的拼单

拼单集中在一个拼单市场里:
https://voicenovel.org/group-funding/market

这个改动更像是一次尝试:
在短期无法大规模降低成本的前提下,看看能不能降低热爱听书的书友们的门槛,也欢迎 v 友拍砖或提建议

GraphicsGale是一款像素画制作软件,很多画像素图、做 GIF 动画的人都在用,体积小、功能全,还支持逐帧编辑。

它的安装包通常就是一个 .exe文件,双击就能装,下面一步步教你。

一、准备工作

安装包下载:https://pan.quark.cn/s/007523c13df9

二、安装步骤

  1. 双击 GraphicsGale.exe运行。
  2. 如果是 Windows 10/11,会弹出“用户账户控制”提示 → 点  “是” (需要管理员权限)。
  3. 进入安装界面,选语言(默认 English,想换日语或中文可以看有没有选项,有的版本没有就默认英文)。
  4. 点  “Next” ​ 继续。
  5. 选安装位置:

    • 默认是 C:\Program Files\GraphicsGale,想改就点“Browse”选 D 盘或其他盘。
  6. 选附加任务:

    • 建议勾“Create a desktop shortcut”(创建桌面快捷方式),点“Next”。
  7. 点  “Install” ​ 开始安装,等进度条走完(很快,几秒钟)。
  8. 最后点  “Finish” ​ 完成安装,桌面上会有 GraphicsGale 图标。

三、首次运行设置

  1. 双击桌面图标打开软件。
  2. 第一次打开可能会提示“是否注册” → 选“试用”或“Cancel”(免费版够用了)。
  3. 进入主界面,就能开始画像素图了。

四、基本使用(简单说两句)

  • 新建画布:点“File”→“New”,选尺寸(比如 32x32、64x64 像素)。
  • 画图工具:左边工具栏有铅笔、橡皮、油漆桶、吸色器等,选了就能画。
  • 保存文件:点“File”→“Save As”,支持 .gal(工程文件)、.png.gif等格式。
  • 做 GIF 动画:新建多帧画布,每帧画不同的画面,然后导出为 GIF 就行。

引你是否在Windows与macOS之间频繁切换工作、互传数据?你是否拥有NAS并且局域网内同时存在Mac和PC访问其资源?或者,你是否拥有一位使用Mac的朋友、同事、同学,并使用储存介质在他们的Ma ...


你是否在 Windows 与 macOS 之间频繁切换工作、互传数据?你是否拥有 NAS 并且局域网内同时存在 Mac 和 PC 访问其资源?或者,你是否拥有一位使用 Mac 的朋友、同事、同学,并使用储存介质在他们的 Mac 上拷贝过文件?如果满足上述任一条件,那么你应该大概率见过 .DS_Store 文件。

如果你进入互联网搜索 .DS_Store 文件,扑面而来的却可能是大量「讨伐」.DS_Store 的声音。主流的搜索结果包括「如何删除 .DS_Store 文件」「如何阻止 .DS_Store 生成」「如何在项目/仓库中排除 .DS_Store」「.DS_Store 文件清理工具」等等。

可以说,大多数搜索结果以及针对 .DS_Store 的批评意见其,实围绕着 .DS_Store 文件本身展开,而「.DS_Store」与产生这一文件的 macOS Finder 之间的关联却常常被人忽视。抛开 Finder 谈 .DS_Store 就如同抛开前提条件谈问题——在很大程度上失去讨论问题的意义。

因此,本文希望从 .DS_Store 出发,基于与 Windows 平台下的类似文件 Desktop.ini 和 Thumbs.db 的对比,论述 Finder 与 Windows 资源管理器在某些设计方面的差异。

概述

在开始 macOS 的 Finder 与 Windows 资源管理器的比较前,这里还是有必要对本文将要讨论的几个对象做出简要概述。

首先是 .DS_Store 文件,其英文全称为 Desktop Services Store(桌面服务存储),诞生于 1999 年 Mac OS X Finder 重写时期。这是一种由 macOS 自动创建的隐藏文件,本质上是一个采用 B-树(B-tree)结构的专有二进制文件。它主要用于存储 Finder 文件夹的自定义属性与元数据,这些数据通常无法直接由文件系统本身记录,例如用于记录图标位置的 Iloc、用于存储 Finder 注释(Finder Comments)的 cmmt、以及文件夹背景图片 BKGD 等。

第二是 Desktop.ini 文件。这是一种隐藏的受保护 Windows 系统配置文件 (*.ini)。它用于存储所在文件夹的自定义设置,包括图标、显示名称 (本地化名称) 或文件夹说明等。

最后是 Thumbs.db 文件。Thumbs(缩写自 thumbnails)即缩略图数据库,这是一种 Windows 系统文件,采用 OLE 复合文档结构。它用于储存文件夹中图像和视频的缩略图预览缓存,以加速 Windows 资源管理器对缩略图的加载。

可见,在 Windows 中,功能设计上与 .DS_Store 更相近的则应该是 Desktop.ini(尽管它的出现频率没有 Thumbs.db 那么高)。

基础差异比较

既然 Windows 中也有 Desktop.ini 与 .DS_Store,那么为什么对于移除 .DS_Store 的需求更为突出,甚至视其为垃圾文件呢?这里笔者认为主要有以下几点因素,包括生成策略以及隐藏文件策略的差异。

生成策略

生成策略直接决定了文件是否会频繁出现。虽然 Apple 并未公开其完整技术文档,但根据日常观察和逆向工程的研究,.DS_Store 的生成策略极为激进。

一方面,.DS_Store 是跟随文件夹的,每个文件夹都会产生自己的 .DS_Store。

另一方面,打开文件夹、修改视图、排列、文件夹窗口大小和位置等大多数操作都有可能触发文件夹下 .DS_Store 的生成。

(一些例外情况包括:在仅包含文件而不存在次级文件夹目录的文件夹中调整设置并不会使 .DS_Store 生成;在部分采用非日志式文件系统的外置存储介质上,调整文件夹的配置不会生成 .DS_Store。)

相比之下,Desktop.ini 文件虽然也是跟随文件夹的,但其生成策略要保守得多。

根据日常观察,Desktop.ini 主要常见于用户目录下几个系统预置的文件夹中,如桌面、下载、文档等。这是因为 Windows 为这些特殊文件夹定制了图标和本地化名称,必须通过 Desktop.ini 记录。

而在普通文件夹中,单纯修改视图或排列方式往往不会生成 Desktop.ini——Windows 资源管理器似乎更倾向于在注册表或系统盘的特定位置中心化地存储这些配置。因此,普通用户在日常文件操作中遇到 Desktop.ini 的频率远低于 .DS_Store。

某个 Desktop.ini 文件中记录的信息

至于 Thumbs.db,在 Windows 早期版本中确实随文件夹存储,但自 Windows Vista 起,缩略图缓存已被改为中心化存储在用户的 AppData 目录下(文件名为 thumbcache_xxx.db)。这一改变使得该文件淡出了普通用户的视野。

上述目录与其中的文件

隐藏文件策略

隐藏文件的展示策略也是影响用户感知的关键因素。macOS 默认不显示以点号开头的文件,而在 Windows 上,用户开启「显示隐藏文件」后即可看到 .DS_Store。但「显示隐藏文件」并不会展示 Desktop.ini,因为后者还被标记为「受保护的操作系统文件」,需要更深层级的设置才能取消隐藏。因此,如果用户经常在 macOS 与 Windows 间交换数据,对 .DS_Store 文件的感知还会更加强烈。

二次确认对话框
ls -a 呈现的目录下所有项目

设计差异比较

然而,要正确评价 .DS_Store 或是 Desktop.ini,我们不可能脱离产生它们的平台孤立地看待问题,而是要落脚到 macOS 访达与 Windows 资源管理器的设计哲学比较上。

Windows 的资源管理器是一个有边界的、强调秩序的内容呈现窗口。在窗口内,所有内容均强制按照某种特定的顺序(如名称、日期、类型)排列,并严格对齐网格。资源管理器仅有一个例外,那就是桌面。只有在桌面上同时取消「自动排列图标」和「将图标与网格对齐」后,图标才可以像画布一样自由放置。

这种设计导致 Windows 文件夹在拷贝到另一台电脑时,虽然会丢失视图配置,但也保证了文件夹状态的「相对干净」和展示逻辑的统一性。

会员专属文章,欢迎加入少数派会员。

优质内容

权益周边

会员社群

power+

在 AI 驱动的数据分析时代,传统宽表模式因敏捷性不足、数据冗余和难以支持即席查询而力不从心。相比之下,NoETL 数据语义层(Semantic Layer)作为位于数据存储与应用间的抽象层,通过将物理数据映射为统一业务语义,实现了逻辑与物理解耦。对于需要快速响应变化、支持 AI 交互的场景,语义层架构是更具适应性的选择,能提供零等待的指标交付和 100% 一致的业务口径。

AI 时代下,传统宽表模式为何力不从心?

数据分析正从“预制品加工”转向“自助式厨房”。过去支撑报表的宽表模式,在 AI 驱动、即席查询的需求下暴露三大瓶颈:

  1. 敏捷性坍塌:业务变更需回溯修改 ETL、重跑宽表,响应周期长达数周。
  2. 数据一致性失控:多张口径各异的宽表导致“指标打架”,AI 模型基于此将产生不可靠洞察。
  3. 无法支持即席查询:宽表只能回答预设问题,无法响应跨域、临时的分析需求。

例如,周五下午,市场部需要新指标评估促销活动。数据团队告知需新建宽表,排期至下周三。决策时机已然错过。这种“响应迟滞”在 AI 时代是致命的。

什么是 NoETL 数据语义层(Semantic Layer)?

NoETL 数据语义层(Semantic Layer)是数据存储与数据应用间的关键抽象层,其核心功能是将复杂的技术数据结构映射为统一的业务术语和指标,充当数据的“业务翻译官”。其颠覆性源于三大技术理念:

  1. 解耦逻辑与物理:业务逻辑(如“销售额=价格×数量-折扣”)不再硬编码于 ETL,而是作为可复用定义存储于语义层。
  2. 统一业务语义:动态编织明细数据为统一的业务语义,确保全公司对“销售额”只有一个定义,实现“单一事实来源”。
  3. 实时查询下推:将“查看华东区销售额”的查询实时翻译、优化并下推至数据源执行,无需移动和预计算数据。

为什么它是 AI 时代的关键?

AI Agent 需要无歧义的上下文来准确生成 SQL。语义层提供了这份“业务词典”,为 AI 提供了稳定、可靠的数据接口,从根本上避免了因口径混乱导致的“AI 幻觉”。

Aloudata 如何基于语义层赋能 AI 驱动的分析?

作为国内数据语义编织(Semantic Fabric)领导者,Aloudata 方案的核心是:用 Aloudata CAN 自动化指标平台构建语义层,用 Aloudata Agent 分析决策智能体作为交互入口。

企业可以通过 Aloudata CAN 中连接数仓明细层,在可视化界面通过配置化的方式定义业务实体、维度和指标,构建语义模型,形成 NoETL 数据语义层,实现业务语义的标准化开发和管理,保障 100% 指标口径的一致性,避免 AI 问数的“幻觉”出现。

以 NoETL 数据语义层为底座,用户可以部署 Aloudata Agent,通过自然语言交互的方式直接提问:“上周新用户首单平均客单价?”Agent 基于语义层理解意图,通过 NL2MQL2SQL 的技术路径,先输出 MQL,再通过指标语义引擎生成 100% 准确的 SQL 语句并返回结果。

在这个过程中,用户零等待指标交付,逻辑变更分钟级生效,无需 ETL;100%一致口径,所有人与 AI 通过同一语义层访问数据;无缝对接 AI,语义层为 AI 提供标准化查询 API。

常见疑问回答(FAQ)

Q: 语义层架构的性能是否比宽表差?

不会。语义层采用智能查询下推与缓存,其优势在于在保证核心性能的同时,极大扩展了可即时响应的问题范围。

Q: 已建的宽表和数据仓库,是否要推倒重来?

不需要。语义层是增强层。Aloudata CAN 可直接连接现有数据资产,在其之上构建统一语义,保护投资的同时解锁新能力。

Q: 语义层如何保证数据安全与权限控制?

企业级产品(如 Aloudata CAN)提供行列级权限管控,并将规则与语义模型绑定。任何查询都会自动注入权限过滤,确保安全合规。

很多企业的指标越做越多,决策却越来越慢:会上报数热闹,真正的“下一步做什么”说不清。根因往往不是数据不够,而是缺少一套能对齐战略、解释因果、嵌入节奏的产品指标体系。本文用一套“5步法”把北极星、指标树、漏斗、治理与看板串成可执行路径,让指标从“汇报材料”变成“决策语言”。

关键词聚合:产品指标体系|北极星指标(North Star Metric)|指标树(Driver Tree/KPI Tree)|AARRR 漏斗(Pirate Metrics)|HEART 体验指标|OKR|指标口径|数据治理|数据质量|数据看板/仪表盘(Dashboard)

为什么你的指标越做越多,决策却越来越慢?

我在不同规模的组织里反复见到一个现象:指标体系做得很“全”,管理却做得很“虚”。 每个部门都能拿出一组“看起来不错”的数字,但一旦追问“这些数字如何改变用户价值、如何影响长期收入”,讨论就会迅速滑向口径争执、责任推诿,最后以“下次再看”收场。

更棘手的是,一些“可展示但不可驱动”的指标会天然占据汇报舞台:曝光、下载、浏览量、粉丝数……它们往往能让人产生“我们在变好”的错觉,却很难直接导向下一步行动。组织越依赖这类指标,越容易陷入“报数化”,决策反而越来越慢。

所以问题不在于缺指标,而在于缺一套能把“指标—行动—结果—复盘”真正连起来的产品指标体系。当指标只用来展示,它会越来越像装饰;当指标用来决策,它才会成为组织能力。

方法论:一套好的产品指标体系,至少解决三件事

关键定义:什么是“产品指标体系”?

产品指标体系不是一张报表,也不是 KPI 清单,而是:

一套围绕“用户价值与业务价值”建立的指标结构(指标分层+指标口径+数据治理+看板节奏),用于支持决策、资源配置与持续改进。

它至少要同时解决三个问题:方向是否一致、原因是否可解释、行动是否能闭环。

1)对齐:让“用户价值”和“业务价值”说同一种话

中高层最怕的不是指标不好看,而是组织努力方向不一致:产品追功能,运营追热度,销售追签约,最后用户体验与续费被牺牲。我通常建议用“北极星指标(North Star Metric)”做对齐:用一个最核心的指标把方向统一,避免资源在部门之间相互抵消。

2)可解释:从“指标清单”升级为“因果链条”

有数字不等于有洞察。你需要的不是几十个 KPI,而是一棵能解释“为什么上升/下降”的指标树(Driver Tree / KPI Tree):把结果指标拆解为可影响的驱动因素,帮助团队定位杠杆、做资源配置。

3)可运营:把指标嵌入节奏,而不是只在月底出现

指标体系发挥作用,靠的是机制:看板怎么设计、例会怎么开、异常怎么处理、动作怎么验证。否则指标会退化成“月度PPT”。这里要特别警惕一个规律:当指标被当作硬目标与奖惩绑定时,人会“优化指标”而不是“优化系统”。

5步法:从“定方向”到“能落地”的产品指标体系搭建路径

一页速览(可直接做成内部共识页)
1)定北极星(方向) → 2)搭指标树(因果) → 3)串漏斗(旅程) → 4)建治理(可信) → 5)上看板(闭环)

第一步:定北极星——先把“我们到底要变好什么”说清楚

北极星指标怎么选?一句话答案:选“最能代表用户核心价值、且能牵引长期业务结果”的那一个。

北极星三条硬标准(评审时直接照此打分)

  • 代表用户核心价值(不是内部产出)
  • 与商业结果强相关(能解释留存、续费、复购、成本效率等)
  • 不能被短期手段直接拉动:如果一个指标能被刷量、活动堆资源迅速抬高,它往往不适合作为北极星(会把组织带偏)。

常见误选(也是中国企业最常见的“走歪点”)

  • 误把“营收/签约额”当北极星:这是结果,但难指导产品日常动作;
  • 误把“DAU/访问量”当北极星:易被流量手段劫持,且未必代表价值达成;
  • 误把“上线功能数/迭代次数”当北极星:这是输出不是结果,容易把组织带向“忙而无功”。

产出物(务必落在纸面)

  • 北极星指标(1个主选+1个备选)
  • 3~5个输入指标(能被日常工作影响)
  • 关键假设清单(本季度必须验证的因果假设)

落地提示:北极星与关键假设最怕“只在会议上存在”。实践里我更建议把它们沉淀成可追溯、可讨论、可复用的“产品共识页”(例如 PRD/策略说明/指标定义页),并允许后续迭代版本化。像 ONES Wiki 这种知识库工具支持富文本/Markdown、评论讨论、版本记录与回滚,也支持把文档与项目任务关联起来,便于“战略—需求—迭代”同源追踪。

第二步:搭指标树——把结果拆到“可被影响”的驱动指标

指标树怎么画?一句话答案:把滞后结果拆成领先杠杆,让团队能“事前纠偏”而不是“事后复盘”。

我在项目里常用一句话提醒团队:

只看结果,你永远在解释过去;有领先指标,你才可能改变未来。

拆解三条纪律(避免“拆得很细但毫无行动价值”)

  • 可控性:拆到团队能影响的层级,否则只是压力传导;
  • 可解释性:每条分支必须讲得清“为什么会影响上层指标”;
  • 可验证性:允许被数据检验,避免拍脑袋“伪因果”。

一个通用指标树骨架(可直接复用)

北极星(结果):每周/每月“价值达成”的客户或用户规模

  • 覆盖:进入价值路径的比例(从“进入”到“达成”)
  • 深度:价值行为频次/协作深度(从“能用”到“用好”)
  • 稳定:关键流程成功率/性能/缺陷(从“可用”到“可靠”)
  • 留存:次周/次月留存、续费前置信号(从“发生”到“持续”)

指标卡片(Metric Card):口径统一的最低成本做法

每个关键指标至少写清:

  • 指标定义(口径)|计算公式|数据来源(埋点/表/系统)
  • 更新频率|Owner(业务Owner)|使用场景(用于什么决策)

检查点:如果会开到最后仍在争“活跃到底怎么算”,说明你缺的不是分析能力,而是指标卡片与口径库。

落地提示:指标卡片不是“数据团队的文档”,而是产品团队的“决策字典”。我见过做得比较顺的团队,会把指标卡片放在知识库里,同时在需求/用户故事/实验任务上引用同一口径,避免“文档一套、执行一套”。ONES Wiki 支持文档关联项目任务、并能嵌入工作项列表;ONES Project 则覆盖需求管理、迭代管理等场景,能把“要改什么”直接落到工作项上。

第三步:串漏斗——把“增长与留存”讲成同一种语言

漏斗怎么定义?一句话答案:把用户从“进入—首次价值—持续使用—付费/续费”的关键路径,用事件+时间窗固化为可运营指标。

在B2B/复杂产品里,漏斗最容易失败的两件事

  • 激活定义含糊:只写“完成注册”,没有“首次价值达成”;
  • 没有时间窗口:不规定“7天内/14天内”,漏斗就无法比较、无法运营。

推荐做法:把“激活”定义为“首次价值达成(First Value)”。B2B 常见示例:

  • T天内完成关键配置 / 跑通关键流程一次
  • 首次协作达成(≥2角色、≥1流程闭环)
  • 首次产出可交付结果(报表/审批/工单闭环等)

产出物

  • 关键路径(用户旅程)图
  • AARRR 各阶段的“决策级指标”(每段1~2个)
  • 每个指标对应的“可运营动作库”(触达、引导、产品改造、质量改进)

落地提示:漏斗不是“画出来”,而是“跑起来”。所以建议你把每个漏斗节点的改进动作拆成可执行的产品工作项:比如“激活引导改版”“关键任务模板”“首个价值路径埋点补齐”“新手引导实验A/B”等,并按优先级进入需求池。比如 ONES Project 提到其支持建立需求池、规划迭代,并可通过看板、燃尽图等跟踪进度——这类能力更适合承载产品团队“从漏斗诊断到迭代交付”的连续动作。

第四步:建治理——口径统一、数据可信、权责闭环

治理怎么做?一句话答案:把指标当“管理资产”来管,像管需求一样管口径、质量与变更。

很多企业的产品指标体系失败,不是方法错,而是“治理缺席”:同名不同口径、数据延迟、指标无人负责,最后只能“用感觉决策”。

治理四件套(PMO 最适合牵头)

  • 指标口径库:统一定义、统一版本、可追溯
  • 数据质量红线:准确性、完整性、一致性、及时性(不达标必须标注风险)
  • Owner机制:业务Owner 对指标解释与改进负责(数据同学负责“数的正确”)
  • 变更控制:口径/埋点/报表变更必须评审、公告、可回溯

检查点:如果一个指标没有Owner,就没有人对“为什么变动、下一步怎么改”负责——它迟早变成“会议装饰”。

落地提示:很多产品团队在“指标治理”上忽略了一件事:指标体系不仅要管增长,也要管质量与体验。一个常见闭环是:需求→开发→测试→缺陷→复盘,如果链条断了,你会在“指标下降”时找不到可修复的抓手。ONES TestCase 支持测试用例与需求/任务关联、测试计划与迭代关联,并可由未通过用例快速创建缺陷任务;ONES Project 也与 TestCase 数据互通、可一键提 Bug 并跟踪缺陷。对产品团队而言,这意味着“漏斗问题”可以更快落到“版本质量与缺陷修复”的可执行闭环。

第五步:上看板——用“看板+例会+复盘”把指标变成组织习惯

看板怎么做?一句话答案:看板不是展示页,而是“决策清单”——每次例会都要产出动作与验证方式。

三层看板(与组织层级匹配)

  • 经营层看板:北极星 + 关键结果(季度视角)
  • 产品层看板:指标树主干 + 漏斗关键节点(双周/月度节奏)
  • 专项看板:版本/实验/活动(短周期验证,明确假设与样本)

OKR 如何衔接指标体系?

  • OKR 的 KR 要“可衡量、可复盘、能驱动对齐”。因此我建议的硬规则是:
  • KR 优先来自“指标树主干 + 漏斗关键节点”;
  • 每个KR必须对应:动作(做什么)+ 证据(怎么证明有效);
  • 复盘只讨论:事实—解释—动作,避免变成表态会。

落地提示:

产品经理常见痛点是:单个迭代看得清,多项目/多团队协同就看不清(依赖、资源、节奏容易失控)。在这种情况下,除了迭代看板,还需要“产品线/项目集”层面的汇总视角。ONES 的项目集管理解决方案强调为管理者提供全局视角、支持跨项目制定迭代计划;同时 ONES Project 也提供看板、燃尽图与多种报表来呈现项目表现。你不需要把看板做得花,关键是把它绑定到“例会—异常—动作—验证”的固定节奏上。

如果你还想把“指标体系”落实到更稳定的度量面(交付效率、交付质量、资源效率等),ONES Performance 提到其建立多维度效能度量实践体系,并提供仪表盘模板与多维分析能力,可用于跨团队的趋势复盘。

常见误区:产品指标体系最怕“越努力越错”

误区1:指标越多越安全
指标多往往意味着焦点分散。建议先把“决策级指标”控制在 10~20 个,其他作为诊断指标按需展开。

误区2:只盯增长,不看体验与质量
如果产品进入长期经营阶段,建议把体验纳入指标体系。HEART 框架提供五类 UX 指标:Happiness、Engagement、Adoption、Retention、Task Success,并强调不必每次都用全量指标,应按目标选择组合。

误区3:把指标当考核“唯一答案”
当指标直接绑定奖惩,人会优化指标而不是优化系统,这是典型的古德哈特风险。
更成熟的做法是:指标用于“方向与学习”,考核看“过程合规 + 结果趋势 + 关键里程碑”,避免单点指标绑架组织。

常见问题 FAQ:

Q:北极星指标可以有两个吗?
A:强烈建议“一条业务线一个北极星”,否则对齐会被稀释;若多业务线,可采用“业务线北极星 + 集团约束指标”。

Q:指标树拆到多细才算够?
A:拆到“团队可控、可行动、可验证”为止;再细会变成噪音。

Q:产品经理最容易把哪一步做成形式?
A:第三步与第五步——漏斗没变成需求池动作、看板没绑定复盘节奏,最后都会退化成“好看的图”。

一套真正有效的产品指标体系,最终在提升一种组织能力:

  • 用北极星对齐方向,减少内耗;
  • 用指标树解释因果,把结果变成可驱动的杠杆;
  • 用漏斗运营旅程,把增长与留存放到同一条价值路径上;
  • 用治理保证可信,让复盘基于同一套事实;
  • 用看板与 OKR 固化节奏,把学习变成组织习惯。

当指标从“月底报表”走向“日常决策”,管理不会更冷,反而更诚实:因为每一次取舍,都能被解释、被验证、被复盘。对中高层与 PMO 来说,这才是指标体系真正的价值——把组织从“讲故事”带到“做学习”。

供应链、交付、现金流压力一上来,很多公司才发现:ERP不是“有没有”,而是“能不能在手机上把事办完”。
移动ERP选对了,核心是让审批、开单、库存、对账这些高频动作随时闭环。

一、主流移动ERP系统详细盘点

1、支道

支道是“一站式业务管理平台”,而不是那种固定菜单的传统ERP:你可以用它把采购、销售、项目、费用、审批、数据看板等流程按自己业务搭起来,然后在移动端跑起来。支道官方站点与App信息里都明确提到其以低代码/aPaaS等方式提供业务全流程数字化管理能力,背后主体为浙江支点数字科技有限公司。

如果你们的痛点是“流程散、表格多、跨部门全靠催”,支道通常比换一套重ERP更快见效。

推荐理由:

1、适合“业务变化快”的团队:流程、表单、权限经常要调整,不想每次都找开发改系统。

2、移动端上手快:App商店可查,适合把填报、审批、协同、数据汇总搬到手机上处理。

产品特色:

1、流程能“按你公司习惯走”:不是让你适应系统,而是系统更容易贴合你的流程。

2、数据能汇总到一处:减少“同一份数据多处填、多版本对不上”的情况。

3、适合先从一个部门/一条流程试起:跑通后再扩,不容易翻车。

适合场景/行业:

项目型/专业服务类公司、以及需要快速搭建内部流程的成长型企业。

2、金蝶

金蝶在小微与中小企业的移动端体验上做得比较成熟,尤其是“金蝶云星辰”这类产品,官方页面强调覆盖采购、销售、库存、资金等链路;同时其App商店信息也强调移动端经营看板、开单、审批等能力

1、推荐理由:想用手机把生意管住(开单/库存/资金),金蝶这条线比较稳。

2、产品特色:进销存与资金链路打通,移动端可做经营与待办处理。

3、适合场景:小微工贸、零售商家、轻量制造或商贸企业。

4、可能的局限:更偏“经营执行与老板看数”,复杂集团多业态要看更高阶产品与实施能力。

3、用友

用友体系里,“友空间”作为移动协同与门户入口,官方页面直接写到:一个App访问多系统、移动快捷审批、实时处理业务;App商店也强调可按组织/角色配置移动门户。

1、推荐理由:如果你们审批链条长、跨部门多,用友的“移动入口+审批”更容易打通。

2、产品特色:移动工作台、待办审批、业务单据一键访问。

3、适合场景:成长型企业、集团型组织的移动协同与业务处理。

4、可能的局限:体系更大,落地往往更依赖实施与规划。

4、鼎捷

鼎捷“掌上易助”页面写得很直白:提供易助小程序,用于满足ERP用户移动化需求;同时易助ERP介绍中也强调其面向中小微制造企业,覆盖财务、进销存、生产等模块。

1、推荐理由:制造企业经常是“人不在电脑前”,小程序入口更容易推广。

2、产品特色:面向中小微制造的ERP体系 + 移动端应用入口。

3、适合场景:机械、五金、汽配、电子加工等中小制造。

4、可能的局限:如果你是多工厂、多语言、多币种的全球化集团,需要评估更高阶产品线。

5、浪潮

浪潮移动ERP在App商店描述中明确写到:提供移动首页、功能中心、移动审批、协同消息等,并可接入后台业务系统。

1、推荐理由:你要的是“统一移动入口+审批协同”,浪潮这类更对路。

2、产品特色:移动首页、功能中心、待办审批、协同消息等。

3、适合场景:高端集团企业移动化协同场景。

4、可能的局限:更偏“集团移动门户”,中小企业如果只要轻量进销存,可能会显得偏重。

6、网上管家婆

网上管家婆官网与App商店信息都提到:移动版为中小微打造,覆盖采购、销售、库存、财务等;并支持电脑、手机、平板、PDA多终端数据同步。

1、推荐理由:商贸批零电商最常见的诉求是“开单快、盘点快、对账清楚”。

2、产品特色:多终端同步、扫码操作、进销存+财务基础闭环。

3、适合场景:批发、零售、电商等。

4、可能的局限:更强在执行层,复杂制造/项目型的深度协同要另评估。

二、6款移动ERP对比表

三、选型建议与关键知识

移动ERP成不成功,不取决于“功能多不多”,取决于“用的人愿不愿意天天用”。

1、先定“移动端三大高频动作”

(1)审批:合同/付款/报销/采购申请

(2)业务动作:开单、查库存、对账、收发货

(3)现场回填:项目进度、巡检、异常上报

2、再看“供应商/协作方是否好用”

(1)入口轻不轻,有没有App、小程序、网页

(2)操作顺不顺,能不能3步以内完成常用动作

3、再看“你现有系统怎么接”

(1)已有财务/ERP/OA?优先选接口开放、能集成的。

(2)用友/金蝶生态用户,走原生或强集成路线通常更省心。

4、最后算总成本,不只看软件费

(1)实施、培训、对接、运维、人力配合成本都要算进去。

(2)最稳的做法:先做PoC,拿你们真实单据和流程跑一遍。

总结:如果你只想先把“移动闭环”跑起来,支道确实应该先看

很多企业的真实情况是:流程不标准、变化快、协同靠人盯。这个时候,支道这种更偏“可搭建、可迭代”的路线,往往更容易先拿到效果,再逐步扩到更完整的管理体系。

作者:齐海智

在 618 大促的技术战场上,每一行代码、每一个配置都影响着一线的实实在在的业务。一次看似平常的发版,却意外暴露了我们系统中的定时任务管理短板,这促使我们深入剖析分布式任务调度中异常重试机制的技术细节,并最终将其转化为守护系统稳定性的坚固防线。​

一、异常事件回溯:隐藏在发版背后的定时炸弹​

发版次日,业务部门反馈商家未收到门店收货明细邮件,导致门店收货业务收到影响。技术团队迅速启动应急流程,通过全链路日志追踪和系统状态分析,发现了问题的根源是:发版过程中,由于服务重启,中断了定时任务进程,正在执行的邮件发送任务被意外终止。而该任务在管理平台上并未配置任何重试策略,业务代码上也没有进行相关的检测和重试,这就导致任务失败后无法自动恢复执行,也未被及时感知到,进而引发业务阻断。​

为解决燃眉之急,研发人员立即登录任务管理平台,手工触发邮件发送任务,确保业务及时恢复。但这次事件给我们敲响了警钟:在分布式任务调度场景下,面对网络抖动、进程异常终止等场景,异常重试机制是保障业务可靠性的关键。​

二、重试策略设计:从理论到代码的深度解析​

2.1 验证EasyJob的重试策略

在复盘问题的过程中,我们发现了EasyJob分布式任务是具有重试策略的,只是默认不开启,而不是默认开启。

在这里插入图片描述



该策略以三个核心参数为基础:首次重试间隔时间 F、重试间隔乘数 M 和最大重试次数 C。

通过这三个参数的组合,我们可以灵活控制任务重试节奏,平衡系统负载与任务恢复效率。​

例如:配置t=10s, M=2, C=10,则间隔时间依次是:

重试次数 nn间隔时间计算方式间隔时间结果
110s(初始间隔,无计算)10s
210s×220s
320s×240s
440s×280s
580s×2160s

验证日志:

21:45:29.990 [main-schedule-worker-pool-1-thread-1] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:45:40.204 [main-schedule-worker-pool-1-thread-2] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:46:00.674 [main-schedule-worker-pool-1-thread-3] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:46:41.749 [main-schedule-worker-pool-1-thread-4] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:48:02.398 [main-schedule-worker-pool-1-thread-5] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
21:50:43.008 [main-schedule-worker-pool-1-thread-1] INFO  cn.jdl.tech_and_data.EmailSendingTask - 开始执行发送邮件任务
任务序号开始时间与前一任务的间隔
第 1 个任务21:45:29.990-
第 2 个任务21:45:40.20410.214 秒
第 3 个任务21:46:00.67420.47 秒
第 4 个任务21:46:41.74941.075 秒
第 5 个任务21:48:02.39880.649 秒(约 1 分 20.65 秒)
第 6 个任务21:50:43.008160.61 秒(约 2 分 40.61 秒)

与上面计算的一致。

验证方案:

1、实现接口:com.wangyin.schedule.client.job.ScheduleFlowTask,并设置任务返回失败:

在这里插入图片描述



2、创建CRON触发器

在这里插入图片描述



3、设置自动重试参数

在这里插入图片描述

在这里插入图片描述



4、暂停任务并手工触发一次



在这里插入图片描述

2.2 实现一个简单的重试策略

根据上述策略,简单实现了一个灵活可配置的任务重试机制。

public class TaskRetryExecutor {
    @Getter
    private final ScheduledExecutorService executor = newScheduledThreadPool(10);
    private final long firstRetryInterval;
    private final int intervalMultiplier;
    private final int maxRetryCount;

    public TaskRetryExecutor(long firstRetryInterval, int intervalMultiplier, int maxRetryCount) {
        this.firstRetryInterval = firstRetryInterval;
        this.intervalMultiplier = intervalMultiplier;
        this.maxRetryCount = maxRetryCount;
    }

    public void submitRetryableTask(Runnable task) {
        executeWithRetry(task, 1);
    }

    private void executeWithRetry(Runnable task, int currentRetryCount) {
        executor.schedule(() -> {
            try {
                task.run();
                log.info("任务在第{}次尝试时成功执行", currentRetryCount);
            } catch (Exception e) {
                log.error("任务在第{}次尝试时执行失败", currentRetryCount, e);
                if (currentRetryCount <= maxRetryCount) {
                    long delay = calculateRetryDelay(currentRetryCount);
                    log.info("计划在{}毫秒后进行第{}次重试", delay, currentRetryCount);
                    executeWithRetry(task, currentRetryCount + 1);
                } else {
                    log.error("超过最大重试次数。任务执行最终失败。");
                }
            }
        }, currentRetryCount == 1 ? 0 : calculateRetryDelay(currentRetryCount), TimeUnit.MILLISECONDS);
    }

    public long calculateRetryDelay(int retryCount) {
        if (retryCount == 1) {
            return firstRetryInterval;
        } else if (retryCount > 1 && retryCount <= maxRetryCount) {
            long previousDelay = calculateRetryDelay(retryCount - 1);
            return previousDelay * intervalMultiplier;
        }
        return -1; // 超出最大重试次数,返回错误标识
    }
}

​在上述代码中:

1.TaskRetryExecutor类封装了任务重试的核心逻辑。构造函数接收三个关键参数:firstRetryInterval、intervalMultiplier和maxRetryCount,用于配置重试策略,对应于EasyJob的F、M、C参数。

2.submitRetryableTask方法接收一个可执行任务,并启动重试流程。它调用executeWithRetry方法,初始重试次数为1。

3.executeWithRetry方法是重试逻辑的核心。它使用ScheduledExecutorService来调度任务执行:

◦如果任务执行成功,记录成功日志。

◦•如果任务执行失败且未超过最大重试次数,计算下一次重试的延迟时间,并递归调用自身进行重试。

◦•如果超过最大重试次数,记录最终失败日志。

4.calculateRetryDelay方法实现了重试间隔的计算规则:

◦第一次重试使用firstRetryInterval。

◦之后的重试间隔是前一次间隔乘以intervalMultiplier。

◦如果超出最大重试次数,返回-1表示错误。

通过这种设计,我们实现了一个可复用、可配置的任务重试机制。它能够根据配置的参数自动调整重试间隔,在任务失败时进行有策略的重试,同时避免无限重试导致的资源浪费。

详细代码可在以下Git仓库中找到:mailto:git@coding.jd.com:newJavaEngineerOrientation/TaskRetryStrategies.git

2.3 重试策略的理论分析

2.3.1 EasyJob对乘数和最大重试次数的限制

在对EasyJob也进行了重试的验证中发现:

1.每次重做的乘数取值范围是[1,8],可以是具有一位小数位的浮点数,比如3.5,

2.最多重做次数是[1,16]间的整数,第一次重试的间隔没有限制,单位是秒。

在这里插入图片描述

2.3.2 梯度分析

通过上面的验证和重试相关概念的定义,可以得到:第n次重试的间隔时间=第一次间隔时间*乘数^(n-1),即:

在这里插入图片描述

其中:

在这里插入图片描述

对乘数M的梯度:
在这里插入图片描述

对重试次数n的梯度:
在这里插入图片描述



详细推导: http://xingyun.jd.com/codingRoot/newJavaEngineerOrientation/T...

从下图可以看出,重试次数n较大时(比如8),乘数 M 的细微变化都会导致,任务的间隔时间发生剧烈变化,因此n超过8之后,M基本不可调。

在这里插入图片描述

同样的,从下图可以看到,乘数M较大时(比如4),n的细微变化也会导致任务的间隔时间爆发式的增加。

在这里插入图片描述

1、乘数在1.5-4 的合理性

过小乘数 (<1.5) 的问题:

当乘数 = 1.2,重试 10 次的间隔时间是:1次:1, 2次:1.2, 3次:1.44, ..., 10次:5.16,

10 次重试总间隔仅 5 倍,接近固定间隔,可能导致 "惊群效应"(大量请求同时重试)。

过大乘数 (>4) 的问题

当乘数 = 8,重试 5 次的间隔时间:1次:1, 2次:8, 3次:64, 4次:512, 5次:4096

5 次重试后间隔已超 1 小时(假设初始间隔时间是最小的1s,4096s>1小时),可能导致请求长时间等待,用户体验差。

因此,乘数 = 1.5-4 在 "退避效率" 和 "资源消耗" 间取得平衡,一般取乘数= 2 (标准指数退避)。

行业实践:AWS SDK 默认乘数 = 2,Google gRPC 重试策略推荐乘数 = 1.5-3,多数 HTTP 客户端库 (如 requests) 默认乘数 = 2。

2、最大重试次数3-10的合理性

假设单次重试成功概率为P(比如网络/服务临时故障,重试成功概率通常较高),重试 n次至少成功 1 次的概率为:

在这里插入图片描述

当 p=0.5,(单次重试 50% 成功概率):

n=3 时,成功概率 =1−(0.5)^3=87.5%

n=5 时,成功概率 =1−(0.5)^5=96.875%

n=10 时,成功概率 =1−(0.5)^10≈99.9%

实际场景中,临时故障的单次成功概率远高于 50% (比如网络抖动重试成功概率可能达 80%)

若 p=0.8,n=3时成功概率已达 1−0.2^3=99.2%几乎覆盖所有临时故障。

因此,3 - 10 次重试,能以极高概率(99%+)覆盖“临时故障”场景,再增加次数对成功概率提升极有限(边际效应递减)。

因为已知的任务延迟时间的公式是:

在这里插入图片描述

n从1到C进行累加得到总耗时:

在这里插入图片描述

,

根据等比数列求和公式可以得到:

在这里插入图片描述



令 M=2(常用乘数),F=1 秒(最小可能值):

n=3时,T=(2^3-1)/(2-1)=7秒

n=5时,T=(2^5-1)/(2-1)=31秒

n=10时,T=2^10-1=1023秒≈17分钟

n=13时,T=2^13-1≈2.3小时

n=15时,T=2^15-1≈9.1小时

当n超过10后,每次增加都会导致总耗时急剧增长,很容易超过业务的容忍上限(具体业务具体分析),也可能因为重试过多,导致被调用的系统压力增加,甚至造成系统崩溃。

故:3 - 10 次重试可将总耗时控制在“业务可接受范围”(几秒到十几分钟),同时避免资源过载。

行业实践:Kafka 消费者重试:默认 10 次、Redis 客户端重试:默认 5 次、Hadoop 任务重试:默认 3-5 次、RFC 建议:RFC 6582(HTTP 重试)建议:3-5 次重试。

3、最佳实践速查表
参数短期任务(分钟级)中期任务(小时级)长期任务(天级)
乘数221.75
重试次数3 - 55 - 88 - 12
初始间隔(秒)1 - 530 - 60300 - 600
总耗时范围<60秒5 - 10分钟1 - 2小时
适用场景临时网络波动 服务重启、发版服务短暂过载资源密集型操作

三、经验沉淀:异常重试机制的设计原则​

通过这次实践和对行业方案的研究,我们总结出异常重试机制设计的四大核心原则:​

1.动态适应性原则:重试策略应支持参数化配置,根据业务场景和系统负载动态调整重试间隔和次数,避免 “一刀切” 的重试策略对系统造成冲击。​

2.幂等性保障原则:确保任务在多次重试过程中不会产生重复数据或副作用,通过唯一标识、状态机等技术手段,实现任务的幂等执行。​

3.故障隔离原则:将重试逻辑与业务逻辑分离,通过消息队列、异步调度等方式,降低重试操作对主线程的影响,避免因重试失败导致系统整体崩溃。​

4.可观测性原则:建立完善的监控和告警体系,实时追踪任务重试状态,在达到最大重试次数时及时发出告警,便于运维人员快速定位和解决问题。​

四、结语:以技术沉淀筑牢大促防线​

这次线上异常事件,犹如一面镜子,让我们清晰地看到了系统中的潜在风险,也为我们提供了一次宝贵的技术提升机会。通过对异常重试机制的深入研究和实践,我们不仅解决了当前问题,更将这些经验转化为团队的技术资产。在未来的 618 大促及其他关键业务场景中,我们将以更完善的技术方案、更严谨的设计原则,守护系统的稳定运行,为业务发展提供坚实的技术保障。

作者:蔡欣彤

项目说明

这是一个同时支持stdio,streamableHttpless和sse三种协议的MCP-Server的框架(ts语言)。

为什么我想做这个框架呢?因为随着AI发展,现在越来越多业务需要和AI相结合。而我在做AI应用中发现,MCP服务在AI方向的业务使用频率很高,但随着业务的加深,发现存在以下痛点:

1.针对不同业务,对于mcp-server需要的类型不同,有的就需要stdio,有的需要网络请求

2.不同平台对MCP服务协议要求不同,有支持streamableHttp,有仅支持sse的。

这两种情况,会出现相同功能重复开发,重复造轮子,浪费时间成本

  1. 此外,有些研发人员目前并不了解MCP,在业务开发时候需要现学

而这会让研发周期加长,时间成本耗费过多

所以为了解决以上痛点,我从0-1搭建了这个框架。这个框架特点

1.同时支持stdio,streamableHttpless和sse三种模式,实现一次开发支持三种模式

2.所有功能都拆分为独立模块。这样即使不懂的人,只要在指定的文件里面编写业务逻辑,就可以创造自己的mcp服务

3.支持环境变量,可通过环境变量配置域名,服务地址,端口和host,真正适用于生产使用

4.切换模式也很简单,只要在启动脚本根据需要,切换启动命令即可,改动成本近乎无

5.添加日志模块,方便查阅启动和服务调用情况

6.同时添加行云脚本,支持行云部署

github地址:https://github.com/XingtongCai/mcp-server-ts

coding地址: http://xingyun.jd.com/codingRoot/jdcloud-fe/mcp-server/tree/m...

内容介绍

整个框架的结构很简单,就如下这些:

## 目录结构
- build: 编译之后的文件
- src
 -- router: 配置streamableHttp和sse协议的路由
   -- index.ts: 注册streamableHttp路由入口
   -- mcp.ts: streamableHttp的配置路径,具体为`process.env.MCP_BASE_PATH`的路径请求,如果没有配置,默认/mcp。如果有需要添加二级路径,例如 /mcp/event,需要在这里面添加一下/event,如果一级不用动
   -- sse.ts: sse的配置路径,具体为`process.env.MCP_BASE_PATH`的路径请求,如果没有配置,默认/mcp。如果有需要添加二级路径,例如 /mcp/event,需要在这里面添加一下/event,如果一级不用动
 -- tools: mcp的工具 
   -- index.ts: 注册工具
   -- mockFunc.ts: 模拟一个工具写法 - 这部分需要根据业务开发
 -- cli.ts: 命令行解析工具
 -- index.ts: 总入口
 -- server.ts: 创建Mcp服务
 -- sse.ts: 运行sse模式
 -- stdio.ts: 运行stdio模式
 -- streamableHttp.ts: 运行streamableHttp模式
- xingyun/bin : 是根据我们业务使用的部署工具开发的部署脚本 - 这部分需要根据实际部署平台更改,我这个支持行云部署
- build_xingyun.sh: 是根据我们业务使用的部署工具开发的部署脚本 - 这部分需要根据实际部署平台更改,我这个支持行云部署

启动服务方式

a.本地启动

1.启动stdio: npm run start 是默认启动stdio

2.启动StreamableHttp: npm run start:http 是默认启动端口3001

3.更改端口启动StreamableHttp: npm run dev:http 或者 npm run start -- -t http -p 3001

-t httt: 代表启动StreamableHttp

-p 3001: 代表启动端口3001

4.启动sse: npm run start:sse 是默认启动端口3001



b.部署启动

我在 xingyun/bin/control.sh中写的启动脚本,这段代码是启动streamableHttpless的,如果需要启动sse,需要改为 npm run start:sse

start(){
    npm run start:http
    sleep 3
    status
}

生产环境配置

# 监听特定内网IP(例如:192.168.1.100)
export MCP_HOST=192.168.1.100
export MCP_PORT=3001

# 使用内网域名(可选)
export MCP_DOMAIN=mcp-server.internal.com

# 修改基础路径(可选,默认是 /mcp)
export MCP_BASE_PATH=/api/mcp

<!---->

### 端口配置优先级
1. 环境变量 `MCP_PORT`(最高优先级)
2. 命令行参数 `--port` 
3. 默认值:3001端口

### 访问地址优先级
1. 环境变量 `MCP_DOMAIN`(最高优先级)
2. 环境变量 `MCP_HOST`
3. 默认: localhost

<!---->

### 内网访问方式
假设你的内网服务器IP是 `192.168.1.100`,端口是 `3001`:

**基础访问:**
```
http://192.168.1.100:3001/sales
```

**带域名的访问:**
```
http://mcp-server.internal.com/sales
```

**自定义路径:**
```
http://192.168.1.100:3001/api/mcp



项目关键代码说明

这个是package.json文件,也是我们一开始要看的,cli.js这个文件是我们启动文件,也是解析命令行的工具,真实区分的地方在index.ts文件中

"scripts": {
    "build": "tsc && chmod 755 build/src/index.js  build/src/cli.js",
    "start": "node ./build/src/cli.js",
    "start:http": "node ./build/src/cli.js --transport http",
    "start:sse": "node ./build/src/cli.js --transport sse",
    "dev:http": "node ./build/src/cli.js  --transport http --port 3002",
    "stop": "pkill -f "demo" || true",
    "restart": "npm run stop && npm run start:http",
    "inspector": "npx @modelcontextprotocol/inspector"
  },

index.ts 的关键代码,在这区分不同模式,然后进入到各自的处理模块。各自模块就是调用sdk,配置域名等操作,代码过长,不展示了,但是这几个文件不用动。

在这里插入图片描述


StreamableHttp.ts我支持的是less,就是我不需要sessionId,如果有需要的,这块需要再自己改一下!!

在这里插入图片描述



server.ts 是创建mcp服务,同时注册tools工具,三个模式都需要使用的公共文件

在这里插入图片描述

tools/index.ts, 作为工具入口,一个工具一个注册

在这里插入图片描述

router文件夹下路由注册,是为了sse和streamableless的路由。

在这里插入图片描述

其中streamable的index.ts文件里面关键内容,其中basePath就是你的基础路径,通过定义指定访问路径。

在这里插入图片描述



sse的在sse.ts文件中,定义了get和post的方法

在这里插入图片描述



其实整个框架到这关键的代码就说完了。剩下xingyun的就是在行云平台部署和启动需要的脚本,这里就不介绍了



成果展示

1.stdio - 发布了依赖包,并用joycode成功联通

https://npm.m.jd.com/package/@jd/demo-mcp-server

在这里插入图片描述



2.streamableHttp - joycode成功联通并且可以运行


在这里插入图片描述

在这里插入图片描述

3.sse - autobots支持sse模式,用这个框架开发了在业务中使用的 权限拦截MCP,并成功在autobots引入


在这里插入图片描述
在这里插入图片描述

本文横评 12 款项目集管理软件/PPM/SPM 工具:ONES、Planview、Clarity、ServiceNow SPM、Jira Align、Planisware、Sciforma Vantage、Meisterplan、OnePlan、Microsoft Project、Oracle Primavera P6 EPPM、Smartsheet Control Center。目标是帮研发负责人、PMO 与效能团队快速识别:哪些工具能支撑“战略—投资—资源—交付—价值”的闭环,以及最常见的落地陷阱与避坑路线。

为何“项目集管理软件”成为管理刚需

过去几年,很多企业的研发数字化先解决了“把活干起来”:需求、任务、迭代、缺陷能在线流转,协作效率明显提升。但到了 2026 年,新的瓶颈更集中在“把活干对、把钱花值”——项目越来越多、依赖越来越密、资源冲突越来越频繁。管理层真正缺的,往往不是一个更好看的项目看板,而是一套能支撑跨项目决策的项目集管理软件(PPM/SPM)。

概念速查:

  • 项目(Project):为交付特定成果而开展的临时性工作。
  • 项目集(Program):一组相互关联的项目与活动,通过协同管理来实现单个项目无法独立实现的业务收益。
  • 项目组合(Portfolio):为实现组织战略目标而进行的项目/项目集集合及其选择、优先级与治理活动;其核心是战略对齐与投资决策。
  • PPM(Project Portfolio Management):更常用的行业叫法,强调以组合方式进行选择、排序、资源与财务配置。
  • SPM(Strategic Portfolio Management):更强调“战略 + 资金 + 执行”一体化治理,把组合管理提升为经营系统。

一句话总结:项目集管理软件解决的不是“项目怎么排”,而是“在资源与资金约束下,哪些项目集最值得做、怎么做、做出什么价值”。

工具盘点:12款项目集管理软件横评

1) ONES(ONES Plan + ONES Project)

一句话定位:偏“研发一体化”的项目集管理软件,把计划层与研发执行数据打通。ONES Plan 强调多项目总览、里程碑/甘特、资源与工时等,并与 ONES Project 数据互通。

项目管理能力(ONES Project):面向敏捷与瀑布等项目制研发,覆盖需求池与迭代规划、任务工时统计与进度可视化(看板、燃尽图等),并提供缺陷跟踪与质量统计;再通过多种报表与可选维度输出绩效度量与改进信号,适合把“交付过程”做实。

项目集/项目组合能力(ONES Plan):核心抓手是“多项目总览 + 里程碑/甘特 + 资源/工时”。它支持总览多项目信息、制定里程碑与甘特计划,并通过自定义项目属性与多项目数据集合,把不同类型项目纳入同一治理口径;资源侧提供多种资源报表与项目工时管理,并可直接查看 Project 的登记/预估/剩余工时数据,帮助管理层理解投入结构与团队负载,从而更理性地做优先级与产能调度。同时,Plan 提供产品管理(产品线),可通过工作项属性实现跨项目管理,更适合“按产品域聚合组合”的组织。

适用场景:研发多项目并行,既要项目集层面的管控,又希望需求/迭代/缺陷等执行数据可回流的组织。

2) Planview(Strategic Portfolio Management )

定位一句话:企业级 SPM,强调战略到交付的组合治理,并将 AI 深度嵌入;Planview 明确提出其战略组合管理用于帮助高层、财务与 EPMO 推动转型与按战略交付。
项目集/项目组合能力:强在“组合视图、情景规划、资源约束下的决策”,并借助 AI 做风险识别、预测与自动化辅助(Planview Anvi 发布中提到可检测组合风险、预测新工作完成情况等)。
适用场景:多事业部、投资盘子大、需要组合层治理深度与跨部门协同的组织。
优势亮点:适合把项目集管理软件作为“经营驾驶舱”:在约束下做选择,在变化中持续重排。
局限与体验:实施与配置复杂度通常不低;若流程与主数据治理不成熟,容易变成“填表工程”。
试用重点:要求用你们真实资金/资源约束跑一次 what-if,并验证输出是否能支撑评审会“当场决策”。

3) Broadcom Clarity(Clarity SPM)

定位一句话:Clarity 被官方定义为企业级 SPM 平台,用于统一战略、资金与执行,并强调财务透明与资源利用。
项目集/项目组合能力:更偏“资金与资源治理驱动”的项目组合管理,适合在组合层把“投什么、投多少、谁来做”讲清楚。
适用场景:PMO 成熟、预算问责明确、资源需要矩阵化调度的大中型组织。
优势亮点:当高层最关心“钱去哪了、产能去哪了”时,Clarity 的价值更容易体现。
局限与体验:对数据口径要求高;与交付系统割裂时,集成会显著抬高 TCO。
试用重点:优先验证“资金池—成本归集—资源占用—价值/收益追踪”的最小闭环能否跑通。

4) ServiceNow SPM(Strategic Portfolio Management )

定位一句话:平台化的 SPM,把需求、组合、项目与治理流程放进统一工作流,并用 Now Assist for SPM 提升记录创建、项目总结、需求/用户故事生成等效率。
项目集/项目组合能力:强在“流程可审计、端到端流转”,适合把立项、组合评审、变更、项目治理做成系统化管理闭环。
适用场景:企业已有 ServiceNow 平台基础,或希望用一个平台承载跨部门治理。
优势亮点:AI 更贴近管理工作流(总结、生成、完善记录),对提升“治理效率”有现实价值。
局限与体验:平台化意味着建模与实施门槛;治理边界不清会“流程压死敏捷”。
试用重点:用真实审批链跑一遍立项/变更,看权限、审计日志、口径与例外处理是否可用。

5) Atlassian Jira Align

定位一句话:战略到执行的对齐层,允许团队继续在 Jira 与 Azure DevOps 中工作,同时在计划、项目组合与企业层进行协调与规划。
项目集/项目组合能力:更适合“规模化敏捷/混合交付”的组合治理,价值在于减少“战略语言”和“团队执行语言”的翻译成本。
适用场景:正在推进 SAFe/规模化敏捷,或跨团队依赖密集、需要 program 层节奏协同的组织。
优势亮点:对齐逻辑清晰,特别适合用来统一路线图、依赖与价值交付节奏。
局限与体验:它不是细化项目计划的工具;如果底层数据与需求治理不稳,很容易出现“看上去对齐、实际失真”。
试用重点:重点验证双向数据回流与字段语义一致性(Align↔Azure DevOps/Jira)。

6) Planisware

定位一句话:强调数据驱动的评分、对比与优先级排序,并把 reporting、analytics、scenario modeling 融合到组合绩效、资源利用与风险洞察中。
项目集/项目组合能力:强在“组合优化 + 情景模拟 + 资金/容量权衡”,适合把组合治理做得很“硬”。
适用场景:流程成熟、资源约束强、需要严谨组合规划的中大型组织(尤其多项目、长周期行业)。
优势亮点:对高层最关键的“取舍问题”支持度高——在投入前先把不同策略的后果算清楚。
局限与体验:学习曲线与实施复杂度较高;组织配套机制不足时,系统很难跑出真实价值。
试用重点:让 PMO 用真实资源/预算约束跑两套方案并对比:稳健增长 vs 风险缓解。

7) Sciforma Vantage(现并入 Planview 体系)

定位一句话:面向 PPM/项目组合管理的产品线,市场材料强调 simulations、实时比较与组合概览等能力;同时 Planview 已完成对 Sciforma 的收购并将其纳入组合解决方案。
项目集/项目组合能力:更偏“PMO 视角的组合治理与可视化”,适合希望快速建立组合透明度与容量规划能力的组织。
适用场景:需要组合分析/情景模拟/容量规划,但又不一定上最重的全栈平台的企业。
优势亮点:适合做“可视化决策”,把组合评审从主观争论拉回到可比较的方案层面。
局限与体验:与研发执行工具链的深度联动通常需要额外集成与数据建模。
试用重点:优先验证:组合评分模型能否适配你们的战略维度;容量规划是否能真实反映人力约束。

8) Meisterplan

定位一句话:典型“组合级资源管理 + 情景规划引擎”,强调用场景(Scenarios)回答高层 what-if 问题,并用多视图呈现对项目、资源与财务的影响。
项目集/项目组合能力:更像“组合决策引擎”,项目执行可留在 Jira/其他系统里。
适用场景:项目太多、资源冲突高频、但不想先上重型 SPM 的成长型组织。
优势亮点:上手更聚焦,能更快把“资源—需求—优先级”从 Excel 拉到一致视图。
局限与体验:财务/收益闭环常需要外部系统补齐;治理重时要小心边界错配。
试用重点:用一周做“资源冲突复盘”:导入近期延期项目,检验系统是否能解释冲突来源与调序后果。

9) OnePlan

定位一句话:主打“连接异构工具链,把数据汇入统一组合视图”,明确提到可连接 Teams、Planner、Project、Azure DevOps、Jira、Smartsheet 等,把项目数据汇聚到一个平台。
项目集/项目组合能力:强在“连接 + 统一口径 + 组合视图 + 资源优化”,特别适合工具分散、数据分裂的企业。
适用场景:多系统并存,希望先解决“组合透明度与统一口径”。
优势亮点:连接面广,适合以较低代价先做出全局视图,再逐步强化治理。
局限与体验:连接越多,对主数据治理要求越高,否则只是把噪音集中到一个地方。
试用重点:重点做一次“字段语义对齐”演练:状态/优先级/完成度在不同系统的定义如何统一。

10) Microsoft Project

定位一句话:微软生态的 PPM 路线对很多企业很友好,但必须提一句的是:微软已宣布 Project Online 将于 2026-09-30 退役,迁移规划需要提前纳入选型。
项目集/项目组合能力:更偏“标准化流程 + 报表/协作生态”,适合希望与 Microsoft 365/Power BI 深度耦合的组织。
适用场景:协作平台以 Microsoft 365 为核心,且希望以较低集成成本搭建组合视图的企业。
优势亮点:生态与扩展性强;对“统一报表口径与协作体验”价值明显。
局限与体验:如果企业核心矛盾是“资源容量与组合优化”,仅靠轻量生态往往不够,需要更清晰的治理机制与模型。
试用重点:把“退役迁移路线”当成验收项:未来两年你的组织要迁往哪里,数据与流程怎么接续。

11) Oracle Primavera P6 EPPM

定位一句话:Oracle 官方文档明确其为集成解决方案,用于在全球范围确定项目、计划(program)和项目组合(portfolio)的优先级、进行计划、管理和执行。
项目集/项目组合能力:更适合“复杂排程/关键路径/长周期大型项目群”的治理,在工程与强计划约束行业非常典型。
适用场景:工程建设、制造交付、强里程碑与强关键路径管理的组织。
优势亮点:排程与项目群治理成熟,适合把“计划准确性与可控性”做到极致。
局限与体验:对产品迭代/敏捷研发组织可能偏重;与 DevOps 工具链的耦合需要方法论转译与集成投入。
试用重点:验证关键路径、基准与变更影响分析是否真正减少“计划反复推倒重来”。

12) Smartsheet Control Center

定位一句话:以蓝图(Blueprint)规模化创建项目,并形成“蓝图汇总/组合报表”的统一视图;其学习中心也强调通过 dashboard widget 自动汇总新建项目的数据,实现组合层可视化。
项目集/项目组合能力:更偏“可复制的项目工厂 + 组合报表”,特别适合大量重复型项目的规模化治理。
适用场景:交付/运营/门店/推广等重复性项目多,希望快速统一模板与汇总报表的组织。
优势亮点:把 PMO 从“项目搭建与汇总”中解放出来,提升一致性与可见性。
局限与体验:更深的投资组合建模与财务闭环往往需要外部系统配合;否则更像“组合可视化 + 标准化执行”。
试用重点:验证蓝图能否承载治理规则(字段/权限/变更),以及组合报表是否覆盖高层关心的问题。

项目集管理软件落地避坑指南

我把失败原因归为三类,便于你对症下药。你会发现:这些坑不是“某个产品的缺陷”,而是“组织把项目集管理软件当成灵丹妙药”的误解。

1) 数据没统一:没有“单一事实源”,一切组合分析都是幻觉

项目集管理软件最依赖三类数据:项目状态口径、资源与工时口径、成本/预算口径。任何一条不可信,组合层的结论就会被质疑。最终高层会议讨论的不是“决策”,而是“数据准不准”。
避坑动作:先定“口径委员会”,把状态、完成度、健康度、产能占用的定义统一下来;宁可少指标,也不要多口径。

2) 决策机制没落地:工具无法替你做取舍

很多企业买项目集管理软件的潜台词是“希望系统帮我压住各部门”。但系统只能把规则固化,无法替你做组织政治的取舍。没有清晰的组合评审节奏、资源分配权责与变更门槛,工具只会把混乱更高清地展示出来。
避坑动作:把“项目增量的门槛”写进制度:新增项目必须说明战略关联、收益假设与资源来源;没有这三项,系统再强也只是登记簿。

3) 集成断层:战略与组合在云端,交付在地面

像 Jira Align 这类对齐层,定位就是把战略与执行连接起来,并与 Jira/Azure DevOps 形成数据回流。
但如果底层交付系统的数据语义不统一,系统对齐只会变成“漂亮但失真”。
避坑动作:把“字段语义映射表”当作一等公民:状态、优先级、完成标准必须跨系统一致,否则组合报表一定失真。

一套更可执行的落地路线图(30-60-90天):

前30天:统一视图
先别追求全功能,做到:项目清单唯一、状态口径统一、组合视图能回答“我们在做什么、占用多少产能”。

60天:治理入口
把立项入口、组合评审、变更审批流程固化;做到“新增项目必须过门槛”。

90天:组合优化
引入 what-if 与资源/资金约束下的组合选择,把会议从“吵架”变成“算账”。

项目集管理软件选型的本质,是你要用系统解决哪个“经营问题”——战略对齐、投资取舍、资源约束、价值兑现。把问题定义对了,再用“三层尺子(数据/治理/系统)”评估,你就很难选错。

作为一名日常用 Mac 办公的打工人,最近想自己组装一台 Windows 主机,结果打开京东和海鲜市场一看,瞬间被价格劝退 —— 内存和硬盘的价格几乎翻了一倍,原本预算内的配置,现在硬生生超了不少。相信不少 DIY 爱好者都有同感:电脑配件怎么涨得这么离谱?明年能不能盼来降价?
这轮涨价并非偶然,核心原因是 AI 产业的爆发式增长。全球存储巨头为了抢占利润更高的 AI 专用存储市场,纷纷把生产普通 DDR5 、DDR4 内存和固态硬盘的产线,改造用于生产高带宽内存( HBM )。HBM 占用的晶圆面积是普通内存的数倍,直接挤压了消费级配件的产能。加上渠道商囤货惜售,进一步放大了供需缺口,价格自然水涨船高。
那么,明年配件价格能回调吗?目前来看,乐观但不乐观。一方面,随着各大厂商逐步扩大产能,以及 AI 市场需求增速放缓,预计明年下半年部分存储产品的供需会趋于平衡,价格可能出现小幅回落。但另一方面,AI 算力需求仍在增长,想要回到之前的 “白菜价” 几乎不可能。
对于我们普通装机用户来说,与其盲目等待降价,不如按需购买。如果不是急需,可选择二手靠谱配件过渡;若必须装机,建议优先锁定核心配置,避开价格波动最大的型号。毕竟,装机是为了提升效率,没必要在涨价潮中过度焦虑。

作者:齐海智

大促备战中的代码评审困境与破局

双十一大促是系统稳定性的终极“大考”。为规避上线风险,技术侧会启动系统封板管控,主动将非紧急需求的发布窗口前置。这一举措在保障系统稳定性的同时,也必然导致研发需求的前置与集中,使得封板前的代码评审任务量显著增加。我们面临着一个严峻的“量与质”的挑战:

如何在时间紧、任务重的双重压力下,确保代码评审的效率与质量,从而前置发现潜在风险,有效拦截线上BUG?

传统的代码评审模式在此场景下效率低、质量差(风险遗漏的可能性高),而现有的AI辅助工具又因误报率高而陷入尴尬:产生的多数评审意见并无实质帮助,工程师仍需花费大量时间进行判断与筛选。

正是在此背景下,【供应链技术部-商家导入研发组】在AI代码评审方面进行了一些探索,尝试将知识工程代码知识检索能力与AutoBots(已更名为:JoyAgent)知识库检索能力相结合,构建了一套代码评审系统。这套双RAG架构为我们的代码评审工作提供了一些新思路,在此分享出来,希望与各位同行交流探讨,共同进步。

现有技术方案的局限性

技术1:基于流水线的AI代码评审方案

核心技术路径: 在通过公共流程(Webhook触发、解析MR、获取Diff)得到代码变更内容后,该方案的核心处理流程如下:

1.文件类型过滤:仅保留.java、.yaml和.md文件进行后续分析,并明确优先级的处理顺序。

2.上下文截断:为避免触及大模型上下文窗口上限,采用了一种基于固定行数的上下文截断策略。该策略仅截取代码变更处附近预设行数(如10行)的文本内容。

3.Prompt驱动评审:将经过过滤和截断后的代码片段,与预设的评审规则Prompt组合,发送给通用大语言模型。

4.输出评审意见:解析大模型的返回结果,通过coding平台API将评审结果添加到MR中。

核心问题识别

1.全局上下文缺失:其采用的“固定行数截断”策略是导致问题的根本原因之一。这使得评审完全丧失了项目架构、模块依赖和完整业务逻辑的视野,如同“管中窥豹”,评审深度和准确性受到严重制约。

2.提示词天花板:所有评审规则与知识硬编码于Prompt中,规则膨胀后极易触及模型上下文长度上限,可维护性与扩展性差。

3.知识无法沉淀:效果提升完全依赖于“更换更强的基础模型”与“调整Prompt”,自身缺乏可持续积累、沉淀和复用领域知识的机制。

技术2:基于JoyAgent知识库的RAG代码评审

核心技术路径: 在通过公共流程获取代码差异后,该方案的核心流程如下:

1.知识归纳:将格式化后的Diff内容发送给JoyAgent,由LLM智能体对其进行初步的“知识归纳”,以理解此次变更的核心意图。

2.规则检索:基于归纳出的知识,通过RAG机制从自定义知识库中召回相关的代码评审规则。此知识库支持在线文档(Joyspace)、离线文档(PDF/Word)等多种格式。该方案的核心灵活性在于其“自定义知识库绑定”机制。接入者可以在JoyAgent平台上自定义智能体,通过工作流绑定自定义知识库。这使得在召回评审规则时,系统能动态地查找并应用接入者自定义的评审规则,从而实现了无需修改Prompt即可定制评审规则的能力。

3.行级评审:JoyAgent将代码Diff与召回的具体规则相结合,再次调用LLM进行精确评审。利用Git Diff信息中包含的代码行信息,能够将评审意见精准关联到具体的代码行。

4.输出结果:直接使用JoyAgent的输出结果,通过coding平台API将评审结果添加到MR中。

核心问题识别

1.知识归纳失真:核心问题源于其“知识归纳”步骤。该步骤依赖底层大模型对Code Diff进行总结,此过程不稳定,经常遗漏或曲解原始代码变更的关键上下文,导致后续流程建立在一个不完整或失真的信息基础之上。

2.检索与生成联动失效:基于失真的知识归纳结果进行RAG检索,导致召回的规则与真实代码场景匹配度低。此外,检索结果未经有效的重排序,直接与不完整的代码上下文一并送入大模型,这使得模型缺乏进行准确判断的可靠依据,最终必然生成大量不可靠甚至错误的评审意见。

从线上问题到技术突破

问题1:三方系统空值处理异常

示例:

// 问题代码:三方系统地址编码字段处理
request.setAddressCode(String.valueOf(address.getCode()));
// 当address.getCode()为null时,String.valueOf(null)返回"null"字符串
// 导致三方系统Integer.parseInt("null")抛出NumberFormatException

技术1的问题

理论上,可以通过在Prompt中硬编码“三方接口地址编码须为数字类型字符串” 的规则来识别此问题。然而,随着业务场景增多,所有规则都被挤压在有限的上下文窗口内竞争。当代码变更触发自动压缩(如截断至10行)时,被保留的上下文具有极大的随机性,与当前评审强相关的评审规则很可能被其他无关规则挤掉或因自动压缩而被截掉,导致其无法被稳定触发,从而漏报。

技术2的问题

该方案虽然理论上能够通过知识库检索到相关规则,但其不稳定的知识归纳过程导致代码上下文的理解时好时坏,使得规则检索的准确性波动较大。同时,未对检索结果进行重排序,进一步放大了这种不确定性。最终,由于缺乏稳定、可靠的上下文支撑,系统无法持续、准确地识别此类问题,其评审结果表现出显著的随机性。

问题2:EDI项目中的语法错误

示例:

<!-- 错误:使用变量而非字面常量 -->
<case value="${orderType}">
<!-- 正确应使用字面值:<case value="NORMAL"> -->

EDI平台介绍:

EDI(电子数据交换)是用来解决京东物流与多样化商家系统间的对接难题的技术,其关键功能包括协议转换、数据格式转换、数据校验和流程编排。这意味着EDI配置文件必须严格遵守预定义的语法和标准,任何偏差都可能导致平台的核心转换与校验功能失效。

技术1的问题

由于其缺乏对EDI配置语法与规范的领域知识,如果自定义规则,会遇到问题1一样的提示词天花板和上下文截断的问题。

技术2的问题

除了上面提到的知识归纳过程的不稳定问题,技术2也面临一个更前置的的挑战:它缺乏对项目身份的感知能力。系统在处理一个XML配置文件时,无法自动识别它隶属于“EDI项目”而非普通Java应用。因此,在后续的RAG检索过程中,它极有可能使用通用的Java代码评审规则,而无法精准命中“EDI专用配置规范”这一关键上下文,导致检索方向错误,最终无法识别出必须使用字面常量这一特定于EDI领域的合规性要求。

解决方案:双RAG架构

在这里插入图片描述

1. 识别项目类型

特征识别:基于文件扩展名(.flow, .dt)进行精准判断。

优先级设定:EDI项目识别优先于普通JAVA项目,确保领域特殊性得到优先处理。

策略影响:项目类型直接决定后续评审规则的选择RAG知识库的检索策略,从源头保障了评审的针对性。

2. 代码分块处理

2.1 Token估算算法

由于我们使用的底层大模型是JoyAI,并没有公开tokenizer的细节,根据官网文档提供的token计算API: http://api.chatrhino.jd.com/api/v1/tokenizer/estimate-token-c...

测试了几组数据:

测试文本字符长度实际Token数内容Token增量
空字符串0630
"a"164+1
"hello"564+1
"code"464+1
"hello world"1165+2
"测试"264+1
"编程编程"465+2
"测试测试测试测试测试"1068+5
"hello世界"765+2
"programming代码"1366+3
重复"programming代码"3次3972+9

推导过程

通过分析测试数据,我们发现了以下关键规律:

1.基础系统开销:所有请求都有63 tokens的固定开销

2.英文单词分级:

◦1-5字符单词 = 1 token("a"、"hello"、"code")

◦6-10字符单词 ≈ 2 tokens(推测值)

◦11+字符单词 = 3 tokens("programming")

3.中文分词规则:每2个中文字符 = 1 token

4.空格处理:空格作为分隔符,不增加额外token

5.混合内容:按字符类型分段计算后求和

基于上述规律,我们构建了以下估算公式:

总Tokens = 63 + ∑(单词token)

单词token计算:
- 单字符单词: 1 token
- 英文单词(≤5字符): 1 token  
- 英文单词(6-10字符): 2 tokens
- 英文单词(≥11字符): 3 tokens
- 中文文本: (字符数 + 1) / 2 tokens
- 混合内容: 分段计算后求和

2.2 分块阈值与安全设计

•触发阈值:当预估Token数 > 100,000时,自动触发分块处理流程。

◦JoyAI的上下文窗口是128K,由于JoyAI没说明1K是1024还是1000,保守估计使用1000

◦128K = 128000,为了避免超过上下文窗口,留个富余量,使用80%,12800*0.8=102400 ≈100000

在这里插入图片描述

•单块容量:设定 MAX\_TOKENS\_PER\_CHUNK = 60000,为模型输出及上下文预留40%的安全余量。

•设计理念:通过严格的容量控制,确保单次处理负载均在模型窗口的安全范围内。

2.3 智能分块策略

系统采用两级分块策略,确保代码语义的完整性:

2.3.1 文件级分割

通过git diff指令识别文件边界,确保单个文件的代码完整性,避免跨文件分割。

Pattern.compile("diff --git a/(.+?) b/(.+?)\n") 

2.3.2 代码结构感知分割

利用方法签名模式识别代码结构边界:

Pattern methodPattern = Pattern.compile(
 "([+-]\s*((public|private|protected)\s+)?(\w+\s+)?\w+\s*\([^)]*\)\s*\{)",Pattern.MULTILINE);

在方法或类的自然边界处进行分割,最大限度保持代码块的语义完整性。

3. RAG增强与重排序机制

3.1 基于知识工程的代码片段、业务上下文的检索

在 RAG增加服务中实现多维度检索增强:

•业务领域识别:基于代码内容识别是仓业务(WMS)、仓配接入业务(ECLP)、转运中心业务(TC)等。

•关键词提取与过滤:从变更文件中提取并净化关键术语。

•通过执行语义搜索。

重排序优化:对检索结果使用BGE模型进行重排序,提升相关性。

3.2 重排序

在RAG系统中,检索(召回)这一步通常使用向量相似度搜索。这种方法追求的是高召回率——即尽可能不遗漏任何可能相关的文档。但这就带来了一个问题:

◦数量过多:可能会返回大量候选文档,全部送入大模型会导致超过上下文窗口限制,成本高昂且速度慢。

◦质量不均:向量搜索是基于语义相似度,但“相似”不一定等于“有用”。它可能会召回一些:

▪主题相关但内容泛泛的文档。

▪包含关键词但逻辑不匹配的文档。

▪相关性排名不高但实际至关重要的“珍宝”文档。

例如检索“如何做番茄炒蛋”,向量相似度查询结果可能会找到:

◦《番茄炒蛋的最正宗做法》 (极度相关,排名第一)

◦《100道家常菜谱》 (相关,但范围太广)

◦《鸡蛋的营养价值》 (部分相关)

◦《番茄种植指南》 (仅关键词相关,实际无用)

如果不经处理,把这四篇文档塞给大模型,模型需要费力地从大量文本中辨别哪些是真正有用的信息,不仅增加了Token消耗,更严重的是,无关信息会形成“噪声”,干扰模型的判断,导致生成质量下降——模型幻觉。

为了节省成本,我们使用了本地重排序方案:

◦模型文件: bge-reranker-base.onnx (BGE重排序模型)

◦分词器: HuggingFaceTokenizer

◦运行时: ONNX Runtime Java API

// 核心流程
public List<Map.Entry<String, Float>> rerankBatch(String query, List<String> documents) {
 // 1. 文本预处理和分词
 // 2. 构建查询-文档对
 // 3. ONNX模型推理
 // 4. 相关性评分计算
 // 5. 按分数降序排序
 // 6. 返回排序结果
}

示例:

在这里插入图片描述

4. 实际应用效果验证

案例1:成功预防空值处理事故

在这里插入图片描述

案例2:EDI配置规范检查

在这里插入图片描述

总结与展望

我们探索出的双RAG架构,其价值核心并非追求极致的简单或敏捷,而是它既能像资深的一线研发一样,深度理解业务及代码变更的具体语境与潜在影响,又能像严谨的架构师一样,严格遵循成文的规范与最佳实践。

通过结构化的协同机制,系统将两种不同质、不同源的知识(深度的代码语义与精准的评审规则)进行融合,实现了 “1+1 > 2” 的智能涌现,从而具备了识别并预防那些复杂、隐蔽代码缺陷的深度推理能力。这正是我们在高并发、高可用要求极为严苛的大促等场景下,为夯实系统稳定性基石所做出的关键性架构决策。

这一成功实践,为我们奠定了代码评审工作中坚实的技术基石,并清晰地指明了未来的演进路径:

1.迈向多模态代码理解:从纯文本代码评审,扩展至对架构图、时序图等非结构化设计产物的理解与合规性检查。

2.构建全域业务知识库:自动抓取并融合产品经理的历史PRD、设计文档等非技术知识,将其转化为知识工程中的关键上下文。这使得AI在评审时,不仅能理解“代码怎么写”,更能判断“代码为何而写”,实现对业务意图的精准校验,从源头规避偏离产品设计的实现。

3.实现需求上下文的自动关联:通过规范研发流程,约束在提交代码时于commit信息中嵌入需求编号。系统在评审时自动提取该编号,并主动获取对应的PRD详情。这使得每一次代码评审都能够在完整的业务背景中进行,AI能够直接对照需求文档,判断代码实现是否完整、准确地满足了所有功能点与业务规则,提供前更加精准的上下文。

虽然探索的道路并非坦途,我们曾在具体的技术细节中陷入困境,例如,为了在 CentOS 7.9 的环境中支持高版本 ONNX 运行时以启用重排序功能,不得不手动编写docker脚本从源码编译高版本的cglib依赖。这段经历,恰恰印证了弗雷德里克·布鲁克斯在《人月神话》中所揭示的那句箴言:

The only way to accelerate software work is to simplify the product and the process, and to face the essential complexity of the software task itself with courage and skill.

利益相关声明:作者与文中产品有直接的利益相关(开发者、自家产品等)

Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 

文章代表作者个人观点,少数派仅对标题和排版略作修改。


当「英语四六级」遇上「英文菜单」

大家好,我是开发者 Pyacark。故事的起点很俗套,但也很真实。作为一个在英语考试中身经百战的选手,词汇量虽然马马虎虎,但也不是两眼一抹黑。但是每次出国旅行,走进当地餐厅,打开菜单的那一刻——却总是充满尴尬

那些单词我都认识字母,组合在一起却仿佛天书。没有 abandon,没有复杂的从句,只有 Glazed(上釉的?不,是蜜汁)、Tart(酸的?不,是塔)、Poached(偷猎?不,是水煮)。那些饭是盲点的,那份尴尬,让我意识到一个问题:我们的英语学习,往往是为了「考试」,而不是为了「生活」。

即使背了再多单词,当生活场景具体到「吃」这件事上时,我们依然可能是失语者

就是这个念头,让我决定开发一款专注于垂直细分领域的单词 App —— 「上菜单词」。它的初衷特别简单:让每一个成年旅行者,都能自信地看懂菜单,体面地完成点餐。

为什么背单词不能像「抽卡」一样快乐?

在立项之初,我一直在思考一个问题:为什么背单词如此反人性?从心理学角度看,背单词是一种极端的「延迟满足」(Delayed Gratification)。你今天背的单词,可能要三个月后的考试,甚至三年后的旅行中才能用上。这种反馈链路太长,大脑很难产生持续的多巴胺。

反观现在的游戏,为什么我们沉迷于「抽卡」、「开箱」?因为那是「即时满足」(Instant Gratification)。手指一点,金光一闪,获得感瞬间炸裂。哪怕是垃圾蓝天白云,你也会期待下一发的出货。

作为一个「抽卡星人」,我产生了一个离经叛道的脑洞:如果把每一个枯燥的单词,都变成一张值得收藏的精美卡牌呢? 如果复习单词不再是痛苦的「任务」,而是为了积攒运气去「多连抽」呢?于是,我摒弃了传统单词 App 那种一本正经的列表形式,将「上菜单词」设计成了一台「美食盲盒机」

机制拆解:用「收集癖」对抗「遗忘曲线」

在「上菜单词」中,核心逻辑非常简单,形成了一个正向的游戏化闭环:

  1. 学习即赚币: 你不再是枯燥地记忆,而是在赚取「餐券」。通过日常的签到、新词学习、旧词复习,系统会奖励你通用的抽卡货币。
  2. 单词即卡牌: 当你积累了足够的餐券,就可以去卡池里进行「五连抽」。看着卡包撕开,光芒四射,爆出一张张设计精美的 3D 美食单词卡——比如一张  Eggs Benedict(班尼迪克蛋),或者一张 Molecular Gastronomy(分子料理)。
  3. 图鉴即词典: 所有的卡牌都会收录进你的「美食图鉴」。为了点亮那个灰色的图标,为了集齐一套「法式甜点」卡组,你会不自觉地想要多背几个单词,多复习几轮。

我希望这不仅仅是一个吸引眼球的噱头。我们在谈论记忆方法时,常提到艾宾浩斯遗忘曲线。而在「上菜单词」里,我试图用人类本能的「收集癖」去对抗「爱遗忘」的本能。

为了获得抽卡机会,用户必须保持高频的复习;为了集齐图鉴,用户会主动增加接触单词的频率。当「背单词」变成了「集卡片」,枯燥的重复就变成了期待的铺垫

始于颜值,终于科学

当然,作为一款工具类 App,光有好皮囊是不够的。在「抽卡」的娱乐外壳之下,内核依然是严肃的学习逻辑。为了保证记忆效率,我在应用中引入了 FSRS (Free Spaced Repetition Scheduler) 间隔重复算法。

不同于传统的艾宾浩斯算法,FSRS 能更精准地捕捉你对每个单词的遗忘临界点。系统会根据你的每一次反馈(认识/模糊/忘记),动态调整下一次复习的时间。

简单的词(比如 Beef),可能几天后才出现;困难的词(比如 Caramelized),会在你即将遗忘的前一刻跳出来「攻击」你。「抽卡」负责让你开始 ,「算法」负责帮你记住 。

少点「蹦词」:从卡牌到餐桌的实战演练

除了「抽卡」带来的收集快乐,在开发过程中,我还意识到另一个痛点:很多时候,我们背了单词,但在真实场景下依然只会尴尬地往外蹦单词。

你抽到了 Steak(牛排)这张卡,这很好。但当服务员问你 「How would you like that cooked?」或者你想表达 「酱汁请分开放」 时,光有一个名词是不够的。为了解决这个「哑巴吃货」的困境,我在 App 中加入了一个核心功能板块——「场景对话实战」

这不是那种教科书式的 「How are you? I'm fine」,而是极度垂直的餐厅生存指南。模拟了从走进餐厅、就座、点餐、特殊要求(如过敏、忌口)到结账的完整流程。

  1. 比如在咖啡馆场景: 仅仅认识 Latte 是不够的,你还需要学会如何顺滑地说出 「Iced, with oat milk, less ice, please.」(冰拿铁,换燕麦奶,少冰)。
  2. 比如在过敏场景: 系统会教你用最准确的句式确认 「Does this contain peanuts?」(这个含有花生吗?)。

如果说「抽卡」是帮你收集武器,那么「场景对话」就是带你去靶场射击

我希望「上菜单词」不仅能帮你构建一个华丽的美食词汇库,更能让你在异国他乡的餐厅里,从容自信地与服务员谈笑风生,而不是仅仅用手指着菜单说 「This, and this」。

写在最后:一场关于「吃」的小实验

「上菜单词」目前还只是一个初生者。它没有社交,没有广告,目前也是完全免费的。它更像是我作为一个开发者,对「如何快乐学习」这一命题交出的一份答卷。

我希望它能解决两个问题: 

  • 第一,解决「场景化痛点」,下次出国时,不再对着菜单两眼一抹黑;
  • 第二,解决「动力问题」,在每一次点击「抽卡」的瞬间,找回久违的学习快感。

如果你也厌倦了枯燥的列表记忆,如果你也是看到「未解锁图鉴」就手痒的强迫症患者,欢迎来试试我的这个小实验。

希望能帮你把「背单词」这件苦差事,变成一场「上菜」的快乐盛宴

上菜!上菜! 🥘✨

📱 应用信息

  • 应用名称: 上菜单词
  • 支持平台: HarmonyOS (iOS 稍晚上线)
  • 价格: 目前免费
  • 开发者: Pyacark

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀

    Zabbix 介绍

    Zabbix 是一个开源的企业级监控解决方案,它可以监控各种网络参数,服务器健康状态,应用程序性能等,并提供灵活的告警机制和丰富的报表功能。

    1、Zabbix Server

    • 核心组件,负责接收和处理所有监控数据,生成报警和报表。
    • 需要一个数据库来存储所有配置和监控数据。

    2、Zabbix Agent

    • 部署在被监控的设备上,负责收集本地资源和应用数据,并发送给 Zabbix Server。
    • 支持多种操作系统,包括 Linux、Windows 和 Unix。
    • 其中 Agent 分为 Zabbix Agent 和 Zabbix Agent 2,后者是增强版 Agent,支持插件,适合大规模监控。

    3、Zabbix Proxy

    • 用于分担 Zabbix Server 的负载,尤其适用于大规模分布式监控。
    • 可以在远程网络中收集数据并转发给 Zabbix Server。

    4、Zabbix Web Interface

    • 基于 PHP 的 Web 界面,用于配置、管理和查看监控数据。
    • 提供用户管理、权限控制、仪表盘和报表等功能。

    5、数据库

    • 存储所有的配置、监控数据、历史记录等。
    • 支持多种数据库,如 MySQL、PostgreSQL、Oracle、SQLite。

    观测云

    观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

    部署 DataKit

    DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。(注意,请安装完整版 DataKit,Lite 版本 DataKit 没有 Zabbix 相关采集器。)

    登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式。这里使用主机方式安装。

    图片

    复制一键安装命令,登陆到目标服务器执行该命令即可实现一键安装。

    执行 datakit monitor 命令查看 DataKit 运行状态。

    图片

    指标数据采集

    Zabbix API 方式(zabbix >= 5.0)

    DataKit 方式

    1、配置 pythond 配置文件

    进入 DataKit 的配置文件目录 conf.d,进入 pythond 目录,复制 pythond.conf.samplepythond.conf, 修改如下配置:

    [[inputs.pythond]]
      # Python input name
      name = 'zabbix_collect'  # required
    
      # System environments to run Python
      #envs = ['LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH',]
      envs = ['ZABBIX_HOST=http://127.0.0.1/zabbix', 'ZABBIX_USER=Admin', 'ZABBIX_PASSWD=zabbix', 'ZABBIX_VERSION=7.0', 'COLLECT_TYPE=api']
    
      # Python path(recomment abstract Python path)
      cmd = "python3" # required. python3 is recommended.
    
      # Python scripts relative path
      dirs = ["zabbix"]

    其中 ZABBIX_HOSTZABBIX_USERZABBIX_PASSWDZABBIX_VERSION 填写实际 Zabbix 的地址用户名密码和版本。

    保存并退出。

    2、复制脚本

    进入 DataKit 目录,进入 python.d 目录,创建 zabbix 目录,点击下方链接下载脚本到 zabbix 目录下:

    https://static.guance.com/integrations/zabbix/zabbix-collecto...

    3、重启 DataKit

    datakit service -R

    4、检查采集任务,出现 zabbix_collect 任务则说明采集任务开启成功

    datakit monitor

    图片

    Func 方式

    1、安装采集脚本

    登录 Func,点击「脚本市场」,选择预装脚本市场,点击管理按钮,进入预装脚本市场的脚本列表页。在过滤搜索框中输入 ,过滤出 zabbix 采集脚本。

    图片

    点击安装按钮,并在弹出的确认框点击确认按钮。点击确认后,在弹出的部署对话框中输入 zabbix 的地址,用户名,密码,以及版本号。确认信息无误后,点击部署启动脚本,即可完成脚本的部署以及采集任务的创建。

    图片

    2、查看采集结果

    登录观测云,点击「指标」 - 「指标管理」,查找 zabbix 指标,看是否采集到。

    图片

    Streaming 方式(zabbix >= 6.4)

    该方式类似于 Prometheus 的 Remote Write,由 zabbix server 主动将数据打给 DataKit,有较高的时效性。

    HTTP Server

    DataKit 方式

    1、配置 pythond 配置文件

    进入 DataKit 的配置文件目录 conf.d,进入 python.d 目录,复制 pythond.conf.samplepythond.conf,修改如下配置:

    [[inputs.pythond]]
      # Python input name
      name = 'zabbix_collect'  # required
    
      # System environments to run Python
      #envs = ['LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH',]
      envs = ['ZABBIX_HOST=http://127.0.0.1/zabbix', 'ZABBIX_USER=Admin', 'ZABBIX_PASSWD=zabbix', 'ZABBIX_VERSION=7.0', 'COLLECT_TYPE=stream', 'STREAM_LISTENER_PORT=8000']
    
      # Python path(recomment abstract Python path)
      cmd = "python3" # required. python3 is recommended.
    
      # Python scripts relative path
      dirs = ["zabbix"]

    其中 ZABBIX_HOSTZABBIX_USERZABBIX_PASSWDZABBIX_VERSION 填写实际 Zabbix 的地址用户名密码和版本。

    注意,COLLECT_TYPE 必须为 stream, 可根据需要调整 STREAM_LISTENER_PORT 的值。

    保存并退出。

    2、复制脚本

    进入 DataKit 目录,进入 pythond 目录,创建 zabbix 目录,点击下方链接下载脚本到 zabbix 目录下:

    https://static.guance.com/integrations/zabbix/zabbix-collecto...

    3、重启 DataKit

    datakit service -R

    4、检查采集任务,出现 zabbix_collect 任务则说明采集任务开启成功

    datakit monitor

    图片

    5、创建 Zabbix 连接器

    登录 Zabbix,点击管理 -> 常规 -> 连接器,点击创建连接器,URL处输入 DataKit 的地址以及 zabbix stream 的监听端口(默认8000),信息类型选择数字和浮点数,点击添加。

    图片

    6、修改 zabbix_server.conf,修改 StartConnectors 为10,保存并重启 zabbix-server 服务

    图片

    7、验证指标采集结果

    Func 方式

    1、安装采集脚本

    登录 Func,点击「脚本市场」,选择预装脚本市场,点击管理按钮,进入预装脚本市场的脚本列表页。在过滤搜索框中输入zabbix Stream ,过滤出zabbix Stream采集脚本。点击安装即可。

    图片

    2、创建URL

    登录 Func,点击「管理」 - 「同步 API」(建议使用异步API)- 「新建」, 执行一栏选择刚导入脚本中的 Zabbix Receiver 方法,在参数指定中配置采集任务相关的配置,需要指定 zabbix_hostzabbix_userzabbix_passwdzabbix_version 为实际的值,base64 为 Zabbix 入参,此处填 INPUT_BY_CALLER,点击保存,并复制 url。

    图片

    3、创建 Zabbix 连接器

    登录 Zabbix, 点击管理 -> 常规 -> 连接器,点击创建连接器,URL 处输入上一步创建的 url,信息类型选择数字和浮点数,点击添加。

    图片

    4、修改 zabbix_server.conf,修改 StartConnectors 为10,保存并重启 zabbix-server 服务

    图片

    5、验证指标采集结果

    Kafka

    该方式原理同 HTTP 方式消费指标数据,区别在于该方法引入了 Kafka 组件,需部署一个 HTTP 服务用于接收 Zabbix 的 stream 输出并将消息发送到 Kafka 中,详见https://git.zabbix.com/projects/ZT/repos/kafka-connector/browse,再由消费者订阅 Kafka,进行数据消费。

    指标治理

    Zabbix 指标数据结构

    Zabbix 以主机为维度统计指标和告警。所以所有的指标必然包含主机信息。主机往往绑定一个或多个接口。

    Zabbix 的指标(item key) 的形式为 key[param1,param2,param3]。其中 params 分为静态值和变量两种。

    vfs.fs.size[{#FSNAME},pused]。其中 keyvfs.fs.size{#FSNAME} 是动态参数,指实际文件系统名,pused 为静态参数,指使用量。

    上述采集方式中 zabbix apiStreamingZabbix Agent 2 三种采集方式均默认使用该规则进行指标映射。

    建议的指标治理规则

    由于 Zabbix 的数据结构跟观测云存在较大差异,为方便指标的使用与管理,结合实际企业用户的部署经验,对于 API 和 Streaming 的采集方式,我们建议 Zabbix 指标数据上传到观测云时按如下规则进行转换:

    • measurement (指标集):zabbix key 第一个 '.' 前的内容。
    • fields (指标):zabbix key + 所有静态参数。如 vfs.fs.size[{#FSNAME},pused],就会变成 vfs.fs.size.pusedsystem.cpu.load[all,avg1],就会变成system.cpu.load.all.avg1
    • tags (标签):zabbix item key 中的所有动态参数小写。同时会添加 hostip 以及 itemtags。如:vfs.fs.size[{#FSNAME},pused]tagfsname

    Example:

    Zabbix item keymeasurementFieldtags
    vfs.dev.queue_size[{#DEVNAME}]vfsvfs.dev.queue_sizedevname
    vfs.dev.read.await[{#DEVNAME}]vfsvfs.dev.read.awaitdevname
    vfs.dev.read.rate[{#DEVNAME}]vfsvfs.dev.read.ratedevname
    vfs.file.contents[/sys/block/{#DEVNAME}/stat]vfsvfs.file.contents._sys_blck__statdevname
    vfs.file.contents["/sys/class/net/{#IFNAME}/type"]vfsvfs.file.contents._sys_class_net__typeifname
    vfs.fs.inode[{#FSNAME},pfree]vfsvfs.fs.inode.pfreefsname
    vfs.fs.size[{#FSNAME},pused]vfsvfs.fs.size.pusedfsname
    net.if.in["{#IFNAME}",dropped]vfsnet.if.in.droppedifname
    net.if.in["{#IFNAME}"]vfsnet.if.inifname

    使用 Pipeline 的 reference table 实现自定义 Tag

    场景:对于已有 CMDB 的客户,希望将主机的一些字段富足到指标 Tag 中。如应用、负责人信息等。

    方式:使用 Pipeline 的 refertable 功能。

    具体步骤:

    1、使用 Func 创建一个脚本用于组装 reference table 数据,并发布。数据结构类似于:

    {
    "table_name": "zabbix-refer-table",
    "column_name": ["itemid", "host", "ip", "itemkey"],
    "column_type": ["string", "string", "string", "string"],
    "row_data": [["1001", "host-1", "10.0.0.1", "vfs.fs.size"], 
        ["1002", "host-2", "10.0.0.2", "vfs.fs.size.pused"], 
        ["1003", "host-3", "10.0.0.3", "vfs.fs.size.pfree"]]
    }

    更多 reference table 用法,可参考:https://docs.guance.com/datakit/datakit-refer-table/

    2、创建同步 API

    登录 Func,点击「管理」 - 「同步 API」,点击 新建,在添加同步 API 对话框执行一栏中选择 zabbix-reference-table 获取脚本,点击确定保存脚本,并点击示例,获取请求 API。

    图片

    图片

    3、编辑 DataKit 的配置文件

    登录 DataKit 所在服务器(容器部署DataKit 参考官方文档),进入 DataKit 配置目录 /user/local/datakit/conf.d,编辑 datakit.conf 文件,修改 [pipeline] 选项下的 refer_table_url 的值为上一步复制的 Func 接口地址。DataKit 会将 refertable 数据预先加载到本地的 sqllite 中,可以根据 refer table 大小灵活选择是否使用内存模式的 sqllite。保存后重启 DataKit 生效。

    图片

    4、编辑 Pipeline

    登录观测云,点击「管理」 - 「Pipelines」- 「新建 Pipeline」,这里给到一个参考 Pipeline,可根据实际业务情况和 refertable 数据结构灵活调整。

    5、查看指标 Tag

    超大数据量采集优化策略

    • 对于 Export Directory 方式,可以增加独立的高速 SSD 磁盘,增加单独的 zabbix server 用于数据导出(由于需要访问 zabbix API 和数据库,DataKit 采集 ExportDirectory 会比较占用 zabbix 资源)。调低 ExportFileSize 大小。
    • API 采集方式,可以通过分页查询,减少查询关联表,多线程查询等方式。
    • HTTP stream 方式,可以引入队列进行异步消费或使用异步方法。支持采样收集等方式。
    • 指标治理应先将映射关系生成后存入缓存或内存中,方便快速匹配。为减少 redis 读写压力可以考虑分片缓存或缓存压缩等方法。

    各采集方式对比

    采集方式采集原理优势劣势
    Zabbix APIfunc/datakit使用python代码通过zabbix api获取指标数据。进行指标治理和映射后上传到观测云。可分布式采集,采集过程高可用便于灵活调整采集所需资源。便于指标的灵活治理和映射时效性不高,最大时延可达1minzabbix到func区间数据无法压缩,对该区间网路压力较大。通常需要在func维护采集代码,对采集代码质量要求较高,否则在进行大数据量采集时速度较慢导致时效变差或丢失数据,严重时会影响zabbix性能。
    Streaming与zabbix建立网络长连接(HTTP server/Kafka)消费zabbix产生的history和event数据时效性高可分布式采集,采集过程高可用便于灵活调整采集所需资源。便于指标的灵活治理和映射zabbix到func区间数据无法压缩,对该区间网路压力较大。
    Zabbix 转 Prometheus部署独立服务通过调用zabbix api将zabbix指标数据暴露成Prometheus metric接口供datakit采集集成简单,可以使用datakit现有能力。需要维护独立的转换服务。转换服务与zabbix间网络转发无压缩,对网络压力较大。无法灵活进行指标治理和映射。

    总结

    监控数据的集成是一个复杂的综合性工作,本文所展示方案所适用场景需相关运维工程师根据实际情况进行调整。