AI 时代,为什么“选择无聊的技术”又成了高级工程判断

2026-08-17 31 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

技术圈最近重新讨论一篇 2015 年的文章:《Choose Boring Technology》。它的观点并不复杂:一家公司的创新预算很有限,每引入一种新技术,就等于消耗一部分“创新积分”。当这些积分被用完,团队就必须面对学习成本、故障排查、招聘困难和长期维护等现实账单。

这套判断在 AI 时代重新变得重要,是因为今天的新工具更多了:新的模型、新的 Agent 框架、新的向量数据库、新的编排平台,以及各种看起来可以立刻改变开发方式的产品。真正困难的问题不是“有没有更先进的技术”,而是“这个系统是否值得承担额外的不确定性”。

“无聊”不是落后,而是可预测

这里的“无聊”并不是拒绝新技术,也不是坚持使用过时的工具。它更接近工程上的“可预测”:

  • 团队已经知道它怎样部署、监控和升级。
  • 出现故障时,有成熟的排查路径。
  • 招聘和交接不会依赖少数专家。
  • 社区、文档和第三方工具足够丰富。
  • 技术的行为边界已经被大量真实项目验证。

例如,一个团队已经熟悉 PostgreSQL,那么给普通业务增加一个新的数据库,应该回答的就不只是“它是否在某个基准测试中更快”,还包括:谁来维护?备份怎么做?权限怎么管?迁移如何回滚?本地开发是否一致?

“无聊技术”的价值,往往不在演示当天体现,而是在两年后的凌晨故障、人员变动和业务重构中体现。

创新积分应该花在真正改变结果的地方

“每家公司只有大约三个创新积分”可以理解为一种决策模型,而不是精确的数字。它提醒团队:创新不是免费的,技术选择会产生叠加风险。

一个项目同时采用全新的语言、全新的数据库和全新的部署平台,单独看每项选择都可能合理,但组合起来就会产生乘法效应:

总复杂度 ≈ 业务复杂度 × 技术不确定性 × 团队陌生度

因此,创新积分应该优先花在真正能够改变产品结果的地方。例如:

  • 新技术是产品核心能力,而不是开发者个人偏好。
  • 现有方案已经明确无法满足关键约束。
  • 预期收益足以覆盖学习、迁移和运维成本。
  • 团队有能力把实验限制在可回滚的范围内。

如果某项技术只是让架构图更时髦,却没有改善延迟、可靠性、成本或交付速度,那么它很可能不值得消耗积分。

AI 项目更需要“无聊的外围”

AI 系统确实带来了新的技术问题:模型调用具有概率性,输出需要评估,提示词会变化,成本会波动,数据安全边界也更加复杂。正因为核心部分已经足够不稳定,外围系统更应该尽量成熟。

一个可实践的组合是:

  • 使用成熟的 Web 框架承载 API。
  • 使用熟悉的关系型数据库保存用户、任务和审计记录。
  • 使用普通队列处理长时间运行的模型任务。
  • 把模型、提示词和检索策略封装在清晰的适配层后面。
  • 为每次调用记录模型版本、输入摘要、耗时、token 用量和结果状态。

下面是一个最小的 Python 示例。它没有依赖特定的 Agent 框架,而是把模型调用放在一个可以替换的函数后面。实际接入供应商 SDK 时,只需要改造 call_model,业务层仍然保持稳定。

运行前安装依赖:

python -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn
uvicorn app:app --reload

保存为 app.py

from typing import Any

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()


class AskRequest(BaseModel):
    question: str


def call_model(question: str) -> dict[str, Any]:
    """Replace this function with a provider SDK or internal model gateway."""
    if not question.strip():
        raise ValueError("question must not be empty")

    # Keep the provider-specific code behind this boundary.
    return {
        "answer": f"A model would answer this question: {question}",
        "model": "demo-model",
        "usage": {"input_tokens": 0, "output_tokens": 0},
    }


@app.post("/ask")
def ask(request: AskRequest) -> dict[str, Any]:
    try:
        result = call_model(request.question)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    return {"ok": True, "result": result}

测试接口:

curl -X POST http://127.0.0.1:8000/ask \
  -H 'Content-Type: application/json' \
  -d '{"question":"如何设计一个可观测的 AI 服务?"}'

这个例子故意很普通,但它保留了几个关键工程边界:HTTP 层负责协议,业务层负责流程,模型层负责供应商适配。之后无论替换模型、加入重试、增加缓存,还是把同步调用改成队列任务,都不必让整个系统一起变化。

如何判断一项技术是否值得引入

可以在技术评审中固定问下面几组问题:

  1. 它解决的是当前已经发生的问题,还是一个想象中的未来问题?
  2. 如果技术明天停止维护,我们能否迁移或接管?
  3. 团队中有多少人能够独立排查生产故障?
  4. 它会新增哪些部署、监控、备份和安全工作?
  5. 失败时能否快速回滚,而不是重写整个系统?
  6. 这项选择是否与其他新技术叠加,形成不可控的复杂度?

对于 AI 项目,还应增加几项检查:

  • 模型输出是否有离线评估集和线上质量指标?
  • token 成本和延迟是否可观测?
  • 是否能切换模型或供应商?
  • 敏感数据是否会被发送到不合适的边界之外?
  • 提示词、模型版本和检索配置是否可以审计?

把新技术放进隔离区

并不是所有新技术都应该被拒绝。更稳妥的做法,是先把它放进一个边界清晰的实验区:

  • 用独立服务或适配器隔离供应商 API。
  • 用小流量或内部用户验证真实收益。
  • 明确成功指标和停止条件。
  • 保留成熟方案作为降级路径。
  • 在正式依赖之前记录迁移和退出方案。

这样做的重点不是降低技术野心,而是控制失败半径。技术实验应该像一笔有上限的投资,而不是悄悄渗透进所有基础设施。

结语:成熟系统需要的是判断力

“选择无聊的技术”真正反对的不是创新,而是把新颖误认为价值。工程团队的目标不是让技术栈看起来先进,而是持续交付可靠的软件,并且在业务变化时保留选择权。

AI 时代当然需要实验,但实验不等于全栈重建。让模型层保持可替换,让数据和任务流程使用团队熟悉的基础设施,让每一项新技术都对应明确收益和退出方案。能把创新限制在值得创新的地方,本身就是一种高级能力。


相关推荐