註冊並分享邀請連結,可獲得影片播放與邀請獎勵。

檢索結果 代码复杂度
代码复杂度 貼吧
一個關鍵字就是一個貼吧,路徑全站唯一。
建立貼吧
用戶
未找到
包含 代码复杂度 的搜尋結果
决定代码复杂度的东西不在代码里,在写代码的人的脑子里。LLM 碰不到它。 这是 软件工程师 Pol Alvarez Vecino 读完 Peter Naur 1985 年的论文后得出的结论。 为什么 LLM 没法让你的代码更简单 本文最初发表于 Medium( tl;dr:Peter Naur 的《Programming as Theory building》指出,真正的程序——他称之为 Theory,大写的 T——存在于工程师的脑子里。代码和文档只是下游的(因而不完整的)产物。我对 LLM 最大的抱怨之一,就是它写出来的代码有多啰嗦、复杂度是怎样到处蔓延的。我一直抱着一丝信念:也许我们可以用 LoC 或者独立代码路径数量之类的指标来约束它们。然而,读完 Naur 之后我意识到,我们想降低的那个复杂度是 Theory 的复杂度,不是代码的复杂度,而这方面没有任何可用的度量,因为它非常主观。 我最近读了 Peter Naur 那篇精彩的论文《Programming as Theory building》( LLM 能做什么、不能做什么的看法,也改变了我对如何给它们写提示词、当前 agent 系统的主要局限,以及结对编程为何如此有效的看法。 今天我只聚焦它和代码复杂度的关系。 如果你还没读过这篇论文,我真的建议你读一读。说实话,我写这篇文章的主要目的,就是让一些人去读原论文。它值得花这个功夫。这也是练习(或学习!)在 Solveit 里做精读的绝佳机会,因为在 Solveit 里这要容易得多:你可以在阅读过程中随时提问,钻进任何你感兴趣的兔子洞,或者直接让 Solveit 帮你把语言讲清楚。关于精读的更多信息见这篇博文( fork 我的对话记录快速上手( 话说回来,如果你还是决定不读,这里是论文的 tl;dr: 程序是构建和维护它的人所持有的 Theory:一种理解——程序如何与现实世界的问题相关联,哪些约束和权衡塑造了它,它为什么能工作,以及哪些改动符合它的设计。代码和文档是这套 Theory 的下游产物,永远无法完整地承载它。 工程师通过经验发展出这种理解:与用户交谈、观察故障、学习领域知识、观察系统在真实世界中的表现。这种理解指导着对相关性、相似性、简洁性和良好设计的判断。 LLM 不太擅长持续学习,不擅长和用户交谈,也不擅长在真实世界里体验事物。但这和复杂度有什么关系呢? 我想我们都同意:LLM 总体上倾向于让代码库的复杂度上升,如果没人管的话。原因有很多:它们没意识到某个方法已经存在,于是又写了一遍;它们写过度防御的代码,比如为不可能发生的边界情况做防护;或者过早地过度优化。顺便说一句,大多数前沿实验室从你消耗的 token 里赚大钱,所以它们多少有动机去推广 token 最大化。总而言之,LLM 很少遵循 KISS 原则。这个问题在你不看输出、纯 vibe-coding 的时候最严重。但即使你会审查代码,要想让程序保持简洁,也需要主动付出努力去尽量削减复杂度。 在我天真的日子里(大约两周前),我曾以为我们早晚能爬出这个复杂度的大坑。前沿实验室只需要在 RL 训练里加一些复杂度惩罚就行。他们可以用总 LoC 作为最小化的指标,但我们都同意,有时候一行代码比两三行更复杂。另一个选项是圈复杂度(cyclomatic complexity),它衡量独立代码路径的总数。读完 Peter Naur 之后我意识到,这些东西无法真正解决问题(也许能稍微缓解一点)。我们来看看为什么。 为什么代码复杂度是错的指标 在下面这个(我编的)例子里,我们想支持调用 OpenAI 和 Anthropic。假设所有的消息准备和重试逻辑完全一样,只有请求体参数略有不同,于是我们有两个不同的方法 call_openai 和 call_anthropic。 在第一个朴素版本里,我们有两个不同的类,带重复的样板代码(即 prepare 和 with_retries)。 分开 —— 指标会发现重复 class OpenAIClient: def complete(self, prompt): msgs = prepare(prompt) # 公共样板代码 y = call_openai(msgs) # 唯一不同的一行 return with_retries(y) # 公共样板代码 class AnthropicClient: def complete(self, prompt): msgs = prepare(prompt) y = call_anthropic(msgs) return with_retries(y) 一个直接的 refactor 是创建单个类,做到 DRY。按很多指标看这都是更好的实现:行数更少、Halstead 容量更好(V=N×log2(n),N 为程序长度,n 为词汇量)、可维护性指数(Maintainability Index)也更好。 合并版 —— 按指标看确实更好:DRY,行数更少 class LLMClient: def __init__(self, provider): self.provider = provider def complete(self, prompt): msgs = prepare(prompt) y = call_openai(msgs) if self.provider == "openai" else call_anthropic(msgs) return with_retries(y) 一般来说,第二个版本(或者类似减少 LoC 和重复的版本)复杂度更低。但是,如果我告诉你,下个月我们很可能就停止支持 Anthropic 了呢?在那种情况下,我更倾向于让它们保持分开,这样到时候我只要删掉包含 AnthropicClient 的那个文件就行。 当然,这种简单的例子很容易解决,尤其是现在 LLM 可以帮你写代码。但如果你的目标不是 2 个供应商,而是像 LiteLLM 那样支持 165+ 个供应商呢?那种情况下,直接用 LiteLLM 就行。但那样你就把 120 多万行 Python 代码放到了你和最终供应商之间。值得吗? 设计良好的 API 是抽象复杂度的绝佳方式。你有清晰的契约,不需要理解背后发生了什么。即使 LiteLLM 是一个庞大的包,它也可能不计入你的 Theory 总复杂度。LLM 推理端点早期的日子就是这样:「文本进,文本出」。然而,当契约不再可靠时,这一切就会崩塌。原因可能是它有 bug,可能是 API 背后藏着大量你拿不到的状态,也可能仅仅是你不确定某个新供应商特性是否被支持。 每当你被迫窥视 API 抽象层背后的深渊时,那份复杂度就成了你的问题。这个问题正变得越来越普遍。像 OpenAI 和 Anthropic 这样的供应商,越来越多地把数据藏在服务端,比如加密的压缩数据或推理 token(更多讨论见 如果你在快速推进、只用基础功能、想尝试很多供应商,那么 LiteLLM 或类似的库可能值得用。反过来,如果你看重控制力、调试和对技术栈的理解,那可能就不值得。不存在「正确的」复杂度(虽然我非常偏好第二种选择)。 进入 Theory 决定走哪条路的信息不在代码里。这些信息属于 Naur 所说的程序的 Theory 的一部分。迄今为止,LLM 几乎接触不到这些信息,因为它们活在人的脑子里。它们可以从 IM、邮件或其他书面文档里得到一些线索,但那些永远只是局部的(最好的情况下)。 其中一些信息可以作为上下文提供给 LLM,比如业务优先级、预期的产品变化、运维约束,以及早期决策背后的原因。这样做也许能改善它的选择,但这些仍然只是 Theory 的产物。它们无法完整地传递团队发展出这套 Theory 所依赖的经验和判断。 这些都很好,但如果我全身心投入 vibe-coding 和 token 最大化、完全不在乎代码呢?那样的话,这篇博客后面的内容说服不了你。如果你处于两者之间,我来描述一个我们在 亲身经历的真实情况,关于 Solveit 的计费系统。 剧透警告:在 最初的计费系统 Solveit 是一个平台,你可以在里面用 AI 在一个类 notebook 的环境里工作。环境是持久化的,所以我们对 LLM 用量、CPU、磁盘、内存和带宽收费。 最初的计划是向用户收月度订阅费(比如 5 美元)。这笔月度订阅费变成当月可以消耗的积分(credits),如果全部用完,下个月之前就得充值。我们先在一个更小的项目里测试了这套方法来验证它。 这套方法后来证明比我们想要的更复杂。第一,积分 + 订阅的机制会把人(比如我自己)搞晕。第二,它让代码在多个层面上更复杂。你得处理「先消耗月度订阅积分、再消耗普通积分」的所有逻辑,以及剩下的积分怎么办。在 Stripe 这一侧,它有两个不同的代码路径:手动充值和订阅服务。 对不熟悉的人来说,Stripe 订阅是一个全托管服务。Stripe 管理整个生命周期(扣款周期、发票、重试全在他们那边)。 你大致只需要这样创建订阅: stripe.Subscription.create(customer=cust_id, items=[{"price": "price_5usd_monthly"}]) 然后监听他们的 webhook,在订阅状态变化或付款到达时更新你的数据库(还有很多其他事件可以选择)。 直接收款则需要你启动一个 checkout session,让用户跳转到 Stripe 的域名填卡。这需要你提供一个 customer ID。那应该在什么时候创建 Stripe customer?用户注册时?他们尝试付款时?还是别的时机?全都是合理选项。 stripe.checkout.Session.create(mode="payment", customer=cust_id, line_items=[{"price": "price_5usd", "quantity": 1}], success_url="") 到目前为止还好吧?如果你对 Stripe 或支付没有太多经验,很可能你已经感到吃力,没法把这一切全装进脑子里。也许你设法把它简化成了: • 订阅 → 交给 Stripe 订阅服务管理 • 充值 → Stripe checkout 一个不明显的问题是:使用 Stripe 托管服务意味着你有重复的数据。一半数据在 Stripe 的后端,而你必须保证本地数据库和它同步。另一个问题是,调试的时候,你既要查 Stripe 的服务,又要查自己的数据库。比如,一笔付款没到账,是 Stripe 没发 webhook(「他们的错」),还是我们没把它存进数据库(「我们的错」)? Stripe 订阅服务很棒、很容易上手,但它是为支持海量用例而设计的。这意味着,即使设计得很好(它确实很好),这个 API 抽象最终也相当复杂。在这种情况下,你在用「卷起袖子自己写代码的复杂度」交换「学习 Stripe API 的复杂度」。 LiteLLM 和 Stripe 在不同规模上展示了同一个权衡:只要契约成立,外部抽象能极大地简化你的 Theory;但每当你需要调试、修改或超出契约去推理时,它隐藏的复杂度就变成你的了。 AAI 的做法 在 经过很多天的探索和讨论,我们最终定下了一个简单得多的系统。 首先,我们只做积分(credits),按用量收费。这是一个超级简单的模型(和 Theory!):充值积分,用多少付多少。 订阅一去掉,我们就可以删掉一大块用来保持同步的代码。剩下的付款路径只有两条:手动充值和自动充值。要做自动充值,你需要能保存客户的信用卡,以便随时扣款。而 Stripe checkout 不会保存信用卡,你只是让 Stripe 在他们的 UI 里处理这次付款。 长话短说,我们最终发现最简单的办法是:用户一注册就保存他们的信用卡。卡一旦在档,用户可以用它手动充值,也可以设置成自动充值。因为全部是我们自己处理的,同步问题几乎为零。我们只监听支付成功事件(没有订阅了!)。 结果就是,我们支付系统的 Theory 可以用一句话概括: 客户注册时添加信用卡,之后我们对该卡扣款——要么手动(充值),要么在余额不足时自动扣。 手动充值和自动充值现在走同一条支付路径。我们整个支付技术栈——拆在 Solveit 和 faststripe 之间——大约 300 行代码。 结果是非常低的复杂度,但这是数小时的探索、尝试和讨论换来的。我这里的解释充其量只是触及皮毛。 印度登场 那么上线那天发生了什么?一切顺利吗?没有。上线后我们发现,印度信用卡不支持你想什么时候扣就什么时候扣的 off-session 扣款。手动充值属于 on-session,仍然可以工作,因为用户会在我们的 UI 里看到一个类似 3DS 的验证流程;但自动充值不行。 在寻找解决方案时,我们发现 Stripe 托管订阅在印度确实能工作。为什么?因为 Stripe 替你绕开了所有这些复杂度。他们提前一天创建并持有 off-session 的支付意图(payment intent),这样银行就能在实际扣款前向用户发送预扣款通知或认证请求。 我们迁移出托管订阅时,就失去了这个特性。我问了一个前沿 LLM——我记得是 GPT-5.5——我们该怎么处理这个问题。你猜它给出的方案是什么? 用回 Stripe 订阅来处理 这个 LLM 提议的正是我们刚刚迁移出来的方案。读到这里,你会怎么说?你的意见是什么?我们应该迁回去吗? LLM 列出了两个选项:要么同时支持两套系统(随时可以开工,你一句话就行!),要么完全迁回旧的系统。我们做了什么?什么都没做。我们非常看重 Theory 复杂度,于是我们决定:让印度用户手动充值就好了(抱歉了各位!),换来一个更简单、更健壮的平台。 如果你不同意我们的选择,反思一下为什么不同意。真的,现在就停下来想一想。 这个问题没有正确答案,而这篇博客的目的之一,就是帮你看清你的答案来自哪里。你的论据是什么?更具体地说,它们是从哪里来的? 有很多场景下 Stripe 托管服务是更优的选择。举几个例子: • 公司收入最重要,手动充值的额外摩擦可能会让我们损失一些印度销售额,那我们应该迁回去(或者同时支持两套) • 销售团队用 Stripe Dashboard 的 UI,所有支付信息都放在我们自己的数据库里并不理想,因为他们没法在那里管理 我的观点是:你的代码的复杂度,真的取决于一大堆和代码无关的因素,而那些信息不在代码里。 隐藏的优势 那么为什么不干脆让 LLM 全权处理这些事呢?在我看来,最妙的答案是:我们的工作方式揭示了一个可能的商业机会。印度不支持 debit mandate(借记授权)的方式和世界其他地方不一样。Stripe 试图解决这个问题,但远远不是一个完整的解决方案。 在理解和简化流程与 Theory 的过程中,我们学到了产品之外有价值的东西。在我看来,这类洞察是可以转化为竞争优势的。 努力去理解,本质上就是一个简化 Theory 的过程。如果你放任 LLM 在复杂度上为所欲为,你可以很快产出大量代码。选择简化路线更长、更费劲,但长远来看我认为它是值得的,而且你可能会在路上发现隐藏的宝石。 原文: #LLM# #编程# #代码复杂度#
顯示更多
每日和 Kimi K3 一起学习中文…… 大袋子:大段大段的代码,形容代码复杂度极高。 浅子:形容代码方法简单重复,可以统一为简单逻辑。
顯示更多
0
17
79
4
轉發到社區
和Quant Alex @StochAlex07 讨论: **总结:Jeff Liang 与 Quant Alex Wu 关于期权挂单滑点捕获优化的讨论** 两人讨论的核心焦点是:**当前期权挂单执行效果差(滑点大、成交差),本质上是缺乏高频/算法做市能力导致的,需要从“钝刀子割肉”升级到专业的 Delta 对冲 + 期权做市系统**。 ### 1. **问题诊断** - 当前挂单像“**钝刀子割肉**”,成交概率低、排队位置差,滑点严重。 - Jeff 提供数据:**平均每成交 1 张期权亏损约 5.2 美元(略小于 1bp)**,已含手续费和返佣,仍无法接受。 - 即使永续合约 maker 返费能补一点,也“无法坐视不理”。 - **价格检查和调整频率不是核心**,**成交概率(fill probability)和排队位置(queue position)才是关键**。 ### 2. **根本解决方案方向(Alex 观点)** - **好的 Delta 对冲系统与现货/期货/永续高频做市系统有大量技术重叠**。没有这个基础,面对逆向选择(adverse selection)基本无力。 - 把 **maker 单做 Delta 对冲** 本质上等同于 **Delta 1 做市处理 inventory risk** 的过程,两者“豁然开朗”地高度一致。 - 期权做市和 Delta 1 做市是**联动的**: - Delta 1 系统负责处理期权的 Delta。 - 期权本身也能给 Delta 1 头寸提供保护。 ### 3. **技术实现难度与路径** - **需要进入 algo trading / HFT 领域**,涉及大量工程投入。 - **语言要求**:Python 无法胜任,必须 **C++ 和 Rust**。 - **针对客户**:最终服务于场内大宗交易的机构客户 / 高净值个人。 - **从 0 开始的完整路线(Alex 详细规划)**: 1. 大量采集 **永续 + 期货 + 期权订单簿**(快照、增量、逐笔成交数据)。 2. 构建 **成交概率模型 + 队列模型**: - 限价单 arrival intensity(到达强度) - 成交概率 - 排队位置 - 延迟建模 3. 先在 **Delta 1 产品上跑通**,验证回测系统。 4. 再扩展到**全部期权合约**(需大量重构与验证,代码复杂度很高)。 5. 额外开发**挂限价单 + 打对价成交**等专业算法,降低总体滑点。 6. 最后小资金实盘测试。 Alex 反复强调:**“这个项目是货真价实的重工业”**,工程量和研究投入都很大。 ### 4. **共识** - Delta One 的研究正是期权成交概率研究的基础。 - 期权做市必须和 Delta 对冲系统深度融合,不能割裂。 - 当前阶段是**基础设施建设期**,需要耐心投入资源。 **总体评价**: Alex 给出了非常专业、系统性的优化路径,从数据层、模型层到执行层都有清晰步骤,强调这不是简单调参数,而是要建立高频做市级的能力。Jeff 则侧重业务痛点(真实滑点成本),两人对“必须重做底层系统”达成一致。 这是一个典型的**量化执行优化**讨论,从业务问题出发,直指 HFT 级基础设施建设。
顯示更多
很多项目的复杂度其实并不高。 框架设计简单,业务逻辑也不复杂。无论是人写代码还是 AI 写代码,差距往往没有想象中那么大。有些时候,AI 甚至写得比人更细致。 后端大部分场景无非是增删改查,偶尔遇到高并发,加缓存、队列、异步任务,通常也能解决。前端更多是数据请求、状态管理、模板渲染,真正复杂的场景也不常见。 所以在软件实现层面,AI 的胜任度已经非常高。 时间久了,人对 AI 就会逐渐建立起一种信任感。我们会觉得它解决问题越来越厉害。实际上,很多时候并不是 AI 突然变强了,而是我们面对的问题本身就没有那么复杂。同时 AI 还在持续进步,两者叠加之后,人会越来越倾向于把事情交给 AI。 那么问题也就来了。 当所有逻辑都交给 AI 实现的时候,项目初期可能运行得很好。但随着业务不断演进,if else 越来越多,数据流越来越复杂,代码规模也会快速膨胀。 这时候,人对系统的掌控力就开始下降。 出现 Bug 之后,人依旧能够分析问题,但第一反应已经变成继续交给 AI 去排查和修复。慢慢地,亲自理解代码的动力会减弱,对业务逻辑的理解也逐渐模糊。 这就是很多复杂项目失控的开始。 如果项目再涉及多人协作,这种失控会来得更快。 每个人都在让 AI 写代码,都能快速提交需求,也都觉得项目推进得很顺利。但当系统真正出现问题时,却找不到一个能够理解全局的人。 AI 时代最重要的问题,或许已经变成了“什么东西必须交由人来负责”。 需求可以让 AI 实现,代码和测试也没问题,但架构边界、数据流向、系统约束以及长期演进方向,还得让人来跟进。 如果每个需求都只是告诉 AI 一句话,然后等待结果出现,项目最终会变成一个可执行但不可理解的黑盒。这对商业化项目来说,可能会是一场灾难。
顯示更多
0
13
93
8
轉發到社區
AI 编程工具标准之争爆发:Shopify 因“复杂度税”要禁用 Claude Code Shopify 的 CEO 公开威胁,要在公司内部禁用 Anthropic 的 Claude Code 编程工具,原因不是工具本身不好,而是它不支持一个行业开放标准配置文件。 现在很多公司(包括 Shopify)同时在用多种 AI 编程助手:这些工具需要知道项目的特殊规则、代码风格、架构约定、技能说明等,所以大家会在代码仓库里放配置文件。 但 Claude Code 默认只认自己的专属文件 CLAUDE.md,不主动读取 AGENTS.md。 Shopify 是个大型 monorepo(单体仓库),有几千名开发者共用。 一旦某个目录漏放了 CLAUDE.md,用 Claude Code 的同事就会拿到“阉割版”的项目认知,而用其他工具的同事则正常。Tobi 把这称为 分裂脑 或 脑叶切除。 虽然 Shopify 已经写了自动化脚本去同步两套文件,但 Tobi 认为这是一笔完全不必要的“复杂度税” Claude 团队的回应 @trq212 很快回复: 他们正在让 Claude Code 变得更“可黑”,未来会支持轻松使用 AGENTS.md,或者其他自定义系统提示。 之所以目前坚持 CLAUDE.md,是因为他们认为不同模型家族(Claude vs GPT 等)并不可互换,系统提示对模型表现影响很大,所以他们为不同模型准备了不同的提示格式。 短期临时方案:可以在 CLAUDE.md 里直接 Agents.MD 引用过去。 这个解释并没有完全说服所有人,很多开发者认为:更合理的做法应该是默认支持行业开放标准 AGENTS.md,把 CLAUDE.md 当作特殊优化选项,而不是反过来。 Anthropic 承诺会改进,但具体支持时间表还没完全公布。
顯示更多
分享一个很有效的AI Review代码的方案 开新窗口不带上下文去Review代码 或者 用其他模型去Review代码 我最近用的很好用的提示词: 找 Bug。 找需求遗漏。 找不必要的复杂度。 找缺失的测试。 建议删除或简化。 不要自动大规模重构
顯示更多
0
38
42
1
轉發到社區
AI Coding 时代,好的编程习惯仍然重要 最近做一个 Agent benchmark,发现不能简单地用开发者视角来评估一个编程任务对 AI 的复杂度。 比如一个重构任务:把一个几千行的大文件,按功能拆成十多个小模块。 这个任务对开发者来说其实不算难,主要工作就是移动代码、整理 imports、编译验证,新手也能搞定。 所以想着用一个简单的任务来做一下 benchmark,结果却出乎意料。 Claude Code 判断这个任务比较大,尝试拆了一部分,提了个 PR 写了 Future work 打算分步来。 我自己的 Agent 是“硬上”,往完整拆分的方向推进了更多,但代价也很明显:Token 消耗是 Claude 的几十倍,后面大量时间都花在反复读文件、修编译错误、再读文件、再修错误上。 这让我意识到,人觉得简单的任务,对 Agent 不一定简单。 对人来说,这类重构很多时候就是“把这一段挪过去”。但对 Agent 来说,它要先分批读大文件,记住哪些函数和哪些测试有关,再生成一堆跨文件修改,最后通过编译错误一点点补洞。看起来像机械活,实际变成了一个高 Token、高状态管理成本的任务。 前一段时间看到有人说,AI Coding 时代,拆分模块这些编程原则没那么重要了,反正人也不看代码。现在看,我不太同意。模块边界清楚、文件粒度合适、依赖关系简单,不只是方便人读,也是在帮 Agent 降低任务复杂度。 从另一个角度看,现在 Agent 的读文件和改文件工具,对这种重构也不太顺手。 Coding Agent 改文件,主要还是文本替换。比如 Claude Code 常见的是 old_string / new_string 模式:先给出一段旧文本,再替换成新文本。Codex 常用的是 apply_patch:生成一个类似 git diff 的 patch,表达把旧的内容替换成新的。它们都适合小范围修改,但如果要删除一大段旧代码,或者把一批函数挪到别的文件,模型往往还是要先把原始内容读进上下文,再生成一大段替换或 diff。 所以我后来给 Agent 一个提示,让它先用脚本、sed、perl 这类工具把大文件粗拆开,直接把旧内容删掉,写到新文件中,然后再逐个慢慢修,它的完成度确实高了许多。Agent 默认不会这样做,主要是因为系统提示词里会强烈要求 Agent 用内置工具修改文件,而不是命令行工具。 再往前想一步,Coding Agent 可能还需要更高级的编辑工具。不是只给它一个“替换文本”的接口,而是先通过 parser、LSP 或 compiler 建立代码结构,让 Agent 可以像 IDE 一样做重构:移动函数,删除 impl block,整理 imports。不知道是否有朋友做这方面的尝试。 总的来说,即便是 AI Coding 时代,好的编程习惯还是有价值的。尽量在早期通过 harness engineering,把好的编程习惯变成 Agent 的默认工作方式,比后来再重构的成本要小很多。
顯示更多
0
13
49
9
轉發到社區
相比 @CNPYNetwork 融资 850 万美元,我更在意它收购 Tanssi 核心技术这件事。 因为 AI 能让写代码变快,但它解决不了 appchain 真正麻烦的部分。 验证者怎么协调? 节点怎么部署? 区块怎么生产? 跨链通信怎么接? 这些才是很多应用链跑不起来的原因。 @CNPYNetwork Canopy 原本讲的是用 AI 友好的模板降低开发门槛,让开发者更容易把想法变成链上应用。 但接入 Tanssi 的编排能力后,它的路径开始更完整了: AI 生成应用逻辑,Canopy 负责部署和运行,验证者网络提供安全,项目成熟后再逐步拿回更多主权。 这就不是简单的“发链按钮”,更像是一套 appchain 操作系统。 把底层复杂度交给基础设施,把代码、经济模型和最终控制权留给开发者。 如果未来链上应用真的会大量爆发,拼的可能不是谁能最快发一条链,而是谁能让这条链稳定跑下去。
顯示更多
0
48
31
0
轉發到社區
马斯克今天宣布收购cursor,openai发布codex新版向开发者倾斜,加上之前的anthropic focus企业用户大科技,GLM变相涨价限制普通用户倾向开发者。。。 这些种种行为说明通过代码生成能力不断提升而实现模型领先甚至agi已经成为了更广泛的市场玩家的共识 这是目前最优训练路径的选择。 相比自然语言,代码具备三个关键优势: 一是强可验证性,能否运行、是否通过测试,都提供了极高质量的反馈信号; 二是天然结构化,语法、逻辑、模块化组合,本质上是对人类思维过程的压缩表达; 三是任务复杂度高,天然包含多步推理、状态管理和调试迭代。这使得模型可以在“写代码—运行—报错—修复”的闭环中持续自我强化,这一点极其接近真正的智能系统。 因此,行业并不是在押注“写代码”这个应用本身,而是在利用代码这个环境,训练模型的推理能力、问题分解能力以及迭代能力。代码只是载体,目标是让模型具备工程师级别的解决问题能力。这也是为什么在传统 scaling law 边际递减的背景下,代码成为新的增长引擎:它提供了更密集、更可靠、更可自动化的训练信号,同时也具备清晰的商业化路径。 但代码并不是终点。它的局限同样明显:完全规则化、缺乏物理约束、偏符号系统。这意味着,仅靠代码路径,很难解决现实世界中的不确定性、噪声和复杂环境问题。 于是杨立坤的第二条路径也收获了不少市场关注:把模型放入“有反馈的现实系统”中。核心不是机器人本身,而是构建一个类似代码环境的闭环——决策、执行、反馈、修正。 这条路径同样具备闭环能力,但在可规模化上受限于物理世界,无法像代码那样高速扩张。但它的价值在于,它更接近真实世界,也更接近AGI所需要的“行动能力”。如果说代码路径训练的是“如何思考”,那么现实闭环路径训练的是“如何行动”。 最终的形态,很可能是两条路径的融合:代码能力提供“思考”,现实闭环提供“行动”,共同构成真正的 agent 系统。这也是当前从“模型”向“系统”的转变核心。AGI的路径很可能会是:先在代码中学会思考,再在现实中学会行动。
顯示更多
0
7
45
11
轉發到社區
关于AI时代的职业发展,吴恩达和Lawrence在斯坦福的AI时代职业发展讲座内容很详实,分享下我的收获。 1️⃣ AI能力在加速 有一项研究让吴恩达反复引用:AI能完成的任务复杂度,每7个月翻一倍。 衡量复杂度的方式是:这个任务让一个人做需要多久? 几年前 GPT-2 能完成的任务,换成人类来做也只需要几秒钟,但现在已经进化到AI能够完成需要人类几十分钟甚至几小时的工作。 AI编程方向的翻倍周期更短,大概70天。 但有意思的是,很多人对这个加速的感知是被扭曲的。 原因很简单,评估 AI 能力的 benchmark,满分是100%,你做到90%之后再进步10个点,数值的绝对值变化看起来很小。 于是去年有段时间整个互联网在讨论 AI 是不是在走下坡路,这是因为用一把只能量到100的尺子去量一个还在生长的东西,当然会产生这种幻觉。 真正能衡量 AI 是否变的更智能的指标,不是在 benchmark 测试上的分数,而是 AI 能够处理的任务的复杂度这条曲线,目前看,还在往上走。 2️⃣ PM 和工程师的比例在变 当 Build is Cheap,瓶颈就转移到了决策。 传统硅谷的工程师和 PM 比例大概在4:1到8:1。一个 PM 负责写需求、定方向,四到八个工程师负责执行。 这个比例背后的假设是:执行很贵,写代码很贵,所以你需要大量人手把一个清晰的 spec 变成可运行的代码。 但现在这个假设已经失效了,编码成本在快速下降,但产品决策的成本没有同等下降。于是工程师和 PM 的比例开始向1:1靠近,甚至有团队开始践行这个配比。 更进一步,吴恩达说他现在最欣赏的那批工程师,是能写代码也能跟用户聊的人。 这两件事以前被认为是不同人来做,现在越来越多地被要求长在同一个人身上。 他自己说:在生涯早期,他曾经试图说服一批工程师多做产品工作,结果把一些真正优秀的工程师弄得很沮丧,因为他们不擅长做 PM 工作;他说那是他做过的错误决策之一,后悔了很多年。 然后他说,他觉得自己现在正在重蹈同样的错误。 这句话有点绕,但我觉得他说的是真话:不是所有工程师都应该变成 PM,但如果你恰好能做这件事,你现在的优势会比任何时候都大。 3️⃣ 团队 > 公司 这部分我觉得是整场讲座信息密度最高的地方,也启发了我的机会选择思路。 他讲了一个案例:有个斯坦福的学生,被一家很热门的 AI 公司录用,但对方拒绝事先告知他会加入哪个团队,说有什么 rotation 机制,入职之后再分配。这个学生因为公司品牌够大,就签了 offer,结果被分配去做 Java 后端支付系统。做了一年之后觉得无聊,离职了。 然后吴恩达说,他在 CS230 课上分享过这个案例之后,另一个学生在几年后去了同一家公司,遇到了一模一样的情况。不是 Java 后端,是另一个跟 AI 八竿子打不着的方向。 如果一家公司入职前不告诉你会在哪个团队,这件事本身就是信息。 logo 不大但团队很强的地方,往往比 logo 大但团队一般的地方学得更快。你不是从走进大门那一刻的兴奋感里学东西的,你是从每天打交道的人身上学东西的。 在这个时代,能去到一个足够强的AI Native的小公司,一定比进入大厂的某个传统业务团队更好、成长更快,团队 > 公司。 4️⃣ AI时代的三个能力支柱 接下来换成 Lawrence Moroni 做分享,他是互联网科技的数十年老兵,呆过Google、Microsoft、Meta等公司,他接着讲了他看到当前 AI 人才身上的三个最重要的能力。 1.深度理解:不只是会调 API,而是要真的能读懂论文、理解模型架构、知道什么是信号什么是噪音。这个护城河现在比任何时候都值钱,因为现在社交媒体通过 AI 生成内容、制造噪音的成本降到了零。 2.业务聚焦:你能不能把技术能力翻译成商业价值。他讲了一个案例:一家欧洲公司来找他说想做 Agent,他直接问的第一个问题是为什么,不是要做什么 Agent。剥洋葱剥到最后,CEO 想要的其实是让销售团队更有效率。这个目标里从头到尾都没出现 AI 这个词。从这个真实需求出发,才能做出真正有用的东西,而不是一堆漂亮的演示。 3.Bias toward delivery:这个是他说的,想法很便宜,执行才是一切。他见过很多人带着半生不熟的想法进面试,也见过很多人带着不完整但落地得很扎实的方案进面试,通常都是后者能拿到结果。 5️⃣ 深刻理解技术债 每一行你使用AI生成的代码都是债。 Bug、文档、维护、新需求,这些都是你在还债。问题不在于要不要用 AI 生成代码,而在于你生成的每一行代码是好债还是坏债。 把 technical debt 当成财务债务来理解:买房贷款是好债,冲动刷信用卡买鞋是坏债。 判断标准就三条:你的目标清不清楚?有没有真正的业务价值被交付?别人能不能看懂这段代码? 他说他在硅谷见过太多人把 vibe 出来的代码直接 check in 进仓库,然后没人知道那堆代码在干什么,原作者后来找到了更好的工作,离开了,那些代码就留在那里成了一块永久的技术债。 最后:一些职业建议 Lawrence 说,他预测未来五年 AI 会发生分叉:一边是越来越大的 frontier model,另一边是越来越小、可以自部署的 open weight model。 他的判断是,大模型这边的泡沫会先破,小模型这边的泡沫会晚一些。 好的工程师应该同时押注两边,而不是把所有技能集中在一个方向上;会训练、微调模型的人才很重要,未来会有越来越多企业自部署小型模型。 相比于做一个领域的专家,更推荐做多个领域的复合人才。
顯示更多