diff --git a/.gitignore b/.gitignore index babd03b..16c6ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ -.claude/ +.claude/ .codex/ __pycache__/ *.pyc +*.egg-info/ .env.local - +findings.md +progress.md +task_plan.md +outputs/freshrss/ diff --git a/README.md b/README.md index be6b00f..468ee5c 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,12 @@ pip install -e . summary-mcp ``` -The server exposes three tools: +The server exposes four tools: - `extract_url_content` - `extract_item_content` - `filter_summary_result` +- `run_freshrss_openclaw_pipeline` Validate an LLM summary result: @@ -36,9 +37,12 @@ Pull FreshRSS entries and map them into normalized `item` objects: set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php set FRESHRSS_USERNAME=bot set FRESHRSS_API_PASSWORD=your-api-password -python scripts/pull_freshrss_items.py --limit 5 +python scripts/pull_freshrss_items.py --limit 5 --mark-read ``` +By default the script excludes entries already tagged as `read`. Add `--include-read` if you want the full reading list. +When `--mark-read` is enabled, fetched entries are marked as read after the script finishes successfully. + The script writes: - `outputs/freshrss/raw/freshrss.raw.json` @@ -50,15 +54,48 @@ Pull FreshRSS entries and run content extraction for each mapped item: set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php set FRESHRSS_USERNAME=osiman set FRESHRSS_API_PASSWORD=your-api-password -python scripts/run_freshrss_extract.py --limit 1 +python scripts/run_freshrss_extract.py --limit 1 --mark-read ``` +By default the script excludes entries already tagged as `read`. When `--mark-read` is enabled, only entries with successful extraction are marked as read. + The script writes: - `outputs/freshrss/raw/freshrss.raw.json` - `outputs/freshrss/items/freshrss.items.json` - `outputs/freshrss/extracted/freshrss.extracted.json` +Run the full FreshRSS pipeline and mark items as read only after the final OpenClaw delivery payload is written: + +```bash +set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php +set FRESHRSS_USERNAME=osiman +set FRESHRSS_API_PASSWORD=your-api-password +set LLM_API_URL=https://api.deepseek.com +set LLM_API_KEY=your-llm-api-key +set LLM_MODEL=deepseek-chat +python scripts/run_freshrss_pipeline.py --limit 5 --mark-read +``` + +If you want to apply your personal engineering and AI-agent interest profile during filtering, pass a context file: + +```bash +python scripts/run_freshrss_pipeline.py ^ + --limit 5 ^ + --context configs/filter_context.personal.json ^ + --mark-read +``` + +This is the recommended production entrypoint. By default it writes only: + +- `outputs/freshrss/rerun//raw/freshrss.raw.json` +- `outputs/freshrss/rerun//candidates/openclaw-delivery-payload.json` +- `outputs/freshrss/rerun//run-report.json` + +If you need per-item intermediates, add `--debug-artifacts`. + +When OpenClaw is connected to the MCP server, it should call `run_freshrss_openclaw_pipeline` for the same behavior directly through MCP. The tool also supports `debug_artifacts=true` when deeper inspection is needed. + Run deterministic filter rules against a structured summary result: ```bash @@ -78,6 +115,11 @@ python scripts/run_filter_rules.py ^ --output outputs/reference/filter/filter-decision.with-context.json ``` +Rule engine details and rule authoring guidance live in: + +- `docs/design/filter-rule-engine-design.md` +- `docs/design/filter-rule-engine-usage.md` + Write a filtered result into the Markdown sink: ```bash @@ -117,4 +159,4 @@ The script writes by default: - `outputs/reference/candidates/openclaw-delivery-payload.json` -Output layout details live in `outputs/README.md`. \ No newline at end of file +Output layout details live in `outputs/README.md`. diff --git a/TODO.md b/TODO.md index 31dd431..1b7c6ef 100644 --- a/TODO.md +++ b/TODO.md @@ -2,78 +2,56 @@ ## 当前状态 -项目当前处于 `Content Extract MCP` 的 MVP 完成阶段,已验证 `规则过滤 + Markdown sink`,下一阶段将转向 `OpenClaw 日报聚合 + 知识沉淀` 改造。 +项目当前已经进入“可交付给 OpenClaw 调用”的阶段。 -已完成: +当前主链路: -- [x] 明确整体阅读流链路 -- [x] 明确 `source -> item -> document/article` 的数据抽象 -- [x] 明确 `MCP 负责提取,LLM 负责摘要` 的职责边界 -- [x] 搭建 Python MCP 服务骨架 -- [x] 实现 `extract_url_content` -- [x] 实现 `extract_item_content` -- [x] 完成标题与正文提取 -- [x] 完成质量标记与结构化错误输出 -- [x] 用参考文章完成真实提取测试 -- [x] 输出结构化提取 JSON 文件 -- [x] 设计并迭代 LLM 摘要 prompt -- [x] 验证 LLM 输出的 `result.json` 基本符合预期 -- [x] 已封装 LLM 摘要校验 workflow skill -- [x] 接通 FreshRSS 上游并完成 `item` 映射 -- [x] 跑通 `FreshRSS -> item -> content extraction` 单条链路 -- [x] 定义规则过滤层 schema -- [x] 实现第一版规则引擎与过滤 MCP tool -- [x] 定义 sink 输入输出 schema -- [x] 实现第一版 Markdown sink 与本地写入脚本 -- [x] 明确下一阶段主路径应调整为 `候选材料 -> 日报 -> 人工确认 -> 知识沉淀` -- [x] 明确 `ArticleCandidateRecord` 与 `OpenClawCandidateInput` 需要分层设计 +`FreshRSS 未读 -> RSS 内容提取 -> LLM 总结 -> 规则过滤 -> OpenClaw delivery payload` + +当前已经完成: + +- [x] FreshRSS `greader` API 接入 +- [x] `entry -> item` 标准化映射 +- [x] RSS-first 内容提取策略 +- [x] LLM 摘要与校验闭环 +- [x] 第一版规则引擎 +- [x] `ArticleCandidateRecord` / `OpenClawCandidateInput` 分层 +- [x] `OpenClawDeliveryPayload` 批量投递结构 +- [x] 最终 payload 成功后才标记 FreshRSS 已读 +- [x] MCP 工具 `run_freshrss_openclaw_pipeline` +- [x] 默认精简输出模式 --- -## P0 - 近期必须完成 +## P0 - 交接前后最优先 -- [x] 为 LLM 摘要结果定义正式 JSON Schema -- [x] 增加一个本地校验脚本,自动校验 `result.json` 是否符合 schema -- [x] 把“提取 JSON -> LLM 摘要 JSON”串成一个标准化本地流程 -- [x] 清理或移除当前已不再使用的 `src/summary_mcp/core/summarizer.py` -- [x] 更新旧设计文档中仍然残留的 `summary mcp` 描述,避免和当前实现冲突 +- [x] 为 OpenClaw 补齐交接文档 +- [x] 将 MCP 工具作为统一生产入口 +- [x] 将默认输出收敛为最小必要文件 +- [ ] 设计 OpenClaw webhook / delivery payload 的主动推送方式 +- [ ] 明确 OpenClaw 侧如何注册和启动本 MCP 服务 --- ## P1 - 下一阶段推进 -- [x] 把上游 RSS 聚合结果映射成标准化 `item` -- [x] 补充 `item` 的实际样例文件 -- [x] 跑通 `FreshRSS -> item -> content extraction` 单条链路 -- [x] 定义规则过滤层的输入输出 schema -- [x] 设计知识库入库格式 -- [x] 在文档层定义 `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` -- [x] 在代码里把当前 `article_candidate` 重新定位为 `ArticleCandidateRecord` -- [x] 新增 `OpenClawCandidateInput` 模型与转换逻辑 -- [x] 给 `OpenClawCandidateInput` 增加 `canonical_url` 与 `language` -- [x] 输出面向 OpenClaw 的精简 `OpenClawCandidateInput` 批量载荷 -- [x] 将“人工确认状态”拆成独立模型,不回写到 candidate 输入对象 -- [ ] 设计 OpenClaw webhook / delivery payload 的实际传输方式 - [ ] 设计“人工确认后再沉淀知识库”的状态流转 -- [ ] 给提取结果增加更多正文清洗策略,比如尾部噪音清理 +- [ ] 收敛 `paywall` 误判规则,降低中文文本误报 - [ ] 细化过滤规则并引入更多个性化上下文 -- [ ] 收敛 `paywall` 误判规则,避免仅因正文提到“付费/收费”就进入高优先级 `review` +- [ ] 增加批量 run 的保留策略与历史清理策略 +- [ ] 为 OpenClaw 补一份更正式的 MCP 调用示例和接线说明 --- -## P2 - 后续增强项 +## P2 - 后续增强 -- [ ] 将当前 `Markdown sink` 调整为 debug / fallback 能力,而非主路径 -- [ ] 增加按天批量收集 `ArticleCandidateRecord` 的脚本 -- [ ] 让 OpenClaw 聚合候选内容并生成日报 -- [ ] 将日报写入知识库,并同步生成面向用户的汇报消息 -- [ ] 增加批量提取能力 -- [ ] 引入 Playwright 作为动态页面兜底抓取方案 -- [ ] 支持更多 `content_kind`,例如 `release`、`thread`、`video` +- [ ] 将 `Markdown sink` 进一步降级为 debug / fallback 能力 +- [ ] 增加按天聚合 `ArticleCandidateRecord` 的批处理能力 +- [ ] 让 OpenClaw 聚合候选内容并生成日级摘要 +- [ ] 将日级摘要写入知识库,并同步生成面向用户的日报消息 +- [ ] 支持更多 `content_kind` - [ ] 增加提取缓存、重试和更细粒度日志 -- [ ] 重命名包和项目名,从 `summary_mcp` 调整为更符合当前职责的名称 -- [ ] 与 OpenClaw 做更正式的工作流编排整合 -- [ ] 扩展 Notion / Webhook / 其他 sink +- [ ] 整理历史 rerun 目录与调试产物保留策略 --- @@ -81,19 +59,16 @@ 优先做这三件事: -1. 设计 OpenClaw webhook / delivery payload 的实际传输方式 -2. 收敛 `paywall` 误判规则 -3. 设计人工确认后进入知识库的状态流转 +1. 明确 OpenClaw 侧的 MCP 接线方式 +2. 设计主动投递 / webhook 机制 +3. 收敛规则误判,尤其是 `paywall` 相关启发式 --- -## 收束上下文后建议先看 +## 交接时优先阅读 -- docs/current/context-reset-brief.md -- docs/openclaw/openclaw-candidate-input-field-spec.md -- docs/openclaw/openclaw-delivery-payload-spec.md -- docs/openclaw/openclaw-daily-digest-refactor.md -- docs/openclaw/article-candidate-daily-digest-schema.md -- docs/design/filter-rule-engine-design.md -- docs/design/markdown-sink-design.md -- TODO.md \ No newline at end of file +- `README.md` +- `docs/openclaw/openclaw-handoff.md` +- `docs/openclaw/openclaw-candidate-input-field-spec.md` +- `docs/openclaw/openclaw-delivery-payload-spec.md` +- `docs/current/context-reset-brief.md` diff --git a/configs/filter_context.personal.json b/configs/filter_context.personal.json new file mode 100644 index 0000000..0bc24a0 --- /dev/null +++ b/configs/filter_context.personal.json @@ -0,0 +1,53 @@ +{ + "source_tags": [ + "backend", + "ai-agent", + "frontier-tech" + ], + "interest_topics": [ + "后端工程", + "系统设计", + "分布式系统", + "数据库", + "缓存", + "消息队列", + "性能优化", + "可观测性", + "云原生", + "Kubernetes", + "AI Agent", + "LLM", + "RAG", + "MCP", + "工作流自动化", + "前沿科技" + ], + "interest_keywords": [ + "Java", + "Go", + "Python", + "Spring", + "FastAPI", + "Gin", + "gRPC", + "MySQL", + "PostgreSQL", + "Redis", + "Kafka", + "微服务", + "可观测性", + "Kubernetes", + "云原生", + "AI Agent", + "Agent", + "LLM", + "RAG", + "MCP", + "Prompt Engineering", + "Workflow", + "向量数据库", + "知识库", + "OpenAI", + "DeepSeek" + ] +} diff --git a/configs/filter_rules.json b/configs/filter_rules.json index f42736e..48f9061 100644 --- a/configs/filter_rules.json +++ b/configs/filter_rules.json @@ -76,13 +76,49 @@ "enabled": true, "stop_on_match": false, "conditions_all": [ + { "field": "summary.worth_keeping", "op": "eq", "value": true }, + { "field": "summary.category", "op": "not_in", "value": ["资讯"] }, { "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } } ], "action": { "decision": "keep", - "reason": "Topics overlap with current interest profile.", + "reason": "Topics overlap with the backend and AI-agent interest profile on non-news content.", "labels": ["interest", "topic-match"], - "priority": 75 + "priority": 78 + } + }, + { + "rule_id": "keep-interest-keyword", + "enabled": true, + "stop_on_match": false, + "conditions_all": [ + { "field": "summary.worth_keeping", "op": "eq", "value": true }, + { "field": "summary.category", "op": "not_in", "value": ["资讯"] }, + { "field": "summary.keywords", "op": "overlap", "value": { "from_field": "context.interest_keywords" } } + ], + "action": { + "decision": "keep", + "reason": "Keywords match the backend engineering or AI-agent watchlist on durable content.", + "labels": ["interest", "keyword-match", "engineering"], + "priority": 77 + } + }, + { + "rule_id": "review-interest-news-watch", + "enabled": true, + "stop_on_match": false, + "conditions_all": [ + { "field": "summary.category", "op": "eq", "value": "资讯" } + ], + "conditions_any": [ + { "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } }, + { "field": "summary.keywords", "op": "overlap", "value": { "from_field": "context.interest_keywords" } } + ], + "action": { + "decision": "review", + "reason": "Relevant frontier or engineering news should be watched first instead of auto-kept.", + "labels": ["interest", "news-watch"], + "priority": 70 } }, { diff --git a/docs/README.md b/docs/README.md index d3fc793..d9bb0bd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# 文档索引 +# 文档索引 ## 当前目录结构 @@ -19,25 +19,29 @@ 1. `docs/current/context-reset-brief.md` - 当前真实进度与下一步入口 -2. `docs/openclaw/openclaw-candidate-input-field-spec.md` +2. `docs/openclaw/openclaw-handoff.md` + - 给 OpenClaw 的接手说明、环境变量、MCP 调用方式与已知限制 +3. `docs/openclaw/openclaw-candidate-input-field-spec.md` - 提供给 OpenClaw 的单篇结构化输入字段说明 -3. `docs/openclaw/openclaw-delivery-payload-spec.md` +4. `docs/openclaw/openclaw-delivery-payload-spec.md` - 提供给 OpenClaw 的批量投递 envelope 说明 -4. `docs/design/summary-mcp-service-design.md` +5. `docs/design/summary-mcp-service-design.md` - 当前 MCP 服务的职责、接口和边界 -5. `docs/design/filter-rule-engine-design.md` +6. `docs/design/filter-rule-engine-design.md` - 过滤层的输入输出、规则结构与当前实现 -6. `docs/design/markdown-sink-design.md` +7. `docs/design/filter-rule-engine-usage.md` + - 规则怎么写、怎么跑、结果怎么解读的使用说明 +8. `docs/design/markdown-sink-design.md` - 第一版 Markdown sink 的输入输出、目录结构与落地方式 -7. `docs/openclaw/openclaw-daily-digest-refactor.md` +9. `docs/openclaw/openclaw-daily-digest-refactor.md` - 为什么要从单篇入库改成 OpenClaw 日报聚合链路 -8. `docs/openclaw/article-candidate-daily-digest-schema.md` +10. `docs/openclaw/article-candidate-daily-digest-schema.md` - `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` 的正式设计 -9. `docs/design/source-schema-design.md` +11. `docs/design/source-schema-design.md` - `source -> item -> document` 的对象设计 -10. `docs/notes/reading-pipeline-design-notes.md` +12. `docs/notes/reading-pipeline-design-notes.md` - 更上层的阅读流方案与阶段划分 -11. `docs/design/summary-loop-explained.md` +13. `docs/design/summary-loop-explained.md` - 当前 LLM 摘要校验闭环的解释 ## 当前文档分层 @@ -65,11 +69,15 @@ - 提取 JSON -> LLM 摘要 JSON -> 校验 的闭环说明 - `docs/design/filter-rule-engine-design.md` - 第一版规则过滤引擎设计与落地位置 +- `docs/design/filter-rule-engine-usage.md` + - 规则配置、调用方式与结果解读 - `docs/design/markdown-sink-design.md` - 第一版 Markdown sink 设计与落地位置 ### 3. OpenClaw 与下游设计 +- `docs/openclaw/openclaw-handoff.md` + - OpenClaw 接手所需的运行说明、工具入口与已知限制 - `docs/openclaw/openclaw-candidate-input-field-spec.md` - 提供给 OpenClaw 的单篇结构化输入字段说明 - `docs/openclaw/openclaw-delivery-payload-spec.md` @@ -95,4 +103,4 @@ - `TODO.md` 记录任务优先级与下一步 - `outputs/README.md` 记录当前输出目录约定 - `docs/archive/content-extract-mcp-mvp-archive.md` 只当历史快照,不再作为最新事实来源 -- 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`docs/current/context-reset-brief.md` \ No newline at end of file +- 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`docs/current/context-reset-brief.md` diff --git a/docs/current/context-reset-brief.md b/docs/current/context-reset-brief.md index 8dd4d81..6060764 100644 --- a/docs/current/context-reset-brief.md +++ b/docs/current/context-reset-brief.md @@ -1,102 +1,112 @@ # 项目当前状态简报 +## 当前结论 + +当前仓库已经具备交付给 OpenClaw 的基础条件。 + +当前主链路是: + +`FreshRSS 未读 -> RSS 内容提取 -> LLM 总结 -> 规则过滤 -> OpenClaw delivery payload` + +OpenClaw 应通过 MCP 工具 `run_freshrss_openclaw_pipeline` 调用这条链路,而不是自行拼接脚本。 + ## 当前已完成 -- 已明确整体链路:`来源 -> 聚合池 -> 内容提取 MCP -> LLM 摘要 -> 校验 -> 过滤 -> 入库/推送` -- 已确定当前 MCP 的职责边界: - - 只负责内容提取 - - 不负责摘要、分类、价值判断 -- 已完成 Python MCP 骨架 -- 已实现三个 tool: - - `extract_url_content` - - `extract_item_content` - - `filter_summary_result` -- 已完成真实 URL 提取验证 -- 已完成 LLM 摘要 prompt -- 已完成 LLM 摘要结果 schema 校验器 -- 已完成“提取 JSON -> LLM 摘要 JSON -> 校验”的最小闭环脚本 -- 已完成 LLM 摘要校验 skill 封装 -- 已清理旧的启发式 `summarizer.py` -- 已将旧的 MCP 设计文档更新为当前“Content Extract MCP”语义 -- 已完成 FreshRSS `greader` API 接入 -- 已完成 FreshRSS entry -> `item` 映射 -- 已产出真实 `item` 样例文件 -- 已跑通 `FreshRSS -> item -> content extraction` 单条链路 -- 已定义过滤层输入输出 schema -- 已完成第一版规则引擎、本地脚本和 MCP tool -- 已定义 sink 输入输出 schema -- 已完成第一版 Markdown sink 与本地写入脚本 +- 已完成 FreshRSS `greader` API 接入与未读拉取 +- 已完成 FreshRSS 条目到标准化 `item` 的映射 +- 已完成 RSS-first 提取策略 +- 已完成 LLM 总结与校验闭环 +- 已完成规则引擎过滤 +- 已完成 `ArticleCandidateRecord` 与 `OpenClawCandidateInput` 分层 +- 已完成 `OpenClawDeliveryPayload` 批量投递结构 +- 已完成 FreshRSS 已读状态回写 +- 已完成“仅在最终 payload 成功写盘后再标记已读”的语义 +- 已完成 MCP 工具 `run_freshrss_openclaw_pipeline` +- 已完成默认精简输出模式,减少中间文件 + +## 当前 MCP 工具 + +当前服务入口: + +- `src/summary_mcp/server.py` + +当前暴露的 MCP 工具: + +- `extract_url_content` +- `extract_item_content` +- `filter_summary_result` +- `run_freshrss_openclaw_pipeline` + +其中生产主入口是: + +- `run_freshrss_openclaw_pipeline` ## 当前关键文件 -- MCP 入口: +- MCP 服务入口 - `src/summary_mcp/server.py` -- 提取主流程: +- FreshRSS 统一工作流 + - `src/summary_mcp/workflows/freshrss_pipeline.py` +- 摘要循环 + - `src/summary_mcp/core/summary_loop.py` +- 提取主流程 - `src/summary_mcp/core/pipeline.py` -- LLM 结果模型: - - `src/summary_mcp/models/llm_result.py` -- LLM 校验器: - - `src/summary_mcp/validators/llm_result.py` -- 过滤模型: - - `src/summary_mcp/models/filtering.py` -- 过滤引擎: +- FreshRSS 集成 + - `src/summary_mcp/integrations/freshrss.py` +- 规则引擎 - `src/summary_mcp/filters/engine.py` -- sink 模型: - - `src/summary_mcp/models/sink.py` -- Markdown sink: - - `src/summary_mcp/sinks/markdown.py` -- 默认过滤规则: - - `configs/filter_rules.json` -- 校验 CLI: - - `src/summary_mcp/validate_llm_result.py` -- 最小闭环脚本: - - `scripts/run_summary_loop.py` -- FreshRSS 拉取脚本: - - `scripts/pull_freshrss_items.py` -- FreshRSS 提取脚本: - - `scripts/run_freshrss_extract.py` -- 过滤脚本: - - `scripts/run_filter_rules.py` -- Markdown sink 脚本: - - `scripts/run_markdown_sink.py` -- Markdown sink 文档: - - `docs/design/markdown-sink-design.md` -- 当前提示词: - - `outputs/prompts/llm-summary-prompt.txt` -- 过滤结果样例: - - `outputs/reference/filter/filter-decision.json` -- 文档索引: - - `docs/README.md` -- 当前 TODO: - - `TODO.md` +- LLM 结果校验 + - `src/summary_mcp/validators/llm_result.py` +- OpenClaw candidate 模型 + - `src/summary_mcp/models/article_candidate.py` +- OpenClaw delivery 模型 + - `src/summary_mcp/models/openclaw_delivery.py` +- 生产脚本入口 + - `scripts/run_freshrss_pipeline.py` +- OpenClaw 交接说明 + - `docs/openclaw/openclaw-handoff.md` -## 当前已经验证通过 +## 当前输出规则 -- 参考文章 URL 可提取为结构化 JSON -- LLM 可根据提取结果生成摘要 JSON -- validator 可校验摘要 JSON -- 最小闭环脚本可直接调用 LLM 接口并产出通过校验的结果 -- FreshRSS API 可拉取真实 entry -- 真实 entry 可映射为标准化 `item` -- 标准化 `item` 可继续进入内容提取流程 -- 规则引擎可对结构化摘要结果输出 `keep / drop / review` 决策 -- MCP tool 可承接“由上层 LLM/Agent 调用过滤”的模式 -- Markdown sink 可将过滤后的结果写入本地知识库目录 +默认生产模式只输出: -## 当前未开始的下一阶段 +- `raw/freshrss.raw.json` +- `candidates/openclaw-delivery-payload.json` +- `run-report.json` -- 设计 webhook / 推送格式 -- 把 FreshRSS 拉取与提取流程进一步批量化/调度化 -- 迭代更细的过滤规则与个性化上下文 -- 决定是否扩展 Notion / Webhook / 其他 sink +如果需要排障,可开启: -## 收束后建议从这里继续 +- `debug_artifacts=true` +- 或脚本参数 `--debug-artifacts` -优先从这两个问题继续: +这样才会额外输出逐条中间文件。 -1. 先设计 webhook / 推送格式 -2. 再决定是否扩展其他 sink,而不是继续深化 Markdown sink 本身 +## 当前验证状态 + +已经验证通过: + +- FreshRSS 未读拉取成功 +- 已读回写成功 +- MCP 工具入口可直接触发完整链路 +- 微信公众号样本可直接使用 RSS 提供的 `summary` 内容提取,不再回源抓网页 +- 精简输出模式已实际跑通 + +## 当前已知限制 + +- 当前对 FreshRSS 条目采用 RSS-first 策略,不再回源抓原网页 +- 如果 RSS 中没有足够正文内容,该条会直接跳过,不会进入后续总结 +- 某些规则仍偏保守,部分内容可能落到 `review` +- `paywall` 相关启发式仍可能误判中文文本 +- Webhook / 主动投递到 OpenClaw 外部接口尚未实现,当前是由 OpenClaw 通过 MCP 主动调用 + +## 当前最建议的交接阅读顺序 + +1. `README.md` +2. `docs/openclaw/openclaw-handoff.md` +3. `docs/openclaw/openclaw-candidate-input-field-spec.md` +4. `docs/openclaw/openclaw-delivery-payload-spec.md` +5. `TODO.md` ## 一句话结论 -当前 MVP 已完成,FreshRSS 上游、第一版规则过滤层和第一版 Markdown sink 都已接通,下一阶段应转向推送层与更完整的下游集成。 \ No newline at end of file +当前仓库已经从“提取 MCP 原型”演进到“可供 OpenClaw 调用的 FreshRSS -> OpenClaw payload 上游处理器”,可以开始交接,但后续仍建议继续补 webhook / delivery 接线与规则收敛。 diff --git a/docs/design/filter-rule-engine-usage.md b/docs/design/filter-rule-engine-usage.md new file mode 100644 index 0000000..172ce30 --- /dev/null +++ b/docs/design/filter-rule-engine-usage.md @@ -0,0 +1,328 @@ +# 规则引擎使用说明 + +## 1. 它解决什么问题 + +规则引擎负责把上游产出的结构化信号收敛成最终筛选决策: + +`item -> content extraction -> llm summary -> rule engine -> candidate/openclaw` + +这里有一个明确边界: + +- LLM 负责理解正文、生成结构化摘要信号 +- 规则引擎负责输出稳定、可复现、可审计的 `keep / drop / review` + +也就是说,规则引擎不是“再让 LLM 判断一遍”,而是用确定性规则做最后裁决。 + +## 2. 相关文件 + +- 规则模型: `src/summary_mcp/models/filtering.py` +- 规则执行器: `src/summary_mcp/filters/engine.py` +- 默认规则: `configs/filter_rules.json` +- 本地脚本: `scripts/run_filter_rules.py` +- MCP tool: `filter_summary_result` + +## 3. 输入与输出 + +规则引擎统一读取一个 `FilterInput`,包含四部分: + +- `item` + - 标准化后的条目对象 +- `article` + - 正文提取结果 +- `summary` + - LLM 结构化摘要结果 +- `context` + - 运行时注入的偏好信息 + +当前最常用的判断信号主要来自两类字段: + +- `article.quality_flags.*` + - 如 `is_low_content`、`is_truncated`、`is_paywalled` +- `summary.*` + - 如 `category`、`worth_keeping`、`topics` + +输出是 `FilterDecisionResult`: + +- `decision` + - 最终决策,`keep / drop / review` +- `matched_rules` + - 命中的规则 ID 列表 +- `reasons` + - 命中规则的原因说明 +- `labels` + - 聚合后的标签 +- `priority` + - 命中规则中的最高优先级 +- `matches` + - 每条命中规则的明细 + +## 4. 规则文件怎么写 + +规则文件位置是 `configs/filter_rules.json`,顶层必须是一个 JSON 数组。 + +单条规则结构: + +```json +{ + "rule_id": "keep-worth-keeping-method", + "enabled": true, + "stop_on_match": false, + "conditions_all": [ + { "field": "summary.worth_keeping", "op": "eq", "value": true }, + { "field": "summary.category", "op": "in", "value": ["方法论", "工具实践"] } + ], + "action": { + "decision": "keep", + "reason": "Structured summary marked the content as worth keeping in a durable category.", + "labels": ["summary", "durable"], + "priority": 80 + } +} +``` + +字段说明: + +- `rule_id` + - 规则唯一标识,建议稳定命名 +- `enabled` + - 是否启用 +- `stop_on_match` + - 命中后是否立即停止继续匹配后续规则 +- `conditions_all` + - 全部命中才算命中 +- `conditions_any` + - 任意命中即可 +- `action.decision` + - 该规则命中时产出的规则级决策 +- `action.reason` + - 命中原因 +- `action.labels` + - 打到结果里的标签 +- `action.priority` + - 执行时排序优先级,越大越先执行 + +## 5. 当前支持的操作符 + +- `eq` +- `ne` +- `in` +- `not_in` +- `contains` +- `overlap` +- `gte` +- `lte` +- `exists` + +常见例子: + +```json +{ "field": "summary.worth_keeping", "op": "eq", "value": true } +``` + +```json +{ "field": "summary.category", "op": "in", "value": ["方法论", "工具实践"] } +``` + +```json +{ "field": "summary.topics", "op": "overlap", "value": ["知识管理", "阅读工作流"] } +``` + +## 6. 执行顺序和收敛逻辑 + +执行顺序不是按文件书写顺序,而是按 `action.priority` 从高到低排序。 + +命中后会先收集所有规则,再做最终收敛: + +- 只要命中过任意 `drop`,最终就是 `drop` +- 否则只要命中过任意 `keep`,最终就是 `keep` +- 否则只要命中过任意 `review`,最终就是 `review` +- 如果完全没有命中,默认 `review` + +这意味着: + +- `drop` 是硬拦截 +- `keep` 只能在没有更高约束的 `drop` 时生效 +- `review` 是默认灰区兜底 + +如果你希望某条高优规则一旦命中就不再继续匹配,把 `stop_on_match` 设为 `true`。 + +## 7. 动态上下文怎么用 + +规则支持从 `context` 动态取值,不需要把用户偏好写死进规则文件。 + +示例: + +```json +{ + "field": "summary.topics", + "op": "overlap", + "value": { "from_field": "context.interest_topics" } +} +``` + +对应的 `context` 可以是: + +```json +{ + "interest_topics": ["个人知识管理", "阅读工作流"] +} +``` + +这样同一套规则就可以被不同用户、不同运行场景复用。 + +## 8. 本地怎么跑 + +最小调用: + +```bash +python scripts/run_filter_rules.py ^ + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --output outputs/reference/filter/filter-decision.json +``` + +带上下文: + +```bash +python scripts/run_filter_rules.py ^ + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --context outputs/reference/filter/filter-context.json ^ + --output outputs/reference/filter/filter-decision.with-context.json +``` + +也可以显式指定另一份规则文件: + +```bash +python scripts/run_filter_rules.py ^ + --summary outputs/reference/summary/result.loop.json ^ + --rules configs/filter_rules.json ^ + --output outputs/reference/filter/filter-decision.json +``` + +## 9. MCP 怎么调用 + +MCP tool 名称是 `filter_summary_result`。 + +输入参数: + +- `summary_result` +- `extracted_article` +- `item` +- `context` + +其中只有 `summary_result` 是必填,其余都是可选补充信号。 + +示例: + +```json +{ + "summary_result": { + "title": "如何构建个人阅读工作流", + "url": "https://example.com/read-flow", + "summary": "文章介绍了从采集、提炼到沉淀的个人阅读工作流设计。", + "highlights": ["先采集再提炼", "用规则做稳定筛选", "日报再进入知识库"], + "keywords": ["阅读工作流", "知识管理", "RSS", "规则引擎", "日报"], + "topics": ["阅读工作流", "知识管理", "信息筛选"], + "category": "方法论", + "worth_keeping": true, + "reason": "提供了可复用的方法框架。" + }, + "context": { + "interest_topics": ["阅读工作流", "知识管理"] + } +} +``` + +## 10. 结果怎么看 + +一个典型结果会像这样: + +```json +{ + "decision": "keep", + "matched_rules": [ + "keep-worth-keeping-method", + "keep-interest-topic" + ], + "reasons": [ + "Structured summary marked the content as worth keeping in a durable category.", + "Topics overlap with current interest profile." + ], + "labels": ["durable", "interest", "summary", "topic-match"], + "priority": 80, + "matches": [ + { + "rule_id": "keep-worth-keeping-method", + "decision": "keep", + "reason": "Structured summary marked the content as worth keeping in a durable category.", + "labels": ["summary", "durable"], + "priority": 80 + } + ] +} +``` + +解读方式: + +- 看 `decision` + - 最终裁决 +- 看 `matched_rules` + - 哪些规则生效了 +- 看 `reasons` + - 为什么做出这个判断 +- 看 `matches` + - 需要排查时看完整命中明细 + +## 11. 在当前整条链路里的位置 + +当前生产链路里,规则引擎已经集成在 `run_freshrss_openclaw_pipeline` 中。 + +顺序是: + +1. 从 FreshRSS 拉未读 +2. 从 RSS 项目里读取正文 +3. 调用 LLM 生成结构化摘要 +4. 规则引擎输出 `keep / drop / review` +5. 构建 `ArticleCandidateRecord` +6. 压缩成 `OpenClawCandidateInput` +7. 生成 `openclaw-delivery-payload.json` +8. 如果开启 `mark_read`,最后再标记已读 + +所以在生产模式下,一般不需要单独跑 `run_filter_rules.py`,只有在调规则或排查命中逻辑时才单独跑。 + +## 12. 调规则时的建议 + +- 把“硬性淘汰”规则放高优先级 + - 比如低质量正文、明显噪音内容 +- 把“强 keep”规则放在中高优先级 + - 比如 `worth_keeping=true` 且类别是方法论 +- 把“兜底 review”规则放低一些 + - 避免过早收敛 +- 用户偏好尽量走 `context` + - 不要把临时兴趣直接硬编码到规则里 +- `rule_id` 保持稳定 + - 方便后续审计、统计和排障 + +## 13. 一个最常见的改法 + +如果你想增加一条“命中关注主题就 keep”的规则,可以直接在 `configs/filter_rules.json` 里加: + +```json +{ + "rule_id": "keep-interest-topic", + "enabled": true, + "stop_on_match": false, + "conditions_all": [ + { "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } } + ], + "action": { + "decision": "keep", + "reason": "Topics overlap with current interest profile.", + "labels": ["interest", "topic-match"], + "priority": 75 + } +} +``` + +如果只是临时停用某条规则,最简单的是把它的 `enabled` 改成 `false`,不要先删规则。 diff --git a/docs/openclaw/openclaw-handoff.md b/docs/openclaw/openclaw-handoff.md new file mode 100644 index 0000000..ad999ae --- /dev/null +++ b/docs/openclaw/openclaw-handoff.md @@ -0,0 +1,163 @@ +# OpenClaw Handoff + +## Purpose + +This repository provides a FreshRSS-first reading pipeline for OpenClaw: + +`FreshRSS unread items -> RSS content extraction -> LLM summary -> rule engine -> OpenClaw delivery payload` + +OpenClaw should treat this repository as an MCP-backed upstream content processor. + +## Production Entrypoint + +OpenClaw should call the MCP tool: + +- `run_freshrss_openclaw_pipeline` + +This is the canonical entrypoint for production use. + +## Required Environment Variables + +The MCP server process must have these variables available: + +- `FRESHRSS_API_BASE_URL` +- `FRESHRSS_USERNAME` +- `FRESHRSS_API_PASSWORD` +- `LLM_API_URL` +- `LLM_API_KEY` +- `LLM_MODEL` + +Example: + +```powershell +set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php +set FRESHRSS_USERNAME=osiman +set FRESHRSS_API_PASSWORD=your-api-password +set LLM_API_URL=https://api.deepseek.com +set LLM_API_KEY=your-llm-api-key +set LLM_MODEL=deepseek-chat +``` + +## Server Startup + +Install dependencies: + +```bash +pip install -e . +``` + +Start the MCP server: + +```bash +summary-mcp +``` + +## Recommended MCP Call + +Recommended default call: + +```json +{ + "limit": 5, + "mark_read": false, + "include_read": false, + "debug_artifacts": false, + "timeout_seconds": 60, + "max_retries": 2 +} +``` + +Recommended semantics: + +- Use `mark_read=false` while validating integration. +- Use `mark_read=true` only after confirming OpenClaw will consume the returned payload successfully. +- Keep `debug_artifacts=false` for routine production runs. +- Set `debug_artifacts=true` only when troubleshooting a bad batch. + +## What The Tool Returns + +Primary return fields: + +- `run_id` +- `output_dir` +- `raw_output` +- `delivery_output` +- `report_output` +- `pulled_count` +- `delivered_count` +- `marked_read_count` +- `status_counts` +- `delivery_payload` + +Optional: + +- `items` + - Returned only when `include_item_reports=true` + +## Minimal Output Files + +By default the pipeline writes only: + +- `outputs/freshrss/rerun//raw/freshrss.raw.json` +- `outputs/freshrss/rerun//candidates/openclaw-delivery-payload.json` +- `outputs/freshrss/rerun//run-report.json` + +If `debug_artifacts=true`, the pipeline additionally writes per-item intermediate files. + +## Payload Specs + +OpenClaw payload field specs live here: + +- `docs/openclaw/openclaw-candidate-input-field-spec.md` +- `docs/openclaw/openclaw-delivery-payload-spec.md` + +## Read-State Semantics + +The pipeline reads from FreshRSS unread items by default. + +If `mark_read=true`: + +- items are marked as read only after the final `openclaw-delivery-payload.json` has been written successfully +- only successfully delivered items are marked as read +- failed or skipped items remain unread + +## FreshRSS Content Policy + +For FreshRSS items, the pipeline is RSS-first and does not re-crawl webpages. + +Behavior: + +- use `item.raw_content` first +- if missing, use `item.raw_summary` +- if neither contains usable content, skip the item +- do not fetch the original webpage again for FreshRSS items + +This is intentional. + +## Known Limitations + +- Some sources put only partial content in RSS; those items may be skipped if RSS content is insufficient. +- WeChat articles often block direct crawling, but this pipeline now avoids that path for FreshRSS items and uses RSS-provided content when available. +- Rule behavior is still conservative in some cases; many items may land in `review` depending on current rules. +- Paywall heuristics may produce false positives for some Chinese text patterns. + +## Files OpenClaw Should Read First + +Recommended reading order for a new maintainer: + +1. `README.md` +2. `docs/openclaw/openclaw-handoff.md` +3. `docs/openclaw/openclaw-candidate-input-field-spec.md` +4. `docs/openclaw/openclaw-delivery-payload-spec.md` +5. `docs/current/context-reset-brief.md` + +## Current Recommendation + +For integration handoff, the repository is usable now. + +The minimum you need to give OpenClaw is: + +- the repository code +- the MCP server startup command +- the required environment variables in the target environment +- the instruction to call `run_freshrss_openclaw_pipeline` diff --git a/fellback.md b/fellback.md deleted file mode 100644 index 03b709e..0000000 --- a/fellback.md +++ /dev/null @@ -1,129 +0,0 @@ -我看了,这版 可以,方向是对的。 -如果这是“上游项目 → OpenClaw”的输入格式,我觉得已经 基本能直接用了。 - -我的判断: -这版为什么合适 -它正好满足我最需要的几类信息: -来源信息:title / url / published_at / author / source_name -语义理解:summary / highlights / keywords / topics / category -筛选排序信号:worth_keeping / worth_reason / selection_decision / selection_reason / digest_rank / digest_section_hint -用这批字段,我已经可以做: -日报聚合 -去重 -分栏目 -排序 -生成你的 review 清单 -供你确认后再沉淀到知识库 -所以单从“我好不好解析、能不能稳定消费”来说, -这版 JSON 明显比 md 更适合当上游输入。 -我建议你保留的设计 -这几个点我觉得是对的,不要轻易改掉: -单篇 candidate 扁平对象 -非常适合我消费 -不用反复钻嵌套 -不带全文 -对,别把正文全文塞进来 -token 开销会爆,而且日报阶段根本不需要 -同时保留语义字段 + 筛选字段 -summary/highlights/topics 让我理解内容 -selection_decision/digest_rank 让我快速决定怎么排 -candidate_id 作为稳定主键 -这个非常重要 -后续你让我“保留第几条”“这条上次见过没”“已入库没”都靠它 -我建议你再补 4 个点 -这版已经能用,但如果你要长期跑,我建议再补几个小点。 -1)加一个批量 envelope -你文档里其实已经提到了,我建议尽快定下来。 - -比如: - -{ -"run_id": "daily-2026-03-25-001", -"date": "2026-03-25", -"candidates": [ ... ], -"stats": { -"total": 42 -} -} - - - -原因: -我实际处理日报,不会只收一条 -批次级信息对去重、追踪、失败重跑很重要 -2)加一个 canonical_url 或 url_normalized -现在只有 url,但很多站点会有追踪参数。 - -建议补一个: -canonical_url或 -url_normalized -原因: -去重更稳 -同一篇文章不同 query 参数不会被当两篇 -3)加一个 language -比如: - -"language": "zh-CN" - - - -原因: -以后你来源不一定全是中文 -我做日报、摘要风格、后续入知识库时会更稳 -4)“用户确认结果”不要塞回这个输入对象里 -这个很关键。 - -你这个 OpenClawCandidateInput 很适合做 上游候选输入, -但“你后来确认它有价值”这件事,我建议 不要回写进这个对象定义里。 - -更好的做法是单独维护 downstream 状态,比如: - -{ -"candidate_id": "...", -"review_status": "confirmed", -"reviewed_at": "...", -"review_note": "保留,适合入知识库" -} - - - -原因: -上游输入是“候选事实” -你的确认是“流程状态” -这两个层次最好分开,不然对象会慢慢变脏 -有一个字段关系,我建议你保留现状 -就是: -worth_keeping -selection_decision -这两个不要合并。 - -因为它们语义不一样: -worth_keeping:更像摘要层/语义层判断 -selection_decision:更像规则层/流程层判断 -我消费的时候,两者同时有用。 -如果按你的目标流程,我建议最终这么分层 - -上游输入 -用你现在这版 JSON candidate -OpenClaw 中间处理 -我生成: -日报 markdown -待你确认的候选列表 -人工确认后 -再生成: -知识卡片对象 -或笔记对象 -再入知识库 -也就是说: - -候选输入 JSON ≠ 最终知识库格式 - -别把“日报候选格式”和“知识沉淀格式”硬合成一个。 -一句话结论 -这版 JSON 作为上游输入,已经比 md 合适很多,而且基本可落地。 -如果再补上: -批量 envelope -canonical_url -language -下游确认状态单独建模 -那这套就很稳了。 diff --git a/outputs/README.md b/outputs/README.md index e3fc924..ae530ee 100644 --- a/outputs/README.md +++ b/outputs/README.md @@ -1,38 +1,69 @@ # Outputs Layout -`outputs/` 按“来源 + 阶段”分层,避免所有中间产物堆在根目录。 +`outputs/` 按来源和运行批次组织。当前推荐区分生产产物与调试产物。 -## 目录约定 +## 生产默认输出 + +对于 FreshRSS 主流水线,默认只保留这 3 类文件: + +- `outputs/freshrss/rerun//raw/freshrss.raw.json` + - FreshRSS 原始响应快照 +- `outputs/freshrss/rerun//candidates/openclaw-delivery-payload.json` + - 发给 OpenClaw 的最终批量 payload +- `outputs/freshrss/rerun//run-report.json` + - 本次批处理的运行报告 + +这是当前推荐的生产模式。 + +## 调试扩展输出 + +当启用 `debug_artifacts` 时,才会额外写出这些中间文件: + +- `outputs/freshrss/rerun//items/` + - 标准化 `item` 中间文件 +- `outputs/freshrss/rerun//extracted/` + - 提取结果 +- `outputs/freshrss/rerun//summary/` + - LLM 总结结果及调试尝试文件 +- `outputs/freshrss/rerun//filter/` + - 规则过滤结果 +- `outputs/freshrss/rerun//candidates/*.article-candidate-record.json` + - 内部候选记录 +- `outputs/freshrss/rerun//candidates/*.openclaw-candidate-input.json` + - 单篇 OpenClaw 输入对象 + +## 何时启用调试产物 + +只在这些场景启用: + +- 某一批次有异常,需要定位是提取、总结还是过滤阶段出错 +- 需要核对某条内容为什么被 `keep` / `review` / `drop` +- 需要为规则调整收集样本 + +平时不要默认开启。 + +## 参考目录 - `outputs/prompts/` - - prompt 模板与调试输入 + - Prompt 模板 - `outputs/reference/` - - 手工样例、固定参考输入、通用演示产物 -- `outputs/reference/extracted/` - - 参考提取结果 -- `outputs/reference/summary/` - - 通用摘要结果与 loop 调试产物 -- `outputs/reference/filter/` - - 通用过滤结果与上下文样例 -- `outputs/reference/candidates/` - - 通用 `article_candidate` 样例 + - 手工样例、固定参考输入输出 - `outputs/freshrss/` - - FreshRSS 实跑产物 -- `outputs/freshrss/raw/` - - greader 原始响应 -- `outputs/freshrss/items/` - - entry -> `item` 映射结果 -- `outputs/freshrss/extracted/` - - FreshRSS 文章提取结果 -- `outputs/freshrss/summary/` - - FreshRSS 摘要 loop 结果与调试文件 -- `outputs/freshrss/filter/` - - FreshRSS 过滤结果 -- `outputs/freshrss/candidates/` - - FreshRSS `article_candidate` 结果 + - FreshRSS 实跑批次输出 ## 命名原则 -- 默认脚本输出应优先写入对应子目录,不再直接写 `outputs/` 根目录。 -- 同一条链路的调试文件放在同一阶段目录里,例如 `result.loop.json` 与 `result.loop.attempt-*.json`。 -- `reference/` 只放可复用的稳定样例,真实运行数据优先放 `freshrss/`。 \ No newline at end of file +- 每次批处理使用独立目录:`outputs/freshrss/rerun//` +- 默认优先保留最终产物,不把所有中间文件都当成长期资产 +- 调试文件只在需要时生成 +- `reference/` 只放可复用样例,不放真实生产批次数据 + +## 当前建议 + +如果目标是交给 OpenClaw 稳定消费,优先依赖: + +- `openclaw-delivery-payload.json` +- `run-report.json` +- `freshrss.raw.json` + +其余文件默认都应视为调试辅助产物。 diff --git a/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json deleted file mode 100644 index 2dcfec3..0000000 --- a/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "item": { - "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd", - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "author": "阮一峰", - "published_at": "2026-03-21T10:19:11Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

1、

\n\n

本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。

\n\n

昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。

\n\n

\"\"

\n\n

上图是官网截图,现在点进去还写着\"自有模型\"。

\n\n

自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。

\n\n

现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?

\n\n

Cursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。

\n\n

首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。

\n\n

然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。

\n\n

真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。

\n\n

\"\"

\n\n

2、

\n\n

这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。

\n\n

\"\"

\n\n

可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。

\n\n

\"\"

\n\n

但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。

\n\n

\"\"

\n\n

这下好了,变成了公开的秘密,再也无法掩盖了。

\n\n

3、

\n\n

大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。

\n\n

\"\"

\n\n

许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。

\n\n

Cursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。

\n\n

就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。

\n\n

\"\"

\n\n

他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。

\n\n

稍后,Kimi 官方也发推了。

\n\n

\"\"

\n\n

Kimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。

\n\n

4、

\n\n

事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。

\n\n

既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?

\n\n

我猜测,原因跟 Cursor 不断膨胀的估值有关。

\n\n

彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。

\n\n

\"\"

\n\n

大家知道吗,它以前的估值是多少?

\n\n

2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。

\n\n

可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。

\n\n

为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。

\n\n

我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。

\n\n

5、

\n\n

纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。

\n\n

Cursor 发布 Composer 2 时,披露了性能和成本比较。

\n\n

Composer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。

\n\n

\"\"

\n\n

但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。

\n\n

\"\"

\n\n

既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。

\n\n

6、

\n\n

以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。

\n\n

联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。

\n\n

\"\"

\n\n

他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。

\n\n

\"\"

\n\n

这种新技术据说可以显著提升大模型的推理能力。

\n\n

我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。

\n\n

\"\"

\n\n

据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月21日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Developer" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1774088351 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:122a02c6bb154069e5b8d5cc9c7127f92c48bd940a032559b1812f6d861f1e36", - "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "author": "阮一峰", - "published_at": "2026-03-21T10:19:11Z", - "language": null, - "content_kind": "article", - "plain_text": "1、\n本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。\n昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。\n上图是官网截图,现在点进去还写着\"自有模型\"。\n自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。\n现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。\n2、\n这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。\n但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。\n这下好了,变成了公开的秘密,再也无法掩盖了。\n3、\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。\n稍后,Kimi 官方也发推了。\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。\n4、\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?\n我猜测,原因跟 Cursor 不断膨胀的估值有关。\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。\n大家知道吗,它以前的估值是多少?\n2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。\n可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。\n为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。\n我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。\n5、\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。\nCursor 发布 Composer 2 时,披露了性能和成本比较。\nComposer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。\n但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。\n既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。\n6、\n以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。\n联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。\n他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。\n这种新技术据说可以显著提升大模型的推理能力。\n我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。\n(完)\n小饿 说:\n大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n2026年3月22日 07:58 | # | 引用\n游钓四方 说:\nCursor 也到头了\n2026年3月22日 08:35 | # | 引用\nEdward 说:\n好呀你个cursor,居然用的是我们的kimi:)\n2026年3月22日 11:54 | # | 引用\njake 说:\n国产大模型的真实性能应该是没问题的,但是最大的问题是使用过程中突然就会明显降智,这种情况使用codex和claude中都没感受过。\n2026年3月22日 16:22 | # | 引用\nAlex 说:\nCursor膨脹全靠一開始vscode支援的慢了點,支援agent mode後cursor就一文不值了\n2026年3月22日 18:27 | # | 引用\n张三 说:\n太慢了,即便cursor套壳也比国产的直接用快多了\n2026年3月23日 11:37 | # | 引用\n一拳超人罢了 说:\n笑死了,几个月前用cursor的时候就发现了,使用composer1模型,思考逻辑里会突然蹦出中文来,我一开始以为是套壳的deepseek\n2026年3月23日 14:13 | # | 引用\n大名老王 说:\n老说国产慢,充钱就不慢了呀\n2026年3月23日 16:59 | # | 引用\ncolor 说:\n```12月的 B 轮融资,估值快速上升到26美元;```, 这句话少了亿字吧?阮老师\n2026年3月24日 06:42 | # | 引用\nHaKu 说:\n国模确实还行,问题就是太缺算力,高峰期降智问题很严重,如果这个问题可以解决还是很有性价比的\n2026年3月24日 08:39 | # | 引用\nbillzbc 说:\ncursor估值泡沫太大了\n2026年3月24日 10:57 | # | 引用", - "quality_flags": { - "is_paywalled": false, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 2922 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其不断膨胀的估值,将其包装成大模型公司。", - "highlights": [ - "Cursor的Composer 2模型被技术手段揭露实际调用的是Kimi K2.5模型。", - "Kimi官方确认Cursor通过Fireworks AI获得授权,因此不构成侵权。", - "Cursor隐瞒使用Kimi模型,被认为是为了支撑其高达500亿美元的估值。", - "事件显示中国大模型技术已具备输出能力,国产模型与国外旗舰差距缩小。", - "Composer 2性能低于GPT-5.4但成本最低,生成速度较快。" - ], - "keywords": [ - "Cursor", - "Composer 2", - "Kimi K2.5", - "Fireworks AI", - "套壳模型", - "模型授权", - "估值泡沫", - "AI编程工具" - ], - "topics": [ - "人工智能", - "大模型", - "商业伦理", - "技术争议", - "创业融资" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。" - }, - "filter_result": { - "decision": "review", - "matched_rules": [ - "review-worth-keeping-other" - ], - "reasons": [ - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "summary" - ], - "priority": 60, - "matches": [ - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 60, - "review_state": "pending", - "source_refs": { - "item_path": "outputs\\freshrss\\items\\batch\\item-01.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-01.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-01\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-01.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T10:25:46.487441Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-102546" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-01.article-candidate.json b/outputs/freshrss/candidates/batch/item-01.article-candidate.json deleted file mode 100644 index b1b8fac..0000000 --- a/outputs/freshrss/candidates/batch/item-01.article-candidate.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "item": { - "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd", - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "author": "阮一峰", - "published_at": "2026-03-21T10:19:11Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

1、

\n\n

本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。

\n\n

昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。

\n\n

\"\"

\n\n

上图是官网截图,现在点进去还写着\"自有模型\"。

\n\n

自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。

\n\n

现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?

\n\n

Cursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。

\n\n

首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。

\n\n

然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。

\n\n

真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。

\n\n

\"\"

\n\n

2、

\n\n

这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。

\n\n

\"\"

\n\n

可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。

\n\n

\"\"

\n\n

但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。

\n\n

\"\"

\n\n

这下好了,变成了公开的秘密,再也无法掩盖了。

\n\n

3、

\n\n

大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。

\n\n

\"\"

\n\n

许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。

\n\n

Cursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。

\n\n

就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。

\n\n

\"\"

\n\n

他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。

\n\n

稍后,Kimi 官方也发推了。

\n\n

\"\"

\n\n

Kimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。

\n\n

4、

\n\n

事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。

\n\n

既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?

\n\n

我猜测,原因跟 Cursor 不断膨胀的估值有关。

\n\n

彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。

\n\n

\"\"

\n\n

大家知道吗,它以前的估值是多少?

\n\n

2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。

\n\n

可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。

\n\n

为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。

\n\n

我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。

\n\n

5、

\n\n

纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。

\n\n

Cursor 发布 Composer 2 时,披露了性能和成本比较。

\n\n

Composer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。

\n\n

\"\"

\n\n

但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。

\n\n

\"\"

\n\n

既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。

\n\n

6、

\n\n

以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。

\n\n

联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。

\n\n

\"\"

\n\n

他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。

\n\n

\"\"

\n\n

这种新技术据说可以显著提升大模型的推理能力。

\n\n

我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。

\n\n

\"\"

\n\n

据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月21日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Developer" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1774088351 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:122a02c6bb154069e5b8d5cc9c7127f92c48bd940a032559b1812f6d861f1e36", - "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "author": "阮一峰", - "published_at": "2026-03-21T10:19:11Z", - "language": null, - "content_kind": "article", - "plain_text": "1、\n本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。\n昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。\n上图是官网截图,现在点进去还写着\"自有模型\"。\n自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。\n现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。\n2、\n这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。\n但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。\n这下好了,变成了公开的秘密,再也无法掩盖了。\n3、\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。\n稍后,Kimi 官方也发推了。\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。\n4、\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?\n我猜测,原因跟 Cursor 不断膨胀的估值有关。\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。\n大家知道吗,它以前的估值是多少?\n2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。\n可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。\n为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。\n我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。\n5、\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。\nCursor 发布 Composer 2 时,披露了性能和成本比较。\nComposer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。\n但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。\n既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。\n6、\n以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。\n联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。\n他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。\n这种新技术据说可以显著提升大模型的推理能力。\n我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。\n(完)\n小饿 说:\n大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n2026年3月22日 07:58 | # | 引用\n游钓四方 说:\nCursor 也到头了\n2026年3月22日 08:35 | # | 引用\nEdward 说:\n好呀你个cursor,居然用的是我们的kimi:)\n2026年3月22日 11:54 | # | 引用\njake 说:\n国产大模型的真实性能应该是没问题的,但是最大的问题是使用过程中突然就会明显降智,这种情况使用codex和claude中都没感受过。\n2026年3月22日 16:22 | # | 引用\nAlex 说:\nCursor膨脹全靠一開始vscode支援的慢了點,支援agent mode後cursor就一文不值了\n2026年3月22日 18:27 | # | 引用\n张三 说:\n太慢了,即便cursor套壳也比国产的直接用快多了\n2026年3月23日 11:37 | # | 引用\n一拳超人罢了 说:\n笑死了,几个月前用cursor的时候就发现了,使用composer1模型,思考逻辑里会突然蹦出中文来,我一开始以为是套壳的deepseek\n2026年3月23日 14:13 | # | 引用\n大名老王 说:\n老说国产慢,充钱就不慢了呀\n2026年3月23日 16:59 | # | 引用\ncolor 说:\n```12月的 B 轮融资,估值快速上升到26美元;```, 这句话少了亿字吧?阮老师\n2026年3月24日 06:42 | # | 引用\nHaKu 说:\n国模确实还行,问题就是太缺算力,高峰期降智问题很严重,如果这个问题可以解决还是很有性价比的\n2026年3月24日 08:39 | # | 引用\nbillzbc 说:\ncursor估值泡沫太大了\n2026年3月24日 10:57 | # | 引用", - "quality_flags": { - "is_paywalled": false, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 2922 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其不断膨胀的估值,将其包装成大模型公司。", - "highlights": [ - "Cursor的Composer 2模型被技术手段揭露实际调用的是Kimi K2.5模型。", - "Kimi官方确认Cursor通过Fireworks AI获得授权,因此不构成侵权。", - "Cursor隐瞒使用Kimi模型,被认为是为了支撑其高达500亿美元的估值。", - "事件显示中国大模型技术已具备输出能力,国产模型与国外旗舰差距缩小。", - "Composer 2性能低于GPT-5.4但成本最低,生成速度较快。" - ], - "keywords": [ - "Cursor", - "Composer 2", - "Kimi K2.5", - "Fireworks AI", - "套壳模型", - "模型授权", - "估值泡沫", - "AI编程工具" - ], - "topics": [ - "人工智能", - "大模型", - "商业伦理", - "技术争议", - "创业融资" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。" - }, - "filter_decision": { - "decision": "review", - "matched_rules": [ - "review-worth-keeping-other" - ], - "reasons": [ - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "summary" - ], - "priority": 60, - "matches": [ - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 60, - "review_state": "pending", - "source_refs": { - "raw_item_path": "outputs\\freshrss\\items\\batch\\item-01.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-01.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-01\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-01.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T08:48:41.576492Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-084841" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json deleted file mode 100644 index ec347bd..0000000 --- a/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", - "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", - "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", - "published_at": "2026-03-21T10:19:11Z", - "author": "阮一峰", - "source_name": "阮一峰的网络日志", - "language": null, - "summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其不断膨胀的估值,将其包装成大模型公司。", - "highlights": [ - "Cursor的Composer 2模型被技术手段揭露实际调用的是Kimi K2.5模型。", - "Kimi官方确认Cursor通过Fireworks AI获得授权,因此不构成侵权。", - "Cursor隐瞒使用Kimi模型,被认为是为了支撑其高达500亿美元的估值。", - "事件显示中国大模型技术已具备输出能力,国产模型与国外旗舰差距缩小。", - "Composer 2性能低于GPT-5.4但成本最低,生成速度较快。" - ], - "keywords": [ - "Cursor", - "Composer 2", - "Kimi K2.5", - "Fireworks AI", - "套壳模型", - "模型授权", - "估值泡沫", - "AI编程工具" - ], - "topics": [ - "人工智能", - "大模型", - "商业伦理", - "技术争议", - "创业融资" - ], - "category": "观点评论", - "worth_keeping": true, - "worth_reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。", - "selection_decision": "review", - "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "digest_section_hint": null, - "digest_rank": 60 -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json deleted file mode 100644 index f426644..0000000 --- a/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "item": { - "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc", - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "author": "阮一峰", - "published_at": "2026-03-19T23:59:16Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

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

\n\n

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

\n\n

封面图

\n\n

\"\"

\n\n

唐山河头老街景区的轨道车\"大唐云车\"。(via)

\n\n

未来如何招聘程序员

\n\n

前些天,讨论区有一个帖子,提出一个问题。

\n\n

如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?

\n\n

\"\"

\n\n

程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?

\n\n

你仔细想想,这个问题比预想的难多了。

\n\n

首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。

\n\n

但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:

\n\n
    \n
  • 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。
  • \n
  • 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。
  • \n
  • 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。
  • \n
  • ......
  • \n
\n\n

这些问题能识别出 AI 编程高手吗?我完全没有把握。

\n\n

其次,除了 AI,还要考察什么呢? 这也很不好想。

\n\n

我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。

\n\n

另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。

\n\n

总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?

\n\n

有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。

\n\n

科技动态

\n\n

1、访达小子

\n\n

苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。

\n\n

\"\"

\n\n

上面海报的左上角有一个玩偶,以前没见过。

\n\n

这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。

\n\n

\"\"

\n\n

几天后,苹果公司又在一场直播里面,使用了这个形象。

\n\n

\"\"

\n\n

人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?

\n\n

热心的网友让 AI 绘制了\"访达小子\"的完整形象。

\n\n

\"\"

\n\n

\"\"

\n\n

看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。

\n\n

2、红外线编码

\n\n

英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。

\n\n

\"\"

\n\n

肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。

\n\n

因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。

\n\n

3、机柜种植

\n\n

家里有多余的服务器机柜,怎么利用起来?

\n\n

\"\"

\n\n

一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。

\n\n

\"\"

\n\n

他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。

\n\n

\"\"

\n\n

如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。

\n\n

\"\"

\n\n

文章

\n\n

1、我放弃了 Elasticsearch,转而使用 Meil​​isearch(英文)

\n\n

\"\"

\n\n

Meil​​isearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。

\n\n

2、2016 年,我做过一次 AI 写代码创业(中文)

\n\n

\"\"

\n\n

作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)

\n\n

3、信息过载时代,我的漏斗式阅读工作流(中文)

\n\n

\"\"

\n\n

每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)

\n\n

4、编译器的前端与后端(英文)

\n\n

\"\"

\n\n

一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。

\n\n

5、CSS 的 lh 单位(英文)

\n\n

\"\"

\n\n

CSS 有一个字体大小属性lh,表示行高。

\n\n

6、寻觅杜鹃花之王(中文)

\n\n

\"\"

\n\n

大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。

\n\n

后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。

\n\n

工具

\n\n

1、APTUI

\n\n

\"\"

\n\n

一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。

\n\n

2、my.WordPress.net

\n\n

\"\"

\n\n

如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。

\n\n

它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。

\n\n

3、GrobPaint

\n\n

\"\"

\n\n

一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。

\n\n

4、Apple Matting

\n\n

\"\"

\n\n

一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)

\n\n

5、HealthTick

\n\n

\"\"

\n\n

macOS 菜单栏久坐提醒工具。(@lifedever 投稿)

\n\n

6、CheatReader

\n\n

\"\"

\n\n

一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)

\n\n

7、锤子便签

\n\n

\"\"

\n\n

开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)

\n\n

8、WeChat Download API

\n\n

\"\"

\n\n

开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)

\n\n

9、Speech Speed

\n\n

一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。

\n\n

AI 相关

\n\n

1、VibeGo

\n\n

\"\"

\n\n

Vibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)

\n\n

2、Mimic Them

\n\n

一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)

\n\n

3、AICheck

\n\n

\"\"

\n\n

一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)

\n\n

4、AionUi

\n\n

\"\"

\n\n

开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)

\n\n

5、Lumo

\n\n

\"\"

\n\n

一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)

\n\n

6、AIComicBuilder

\n\n

\"\"

\n\n

开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)

\n\n

资源

\n\n

1、canirun.ai

\n\n

\"\"

\n\n

网页检测你的机器,能够运行哪些本地的 AI 模型。

\n\n

2、AI 是怎么回事(中文)

\n\n

\"\"

\n\n

面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)

\n\n

3、TypeScript 数据结构与算法(Algorithms with TypeScript)

\n\n

\"\"

\n\n

免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。

\n\n

4、频道冲浪者(Channel Surfer)

\n\n

\"\"

\n\n

这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。

\n\n

图片

\n\n

1、巧妙的古建筑

\n\n

因为缺乏机械和动力,古代建筑物往往包含了很多巧思。

\n\n

(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。

\n\n

有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。

\n\n

为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。

\n\n

\"\"

\n\n

(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。

\n\n

这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。

\n\n

\"\"

\n\n

(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。

\n\n

\"\"

\n\n

\"\"

\n\n

(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。

\n\n

\"\"

\n\n

文摘

\n\n

1、避免使用定制框架

\n\n

很多小团队在工作中,往往会发明自己的\"定制框架\"。

\n\n

他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。

\n\n

这种\"定制框架\"有一些共同特点:

\n\n
\n

(1)由小团队创建,旨在解决他们的痛点;

\n\n

(2)底层是其他更通用的技术栈或框架;

\n\n

(3)引入原有技术栈不存在的新概念和术语;

\n\n

(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。

\n
\n\n

我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。

\n\n

我建议,大家避免使用\"定制框架\",原因有下面这些:

\n\n

(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。

\n\n

(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。

\n\n

(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。

\n\n

(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。

\n\n

(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。

\n\n

我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。

\n\n

言论

\n\n

1、

\n\n

我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。

\n\n

-- David Miranda

\n\n

2、

\n\n

AI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。

\n\n

-- lucumr.pocoo.org

\n\n

3、

\n\n

编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。

\n\n

-- 《生活在\"平面国\"的程序员》

\n\n

4、

\n\n

领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。

\n\n

-- 艾森豪威尔,美国前总统

\n\n

往年回顾

\n\n

面试的 AI 作弊----用数字人去面试(#342)

\n\n

所有代码都是技术债(#292)

\n\n

一次尴尬的服务器被黑(#242)

\n\n

最大的机会来自新技术(#192)

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月20日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Weekly" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1773964756 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:28f701753f6d82111e2f9105d9180bb359a75608b2669cb1e7dc741ff5ca17c6", - "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "author": "阮一峰", - "published_at": "2026-03-19T23:59:16Z", - "language": null, - "content_kind": "article", - "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n唐山河头老街景区的轨道车\"大唐云车\"。(via)\n未来如何招聘程序员\n前些天,讨论区有一个帖子,提出一个问题。\n如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?\n程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?\n你仔细想想,这个问题比预想的难多了。\n首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。\n但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:\n- 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。\n- 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。\n- 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。\n- ......\n这些问题能识别出 AI 编程高手吗?我完全没有把握。\n其次,除了 AI,还要考察什么呢? 这也很不好想。\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。\n另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?\n有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。\n科技动态\n1、访达小子\n苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。\n上面海报的左上角有一个玩偶,以前没见过。\n这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。\n几天后,苹果公司又在一场直播里面,使用了这个形象。\n人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?\n热心的网友让 AI 绘制了\"访达小子\"的完整形象。\n看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。\n2、红外线编码\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。\n3、机柜种植\n家里有多余的服务器机柜,怎么利用起来?\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n文章\n1、我放弃了 Elasticsearch,转而使用 Meilisearch(英文)\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。\n2、2016 年,我做过一次 AI 写代码创业(中文)\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)\n3、信息过载时代,我的漏斗式阅读工作流(中文)\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)\n4、编译器的前端与后端(英文)\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。\n5、CSS 的 lh 单位(英文)\nCSS 有一个字体大小属性lh\n,表示行高。\n6、寻觅杜鹃花之王(中文)\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。\n工具\n1、APTUI\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)\n7、锤子便签\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。\nAI 相关\n1、VibeGo\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)\n3、AICheck\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)\n4、AionUi\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)\n5、Lumo\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)\n资源\n网页检测你的机器,能够运行哪些本地的 AI 模型。\n2、AI 是怎么回事(中文)\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)\n3、TypeScript 数据结构与算法(Algorithms with TypeScript)\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。\n4、频道冲浪者(Channel Surfer)\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。\n图片\n1、巧妙的古建筑\n因为缺乏机械和动力,古代建筑物往往包含了很多巧思。\n(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。\n有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。\n为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。\n(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。\n这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。\n(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。\n(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。\n文摘\n1、避免使用定制框架\n很多小团队在工作中,往往会发明自己的\"定制框架\"。\n他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。\n这种\"定制框架\"有一些共同特点:\n(1)由小团队创建,旨在解决他们的痛点;\n(2)底层是其他更通用的技术栈或框架;\n(3)引入原有技术栈不存在的新概念和术语;\n(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。\n我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。\n我建议,大家避免使用\"定制框架\",原因有下面这些:\n(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。\n(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。\n(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。\n(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。\n(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。\n我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。\n言论\n1、\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。\n2、\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。\n3、\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。\n4、\n领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。\n-- 艾森豪威尔,美国前总统\n往年回顾\n面试的 AI 作弊----用数字人去面试(#342)\n所有代码都是技术债(#292)\n一次尴尬的服务器被黑(#242)\n最大的机会来自新技术(#192)\n(完)\njhc 说:\n国外的情况我不清楚,我认为在国内技术面试并不是考候选人能不能写出正确代码,而是一种筛选手段\n2026年3月20日 09:22 | # | 引用\n小白 说:\n访达小子有点“幻视”阴阳脸的意思[:狗头]\n2026年3月20日 09:53 | # | 引用\nNobita 说:\n看完了AI创业的文章,作者结尾的感慨发人深省\n“未来并不是线性展开的。\n所以,焦虑并不能真正帮助我们接近未来。更重要的是,在你当下所能看到的边界之内,做一个对得起自己的选择;至于剩下的部分,就交给时间。”\n2026年3月20日 09:56 | # | 引用\nDeathGhost 说:\n访达小子 像 奶龙~哈哈\n2026年3月20日 09:57 | # | 引用\nvxcoder 说:\n以前研发讲究的是要理解系统里细化到每个字节的运行原理,现在跟我说这是黑箱,但你可以放心的交给一个概率模型去维护。\n2026年3月20日 10:22 | # | 引用\n陆波 说:\nai时代来了,感觉突然多了很多新知识和技术需要学习\n2026年3月20日 10:26 | # | 引用\nJK 说:\nCheatReader 来源于我对象的摸鱼需求,用了2小时使用OpenSpec辅助开发的项目,很荣幸第一次投稿就被选上了。如果有朋友使用过程中遇到问题或者有新的需求,欢迎提ISSUE~\n我烧了几个B的token去实验各种开发的姿势,慢慢的也有一些心得,我和几个朋友最近在做一款很有意思的项目,期待可以出现在下个月的周报中!\n2026年3月20日 12:25 | # | 引用\nk 说:\n你如果没有自已的想法,而整个项目或系统都交给AI,那么AI写出来东西,不都是抄袭现成的吗?\n它也不能自已创建出来一套新的架构或模式吧?\n2026年3月20日 14:25 | # | 引用\nmorty 说:\n服务器养殖蔬菜这不纯纯浪费电力吗?这种没脑子的文章怎么出现在这里。。。。\n2026年3月20日 14:45 | # | 引用\nLY 说:\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n—— 看起来很赛博和有趣,但是\n室内、光照、隐蔽性\n这玩意儿更适合种的是某种加麻大特产\n2026年3月20日 14:47 | # | 引用\nDylan Yu 说:\n访达小子好像弗兰肯斯坦\n2026年3月20日 15:15 | # | 引用\nXZY 说:\n未来面试方也更加依赖AI,反正都是黑盒,都交由AI来判断啦。\n又或者是多开几个agent,减少程序员的需求。\n2026年3月20日 15:59 | # | 引用\nLeon 说:\n关于程序员面试问什么问题,我觉得除了考察 AI 的熟练度,还要考察对方的计算机基础、数据结构算法、设计模式,这些东西永远都不过时,如果时间充裕,可以给个课题,让对方现场用 ai 工具实现,看看效果如何\n2026年3月20日 16:34 | # | 引用\nh29 说:\n定制化框架可以理解为固化一些内部共识,但是也要能跟得上行业发展才行。\n2026年3月20日 16:58 | # | 引用\n求面试 说:\n对于程序员来说结构化表达越来越重要, 这包括能清晰的描述需求, 把需求讲解的编程Agent能充分理解, 清晰的表达技术要求, 需要作者有技术功底, 让大模型Agent理解设计质量, 避免写出一堆屎山代码。\n2026年3月20日 21:54 | # | 引用\nhttps://yijinlee.com李奕锦 说:\n未来的超级个体,是一个程序员带着一群 AI 助手,交付一支团队的产能。\n面试桌上,请放下笔试题,打开电脑,让他展示那些真正用 AI 辅助落地的项目。能把 AI 当作武器去攻城略地的实战派,才是 AI 时代真正稀缺的将才。\n2026年3月22日 10:38 | # | 引用\n徐晖 说:\n这一期质量很高,今后可以多转载些来自其它博客的文章\n2026年3月22日 10:39 | # | 引用\n阿楚 说:\n巴尔贝加尔水磨坊,近2000年还能保存这么多砖石?还是说后人修缮后的现状?\n2026年3月22日 12:16 | # | 引用\n勇者 StartUp 说:\n我来面试,会加上二分查找、冒牌排序的手写编码,难道一个程序员写不出排序和查找?\n2026年3月22日 21:31 | # | 引用\nwuqi 说:\n其实ai没那么全能,还有个问题,烧token是要钱的,有经验的至少知道怎么烧,你可以试试直接让产品烧token,看能不能烧出来正确的结果,ai一般是不会拒绝错误提议和方案的,正经程序员会考虑程序规模和布设成本,ai并不会管那么多...\n一个傻逼领导或者产品可是真的能提出来我们要做一个淘宝,ai也真的能附和这个傻逼\n2026年3月23日 08:45 | # | 引用\nSiu 说:\n我應徵過多次就只有一次是現場寫程序的。可能本港公司都不會現場考人。誰有這時間。\n2026年3月24日 12:47 | # | 引用", - "quality_flags": { - "is_paywalled": false, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 6599 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。", - "highlights": [ - "未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。", - "面试问题需要考察将复杂需求转化为清晰提示词的能力。", - "AI编程时代,对系统架构知识和项目分解能力的要求依然重要。", - "传统的编程语法细节考察在AI辅助下意义可能减弱。", - "文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。" - ], - "keywords": [ - "AI编程", - "程序员招聘", - "面试问题", - "提示词工程", - "Skill", - "MCP", - "多Agent协同", - "系统架构" - ], - "topics": [ - "人工智能", - "软件开发", - "职业发展", - "技术趋势", - "人才评估" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。" - }, - "filter_result": { - "decision": "review", - "matched_rules": [ - "review-worth-keeping-other" - ], - "reasons": [ - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "summary" - ], - "priority": 60, - "matches": [ - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 60, - "review_state": "pending", - "source_refs": { - "item_path": "outputs\\freshrss\\items\\batch\\item-02.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-02.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-02\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-02.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T10:25:47.791246Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-102547" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.article-candidate.json b/outputs/freshrss/candidates/batch/item-02.article-candidate.json deleted file mode 100644 index afb96b7..0000000 --- a/outputs/freshrss/candidates/batch/item-02.article-candidate.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "item": { - "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc", - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "author": "阮一峰", - "published_at": "2026-03-19T23:59:16Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

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

\n\n

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

\n\n

封面图

\n\n

\"\"

\n\n

唐山河头老街景区的轨道车\"大唐云车\"。(via)

\n\n

未来如何招聘程序员

\n\n

前些天,讨论区有一个帖子,提出一个问题。

\n\n

如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?

\n\n

\"\"

\n\n

程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?

\n\n

你仔细想想,这个问题比预想的难多了。

\n\n

首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。

\n\n

但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:

\n\n
    \n
  • 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。
  • \n
  • 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。
  • \n
  • 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。
  • \n
  • ......
  • \n
\n\n

这些问题能识别出 AI 编程高手吗?我完全没有把握。

\n\n

其次,除了 AI,还要考察什么呢? 这也很不好想。

\n\n

我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。

\n\n

另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。

\n\n

总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?

\n\n

有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。

\n\n

科技动态

\n\n

1、访达小子

\n\n

苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。

\n\n

\"\"

\n\n

上面海报的左上角有一个玩偶,以前没见过。

\n\n

这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。

\n\n

\"\"

\n\n

几天后,苹果公司又在一场直播里面,使用了这个形象。

\n\n

\"\"

\n\n

人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?

\n\n

热心的网友让 AI 绘制了\"访达小子\"的完整形象。

\n\n

\"\"

\n\n

\"\"

\n\n

看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。

\n\n

2、红外线编码

\n\n

英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。

\n\n

\"\"

\n\n

肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。

\n\n

因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。

\n\n

3、机柜种植

\n\n

家里有多余的服务器机柜,怎么利用起来?

\n\n

\"\"

\n\n

一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。

\n\n

\"\"

\n\n

他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。

\n\n

\"\"

\n\n

如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。

\n\n

\"\"

\n\n

文章

\n\n

1、我放弃了 Elasticsearch,转而使用 Meil​​isearch(英文)

\n\n

\"\"

\n\n

Meil​​isearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。

\n\n

2、2016 年,我做过一次 AI 写代码创业(中文)

\n\n

\"\"

\n\n

作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)

\n\n

3、信息过载时代,我的漏斗式阅读工作流(中文)

\n\n

\"\"

\n\n

每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)

\n\n

4、编译器的前端与后端(英文)

\n\n

\"\"

\n\n

一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。

\n\n

5、CSS 的 lh 单位(英文)

\n\n

\"\"

\n\n

CSS 有一个字体大小属性lh,表示行高。

\n\n

6、寻觅杜鹃花之王(中文)

\n\n

\"\"

\n\n

大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。

\n\n

后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。

\n\n

工具

\n\n

1、APTUI

\n\n

\"\"

\n\n

一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。

\n\n

2、my.WordPress.net

\n\n

\"\"

\n\n

如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。

\n\n

它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。

\n\n

3、GrobPaint

\n\n

\"\"

\n\n

一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。

\n\n

4、Apple Matting

\n\n

\"\"

\n\n

一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)

\n\n

5、HealthTick

\n\n

\"\"

\n\n

macOS 菜单栏久坐提醒工具。(@lifedever 投稿)

\n\n

6、CheatReader

\n\n

\"\"

\n\n

一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)

\n\n

7、锤子便签

\n\n

\"\"

\n\n

开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)

\n\n

8、WeChat Download API

\n\n

\"\"

\n\n

开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)

\n\n

9、Speech Speed

\n\n

一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。

\n\n

AI 相关

\n\n

1、VibeGo

\n\n

\"\"

\n\n

Vibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)

\n\n

2、Mimic Them

\n\n

一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)

\n\n

3、AICheck

\n\n

\"\"

\n\n

一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)

\n\n

4、AionUi

\n\n

\"\"

\n\n

开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)

\n\n

5、Lumo

\n\n

\"\"

\n\n

一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)

\n\n

6、AIComicBuilder

\n\n

\"\"

\n\n

开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)

\n\n

资源

\n\n

1、canirun.ai

\n\n

\"\"

\n\n

网页检测你的机器,能够运行哪些本地的 AI 模型。

\n\n

2、AI 是怎么回事(中文)

\n\n

\"\"

\n\n

面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)

\n\n

3、TypeScript 数据结构与算法(Algorithms with TypeScript)

\n\n

\"\"

\n\n

免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。

\n\n

4、频道冲浪者(Channel Surfer)

\n\n

\"\"

\n\n

这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。

\n\n

图片

\n\n

1、巧妙的古建筑

\n\n

因为缺乏机械和动力,古代建筑物往往包含了很多巧思。

\n\n

(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。

\n\n

有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。

\n\n

为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。

\n\n

\"\"

\n\n

(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。

\n\n

这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。

\n\n

\"\"

\n\n

(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。

\n\n

\"\"

\n\n

\"\"

\n\n

(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。

\n\n

\"\"

\n\n

文摘

\n\n

1、避免使用定制框架

\n\n

很多小团队在工作中,往往会发明自己的\"定制框架\"。

\n\n

他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。

\n\n

这种\"定制框架\"有一些共同特点:

\n\n
\n

(1)由小团队创建,旨在解决他们的痛点;

\n\n

(2)底层是其他更通用的技术栈或框架;

\n\n

(3)引入原有技术栈不存在的新概念和术语;

\n\n

(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。

\n
\n\n

我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。

\n\n

我建议,大家避免使用\"定制框架\",原因有下面这些:

\n\n

(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。

\n\n

(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。

\n\n

(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。

\n\n

(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。

\n\n

(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。

\n\n

我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。

\n\n

言论

\n\n

1、

\n\n

我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。

\n\n

-- David Miranda

\n\n

2、

\n\n

AI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。

\n\n

-- lucumr.pocoo.org

\n\n

3、

\n\n

编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。

\n\n

-- 《生活在\"平面国\"的程序员》

\n\n

4、

\n\n

领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。

\n\n

-- 艾森豪威尔,美国前总统

\n\n

往年回顾

\n\n

面试的 AI 作弊----用数字人去面试(#342)

\n\n

所有代码都是技术债(#292)

\n\n

一次尴尬的服务器被黑(#242)

\n\n

最大的机会来自新技术(#192)

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月20日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Weekly" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1773964756 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:28f701753f6d82111e2f9105d9180bb359a75608b2669cb1e7dc741ff5ca17c6", - "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "author": "阮一峰", - "published_at": "2026-03-19T23:59:16Z", - "language": null, - "content_kind": "article", - "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n唐山河头老街景区的轨道车\"大唐云车\"。(via)\n未来如何招聘程序员\n前些天,讨论区有一个帖子,提出一个问题。\n如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?\n程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?\n你仔细想想,这个问题比预想的难多了。\n首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。\n但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:\n- 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。\n- 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。\n- 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。\n- ......\n这些问题能识别出 AI 编程高手吗?我完全没有把握。\n其次,除了 AI,还要考察什么呢? 这也很不好想。\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。\n另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?\n有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。\n科技动态\n1、访达小子\n苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。\n上面海报的左上角有一个玩偶,以前没见过。\n这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。\n几天后,苹果公司又在一场直播里面,使用了这个形象。\n人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?\n热心的网友让 AI 绘制了\"访达小子\"的完整形象。\n看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。\n2、红外线编码\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。\n3、机柜种植\n家里有多余的服务器机柜,怎么利用起来?\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n文章\n1、我放弃了 Elasticsearch,转而使用 Meilisearch(英文)\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。\n2、2016 年,我做过一次 AI 写代码创业(中文)\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)\n3、信息过载时代,我的漏斗式阅读工作流(中文)\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)\n4、编译器的前端与后端(英文)\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。\n5、CSS 的 lh 单位(英文)\nCSS 有一个字体大小属性lh\n,表示行高。\n6、寻觅杜鹃花之王(中文)\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。\n工具\n1、APTUI\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)\n7、锤子便签\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。\nAI 相关\n1、VibeGo\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)\n3、AICheck\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)\n4、AionUi\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)\n5、Lumo\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)\n资源\n网页检测你的机器,能够运行哪些本地的 AI 模型。\n2、AI 是怎么回事(中文)\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)\n3、TypeScript 数据结构与算法(Algorithms with TypeScript)\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。\n4、频道冲浪者(Channel Surfer)\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。\n图片\n1、巧妙的古建筑\n因为缺乏机械和动力,古代建筑物往往包含了很多巧思。\n(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。\n有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。\n为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。\n(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。\n这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。\n(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。\n(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。\n文摘\n1、避免使用定制框架\n很多小团队在工作中,往往会发明自己的\"定制框架\"。\n他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。\n这种\"定制框架\"有一些共同特点:\n(1)由小团队创建,旨在解决他们的痛点;\n(2)底层是其他更通用的技术栈或框架;\n(3)引入原有技术栈不存在的新概念和术语;\n(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。\n我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。\n我建议,大家避免使用\"定制框架\",原因有下面这些:\n(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。\n(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。\n(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。\n(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。\n(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。\n我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。\n言论\n1、\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。\n2、\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。\n3、\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。\n4、\n领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。\n-- 艾森豪威尔,美国前总统\n往年回顾\n面试的 AI 作弊----用数字人去面试(#342)\n所有代码都是技术债(#292)\n一次尴尬的服务器被黑(#242)\n最大的机会来自新技术(#192)\n(完)\njhc 说:\n国外的情况我不清楚,我认为在国内技术面试并不是考候选人能不能写出正确代码,而是一种筛选手段\n2026年3月20日 09:22 | # | 引用\n小白 说:\n访达小子有点“幻视”阴阳脸的意思[:狗头]\n2026年3月20日 09:53 | # | 引用\nNobita 说:\n看完了AI创业的文章,作者结尾的感慨发人深省\n“未来并不是线性展开的。\n所以,焦虑并不能真正帮助我们接近未来。更重要的是,在你当下所能看到的边界之内,做一个对得起自己的选择;至于剩下的部分,就交给时间。”\n2026年3月20日 09:56 | # | 引用\nDeathGhost 说:\n访达小子 像 奶龙~哈哈\n2026年3月20日 09:57 | # | 引用\nvxcoder 说:\n以前研发讲究的是要理解系统里细化到每个字节的运行原理,现在跟我说这是黑箱,但你可以放心的交给一个概率模型去维护。\n2026年3月20日 10:22 | # | 引用\n陆波 说:\nai时代来了,感觉突然多了很多新知识和技术需要学习\n2026年3月20日 10:26 | # | 引用\nJK 说:\nCheatReader 来源于我对象的摸鱼需求,用了2小时使用OpenSpec辅助开发的项目,很荣幸第一次投稿就被选上了。如果有朋友使用过程中遇到问题或者有新的需求,欢迎提ISSUE~\n我烧了几个B的token去实验各种开发的姿势,慢慢的也有一些心得,我和几个朋友最近在做一款很有意思的项目,期待可以出现在下个月的周报中!\n2026年3月20日 12:25 | # | 引用\nk 说:\n你如果没有自已的想法,而整个项目或系统都交给AI,那么AI写出来东西,不都是抄袭现成的吗?\n它也不能自已创建出来一套新的架构或模式吧?\n2026年3月20日 14:25 | # | 引用\nmorty 说:\n服务器养殖蔬菜这不纯纯浪费电力吗?这种没脑子的文章怎么出现在这里。。。。\n2026年3月20日 14:45 | # | 引用\nLY 说:\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n—— 看起来很赛博和有趣,但是\n室内、光照、隐蔽性\n这玩意儿更适合种的是某种加麻大特产\n2026年3月20日 14:47 | # | 引用\nDylan Yu 说:\n访达小子好像弗兰肯斯坦\n2026年3月20日 15:15 | # | 引用\nXZY 说:\n未来面试方也更加依赖AI,反正都是黑盒,都交由AI来判断啦。\n又或者是多开几个agent,减少程序员的需求。\n2026年3月20日 15:59 | # | 引用\nLeon 说:\n关于程序员面试问什么问题,我觉得除了考察 AI 的熟练度,还要考察对方的计算机基础、数据结构算法、设计模式,这些东西永远都不过时,如果时间充裕,可以给个课题,让对方现场用 ai 工具实现,看看效果如何\n2026年3月20日 16:34 | # | 引用\nh29 说:\n定制化框架可以理解为固化一些内部共识,但是也要能跟得上行业发展才行。\n2026年3月20日 16:58 | # | 引用\n求面试 说:\n对于程序员来说结构化表达越来越重要, 这包括能清晰的描述需求, 把需求讲解的编程Agent能充分理解, 清晰的表达技术要求, 需要作者有技术功底, 让大模型Agent理解设计质量, 避免写出一堆屎山代码。\n2026年3月20日 21:54 | # | 引用\nhttps://yijinlee.com李奕锦 说:\n未来的超级个体,是一个程序员带着一群 AI 助手,交付一支团队的产能。\n面试桌上,请放下笔试题,打开电脑,让他展示那些真正用 AI 辅助落地的项目。能把 AI 当作武器去攻城略地的实战派,才是 AI 时代真正稀缺的将才。\n2026年3月22日 10:38 | # | 引用\n徐晖 说:\n这一期质量很高,今后可以多转载些来自其它博客的文章\n2026年3月22日 10:39 | # | 引用\n阿楚 说:\n巴尔贝加尔水磨坊,近2000年还能保存这么多砖石?还是说后人修缮后的现状?\n2026年3月22日 12:16 | # | 引用\n勇者 StartUp 说:\n我来面试,会加上二分查找、冒牌排序的手写编码,难道一个程序员写不出排序和查找?\n2026年3月22日 21:31 | # | 引用\nwuqi 说:\n其实ai没那么全能,还有个问题,烧token是要钱的,有经验的至少知道怎么烧,你可以试试直接让产品烧token,看能不能烧出来正确的结果,ai一般是不会拒绝错误提议和方案的,正经程序员会考虑程序规模和布设成本,ai并不会管那么多...\n一个傻逼领导或者产品可是真的能提出来我们要做一个淘宝,ai也真的能附和这个傻逼\n2026年3月23日 08:45 | # | 引用\nSiu 说:\n我應徵過多次就只有一次是現場寫程序的。可能本港公司都不會現場考人。誰有這時間。\n2026年3月24日 12:47 | # | 引用", - "quality_flags": { - "is_paywalled": false, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 6599 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。", - "highlights": [ - "未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。", - "面试问题需要考察将复杂需求转化为清晰提示词的能力。", - "AI编程时代,对系统架构知识和项目分解能力的要求依然重要。", - "传统的编程语法细节考察在AI辅助下意义可能减弱。", - "文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。" - ], - "keywords": [ - "AI编程", - "程序员招聘", - "面试问题", - "提示词工程", - "Skill", - "MCP", - "多Agent协同", - "系统架构" - ], - "topics": [ - "人工智能", - "软件开发", - "职业发展", - "技术趋势", - "人才评估" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。" - }, - "filter_decision": { - "decision": "review", - "matched_rules": [ - "review-worth-keeping-other" - ], - "reasons": [ - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "summary" - ], - "priority": 60, - "matches": [ - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 60, - "review_state": "pending", - "source_refs": { - "raw_item_path": "outputs\\freshrss\\items\\batch\\item-02.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-02.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-02\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-02.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T08:48:43.003811Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-084843" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json deleted file mode 100644 index e7e39a8..0000000 --- a/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", - "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", - "published_at": "2026-03-19T23:59:16Z", - "author": "阮一峰", - "source_name": "阮一峰的网络日志", - "language": null, - "summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。", - "highlights": [ - "未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。", - "面试问题需要考察将复杂需求转化为清晰提示词的能力。", - "AI编程时代,对系统架构知识和项目分解能力的要求依然重要。", - "传统的编程语法细节考察在AI辅助下意义可能减弱。", - "文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。" - ], - "keywords": [ - "AI编程", - "程序员招聘", - "面试问题", - "提示词工程", - "Skill", - "MCP", - "多Agent协同", - "系统架构" - ], - "topics": [ - "人工智能", - "软件开发", - "职业发展", - "技术趋势", - "人才评估" - ], - "category": "观点评论", - "worth_keeping": true, - "worth_reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。", - "selection_decision": "review", - "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "digest_section_hint": null, - "digest_rank": 60 -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json deleted file mode 100644 index 9f553e5..0000000 --- a/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "item": { - "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db", - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "author": "阮一峰", - "published_at": "2026-03-12T23:59:16Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

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

\n\n

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

\n\n

封面图

\n\n

\"\"

\n\n

重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)

\n\n

测试是新的护城河

\n\n

Next.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。

\n\n

\"\"

\n\n

两周前,这个框架被一则新闻颠覆了。

\n\n

一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。

\n\n

\"\"

\n\n

事实上,一天就生成产品原型了,后面几天只是在完善。

\n\n
\n

\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。

\n\n

接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"

\n
\n\n

这个新的实现,比原版 Next.js 性能更好。

\n\n
\n

\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"

\n
\n\n

这个 vinext 的代码已经放出来了。

\n\n

\"\"

\n\n

我觉得,这件事对 Next.js 的打击非常大。

\n\n

Next.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。

\n\n

这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。

\n\n

你知道花了多少钱?Token 费用仅仅为 1100 美元!

\n\n

这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。

\n\n

推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。

\n\n

那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。

\n\n

怎么防呢?关键就是测试用例。

\n\n

Cloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。

\n\n

如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。

\n\n

可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。

\n\n

\"\"

\n\n

世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!

\n\n

其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。

\n\n

无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。

\n\n

\"\"

\n\n

说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。

\n\n

AI 复刻的版权问题

\n\n

AI 复刻软件还有一个版权问题,也引起了很大争议。

\n\n

\"\"

\n\n

Next.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。

\n\n

chardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。

\n\n

网上的意见也分成了两派。

\n\n

支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。

\n\n

反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。

\n\n

更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。

\n\n

按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。

\n\n

科技动态

\n\n

1、AI 改写脏话

\n\n

游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。

\n\n

\"\"

\n\n

以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。

\n\n

现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。

\n\n

虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。

\n\n

2、飞机的激光上网

\n\n

欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。

\n\n

\"\"

\n\n

飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。

\n\n

\"\"

\n\n

上图就是安装在飞机舷窗上的激光终端。

\n\n

激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。

\n\n

缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。

\n\n

3、Grammarly 的专家意见

\n\n

Grammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。

\n\n

\"\"

\n\n

一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。

\n\n

\"\"

\n\n

原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。

\n\n

这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?

\n\n

4、太阳能邮筒

\n\n

网络通信普及以后,传统的邮筒怎么办?

\n\n

英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。

\n\n

\"\"

\n\n

邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。

\n\n

\"\"

\n\n

这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。

\n\n

\"\"

\n\n

文章

\n\n

1、GitHub Issue 标题的注入攻击(英文)

\n\n

\"\"

\n\n

这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。

\n\n

2、重新评估 AGENTS.md(英文)

\n\n

\"\"

\n\n

最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。

\n\n

它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。

\n\n

3、Temporal API 的九年历程(英文)

\n\n

\"\"

\n\n

本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。

\n\n

4、AI 的胡说测试(英文)

\n\n

\"\"

\n\n

国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。

\n\n

5、原生 CSS 就足够了(英文)

\n\n

\"\"

\n\n

本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。

\n\n

6、粪便物理学(英文)

\n\n

\"\"

\n\n

一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。

\n\n

工具

\n\n

1、KULA

\n\n

\"\"

\n\n

Linux 服务器的监控工具,只有一个二进制文件。

\n\n

2、AnsiSaver

\n\n

\"\"

\n\n

mac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。

\n\n

3、upiano

\n\n

\"\"

\n\n

在命令行下模拟钢琴弹奏。

\n\n

4、WSL Distro Manager

\n\n

\"\"

\n\n

一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。

\n\n

5、Mole

\n\n

\"\"

\n\n

开源的 Mac 电脑清理和优化工具。

\n\n

6、PipeGate

\n\n

一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。

\n\n

7、HookListener

\n\n

\"\"

\n\n

一个管理、测试 Webhook 的在线工具,个人可以免费使用。

\n\n

8、Sentinel

\n\n

\"\"

\n\n

将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)

\n\n

9、Flux Monitor

\n\n

\"\"

\n\n

Mac 电脑的系统监控、管理面板。(@chentao1006 投稿)

\n\n

AI 相关

\n\n

1、Agentic Metric

\n\n

\"\"

\n\n

一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)

\n\n

2、cc-connect

\n\n

\"\"

\n\n

一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)

\n\n

3、Page Agent

\n\n

\"\"

\n\n

只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。

\n\n

4、Agent Safehouse

\n\n

一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。

\n\n

5、Repo Tokens

\n\n

\"\"

\n\n

一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。

\n\n

资源

\n\n

1、世界监控(World Monitor)

\n\n

\"\"

\n\n

世界局势的一个实时看板,把各种消息源都放在一个网页里。

\n\n

2、炼油厂探索

\n\n

\"\"

\n\n

一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。

\n\n

3、Mechanical Pencil

\n\n

\"\"

\n\n

弹簧笔、打火机等生活小物品的机械装置动画。

\n\n

图片

\n\n

1、密码的替代方法

\n\n

一位程序员发明了一种新的密码方法,你觉得可行吗?

\n\n

系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。

\n\n

\"\"

\n\n

下次登录时,用户必须按同样顺序挑出同样的5张牌。

\n\n

文摘

\n\n

1、复杂社会的崩溃

\n\n

我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。

\n\n

美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。

\n\n

\"\"

\n\n

1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?

\n\n

他认为,原因是这些社会有一个敌人----复杂性。

\n\n

随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。

\n\n

一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。

\n\n

(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。

\n\n

(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。

\n\n

(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。

\n\n

(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。

\n\n

以上因素的共同作用,导致历史上很多强大的社会最终崩溃。

\n\n

言论

\n\n

1、

\n\n

2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。

\n\n

2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。

\n\n

-- 《我不知道十年后我的工作是否还存在》

\n\n

2、

\n\n

与强大的 AI 对抗会是什么感觉?

\n\n

你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。

\n\n

这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。

\n\n

-- probablydance.com

\n\n

3、

\n\n

阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。

\n\n

这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。

\n\n

-- 《阅读商战书籍是浪费时间》

\n\n

4、

\n\n

我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。

\n\n

-- Simon Willison,著名开发者

\n\n

5、

\n\n

时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。

\n\n

-- 《不要太看重 AI 大模型的订阅费》

\n\n

往年回顾

\n\n

低代码编程,恐怕不会成功(#341)

\n\n

AI 没有护城河(#291)

\n\n

中国的增长动力在内陆(#241)

\n\n

一个程序员的财务独立之路(#191)

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月13日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Weekly" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1773359956 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:fdc9230d42ec24f867f94f3198960e8104f633fb8ab532645b384baf1df6b369", - "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "author": "阮一峰", - "published_at": "2026-03-12T23:59:16Z", - "language": null, - "content_kind": "article", - "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)\n测试是新的护城河\nNext.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。\n两周前,这个框架被一则新闻颠覆了。\n一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。\n事实上,一天就生成产品原型了,后面几天只是在完善。\n\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。\n接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"\n这个新的实现,比原版 Next.js 性能更好。\n\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"\n这个 vinext 的代码已经放出来了。\n我觉得,这件事对 Next.js 的打击非常大。\nNext.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。\n这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。\n你知道花了多少钱?Token 费用仅仅为 1100 美元!\n这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。\n推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。\n那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。\n怎么防呢?关键就是测试用例。\nCloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。\n如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。\n可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。\n世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!\n其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。\n无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。\n说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。\nAI 复刻的版权问题\nAI 复刻软件还有一个版权问题,也引起了很大争议。\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。\n网上的意见也分成了两派。\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。\n科技动态\n1、AI 改写脏话\n游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####\n,你还是知道他在骂人。\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。\n2、飞机的激光上网\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。\n上图就是安装在飞机舷窗上的激光终端。\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?\n4、太阳能邮筒\n网络通信普及以后,传统的邮筒怎么办?\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。\n文章\n1、GitHub Issue 标题的注入攻击(英文)\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。\n2、重新评估 AGENTS.md(英文)\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。\n3、Temporal API 的九年历程(英文)\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。\n4、AI 的胡说测试(英文)\n国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。\n5、原生 CSS 就足够了(英文)\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。\n6、粪便物理学(英文)\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。\n工具\n1、KULA\nLinux 服务器的监控工具,只有一个二进制文件。\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。\n3、upiano\n在命令行下模拟钢琴弹奏。\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。\n5、Mole\n开源的 Mac 电脑清理和优化工具。\n6、PipeGate\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。\n8、Sentinel\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)\nAI 相关\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。\n资源\n1、世界监控(World Monitor)\n世界局势的一个实时看板,把各种消息源都放在一个网页里。\n2、炼油厂探索\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。\n弹簧笔、打火机等生活小物品的机械装置动画。\n图片\n1、密码的替代方法\n一位程序员发明了一种新的密码方法,你觉得可行吗?\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。\n下次登录时,用户必须按同样顺序挑出同样的5张牌。\n文摘\n1、复杂社会的崩溃\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?\n他认为,原因是这些社会有一个敌人----复杂性。\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。\n言论\n1、\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。\n2、\n与强大的 AI 对抗会是什么感觉?\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。\n3、\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。\n4、\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。\n-- Simon Willison,著名开发者\n5、\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。\n往年回顾\n低代码编程,恐怕不会成功(#341)\nAI 没有护城河(#291)\n中国的增长动力在内陆(#241)\n一个程序员的财务独立之路(#191)\n(完)\n一剑飘红 说:\n密码的替代方法?往期周刊好像提到有人开发过一种图像密码,就是点击图片中的某几个位置来作为密码的\n2026年3月13日 09:11 | # | 引用\ndong 说:\n我fork了一个next.js仓库,算是重新生成了一个next.js的替代品吗?\n有大公司会用AI生成的吗?\n保证没有bug吗?\n以后的升级、维护,以及支持,有人管吗?\n2026年3月13日 09:12 | # | 引用\nqiba 说:\n关于那个原生css就够了。所有的框架和构建工具最终都还是要转成原生css的,并没有在原生之外使用什么新的技术,所以不存在原生css就够了这个问题。框架和构建工具只不过是为了方便开发者,减轻部分重复的工作量\n2026年3月13日 09:18 | # | 引用\n北石 说:\n昨天公司也裁员了,现在AI的大力推广对于普通程序员来说并不是一件好事,可替代性太强\n2026年3月13日 09:52 | # | 引用\nAmaF 说:\n扑克牌密码我觉得非常不可行,5个数字好说,5个花色的顺序好难记\n2026年3月13日 10:34 | # | 引用\nF^[email protected] 说:\n在未来,AI会被政府所完全掌控,包括所有的能用到的AI领域与边界。由政府来分配AI资源。因为AI的产生与使用本身就是集整个社会资源与一体的东西。所以,这样的东西不应被任何资本或个人滥用。就像WIFI-水-电-油-粮这样的基础设施。\n只有这样,才能维持稳定的人口结构与避免陷入全球内卷的陷阱。\n当然,这时候的世界,已经很像《我们》与《美丽新世界》了。\n当我前段时间想到这样的未来时,我豁然开朗,不再焦虑。\n2026年3月13日 10:44 | # | 引用\n4cos90 说:\n重新实现? ❌\n照着开源代码优化了一版 √\n没有原版的产品原型和代码 AI 能用这么少token实现吗,光整理需求输入都费劲吧。\n2026年3月13日 11:03 | # | 引用\njiangnanboy 说:\nai的发展是码农的终结者,一声叹息\n2026年3月13日 11:09 | # | 引用\napp 说:\n为什么不能用ai生成测试用例\n2026年3月13日 11:37 | # | 引用\nid17 说:\nClinejection 那个攻击一顿操作猛如虎,最后是装 openclaw。最近付费装 openclaw 的可以装个 cline 解决一下哈哈。这是真的安装免费,付费删除了\n2026年3月13日 12:03 | # | 引用\nanny 说:\n我觉得裁员和ai没有必然的关系,无论有没有都会拆员,AI的出现会提高程序员效率是显而易见的,就像不断有新的技术和框架出现一样,你如果停滞不前被淘汰是早晚的问题。和技术没关系。\n2026年3月13日 12:49 | # | 引用\nLeo 说:\n8、Sentinel\n实际仓库名是 CCTV-Smartphone-AI-Monitoring。\n2026年3月13日 13:12 | # | 引用\nNoOne 说:\n涉及复杂的专业业务场景,这些是不公开的。\n2026年3月13日 13:52 | # | 引用\nlio 说:\nAI对于各个代码第三方包。并不进行校验,而是依赖于文字描述\nai的知识库中并没有对于人类和ai进行合作的知识。所以ai的回答并不是最优解。人类社会甚至还没发明出成熟的 “AI协作方法论”\n上下文腐烂问题。聊的越久,可能反应的越差\n自动化的程序越高,需要人力参与的进度越多,Automation Paradox(自动化悖论)自动化越高,人类越关键。并不是解决了问题,而是将问题进行转移了。\n当 AI 模型不知道某件事时,它并不总会说“I don't know.” 相反,它会基于见过的模式生成看起来最可能的内容。这几条是我整理出来的对于ai的一些心得。不知道大家是什么看法\n2026年3月13日 13:55 | # | 引用\nXZY 说:\n就像唱片普及了之后,去听音乐会的人就少了。现场听的确沉浸感更强,但是大多数人能够忍受这样的品质下降的了。\n没有test case保证的AI生成的代码,也会有那些只要短时间能上而不是那么在意品质的人喜欢用的。毕竟大部分软件都没有办法活到类似sqlite的高度的。\n2026年3月13日 14:00 | # | 引用\nBFlower 说:\nwindows 锁屏可以设这种图片密码诶\n2026年3月13日 14:03 | # | 引用\nmirakyux 说:\nwindows之前的登录方式里就有个这样的图片密码\n2026年3月13日 14:05 | # | 引用\n老牛 说:\n大概率都是:黑红梅方 LOL\n2026年3月13日 14:11 | # | 引用\nrz 说:\n我建议可以搞一个“爱泼斯坦”分身,谁赞成?谁同意?\n2026年3月13日 14:12 | # | 引用\n秋风于渭水 说:\n即使chardet 7.0开发者只给 AI 提供 chardet 的 API 文档、功能描述和测试用例,完全不给 AI 看 chardet 的底层源码。看上去 AI 真的是凭空写出了一套能通过所有测试的代码。\n但像 GPT-4、Claude、Gemini 这样的超大模型,其训练数据中极大概率已经包含了开源的 chardet 源码。当chardet 7.0的开发者要求 AI “写一个类似 chardet 的工具”时,AI 实际上可能是从它的权重记忆中“回想”并“拼凑”出了原版 LGPL 代码的逻辑或片段,而不是真正从零开始推导。如果生成的代码中带有原始 chardet 的“代码指纹”或特有的非标准逻辑,并不是真正意义上的从0开始写的,我感觉在法律上依然会被判定为衍生作品。\n2026年3月13日 14:35 | # | 引用\nxsng 说:\n不就是以前的卡密吗?\n2026年3月13日 15:00 | # | 引用\nDangGwanHOu 说:\n扑克牌密码的复杂度应该是(A_52)^5,即排列组合的A、52下标、5上标,存在52 * 51 * 50 * 49 * 48 = 311_875_200种可能,即3.11亿种。如果网站没有设置锁IP等防暴力破解的安全措施,理论上很容易被破解\n2026年3月13日 15:13 | # | 引用\nbaochuquan 说:\nAI发展至今,一切始于代码开源,程序员最终把自己的命革掉了\n2026年3月13日 15:44 | # | 引用\ntietouwa 说:\n人类成功从cmd发展出UI,现在又回到了cmd,以后人手一个AI,是不是就不需要UI了\n2026年3月13日 16:17 | # | 引用\n草梅友仁 说:\n扑克牌密码从本质上讲是52个字符选5个到排列数,甚至不能重复,粗略算了下一共就3亿多种可能性。\n字符数量其实跟只使用英文字符大小写是一样的,而通常安全的密码还会要求添加数字、特殊字符等来扩大字符范围,也会要求更长的密码来增加破解时间。\n故扑克牌密码作为一个秘密是不怎么安全的,只是看上去花哨。\n2026年3月13日 16:35 | # | 引用\nzheng 说:\n数字芯片设计,不仅RTL代码不开源,工具链还支持代码加密,可以商业IP买卖,验证代码一样,各种协议的验证代码,测试用例,都有商业化,比如synopsis。想AI化?连训练素材都拿不到,只有使用文档,有问题就人工技术支持\n2026年3月13日 16:38 | # | 引用\n云闲 说:\n“早晚”的问题对于程序员来事就是最大的问题。多工作一年多赚一年,AI的快速进步使得问题变得更严峻。虽然未来很美好,可惜现阶段人们需要工作来赚钱养家糊口。\n2026年3月13日 17:18 | # | 引用\nLance 说:\n问题是,走向这一最终图景(且是积极的结局,而非cyberpunk)的过程是很痛苦黑暗动荡的\n2026年3月13日 17:25 | # | 引用\nKsir 说:\n代码正在变得廉价,而“解决问题的逻辑”正在变得昂贵。 测试中包含了解决什么问题的细节和验证\n2026年3月13日 19:24 | # | 引用\n老鱼 说:\n你错了。你们公司并不是因为 AI 才裁员的。而是因为现在经济很不好,巨头们拿走了大多数利益并且掌控了互联网上面的多数变现渠道。你们公司因为利润过低亏损而开始裁员。AI 当然提升了效率,增加了需求和岗位,但是这些岗位又被集中到大厂去,因为只有大厂才有资源训练 AI 以及对应用场景进行试错。并且现在的大厂似乎并不愿意把生态让出来给中小厂,而是自己亲自动手做应用。因此,这次的 AI 狂潮,对于国内,几乎只是大厂们自己的狂欢。\n另外,有可能你们公司已经亏损很久了,所以用 AI 这个借口开始裁员而已。\n这就是一句名言所说的“雪崩时,没有一片雪花是无辜的。”国内经济不好时,只要身处这个环境就不可能独善其身。\n2026年3月13日 19:54 | # | 引用\n老鱼 说:\n这基本上就是做梦。这种许愿发生的可能性很低。AI 必然会被资本控制。普通人,还是准备好迎接时代大山压来吧。几乎每次工业革命都会带来战争,第一次、第二次都是。第三次信息革命带来了冷战。很快就要热战了。大家不打几仗是打不成共识的。\n2026年3月13日 19:59 | # | 引用\n明知故犯 说:\n人类目前的排便时间应该会超过这个平均数字,如果是拿着手机,时间会更久一些\n2026年3月13日 21:01 | # | 引用\nRedNax 说:\n略扯。\n先不说第一次第二次工业革命是不是“带来”了战争,第三次信息革命发生的时候都苏联解体冷战结束了,哪来战争?海湾战争也要按到信息革命上去吗?\n2026年3月14日 04:50 | # | 引用\ndg1245 说:\n过去记录密码是:脑子想一组数字字符,注册账号输入密码,然后用纸笔记录密码;\n现在是:从一副扑克牌里随机抽取几张牌,注册账号选择扑克牌作为密码,然后把抽取的扑克牌按顺序塞到信封里放到抽屉里;\n好处是:抽牌比脑子想更随机,不用费劲写字,实物存储密码比网络存储安全;\n缺点很多,不一一列举。\n2026年3月14日 12:49 | # | 引用\ndatou 说:\n《复杂社会的崩溃》-复杂性边际收益递减,我觉得AI有机会解决这个问题,类似规则太多和需要律师的事,需要使用AI工具打破,包括阶级也是。现在有些医疗种类,明目张胆地结团牟利,感觉已经形成了利益阶层,没有重大变故,难以打破。需要AI工具支持下的平权冲击。\n2026年3月14日 21:20 | # | 引用\nc0m4r 说:\n感谢您提到我的监控工具 - KULA。我邀请所有中国朋友来尝试一下!如果您有任何问题或想要提出更改建议,请在 Github 上写一个问题 - 可能会用您的语言!谢谢。\n2026年3月15日 09:13 | # | 引用\nmat 说:\n很多测试用例都是根据实际问题衍生的,这种测试用例AI没法生成\n2026年3月15日 13:31 | # | 引用\nplaster 说:\n不同的是,速度太快了。\n原来新的技术、新的框架出来,到真正大规模应用都有一个比较长的过程,在这个过程中会产生更多的需求,因此效率提高了但对人的需求不会显著降低。\n现在AI替代编程的这个速度,直接把人的岗位的替代了,而新岗位还没有产生\n2026年3月16日 12:03 | # | 引用\n光 说:\n不但不需要ui,我看高级语言也不需要,直接二进制。反正AI写的一定大概率会比人写的好,而且只要通过测试,管它代码怎么写的呢?参考AlphaGo下围棋人类看不懂之案例。\n2026年3月16日 21:42 | # | 引用\ndodo 说:\n这不就是安卓的锁屏密码嘛\n2026年3月17日 11:35 | # | 引用\nshen 说:\n1. 巨石悬索桥是怎么保证游客安全的?\n2. 英国红色邮筒,太阳能板和寄包裹有啥关系呢?\n2026年3月18日 17:52 | # | 引用\nshen 说:\n说明不相信AI\n2026年3月18日 18:03 | # | 引用\nKit Yeung 说:\n虽然测试用例可以用于复刻开源产品,但是生态还是无法复刻的。而且从用户的角度来看,其实这是好事,谁的点子多,功能好,就可以取代你,相应的会促进当前产品开发的居安思危,才能把产品做得更好,否则随时被取代。\n不然想A\\一样,面对opencode和openclaw的行为,只会增加公众对他的厌恶\n2026年3月20日 15:27 | # | 引用\n阿债 说:\n大树杜鹃那个原文,“0.25平方米内发现了40多株”,西双版纳植物所的研究员,都不看自己的稿子了,对吗?\n2026年3月20日 17:29 | # | 引用", - "quality_flags": { - "is_paywalled": true, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 10296 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "summary": "本文以 Cloudflare 工程师用 AI 在一周内复刻 Next.js 框架为例,指出 AI 使得代码的护城河不复存在。作者认为,软件公司未来将依赖保密的测试用例来防止 AI 复刻,测试成为新的竞争壁垒。", - "highlights": [ - "Cloudflare 工程师仅用一周时间和 1100 美元 Token 费用,通过 AI 成功复刻了 Next.js 框架,性能优于原版。", - "AI 能够复刻软件的关键在于开源项目提供了完备的文档、社区文章和测试用例,使得 API 兼容性得以验证。", - "为防止 AI 复刻,大型软件项目可能选择将核心测试用例闭源,如 SQLite 的 TH3 测试套件和 tldraw 的计划。", - "AI 复刻软件引发了版权争议,例如 chardet 项目的许可证更改,且美国法律认定 AI 生成物无版权,冲击现有许可证体系。", - "文章还讨论了 AI 对软件行业的多方面影响,包括提高效率、替代岗位以及可能引发的社会复杂性崩溃问题。" - ], - "keywords": [ - "Next.js", - "AI 复刻", - "测试用例", - "SQLite", - "MIT 许可证", - "Cloudflare", - "vinext", - "护城河" - ], - "topics": [ - "人工智能", - "软件开发", - "开源协议", - "技术趋势", - "行业影响" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。" - }, - "filter_result": { - "decision": "review", - "matched_rules": [ - "review-paywalled-content", - "review-worth-keeping-other" - ], - "reasons": [ - "Article may be behind a paywall.", - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "paywall", - "quality", - "summary" - ], - "priority": 95, - "matches": [ - { - "rule_id": "review-paywalled-content", - "decision": "review", - "reason": "Article may be behind a paywall.", - "labels": [ - "quality", - "paywall" - ], - "priority": 95 - }, - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 95, - "review_state": "pending", - "source_refs": { - "item_path": "outputs\\freshrss\\items\\batch\\item-03.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-03.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-03\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-03.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T10:25:49.267743Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-102549" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.article-candidate.json b/outputs/freshrss/candidates/batch/item-03.article-candidate.json deleted file mode 100644 index 890524a..0000000 --- a/outputs/freshrss/candidates/batch/item-03.article-candidate.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "item": { - "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "source_id": "freshrss:66c2d55d7563e741", - "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db", - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "author": "阮一峰", - "published_at": "2026-03-12T23:59:16Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "

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

\n\n

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

\n\n

封面图

\n\n

\"\"

\n\n

重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)

\n\n

测试是新的护城河

\n\n

Next.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。

\n\n

\"\"

\n\n

两周前,这个框架被一则新闻颠覆了。

\n\n

一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。

\n\n

\"\"

\n\n

事实上,一天就生成产品原型了,后面几天只是在完善。

\n\n
\n

\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。

\n\n

接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"

\n
\n\n

这个新的实现,比原版 Next.js 性能更好。

\n\n
\n

\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"

\n
\n\n

这个 vinext 的代码已经放出来了。

\n\n

\"\"

\n\n

我觉得,这件事对 Next.js 的打击非常大。

\n\n

Next.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。

\n\n

这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。

\n\n

你知道花了多少钱?Token 费用仅仅为 1100 美元!

\n\n

这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。

\n\n

推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。

\n\n

那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。

\n\n

怎么防呢?关键就是测试用例。

\n\n

Cloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。

\n\n

如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。

\n\n

可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。

\n\n

\"\"

\n\n

世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!

\n\n

其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。

\n\n

无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。

\n\n

\"\"

\n\n

说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。

\n\n

AI 复刻的版权问题

\n\n

AI 复刻软件还有一个版权问题,也引起了很大争议。

\n\n

\"\"

\n\n

Next.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。

\n\n

chardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。

\n\n

网上的意见也分成了两派。

\n\n

支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。

\n\n

反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。

\n\n

更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。

\n\n

按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。

\n\n

科技动态

\n\n

1、AI 改写脏话

\n\n

游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。

\n\n

\"\"

\n\n

以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。

\n\n

现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。

\n\n

虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。

\n\n

2、飞机的激光上网

\n\n

欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。

\n\n

\"\"

\n\n

飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。

\n\n

\"\"

\n\n

上图就是安装在飞机舷窗上的激光终端。

\n\n

激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。

\n\n

缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。

\n\n

3、Grammarly 的专家意见

\n\n

Grammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。

\n\n

\"\"

\n\n

一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。

\n\n

\"\"

\n\n

原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。

\n\n

这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?

\n\n

4、太阳能邮筒

\n\n

网络通信普及以后,传统的邮筒怎么办?

\n\n

英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。

\n\n

\"\"

\n\n

邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。

\n\n

\"\"

\n\n

这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。

\n\n

\"\"

\n\n

文章

\n\n

1、GitHub Issue 标题的注入攻击(英文)

\n\n

\"\"

\n\n

这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。

\n\n

2、重新评估 AGENTS.md(英文)

\n\n

\"\"

\n\n

最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。

\n\n

它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。

\n\n

3、Temporal API 的九年历程(英文)

\n\n

\"\"

\n\n

本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。

\n\n

4、AI 的胡说测试(英文)

\n\n

\"\"

\n\n

国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。

\n\n

5、原生 CSS 就足够了(英文)

\n\n

\"\"

\n\n

本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。

\n\n

6、粪便物理学(英文)

\n\n

\"\"

\n\n

一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。

\n\n

工具

\n\n

1、KULA

\n\n

\"\"

\n\n

Linux 服务器的监控工具,只有一个二进制文件。

\n\n

2、AnsiSaver

\n\n

\"\"

\n\n

mac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。

\n\n

3、upiano

\n\n

\"\"

\n\n

在命令行下模拟钢琴弹奏。

\n\n

4、WSL Distro Manager

\n\n

\"\"

\n\n

一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。

\n\n

5、Mole

\n\n

\"\"

\n\n

开源的 Mac 电脑清理和优化工具。

\n\n

6、PipeGate

\n\n

一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。

\n\n

7、HookListener

\n\n

\"\"

\n\n

一个管理、测试 Webhook 的在线工具,个人可以免费使用。

\n\n

8、Sentinel

\n\n

\"\"

\n\n

将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)

\n\n

9、Flux Monitor

\n\n

\"\"

\n\n

Mac 电脑的系统监控、管理面板。(@chentao1006 投稿)

\n\n

AI 相关

\n\n

1、Agentic Metric

\n\n

\"\"

\n\n

一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)

\n\n

2、cc-connect

\n\n

\"\"

\n\n

一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)

\n\n

3、Page Agent

\n\n

\"\"

\n\n

只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。

\n\n

4、Agent Safehouse

\n\n

一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。

\n\n

5、Repo Tokens

\n\n

\"\"

\n\n

一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。

\n\n

资源

\n\n

1、世界监控(World Monitor)

\n\n

\"\"

\n\n

世界局势的一个实时看板,把各种消息源都放在一个网页里。

\n\n

2、炼油厂探索

\n\n

\"\"

\n\n

一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。

\n\n

3、Mechanical Pencil

\n\n

\"\"

\n\n

弹簧笔、打火机等生活小物品的机械装置动画。

\n\n

图片

\n\n

1、密码的替代方法

\n\n

一位程序员发明了一种新的密码方法,你觉得可行吗?

\n\n

系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。

\n\n

\"\"

\n\n

下次登录时,用户必须按同样顺序挑出同样的5张牌。

\n\n

文摘

\n\n

1、复杂社会的崩溃

\n\n

我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。

\n\n

美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。

\n\n

\"\"

\n\n

1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?

\n\n

他认为,原因是这些社会有一个敌人----复杂性。

\n\n

随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。

\n\n

一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。

\n\n

(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。

\n\n

(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。

\n\n

(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。

\n\n

(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。

\n\n

以上因素的共同作用,导致历史上很多强大的社会最终崩溃。

\n\n

言论

\n\n

1、

\n\n

2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。

\n\n

2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。

\n\n

-- 《我不知道十年后我的工作是否还存在》

\n\n

2、

\n\n

与强大的 AI 对抗会是什么感觉?

\n\n

你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。

\n\n

这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。

\n\n

-- probablydance.com

\n\n

3、

\n\n

阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。

\n\n

这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。

\n\n

-- 《阅读商战书籍是浪费时间》

\n\n

4、

\n\n

我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。

\n\n

-- Simon Willison,著名开发者

\n\n

5、

\n\n

时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。

\n\n

-- 《不要太看重 AI 大模型的订阅费》

\n\n

往年回顾

\n\n

低代码编程,恐怕不会成功(#341)

\n\n

AI 没有护城河(#291)

\n\n

中国的增长动力在内陆(#241)

\n\n

一个程序员的财务独立之路(#191)

\n\n

(完)

\n\n

文档信息

\n
    \n
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • \n
  • 发表日期: 2026年3月13日
  • \n\n
\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/2", - "htmlUrl": "http://www.ruanyifeng.com/blog/", - "title": "阮一峰的网络日志" - }, - "categories": [ - "rss", - "user/-/state/org.freshrss/main", - "Weekly" - ], - "crawled_at": "2026-03-24T09:18:21.528000Z", - "published_epoch": 1773359956 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:fdc9230d42ec24f867f94f3198960e8104f633fb8ab532645b384baf1df6b369", - "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "source_id": "freshrss:66c2d55d7563e741", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "author": "阮一峰", - "published_at": "2026-03-12T23:59:16Z", - "language": null, - "content_kind": "article", - "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)\n测试是新的护城河\nNext.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。\n两周前,这个框架被一则新闻颠覆了。\n一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。\n事实上,一天就生成产品原型了,后面几天只是在完善。\n\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。\n接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"\n这个新的实现,比原版 Next.js 性能更好。\n\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"\n这个 vinext 的代码已经放出来了。\n我觉得,这件事对 Next.js 的打击非常大。\nNext.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。\n这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。\n你知道花了多少钱?Token 费用仅仅为 1100 美元!\n这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。\n推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。\n那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。\n怎么防呢?关键就是测试用例。\nCloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。\n如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。\n可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。\n世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!\n其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。\n无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。\n说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。\nAI 复刻的版权问题\nAI 复刻软件还有一个版权问题,也引起了很大争议。\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。\n网上的意见也分成了两派。\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。\n科技动态\n1、AI 改写脏话\n游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####\n,你还是知道他在骂人。\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。\n2、飞机的激光上网\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。\n上图就是安装在飞机舷窗上的激光终端。\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?\n4、太阳能邮筒\n网络通信普及以后,传统的邮筒怎么办?\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。\n文章\n1、GitHub Issue 标题的注入攻击(英文)\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。\n2、重新评估 AGENTS.md(英文)\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。\n3、Temporal API 的九年历程(英文)\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。\n4、AI 的胡说测试(英文)\n国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。\n5、原生 CSS 就足够了(英文)\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。\n6、粪便物理学(英文)\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。\n工具\n1、KULA\nLinux 服务器的监控工具,只有一个二进制文件。\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。\n3、upiano\n在命令行下模拟钢琴弹奏。\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。\n5、Mole\n开源的 Mac 电脑清理和优化工具。\n6、PipeGate\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。\n8、Sentinel\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)\nAI 相关\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。\n资源\n1、世界监控(World Monitor)\n世界局势的一个实时看板,把各种消息源都放在一个网页里。\n2、炼油厂探索\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。\n弹簧笔、打火机等生活小物品的机械装置动画。\n图片\n1、密码的替代方法\n一位程序员发明了一种新的密码方法,你觉得可行吗?\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。\n下次登录时,用户必须按同样顺序挑出同样的5张牌。\n文摘\n1、复杂社会的崩溃\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?\n他认为,原因是这些社会有一个敌人----复杂性。\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。\n言论\n1、\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。\n2、\n与强大的 AI 对抗会是什么感觉?\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。\n3、\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。\n4、\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。\n-- Simon Willison,著名开发者\n5、\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。\n往年回顾\n低代码编程,恐怕不会成功(#341)\nAI 没有护城河(#291)\n中国的增长动力在内陆(#241)\n一个程序员的财务独立之路(#191)\n(完)\n一剑飘红 说:\n密码的替代方法?往期周刊好像提到有人开发过一种图像密码,就是点击图片中的某几个位置来作为密码的\n2026年3月13日 09:11 | # | 引用\ndong 说:\n我fork了一个next.js仓库,算是重新生成了一个next.js的替代品吗?\n有大公司会用AI生成的吗?\n保证没有bug吗?\n以后的升级、维护,以及支持,有人管吗?\n2026年3月13日 09:12 | # | 引用\nqiba 说:\n关于那个原生css就够了。所有的框架和构建工具最终都还是要转成原生css的,并没有在原生之外使用什么新的技术,所以不存在原生css就够了这个问题。框架和构建工具只不过是为了方便开发者,减轻部分重复的工作量\n2026年3月13日 09:18 | # | 引用\n北石 说:\n昨天公司也裁员了,现在AI的大力推广对于普通程序员来说并不是一件好事,可替代性太强\n2026年3月13日 09:52 | # | 引用\nAmaF 说:\n扑克牌密码我觉得非常不可行,5个数字好说,5个花色的顺序好难记\n2026年3月13日 10:34 | # | 引用\nF^[email protected] 说:\n在未来,AI会被政府所完全掌控,包括所有的能用到的AI领域与边界。由政府来分配AI资源。因为AI的产生与使用本身就是集整个社会资源与一体的东西。所以,这样的东西不应被任何资本或个人滥用。就像WIFI-水-电-油-粮这样的基础设施。\n只有这样,才能维持稳定的人口结构与避免陷入全球内卷的陷阱。\n当然,这时候的世界,已经很像《我们》与《美丽新世界》了。\n当我前段时间想到这样的未来时,我豁然开朗,不再焦虑。\n2026年3月13日 10:44 | # | 引用\n4cos90 说:\n重新实现? ❌\n照着开源代码优化了一版 √\n没有原版的产品原型和代码 AI 能用这么少token实现吗,光整理需求输入都费劲吧。\n2026年3月13日 11:03 | # | 引用\njiangnanboy 说:\nai的发展是码农的终结者,一声叹息\n2026年3月13日 11:09 | # | 引用\napp 说:\n为什么不能用ai生成测试用例\n2026年3月13日 11:37 | # | 引用\nid17 说:\nClinejection 那个攻击一顿操作猛如虎,最后是装 openclaw。最近付费装 openclaw 的可以装个 cline 解决一下哈哈。这是真的安装免费,付费删除了\n2026年3月13日 12:03 | # | 引用\nanny 说:\n我觉得裁员和ai没有必然的关系,无论有没有都会拆员,AI的出现会提高程序员效率是显而易见的,就像不断有新的技术和框架出现一样,你如果停滞不前被淘汰是早晚的问题。和技术没关系。\n2026年3月13日 12:49 | # | 引用\nLeo 说:\n8、Sentinel\n实际仓库名是 CCTV-Smartphone-AI-Monitoring。\n2026年3月13日 13:12 | # | 引用\nNoOne 说:\n涉及复杂的专业业务场景,这些是不公开的。\n2026年3月13日 13:52 | # | 引用\nlio 说:\nAI对于各个代码第三方包。并不进行校验,而是依赖于文字描述\nai的知识库中并没有对于人类和ai进行合作的知识。所以ai的回答并不是最优解。人类社会甚至还没发明出成熟的 “AI协作方法论”\n上下文腐烂问题。聊的越久,可能反应的越差\n自动化的程序越高,需要人力参与的进度越多,Automation Paradox(自动化悖论)自动化越高,人类越关键。并不是解决了问题,而是将问题进行转移了。\n当 AI 模型不知道某件事时,它并不总会说“I don't know.” 相反,它会基于见过的模式生成看起来最可能的内容。这几条是我整理出来的对于ai的一些心得。不知道大家是什么看法\n2026年3月13日 13:55 | # | 引用\nXZY 说:\n就像唱片普及了之后,去听音乐会的人就少了。现场听的确沉浸感更强,但是大多数人能够忍受这样的品质下降的了。\n没有test case保证的AI生成的代码,也会有那些只要短时间能上而不是那么在意品质的人喜欢用的。毕竟大部分软件都没有办法活到类似sqlite的高度的。\n2026年3月13日 14:00 | # | 引用\nBFlower 说:\nwindows 锁屏可以设这种图片密码诶\n2026年3月13日 14:03 | # | 引用\nmirakyux 说:\nwindows之前的登录方式里就有个这样的图片密码\n2026年3月13日 14:05 | # | 引用\n老牛 说:\n大概率都是:黑红梅方 LOL\n2026年3月13日 14:11 | # | 引用\nrz 说:\n我建议可以搞一个“爱泼斯坦”分身,谁赞成?谁同意?\n2026年3月13日 14:12 | # | 引用\n秋风于渭水 说:\n即使chardet 7.0开发者只给 AI 提供 chardet 的 API 文档、功能描述和测试用例,完全不给 AI 看 chardet 的底层源码。看上去 AI 真的是凭空写出了一套能通过所有测试的代码。\n但像 GPT-4、Claude、Gemini 这样的超大模型,其训练数据中极大概率已经包含了开源的 chardet 源码。当chardet 7.0的开发者要求 AI “写一个类似 chardet 的工具”时,AI 实际上可能是从它的权重记忆中“回想”并“拼凑”出了原版 LGPL 代码的逻辑或片段,而不是真正从零开始推导。如果生成的代码中带有原始 chardet 的“代码指纹”或特有的非标准逻辑,并不是真正意义上的从0开始写的,我感觉在法律上依然会被判定为衍生作品。\n2026年3月13日 14:35 | # | 引用\nxsng 说:\n不就是以前的卡密吗?\n2026年3月13日 15:00 | # | 引用\nDangGwanHOu 说:\n扑克牌密码的复杂度应该是(A_52)^5,即排列组合的A、52下标、5上标,存在52 * 51 * 50 * 49 * 48 = 311_875_200种可能,即3.11亿种。如果网站没有设置锁IP等防暴力破解的安全措施,理论上很容易被破解\n2026年3月13日 15:13 | # | 引用\nbaochuquan 说:\nAI发展至今,一切始于代码开源,程序员最终把自己的命革掉了\n2026年3月13日 15:44 | # | 引用\ntietouwa 说:\n人类成功从cmd发展出UI,现在又回到了cmd,以后人手一个AI,是不是就不需要UI了\n2026年3月13日 16:17 | # | 引用\n草梅友仁 说:\n扑克牌密码从本质上讲是52个字符选5个到排列数,甚至不能重复,粗略算了下一共就3亿多种可能性。\n字符数量其实跟只使用英文字符大小写是一样的,而通常安全的密码还会要求添加数字、特殊字符等来扩大字符范围,也会要求更长的密码来增加破解时间。\n故扑克牌密码作为一个秘密是不怎么安全的,只是看上去花哨。\n2026年3月13日 16:35 | # | 引用\nzheng 说:\n数字芯片设计,不仅RTL代码不开源,工具链还支持代码加密,可以商业IP买卖,验证代码一样,各种协议的验证代码,测试用例,都有商业化,比如synopsis。想AI化?连训练素材都拿不到,只有使用文档,有问题就人工技术支持\n2026年3月13日 16:38 | # | 引用\n云闲 说:\n“早晚”的问题对于程序员来事就是最大的问题。多工作一年多赚一年,AI的快速进步使得问题变得更严峻。虽然未来很美好,可惜现阶段人们需要工作来赚钱养家糊口。\n2026年3月13日 17:18 | # | 引用\nLance 说:\n问题是,走向这一最终图景(且是积极的结局,而非cyberpunk)的过程是很痛苦黑暗动荡的\n2026年3月13日 17:25 | # | 引用\nKsir 说:\n代码正在变得廉价,而“解决问题的逻辑”正在变得昂贵。 测试中包含了解决什么问题的细节和验证\n2026年3月13日 19:24 | # | 引用\n老鱼 说:\n你错了。你们公司并不是因为 AI 才裁员的。而是因为现在经济很不好,巨头们拿走了大多数利益并且掌控了互联网上面的多数变现渠道。你们公司因为利润过低亏损而开始裁员。AI 当然提升了效率,增加了需求和岗位,但是这些岗位又被集中到大厂去,因为只有大厂才有资源训练 AI 以及对应用场景进行试错。并且现在的大厂似乎并不愿意把生态让出来给中小厂,而是自己亲自动手做应用。因此,这次的 AI 狂潮,对于国内,几乎只是大厂们自己的狂欢。\n另外,有可能你们公司已经亏损很久了,所以用 AI 这个借口开始裁员而已。\n这就是一句名言所说的“雪崩时,没有一片雪花是无辜的。”国内经济不好时,只要身处这个环境就不可能独善其身。\n2026年3月13日 19:54 | # | 引用\n老鱼 说:\n这基本上就是做梦。这种许愿发生的可能性很低。AI 必然会被资本控制。普通人,还是准备好迎接时代大山压来吧。几乎每次工业革命都会带来战争,第一次、第二次都是。第三次信息革命带来了冷战。很快就要热战了。大家不打几仗是打不成共识的。\n2026年3月13日 19:59 | # | 引用\n明知故犯 说:\n人类目前的排便时间应该会超过这个平均数字,如果是拿着手机,时间会更久一些\n2026年3月13日 21:01 | # | 引用\nRedNax 说:\n略扯。\n先不说第一次第二次工业革命是不是“带来”了战争,第三次信息革命发生的时候都苏联解体冷战结束了,哪来战争?海湾战争也要按到信息革命上去吗?\n2026年3月14日 04:50 | # | 引用\ndg1245 说:\n过去记录密码是:脑子想一组数字字符,注册账号输入密码,然后用纸笔记录密码;\n现在是:从一副扑克牌里随机抽取几张牌,注册账号选择扑克牌作为密码,然后把抽取的扑克牌按顺序塞到信封里放到抽屉里;\n好处是:抽牌比脑子想更随机,不用费劲写字,实物存储密码比网络存储安全;\n缺点很多,不一一列举。\n2026年3月14日 12:49 | # | 引用\ndatou 说:\n《复杂社会的崩溃》-复杂性边际收益递减,我觉得AI有机会解决这个问题,类似规则太多和需要律师的事,需要使用AI工具打破,包括阶级也是。现在有些医疗种类,明目张胆地结团牟利,感觉已经形成了利益阶层,没有重大变故,难以打破。需要AI工具支持下的平权冲击。\n2026年3月14日 21:20 | # | 引用\nc0m4r 说:\n感谢您提到我的监控工具 - KULA。我邀请所有中国朋友来尝试一下!如果您有任何问题或想要提出更改建议,请在 Github 上写一个问题 - 可能会用您的语言!谢谢。\n2026年3月15日 09:13 | # | 引用\nmat 说:\n很多测试用例都是根据实际问题衍生的,这种测试用例AI没法生成\n2026年3月15日 13:31 | # | 引用\nplaster 说:\n不同的是,速度太快了。\n原来新的技术、新的框架出来,到真正大规模应用都有一个比较长的过程,在这个过程中会产生更多的需求,因此效率提高了但对人的需求不会显著降低。\n现在AI替代编程的这个速度,直接把人的岗位的替代了,而新岗位还没有产生\n2026年3月16日 12:03 | # | 引用\n光 说:\n不但不需要ui,我看高级语言也不需要,直接二进制。反正AI写的一定大概率会比人写的好,而且只要通过测试,管它代码怎么写的呢?参考AlphaGo下围棋人类看不懂之案例。\n2026年3月16日 21:42 | # | 引用\ndodo 说:\n这不就是安卓的锁屏密码嘛\n2026年3月17日 11:35 | # | 引用\nshen 说:\n1. 巨石悬索桥是怎么保证游客安全的?\n2. 英国红色邮筒,太阳能板和寄包裹有啥关系呢?\n2026年3月18日 17:52 | # | 引用\nshen 说:\n说明不相信AI\n2026年3月18日 18:03 | # | 引用\nKit Yeung 说:\n虽然测试用例可以用于复刻开源产品,但是生态还是无法复刻的。而且从用户的角度来看,其实这是好事,谁的点子多,功能好,就可以取代你,相应的会促进当前产品开发的居安思危,才能把产品做得更好,否则随时被取代。\n不然想A\\一样,面对opencode和openclaw的行为,只会增加公众对他的厌恶\n2026年3月20日 15:27 | # | 引用\n阿债 说:\n大树杜鹃那个原文,“0.25平方米内发现了40多株”,西双版纳植物所的研究员,都不看自己的稿子了,对吗?\n2026年3月20日 17:29 | # | 引用", - "quality_flags": { - "is_paywalled": true, - "is_truncated": false, - "is_low_content": false - }, - "metadata": { - "content_source": "fetched_html", - "extractor": "trafilatura", - "char_count": 10296 - }, - "pipeline_state": "extracted" - }, - "summary": { - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "summary": "本文以 Cloudflare 工程师用 AI 在一周内复刻 Next.js 框架为例,指出 AI 使得代码的护城河不复存在。作者认为,软件公司未来将依赖保密的测试用例来防止 AI 复刻,测试成为新的竞争壁垒。", - "highlights": [ - "Cloudflare 工程师仅用一周时间和 1100 美元 Token 费用,通过 AI 成功复刻了 Next.js 框架,性能优于原版。", - "AI 能够复刻软件的关键在于开源项目提供了完备的文档、社区文章和测试用例,使得 API 兼容性得以验证。", - "为防止 AI 复刻,大型软件项目可能选择将核心测试用例闭源,如 SQLite 的 TH3 测试套件和 tldraw 的计划。", - "AI 复刻软件引发了版权争议,例如 chardet 项目的许可证更改,且美国法律认定 AI 生成物无版权,冲击现有许可证体系。", - "文章还讨论了 AI 对软件行业的多方面影响,包括提高效率、替代岗位以及可能引发的社会复杂性崩溃问题。" - ], - "keywords": [ - "Next.js", - "AI 复刻", - "测试用例", - "SQLite", - "MIT 许可证", - "Cloudflare", - "vinext", - "护城河" - ], - "topics": [ - "人工智能", - "软件开发", - "开源协议", - "技术趋势", - "行业影响" - ], - "category": "观点评论", - "worth_keeping": true, - "reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。" - }, - "filter_decision": { - "decision": "review", - "matched_rules": [ - "review-paywalled-content", - "review-worth-keeping-other" - ], - "reasons": [ - "Article may be behind a paywall.", - "Worth-keeping signal is positive but no stronger keep rule matched." - ], - "labels": [ - "needs-review", - "paywall", - "quality", - "summary" - ], - "priority": 95, - "matches": [ - { - "rule_id": "review-paywalled-content", - "decision": "review", - "reason": "Article may be behind a paywall.", - "labels": [ - "quality", - "paywall" - ], - "priority": 95 - }, - { - "rule_id": "review-worth-keeping-other", - "decision": "review", - "reason": "Worth-keeping signal is positive but no stronger keep rule matched.", - "labels": [ - "summary", - "needs-review" - ], - "priority": 60 - } - ] - }, - "digest_section_hint": null, - "digest_rank": 95, - "review_state": "pending", - "source_refs": { - "raw_item_path": "outputs\\freshrss\\items\\batch\\item-03.item.json", - "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-03.extracted.json", - "summary_path": "outputs\\freshrss\\summary\\batch\\item-03\\result.loop.json", - "filter_path": "outputs\\freshrss\\filter\\batch\\item-03.filter.json" - }, - "rendered_markdown": null, - "metadata": { - "generated_at": "2026-03-25T08:48:44.069174Z", - "pipeline_version": "v1", - "producer": "run_article_candidate.py", - "run_id": "candidate-20260325-084844" - } -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json deleted file mode 100644 index 9dcc4ce..0000000 --- a/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", - "title": "科技爱好者周刊(第 388 期):测试是新的护城河", - "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", - "published_at": "2026-03-12T23:59:16Z", - "author": "阮一峰", - "source_name": "阮一峰的网络日志", - "language": null, - "summary": "本文以 Cloudflare 工程师用 AI 在一周内复刻 Next.js 框架为例,指出 AI 使得代码的护城河不复存在。作者认为,软件公司未来将依赖保密的测试用例来防止 AI 复刻,测试成为新的竞争壁垒。", - "highlights": [ - "Cloudflare 工程师仅用一周时间和 1100 美元 Token 费用,通过 AI 成功复刻了 Next.js 框架,性能优于原版。", - "AI 能够复刻软件的关键在于开源项目提供了完备的文档、社区文章和测试用例,使得 API 兼容性得以验证。", - "为防止 AI 复刻,大型软件项目可能选择将核心测试用例闭源,如 SQLite 的 TH3 测试套件和 tldraw 的计划。", - "AI 复刻软件引发了版权争议,例如 chardet 项目的许可证更改,且美国法律认定 AI 生成物无版权,冲击现有许可证体系。", - "文章还讨论了 AI 对软件行业的多方面影响,包括提高效率、替代岗位以及可能引发的社会复杂性崩溃问题。" - ], - "keywords": [ - "Next.js", - "AI 复刻", - "测试用例", - "SQLite", - "MIT 许可证", - "Cloudflare", - "vinext", - "护城河" - ], - "topics": [ - "人工智能", - "软件开发", - "开源协议", - "技术趋势", - "行业影响" - ], - "category": "观点评论", - "worth_keeping": true, - "worth_reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。", - "selection_decision": "review", - "selection_reason": "Article may be behind a paywall.", - "digest_section_hint": null, - "digest_rank": 95 -} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json deleted file mode 100644 index b16988a..0000000 --- a/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103", - "item": { - "item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103", - "source_id": "freshrss:2987af960359c5c0", - "external_id": "tag:google.com,2005:reader/item/00064dc18f09d916", - "title": "FreshRSS 1.28.1", - "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1", - "author": "Alkarex", - "published_at": "2026-01-25T18:20:16Z", - "discovered_at": "2026-03-25T08:40:22.917124Z", - "content_kind": "article", - "language": null, - "raw_summary": "\n

This is a release focussing on bug fixing, in particular regressions from the release 1.28.0.

\n

Selected new features ✨:

\n
    \n
  • New customisable message for closed registrations
  • \n
  • Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy
  • \n
\n

Improved performance 🏎️:

\n
    \n
  • Disable counting articles in user labels for Ajax requests (unused)
  • \n
\n

Many bug fixes 🐛

\n

This release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.

\n

Full changelog:

\n
    \n
  • Features\n
      \n
    • Handle Web scraping of text/plain as <pre class=\"text-plain\"> #8340
    • \n
    • New customisable message for closed registrations #8462
    • \n
    \n
  • \n
  • Bug fixing\n
      \n
    • Fix unwanted expansion of user queries (saved searches) applied to filters #8395
    • \n
    • Fix encoding of filter actions for labels #8368
    • \n
    • Fix searching of tags #8425
    • \n
    • Fix refreshing feeds with token while anonymous refresh is disabled #8371
    • \n
    • Fix RSS and OPML access by token #8434
    • \n
    • Fix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427
    • \n
    • Fix regression with MySQL/MariaDB index hint #8460
    • \n
    • Auto-add lastUserModified database column also during mark-as-read action #8346
    • \n
    • Do not include hidden feeds when counting unread articles in categories #8357
    • \n
    • Remove wrong PHP deprecation of OPML export action #8399
    • \n
    • Fix shortcut for next unread article #8466
    • \n
    • Fix custom session.cookie-lifetime #8446
    • \n
    • Fix feed validator button when changing the feed URL #8436
    • \n
    \n
  • \n
  • Performance\n
      \n
    • Disable counting articles in user labels for Ajax requests (unused) #8352
    • \n
    \n
  • \n
  • Security\n
      \n
    • Change Content-Disposition: inline to attachment in f.php #8344
    • \n
    • Hardened user methods exists, mtime, ctime #26c1102
    • \n
    \n
  • \n
  • Deployment\n
      \n
    • Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392
    • \n
    \n
  • \n
  • SimplePie\n\n
  • \n
  • Extensions\n
      \n
    • Update .gitignore to ignore installed extensions #8372
    • \n
    \n
  • \n
  • UI\n
      \n
    • Add data-category=\"3\" to ease custom CSS styling of articles #8397
    • \n
    • Fix space between By: and the author’s name #8422
    • \n
    \n
  • \n
  • I18n\n
      \n
    • Improve Brazilian Portuguese #8411
    • \n
    • Improve Dutch #8403
    • \n
    • Improve German #8402
    • \n
    • Improve Polish #8408
    • \n
    • Improve Spanish #8464
    • \n
    \n
  • \n
  • Misc.\n\n
  • \n
\n\t

\n\t\t\"\"\n\t

\n
", - "raw_content": null, - "metadata": { - "upstream": "freshrss", - "origin": { - "streamId": "feed/1", - "htmlUrl": "https://github.com/FreshRSS/FreshRSS/", - "title": "FreshRSS releases" - }, - "categories": [ - "未分类", - "user/-/state/org.freshrss/main" - ], - "crawled_at": "2026-03-24T09:13:04.078000Z", - "published_epoch": 1769365216 - }, - "fetch_state": "pending" - }, - "article": { - "extract_id": "sha256:169f2b50eec3d198df126a8daedb95c48cff252ead9d4d2598a449e128cae2b8", - "item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103", - "source_id": "freshrss:2987af960359c5c0", - "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1", - "title": "FreshRSS 1.28.1", - "author": "Alkarex", - "published_at": "2026-01-25T18:20:16Z", - "language": null, - "content_kind": "article", - "plain_text": "Alkarex\nreleased this\n25 Jan 18:20\n·\n78 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n