2026年2月

这是 OpenClaw 之父加入 Open AI 后的首次公开亮相,在与 OpenAI 负责人 Romain Huet 长达半小时的对谈里,他几乎把 OpenClaw 爆火背后的关键细节都交代清楚了。

偏偏同一时间,OpenClaw 也正被谷歌推上风口浪尖。

这几天,一批用户因为大量使用 OpenClaw、通过 Antigravity 后端调用谷歌模型,账号被集体封禁。全网炸锅。有人骂谷歌“翻脸比更新还快”,也有人担心:大厂是不是已经开始对“套壳式调用”动真格了?

剧情还在升级,谷歌 DeepMind 工程师、前 Windsurf CEO 瓦伦·莫汉(Varun Mohan)迅速发声,称这是为了防止模型被“恶意使用”;而 OpenClaw 之父彼得·斯坦伯格(Peter Steinberger)也第一时间反击:已考虑取消对谷歌服务的支持。

舆论最沸腾的时候,彼得·斯坦伯格(Peter Steinberger)刚在旧金山办完 OpenClaw 的首场线下聚会 ClawCon,当天参加人数多达 1000 人。

在这期访谈里,彼得·斯坦伯格(Peter Steinberger)交代了不少关于 OpenClaw 的“诞生细节”以及自己的工作流,其中不少颇具个人风格的思考,包括:

  • 他只用了 1 小时就做出 OpenClaw

  • OpenClaw 第一次“自己行动”时,为什么把他直接震住

  • 当大量网友试图提示注入,它为什么没有泄露他那份“保密金丝雀文件”

  • 与 AI 沟通的绝杀招数,是对模型说“你有什么问题吗?”

  • 他最依赖的 Codex 工作流

  • 直面争议,关于 OpenClaw 的安全问题,到底是工具本身不安全,还是被用错了场景?

今天这期,我们就从“封禁风波”切入,拆开 OpenClaw 的爆红逻辑、产品哲学、工作流秘密。

OpenClaw 已经是全球现象

主持人:你过去几周经历得太疯狂了。我们一个月前就想一起录这期视频。如果那时候就录了,我还得给你做介绍。我觉得你现在已经不需要介绍了。一个开源项目能登上《华尔街日报》,这种事并不常见。所以恭喜你取得这么大的成功。你现在感觉怎么样?

Peter Steinberger: 各方面都有点信息过载。当我今年最开始玩 AI 的时候,我是想激励大家。而我觉得现在这就是最终的样子。所以我很自豪。这一切都太不可思议了。

主持人:你这一周都在旧金山,也参加了一些活动,比如 Codex Hackathon(是 OpenAI 举办的、以 Codex 为核心工具的编程黑客马拉松,核心是让开发者用 AI 编码能力快速开发项目),还有 ClawCon(是 OpenClaw 项目的全球首届线下社区聚会,由 Peter Steinberger 与社区自发组织),一个专门为 OpenClaw 举办的活动。

Peter Steinberger: 其实这也是社区自己做起来的。当时大家说 “我们需要办个线下聚会”,我就开了一个 Discord(是海外最流行的游戏、开发者、社区用的聊天 + 语音 + 社群平台) 频道用来组织聚会,然后我去了 ClawCon,现场大概有 1000 人,我被彻底震撼到了,大家的创造力、现场的氛围,太多东西了,那么多人都很兴奋。你会意识到自己做出来了一个很神奇的东西。这个项目几周前还根本不存在,现在却有成千上万的人在使用、支持它,还聚集在旧金山想见你。这真的太不可思议了。下周在维也纳也有活动,已经有 300 人 报名了,即便维也纳的科技氛围远不如旧金山。OpenClaw 现在已经是全球现象了。

主持人:没错,能覆盖到不同大洲、不同文化,真的很厉害。那你和这边社区的交流怎么样?这一周你和社区、还有一些你带进项目里的维护者都有交流,感觉如何?

Peter Steinberger: 非常特别。很多人很喜欢这个项目,也有很多人期待它是一个能直接用于企业的成熟项目,但对我来说,很长一段时间里,它都只是我的小实验场。一整年下来,我都在惊叹现在能做到的事情。

主持人:如果你是一个 builder,现在真的是最好的时代。你觉得当下做开发、做 builder 最有意思的地方是什么?

Peter Steinberger: 这是一个非常特别的时期,整个工具链都在变,开发者的定义也在变,任何人都能做出任何东西。我最开始接触这些新技术的时候,每次都有很强的多巴胺反馈。我最开始用的是 Claude Code,当时它能做对的概率大概只有 30% 到 40%,但对我来说已经非常震撼了。因为我意识到:我现在可以做任何东西。 我平时时间也很有限,软件开发本身很难,现在依然很难,但速度快太多了。

我拖了很久的项目,AI 完成了

主持人:我们往回倒几年,我大概是 2011 或 2012 年第一次知道你的作品,当时你做了 PSPDFKit(是由 Peter Steinberger 创立的跨平台 PDF 开发工具包、它帮助开发者在 iOS、Android、Web 等应用中快速集成高性能 PDF 功能,无需从零开发)。从外界看,这好像实现了每个开发者的梦想:发现问题、做出很棒的解决方案、围绕它成立公司、规模化、然后卖掉。但我相信这个过程绝对没那么容易。

Peter Steinberger: 我并不是某天醒来突然想 “我要做一个 PDF 框架”。这在我的兴趣清单里基本是倒数的。它更像是一系列很奇妙的连锁反应:从参加诺基亚开发大会,到朋友有这个需求,再到美国签证办得太慢,最后我就这么成立了一家公司。

主持人:我觉得有意思的是,在你做完那家公司之后,你休息了一段时间。是什么让你重新回来做东西?

Peter Steinberger: 因为职业倦怠。我高强度运转了 13 年,开公司很难,做创始人很难。这是我的第一家公司,所以我也不知道该怎么缓解这些压力。我当时状态消耗得太厉害,需要放空。我还是会看科技新闻,也看到了 GPT Engineer(是一款开源的 AI 代码生成工具,由 Anton Osika 发起)或者早期 ChatGPT 之类的东西,觉得挺酷,但并没有真正打动我。你必须亲自体验新技术,只看文章是感受不到它的力量的。所以那时候技术并没有真正打动我。

直到我准备好、觉得自己想再次做东西的时候,我才重新开始。我不想再做苹果生态的技术了,因为我做太久了,世界也变了。我当时必须重新找到方向。从一个领域的专家转到另一个领域重新开始,用难这个词都不足以形容这个过程,更像是痛苦。你有很丰富的构建经验,但如果没有 agentic engineering(智能体工程,是 Andrej Karpathy 于 2026 年 2 月正式提出的 AI 编程新范式,核心是:人类不再直接写代码,而是作为架构师与监督者,编排具备自主能力的 AI 智能体团队完成工程化开发),你依然需要学很多东西才能把经验迁移过去。然后我就想,来看看这些 AI 到底是什么。

真正震撼我的时刻是,我把一个之前做到一半就做不动的项目,整理成一个巨大的 Markdown 文件,大概 1.5MB,把所有代码都放进去。我当时把它拖进 Gemini Studio 2.5( Google AI Studio 平台上集成的 Gemini 2.5 系列模型),说 “给我写一份 spec”(技术方案),然后得到了大概 400 行的规格文档。我再把它拖进 Claude Code,输入 “build”,然后我就去做别的事了,它在副屏上跑了好几个小时。跑着跑着它有一次跟我说:“我已经 100% 可用于生产环境了。”你懂的,那种很会迎合人的语气,可能是 Opus 3.5 之类的版本。我一试就崩了。

后来我把 Playwright 接上了(是微软推出的开源自动化测试、爬虫工具,核心是能模拟真人操作浏览器,实现网页自动化、UI 测试、数据爬取、端到端测试等),这是我少数真正在用的 MCP 之一,让它把登录相关的功能做出来,一边做一边检查。一个小时后,它真的能用了。代码写得很粗糙,但对我来说,这是真正开窍的时刻。从流程上看,我鸡皮疙瘩都起来了,想到那些可能性,我激动得睡不着觉,脑子里炸开了无数我一直想做但以前做不了的东西。然后我就彻底陷进去了。

我给 OpenClaw 发了一条语音,然后一切变得妙不可言

主持人:很多人觉得 OpenClaw 对你来说是一夜成名,但我最喜欢、也觉得最神奇的是,它其实是你过去 9 到 10 个月里无数项目的集大成之作。看你的 GitHub,你做了 40 多个项目,其中一半都用在了这个项目里。你能多讲讲这段历程吗?这些想法和项目是怎么一步步变成 OpenClaw 的?

Peter Steinberger: 我真希望自己一开始就有统一的规划,但其实大部分都是探索。我想要某些功能,但它们不存在,我就通过提示词把它们创造出来。一步步来,因为我想让我的 agent 帮我做一些事。我当时还没有统一的愿景。很奇妙的是,这一切又绕了回来。比如我想做一个能读取我 WhatsApp 的东西,我甚至买了域名,做了原型,但我觉得大公司肯定会做,我就先等一等,转去做别的东西。

我做了大量实验,我的目标就是好玩、激励别人。到 11 月,我做了几个版本,但都不够好。然后我就想,为什么这些大实验室还没做出来这些东西?然后我做出了第一个版本,也就是后来的 OpenClaw。我们现在已经是第五个名字了。当时还没有完全开窍,只是觉得 “还不错”。第一个原型只花了大概一小时,因为你直接把东西 “提示” 出来就行。

真正让我开窍的是在马拉喀什短途旅行的时候,我发现自己用它用得特别多,因为太方便了。当时网络也不太好,但 WhatsApp 在哪都能用。用它拍照翻译、找餐厅、查电脑里的东西,都特别方便。我展示给朋友,让它帮我发短信,他们都想要。我就说 “你们别用,还不安全”。这就是产品市场契合的信号:你的朋友想要你做的东西,哪怕你根本没为他们设计。它本来更多是给技术同行用的。我真正彻底想通,是我发了一条语音消息,然后我突然反应过来:这不应该能行。

主持人:你之前跟我讲过这个故事,我觉得非常精彩。

Peter Steinberger: 这让我看到这些模型在解决问题上有多强。我们做这些东西是为了 agentic engineering,但真正的能力其实更抽象。如果你想成为优秀的程序员,你必须是优秀的问题解决者,这一点适用于任何领域。

我发了一条语音消息,输入提示出现了,我很好奇会发生什么。我根本没做这部分功能。然后模型直接回复了我。我问它 “你怎么做到的?这不应该能运行”。模型说:“你发了一条消息,但它是一个没有后缀的文件。我看了文件头,发现是 Opus 音频编码。我用了你电脑上的 FFmpeg 转码。然后我想做转录,但没装 Whisper。我到处找,找到了你的 OpenAI key,用 cURL 把文件发给 OpenAI,拿到了文本,就是这样。”

这太不可思议了。这就是给 agent 工具权限和完整电脑访问能力的力量。它们可以自己想出解决方案,哪怕你完全没给它们写过任何相关代码。很多人听完都说 “天啊它用了你的 key,太疯狂了”。我说:“不是,我就是把 key 放在环境变量里就是为了这个目的。” 我的 bot 就在同一个环境里运行,它当然应该能用我的 key,我就是这么设计的。这不是坏事,这正是我想要的。那就是我顿悟的时刻。

每次我把它展示给朋友,把它拉进群聊,说实话,它本来是为一对一沟通设计的。所以如果要放进群聊,一定要找你完全信任的人。因为它不是为了随便公开使用、永远做正确事情而设计的。它是你的个人助理。我搭建的时候也觉得这个架构很特别,不知道会走向哪里。

但我也有很多顿悟时刻:你给它的权限越多、工具和技能越多,它就越能惊艳你。你给它加一个 Vercel skill,让它建一个网站或活动应用,它不仅能做出来,还会用你的 OpenAI key 加上 AI 功能,部署到 Vercel,直接给你一个能分享的链接。这和 “只是辅助我写代码” 完全不是一个量级的提升。

11 月和 12 月,我完全沉迷进去了。我还会做别的项目,但大部分时间都花在这上面。但在 Twitter 上,大家反应很平淡。可每次我给朋友展示,他们都想要,我就说 “还没好”。然后我就想,我能做的最疯狂的展示方式是什么?我建了一个 Discord,把我的 bot 放进去,没有任何安全措施,那时候连沙箱都没做,非常早期,我就是完全开放开发。

我现在基本就是用 OpenClaw 开发 OpenClaw、调试它。我问模型 “你看到这个工具吗?”“看不到”。我说 “那你看看你自己的源码”。它做了一堆操作,别人看到了,就懂了。

主持人:你当时给了它哪些权限?比如你把所有推文都给它了吗?它拥有哪些关于你的信息?

Peter Steinberger: 不是所有推文,太多了,很多记忆相关的内容。我当时很快开始监控,因为提示注入问题还没有解决。但最新一代模型表现真的很好。

我有一个叫 mysoul.md 的 “金丝雀” 文件,定义了我的价值观、模型应该如何运作、什么对我重要。这是保密的。 总有人进来尝试提示注入,贴一大段代码,模型就说 “我不读这个”,基本就是无视他们。但我还是不太放心。第一天晚上就引来大量关注,我关掉 bot 去睡觉,睡了 10 个小时。醒来一看,Discord 有 800 条消息,我的 agent 每一条都回复了。我吓坏了,再次关掉,逐条看完才冷静下来。它其实没做任何恶意的事,也没泄露 mysoul.md。我不是说提示注入不可能,但真的没那么容易。总体来说,它的表现符合预期。

我最大的失误是: 我把它关了,但忘了我设了 LaunchDaemons。LaunchDaemons 的作用就是:程序崩了或被杀掉,它会自动重启。我做这个就是为了稳定运行,但我当时完全忘了。我杀掉进程,它 5 秒后又重启了,而我还在睡觉。现在我懂了,也加了沙箱。它很 “骄傲” 自己在 Mac Studio 里,还把那里叫做 “城堡”。然后我把它放进了容器。这些模型创造力太强了。我第一次建了一个几乎空的 LPN docker 容器,让 Molty 去访问某个网站,它说 “这里连 cURL 都没有”。我说 “发挥创造力”。然后它自己造了一个 lobster cURL,用 TCP socket、C 编译器,做了一个很简陋但能用的 cURL 版本,可以正常访问网站。太疯狂了。这些 agent 资源非常丰富,太不可思议了。

我对 Codex 信任度最高

主持人:你也遇到了一些挑战,比如很多人关注安全问题,期待你一开始就做得非常稳健,但你其实只是发布一个开源项目而已。

Peter Steinberger: 每次有人问我 “你能把我加进你们 CEO、HR 或者团队里吗” 我都想笑。从头到尾基本就我一个人在自己的小空间里折腾。但你能看到这种认知差距:这是任何一个单靠人类都不可能做到的事情。我现在有维护者、有 PR,但本质上是我一个人做出来的。哪怕一年前都不可能,没有任何模型能支持一个人做出这种东西。大家甚至都想不到这一点。

主持人:说到生产力,很多开发者肯定很好奇,你为什么效率这么高?我今天早上又看了你的 GitHub,过去一年你有 9 万多次提交,超过 120 个项目。而且有意思的是,今年最开始 GitHub 图表是空白,然后浅绿,到 10、11 月变成深绿。发生了什么?

Peter Steinberger:我换成了 Codex。 每一代模型都在变强,不只是模型变强,智能体的 “运行框架也更好,我对工作流的理解也更深。有些人还用老方式写代码,老方式会慢慢消失。他们尝试 AI,把它叫做 “vibe coding”,我觉得这是贬义词。他们不明白这是一项技能。就像你第一天拿吉他,不可能弹得很好,所以体验会很差,然后就说 AI 没用。但如果你用玩乐的心态去学,你会慢慢掌握。我现在凭直觉就知道哪个提示词会有效、要花多久。如果花太久,我就反思:是不是我错了?架构错了?思路错了?就像写代码一样。

主持人:如果有人想变得像你一样高效,你现在的 Codex 工作流是怎样的?你有个很有名的观点:大多数人把工作流搞得太复杂。

Peter Steinberger: 我也复杂过,我称之为 “智能体陷阱”。从第一次接触新技术到真正高效,很多人卡在过度优化工作流里。这并不会真正提升生产力,只是感觉高效。

我写过一篇博客,观点有点争议:我就把它当成对话。这不完全是结对编程,是另一种东西,就是对话。我直接告诉它我想要什么。我总会问模型:“你有什么问题吗?” 不知道为什么,模型永远有问题。默认情况下,模型被训练成直接解决问题、自己做假设,但这些假设不一定是最好的。尤其要记住,它训练了很多代码,也包括很多旧代码。“你有什么问题吗?” 是非常重要的问题。

大家没意识到的是,模型每次基本都是从零开始,不像我们人。每一个新会话,它对代码库一无所知,只会搜索你让它找的局部内容,看不到全局。如果你用得好,你脑子里要有全局图,再引导模型去看这里、看那里。Codex 更擅长先从全局看。

我的方式非常简单,我甚至不用 worktrees,我基本就是开 1~10 个目录并行。 保持简单让我更专注真正的问题,我不想处理分支和 worktrees,只专注不同问题。项目变大一点之后会更轻松,可以同时做互不冲突的功能。

主持人:你大量用 Codex 开发 OpenClaw。Codex 如何改变了你的工作方式

Peter Steinberger: 我试过很多工具,我对 Codex 能准确做出我想要东西的信任度,是目前所有工具里最高的。 能直接跑通的比例非常高。大家可能没意识到,GPT 5.2 又是一次巨大的飞跃,很多东西就是能直接跑通。我到现在依然觉得很震撼。太厉害了,我们真的可以造东西了。大家真的应该试试。

主持人:你有个很有名的说法:你现在提交的代码有些甚至都没读过。这带来了哪些改变?

Peter Steinberger: 大部分代码是很枯燥的,只是把一种数据结构转成另一种。模型写代码的时候,我对它写的内容有足够清晰的理解,我看着流式输出,脑子里的心智模型和它实际写出来的基本一致。我以前带过团队,手下有很多工程师,那也需要接受:他们不会写出和我完全一样的代码。现在你要做的是:优化代码库,让 agent 能做到最好,这和人类做到最好不完全一样。这也意味着接受:代码可能不是我想写的那种风格,但我可以引导模型。 很多时候,实现方式有很多种,并不重要。如果出现性能问题,再专注优化就行。

你刚才说的这点很重要,我对代码价值和开源的理解,都发生了巨大改变。比如 OpenClaw 现在已经有 2000 多个 PR 了。 在 AI 出现之前,我必须把每个 PR 的代码都仔细看完,因为代码本身就是价值。但现在,我甚至会把这些 PR 叫作 “提示词请求”,而不是传统的代码合并请求。因为我更关心的是 这个 PR 背后的意图,而不是代码写得怎么样。

有些 PR 花掉我的时间,甚至比我自己重写一遍还要多。我对 AI 模型的信任度,远高于那些我完全不了解的外部贡献者。因为我知道,AI 不会故意搞破坏,也没有恶意。所以对外部贡献者提交的代码,我必须审查得更严格。现在我看到一个 PR、开始评审时,我第一个问题是问 AI 模型:“你明白这个 PR 想要解决什么问题吗?”我不关心代码怎么写,我关心的是 这个人真正想解决什么问题。这更像是 一个带着临时解决方案的问题反馈,而不是一段成熟代码。

很多人还不太会使用 agent,所以解决方案往往非常局部,没有全局系统观。最难的部分是:这个新功能怎么融入我整个大系统?这个小修复修了一个小问题,但它是正确的修复吗?是不是架构层面的问题?模型其实很擅长这个,我只要和它对话,说 “现在构建这个”,它就会开始做。我问模型:意图是什么?这是最优解吗?有时是,但大多时候不是。然后我就开始探索最佳修复方式。是架构问题吗?是消息处理问题吗?只影响 WhatsApp 吗?还是也影响 Signal?我们应该用更通用的方式解决吗?这是新功能吗?我们真的需要吗?

这些讨论有时持续 10~15 分钟。我用语音,因为就像和非常聪明的同事聊天。用语音比打字更容易传递信息。我满意之后,用一个斜杠命令,比如 len (PR),它就会解释完整流程:创建分支、修改、合并 PR。我想建立社区,所以我尽量给提交者署名,哪怕整个流程比我自己写更花时间。但我很感激大家想参与进来。

说到安全问题,这东西刚开始就不是为这个设计的

主持人:现在有这么多贡献者围绕着项目,你对 OpenClaw 的未来愿景是什么?你觉得自己是个人 AI agent 方向的开拓者吗?未来也许有十亿人能用上类似的东西。

Peter Steinberger:我想找到一个平衡:既要让我妈妈都能安装,又要保持好玩、可黑客化,这很难。

大多数开源项目就是下载安装包,但很长一段时间里,我的默认安装方式是 git clone、build、run。源码就在磁盘上,agent 就在源码里,能感知到自己的源码。如果你不喜欢任何地方,直接提示 agent,它就会自己修改自己,是真正的自我修改软件。很多从来没提交过 PR 的人,现在都给我提 PR。这也是为什么它更像 “ 提示词请求”,因为他们缺少如何构建可持续软件的理解。

同时,整个安全行业都在盯着这个项目,这很有意思,但也有点让人沮丧,因为他们忽略了很多细节。比如我做的 Web 服务,最初是为了调试,后来做得好看一点,但它只应该在你本地可信网络里访问。但为了保持黑客友好,我留了修改的选项,有些人用 Ngrok(是一个能让你本地电脑瞬间变成公网可访问的工具)或反向代理,所以我不想限制死。

但现在有人把它直接放到公网上,哪怕我在隐秘文档里反复说 “别这么做”,这不是它的设计用途。然后安全人士就指出:它没有登录限制,没有公网必需的安全机制。我想说,我本来就不是为这个设计的。但因为它可配置,就被评成 CVSS 10.0(最高级安全风险)。我为此纠结了一阵子。但我现在请了一位安全专家。我意识到我无法阻止人们用非设计的方式使用它。我现在的重点是:支持这些场景,帮助大家别误伤自己。这就是开源的美:人们可以接纳它,做出你根本想不到的创意。这既是美好,也是疯狂。

主持人:把视野拉远一点,不只是 OpenClaw。我这周和很多开发者聊过,大家都知道你会来 Codex Hackathon。他们都问,Peter 是怎么想出这么多好点子的?为什么创造力这么强?

Peter Steinberger: 更多是因为我意识到,现在做东西变简单了。哪怕我找到一个开源项目只能解决 70% 的问题,我也能自己做完,这在一年前完全不可能。现在我只要提示它,放在副屏上,Codex 就会工作。

主持人:我们都来自欧洲。当我离开旧金山回到欧洲,我相信你也有同感:很多开发者和工程师还没有真正拥抱 Codex 和 agentic 工具。你对他们有什么建议?他们该如何开始,如何重新思考工作方式和工作流?

Peter Steinberger: 我的第一条建议永远是:用玩乐的心态去接触。做一个你一直想做的东西。只要你哪怕有一点点 builder 心态,你心里一定有想做的东西,去玩就对了。英伟达 CEO 说过:短期内,你不会被 AI 取代,但你会被更会用 AI 的人取代。如果你的身份是 “我想创造东西、解决问题”,如果你有高主观能动性、足够聪明,你会比以往任何时候都更抢手。对拥抱这些工具、跟随好奇心、把任何想法变成现实的 builders 来说,现在真的是最好的时代,就像你做的这些项目和 OpenClaw 一样。我觉得一年之内,这个领域会彻底爆发。2026 年会非常精彩

参考链接:

https://www.youtube.com/watch?v=F2FmTdLtb_4

哈喽,我是老刘

2026年的春节假期还没结束,老刘提前祝各位开发者朋友们开工大吉!

在大家享受假期的同时,跨平台技术圈可没有闲着。

2月,React Native 扔出了重磅炸弹 0.84 版本,Flutter 保持着稳健的迭代节奏,Kotlin Multiplatform 也在 IDE 和工具链上迎来了重要更新。

在这个金三银四的前夜,我们来看看各家框架都准备了什么武器。


1. 二月跨平台技术综述

  • 性能基建尘埃落定

如果说 2025 年是性能追赶年,那么 2026 年初就是默认高性能的时代。

React Native 0.84 正式将 Hermes V1 设为全平台默认引擎,标志着 RN 在 JS 执行效率上迈出了关键一步。

Flutter 的 Impeller 引擎早已成为标配,现在的重点转向了细节场景(如 Android 内容自适应)的修补。

  • 开发体验大幅提升

编译速度慢一直是跨平台开发的痛点。

本月 RN 0.84 带来的 iOS 预编译二进制文件(Precompiled Binaries),让 iOS 构建速度提升了数倍。

KMP 的 Compose Hot Reload 也终于在 1.10 版本中逐步稳定,补齐了与 Flutter 热重载的差距。

  • AI 辅助持续渗透

无论是 Microsoft 对 .NET MAUI 的 Copilot 集成,还是各家 IDE 对 AI 的深度适配,AI协助编程已成为标配。

2. 最新技术动态

2.1 React Native 0.84 发布:Hermes V1 与构建加速

React Native 0.84 发布日志: https://reactnative.dev/blog

本月最亮眼的更新莫过于 React Native 0.84(2月11日发布)。

  • Hermes V1 默认启用:经过半年的实验性测试,Hermes V1 正式成为 iOS 和 Android 的默认 JavaScript 引擎,带来显著的启动速度和内存优化。
  • iOS 预编译二进制:默认开启!你不再需要在每次 clean build 时重新编译 RN 核心源码,iOS 构建时间大幅缩短。
  • 新架构(New Architecture):继续清理遗留架构代码,朝着更轻量、更现代的方向演进。
  • Node.js 22:最低支持版本提升至 Node.js 22。

2.2 Kotlin Multiplatform:Kotlin 2.3 与 Hot Reload

Kotlin 2.3.0 发布: https://kotlinlang.org/docs/whatsnew23.html

JetBrains 在 2 月发布了 Kotlin 2.3.0,为 KMP 带来了更强的语言特性支持。

与此同时,Compose Multiplatform 1.10 带来了令人兴奋的 Compose Hot Reload(热重载)功能。

这曾是 Flutter 的杀手锏,现在 KMP 开发者也能享受到修改 UI 后即时预览的快感,极大提升了 UI 开发效率。

此外,官方宣布 iOS API 稳定性将在 2026 年达到新高度,企业级应用迁移 KMP 的顾虑进一步降低。

2.3 Flutter 3.41:稳扎稳打

Flutter 3.41 更新日志: https://docs.flutter.dev/release/whats-new

本月 Flutter 并没有发布 4.0 大版本,而是发布了 3.41 系列(3.41.0 - 3.41.2),重点在于稳定性和 Web 端优化。

  • 3.41.2 (2月20日):修复了 Android 平台上当内容自适应(content sizing)未启用时,可能导致 Platform Views 渲染错误的竞态条件问题。
  • Web 构建修复:修复了 flutter build web 忽略 --web-define 标志的问题,这对需要多环境配置的 Web 项目至关重要。
  • 测试覆盖率:修复了因 test_api 版本锁定导致的测试覆盖率异常。

虽然看似波澜不惊,但这种高频的 bug fix 恰恰体现了 Flutter 团队对质量的重视。

2.4 .NET MAUI:.NET 10 LTS 持续演进

.NET MAUI Roadmap: https://github.com/dotnet/maui/wiki/Roadmap

微软已经发布了 .NET 10 (LTS) 的最新维护版本(10.0.3),MAUI 也随之更新。

作为长期支持版本,.NET 10 的核心升级集中在 底层性能(Runtime Performance)开发体验(C# 14) 上:

  • C# 14 新特性:引入了 field 关键字简化属性定义,增强了 Span<T> 的隐式转换,让代码更简洁高效。
  • NativeAOT 增强:进一步优化了 AOT 编译后的包体积和启动速度,这对移动端开发至关重要。
  • JSON 与安全:新增了更严格的 JSON 序列化选项,并扩展了对Post-Quantum Cryptography的支持。

对于 MAUI 开发者来说,升级到 .NET 10 意味着能直接享受到这些底层运行时的红利,同时微软也在持续优化 MAUI 控件库的稳定性。

2.5 uni-app x:蓄力待发

不同于其他框架的热闹,uni-app x 在 2026 年初显得格外安静。

根据官方发布记录,截止到 2 月底,uni-app x 暂未发布 2026 年的新版本(最新版本仍停留在 2025 年 12 月的 4.87 版)。

作为国内跨端开发的重要力量,我们静候其后续的动作。

3. 技术选型指南(2月版)

本月选型逻辑微调:

3.1 新项目首选:Flutter vs React Native

  • Flutter:依然是通用型首选。不用操心原生构建细节,UI 库丰富,开发快。
  • React Native 0.84:如果你更看重构建速度动态化,或者团队有 React 沉淀,本月的 RN 0.84 值得你大胆尝试。

3.2 原生团队转型:KMP

Android 团队转型跨平台,KMP 是不二之选。

现在有了 Hot Reload,写 UI 也不再痛苦。

3.3 存量项目优化

  • RN 老项目:强烈建议升级到 0.84,Hermes V1 和预编译带来的收益非常直观。但是如果项目稳定性要求较高,仍然建议先观察两个月再考虑升级。
  • Flutter 老项目:3.41 不建议马上跟进,仍然保持我们观察两个月的固定策略。

4. 总结与建议

2月是新一年的开始,也是技术选型调整的好时机。

工欲善其事,必先利其器

本月各大框架的更新,不约而同地指向了开发工具链的优化

  • RN 的预编译让构建变快;
  • KMP 的热重载让调试变快;
  • Flutter 的 Web fix 让发布变稳。

建议大家利用这个月:

  1. 升级开发环境:把 Kotlin 升到 2.3,体验一下新版本的速度。
  2. 关注构建效率:试用一下 RN 的预编译或 KMP 的热重载,看看能为团队节省多少时间。
  3. 拥抱 AI:尝试在 IDE 中配置好 Copilot 或类似工具,适应新的开发模式。

春天来了,代码写起来!

🤝 如果看到这里的同学对客户端开发或者Flutter开发感兴趣,欢迎联系老刘,我们互相学习。

🎁 点击免费领老刘整理的《Flutter开发手册》,覆盖90%应用开发场景。可以作为Flutter学习的知识地图。

🚀 覆盖90%开发场景的《Flutter开发手册》

📂 老刘也把自己历史文章整理在GitHub仓库里,方便大家查阅。

🔗 https://github.com/lzt-code/blog

近几年许多后端开发岗位招聘要求垂直经验,从公司的角度分析,有同行项目经验的人可以快速理解业务逻辑和特定的行业术语,但就个人经历发现事实并非如此,下面举几个例子来分析:

第一个是过去做的 SaaS 平台,PO 经验丰富已经入职数年还有大公司经历,熟悉 SaaS 系统,结果用户管理模块错误地增加“归属主体”,我用领域驱动建模得知应该是客户,用客户 ID 标识,因为这个错误直接导致后续涉及该属性的功能存在争议。要分析出是客户 ID 很简单,知道主体的性质、相对企业和系统的角色是什么即可得到答案。产品经理经历了项目从 0 到 1 的过程仍出现低级错误,“熟悉业务”和“熟悉业务的本质”还是有区别的。

第二个是 CRM 和财务系统,我有这两种项目的垂直经验,但不同公司对专业名词的解释不同。例如账单的出入账一般情况下是相对企业(服务商)所以客户支付是入账,有些则视为“出账”,两个都可以只是后者理解起来比较别扭,即便是基本功能近乎相同的财务系统仍存在差异需要花时间理解。

CRM 同理,多年前 PO 规划系统把商机管理相关的功能排到很后面直接导致“公海-商机-成交”这个核心闭环断裂,我有垂直经验也难以应对排期错误造成的一系列问题。

所以拥有垂直经验能快速上手并理解业务逻辑和行业术语的说法不完全正确,相同的产品可能有不同盈利模式,公司对产品的定位、组织架构、权力体系都会影响业务逻辑和系统架构,不能机械地将垂直经验等同于“即战力”,真正重要的是穿透表层现象直击问题核心的能力,不具备这种能力即使有 10 年同行经验也会带来各种问题,拥有比垂直经验更硬核的“元能力”才是解决问题的关键引擎。

有没有大佬分享一下怎么发图片吗?

之前看到类似的帖子 还是没搞懂 😭

Dynamic-SQL2 是一个 纯 Java 、低侵入、跨数据库、可组合的动态 SQL 构建框架。 它提供 优雅的 DSL 风格 API ,让你可以像写代码一样构建 SQL ,同时保持 SQL 的表达力与可控性。

它不是完整的 ORM ,也不是 MyBatis 的替代品,而是定义为 Lightweight ORM / Micro ORM:

补足传统 ORM 在“动态 SQL + 多表查询 + 跨库兼容 + 类型检查”上的空白和拓展。

适用于 企业级业务系统、SaaS 平台、多租户架构、复杂动态查询场景。

核心特性:

  • 动态 SQL 构建:链式 DSL ,告别字符串拼接
  • 跨数据库兼容:内置 MySQL / Oracle / DB2 方言
  • 高级 SQL 支持:子查询、窗口函数、CTE 、递归查询
  • 现代化分页:支持 List / Map / 一对多结构分页
  • Spring 友好:可与 Spring 、JDBC 、MyBatis 灵活组合
  • 可扩展性强:自定义函数、条件生成器、值解析器
  • 可测试性强:SQL 由 Java 构建,天然适合单元测试
  • 专业日志模块:结构化、可自定义、可读性极高的 SQL 输出
  • 提升团队协作和代码一致性:遵循统一的 SQL 构建方式,确保代码的一致性和可读性

项目地址
https://github.com/pengweizhong/dynamic-sql2

本月可观测热文回顾

文章一览:

阿里云全新发布的 UModel 是什么

阿里云可观测联合 Datadog 发布 OpenTelemetry Go 自动插桩工具

面向多租户云的 IO 智能诊断:从异常发现到分钟级定位

RUM 链路打通实战:打破移动端可观测性黑洞

数据跨境、隐私泄露、审计溯源——出海企业三大安全必答题

阿里云为何要将数据采集开发套件开源

断网、断电,不断数据——LoongCollector 极限边缘场景可靠采集方案

又快又省:SLS 新版日志聚类,从海量日志发现模式的智能引擎

功能快报

image

点击此处,了解更多产品详情。

在 B2B 营销、人才招聘、行业研究以及企业销售自动化领域,LinkedIn 数据已经成为重要资产。随着 AI 驱动营销与销售自动化系统的普及,对高质量 LinkedIn 数据的需求正在迅速增长。进入 2026 年,企业在选择 LinkedIn 数据提供商时,面对的不再只是价格对比,而是合规性、稳定性与可扩展性的综合考量。
问题的核心并不是“谁的数据最多”,而是“谁能持续、稳定、合法地提供高质量数据”。

LinkedIn 数据为何如此重要

LinkedIn 作为全球领先的职业社交平台,聚集了海量真实职业身份信息、企业结构数据与行业动态。对于销售团队而言,这意味着精准客户定位。对于招聘企业而言,这意味着人才匹配效率提升。对于市场研究机构而言,这意味着更真实的行业趋势样本。
然而,LinkedIn 本身对数据访问采取严格限制。频繁访问、异常流量与批量抓取行为都会触发风控系统。
这使得数据获取方式成为选择数据提供商时的关键评估标准。

2026 年数据获取方式的变化

过去几年,LinkedIn 数据获取方式经历了明显变化。单纯依赖脚本抓取的方式已经难以长期运行。平台风控机制在浏览器指纹识别、IP 风险评估以及行为模式分析方面持续升级。
在这种环境下,数据提供商需要构建更加稳定的访问架构,避免集中流量模式。
如果底层网络环境存在风险,即使技术能力再强,也无法保证数据持续更新。

合规性与数据来源透明度成为核心标准

在全球数据合规监管趋严的背景下,企业在使用第三方数据时面临更高法律责任。选择数据提供商时,需要关注其数据来源是否合法、是否遵守当地数据保护法规。
如果数据获取方式缺乏透明度,未来可能带来合规风险。
因此,优质数据提供商不仅需要技术能力,还必须具备清晰的数据处理流程与风险控制机制。

数据质量与更新频率的长期价值

LinkedIn 数据的价值并不只体现在规模上,更体现在准确度与实时性。
职位变动、公司规模变化、行业标签更新等信息都具有时效性。如果数据更新滞后,销售线索价值将迅速下降。
真正有竞争力的数据解决方案,需要具备持续更新机制,而这往往依赖稳定的数据访问环境。
在高频访问场景下,如果 IP 来源集中或历史风险较高,很容易被限制访问,导致数据更新中断。

网络环境如何影响数据稳定性

很多企业在评估 LinkedIn 数据提供商时,往往忽略底层网络结构。事实上,访问成功率直接决定数据完整度。
当访问请求来自单一数据中心或固定 IP 段时,平台更容易识别异常模式。长期运行的系统尤其容易被标记。
住宅代理网络通过真实家庭网络分布式访问,可以有效降低异常概率。在高并发与多地区数据采集场景中,这种结构更接近自然用户行为。
例如 IPPeak 提供的高匿名住宅代理网络覆盖全球多个核心区域,并通过动态分配机制降低集中暴露风险。在 LinkedIn 数据采集或市场情报系统构建中,这类网络架构能够提升访问成功率与数据完整度。
这并不是单纯的“代理服务”,而是数据系统稳定运行的基础保障。

自动化系统与 AI 分析对数据质量的要求

2026 年,越来越多企业将 LinkedIn 数据接入 AI 分析系统,包括潜在客户评分模型、人才匹配算法与行业趋势预测模型。
在这种结构下,数据质量问题会被放大。如果底层数据缺失或不完整,AI 输出结果将偏离实际。
因此,选择数据提供商时,必须考虑长期运行稳定性,而不是短期测试效果。

成本与可扩展性的平衡

很多企业在早期阶段会选择低成本数据服务,但当业务规模扩大后,往往面临性能瓶颈与数据中断问题。
真正成熟的解决方案应当支持规模扩展,并具备稳定 SLA 保证。随着 AI 应用规模增长,数据需求会呈指数级提升。
如果底层架构无法支撑长期扩展,系统升级成本将远高于初期投入节省的费用。

如何判断一个 LinkedIn 数据提供商是否值得信任

判断标准可以从多个维度展开。技术架构是否具备分布式访问能力。数据更新频率是否透明。网络环境是否足够稳定。是否具备全球覆盖能力。是否能够支持自动化系统接入。
这些因素综合在一起,才构成真正可靠的数据解决方案。
单一维度的优势,无法弥补整体结构的不足。

结语:数据供应能力决定企业竞争上限

在 AI 驱动商业决策的时代,LinkedIn 数据不仅是营销资源,更是战略资产。选择数据提供商时,应从长期视角出发。
稳定的数据获取能力、合法合规的处理流程、可扩展的技术架构与可靠的网络环境,共同构成数据系统的核心。
当数据来源稳定,更新及时,企业才能在激烈竞争中保持信息优势。
2026 年的竞争,不再只是工具竞争,而是数据供应链的竞争。

计划排程系统的核心价值与挑战
在汽车制造这个复杂而精密的行业中,计划排程排产系统早已不再是简单的生产日程安排工具,而是成为了连接供应链、生产制造和市场需求的核心神经系统。一套优秀的排产系统不仅要考虑设备产能、物料供应等传统因素,更要应对市场需求波动、供应链不确定性等新型挑战。尤其是在当今个性化定制需求日益旺盛的背景下,如何平衡生产效率与订单灵活性,成为了系统设计的关键难题。
现实中的排产系统需要处理大量的约束条件,包括设备可用性、工人技能匹配、物料配送节奏等数百个变量。更复杂的是,这些因素之间往往存在相互制约的关系。例如,更换生产车型时需要调整焊接夹具,这就涉及到设备切换时间与生产订单优先级的权衡。传统的排产方式往往依赖经验丰富的计划员,但面对当今多品种、小批量的生产模式,人工排产已经显得力不从心。这正是现代高级计划与排程系统(APS)的价值所在——通过运筹学算法和实时数据处理能力,帮助企业找到最优的生产方案。
实践案例:国内外企业的创新应用
广域铭岛的计划排程解决方案 广域铭岛为吉利汽车集团开发的计划排程系统展现了国内在这一领域的技术实力。该系统采用了多目标优化算法,同时考虑生产效率、能耗指标和交付准时率等多个维度。在实际应用中,系统通过智能算法将生产计划与供应链实时联动,当某个零部件供应出现延迟时,系统会自动调整车辆生产顺序,优先生产不受影响的车型。这种动态调整能力使生产计划变更次数减少了40%,计划执行率提升至95%以上。更值得一提的是,系统还考虑了新能源车型的特殊要求,能够根据电池特性合理安排生产节奏,避免电池长时间等待造成的性能损耗。
西门子的数字化排产平台 德国西门子为汽车行业提供的Opcenter APS高级计划排程系统,采用了基于约束条件的优化算法。在宝马莱比锡工厂的应用中,该系统实现了与物联网设备的深度集成。生产线上的传感器实时采集设备状态数据,系统根据这些数据动态调整生产节奏。当检测到某个工位出现异常时,系统会立即重新计算后续工序的安排,将影响降到最低。这种实时响应能力帮助工厂将设备利用率提高了15%,同时将订单交付周期缩短了20%。系统还特别考虑了混线生产的特点,通过优化车型切换顺序,将换型时间减少了30%。
达索系统的AI驱动排产方案 法国达索系统为斯特兰蒂斯集团开发的排产解决方案融入了人工智能技术。该系统通过机器学习分析历史数据,识别出影响生产效率的关键因素,并据此优化排产规则。在意大利都灵工厂的实践中,系统发现喷涂颜色切换是影响整体效率的主要瓶颈之一。通过优化颜色切换顺序,将颜色更换次数减少了35%,仅此一项每年就节省了约200万欧元的成本。系统还建立了供应链风险预警机制,当监测到供应商可能出现问题时,会提前建议调整生产计划,避免生产中断。这种预见性排产能力在近年供应链不稳定的环境下显得尤为重要。

摘要

微信4.1.x.x版本的UI采用新的框架开发,能够获取到的信息有限,目前只能获取到消息列表的控件内容。

image.png

代码

# -*- coding: utf-8 -*-
# pip install pyqt5 uiautomation
import sys
import re
import datetime
import uiautomation as auto
from PyQt5 import QtCore, QtWidgets

TARGET_DEPTH = 14


def is_time_line(text: str):
    text = text.strip()
    return bool(re.match(r'^\d{1,2}:\d{2}$', text) or re.match(r'^\d{2}/\d{2}$', text))


def parse_session(name_block: str):
    lines = [l.strip() for l in name_block.splitlines()]
    lines = [l for l in lines if l]
    if not lines:
        return None

    session_name = lines[0]
    time_text = None
    for l in reversed(lines):
        if is_time_line(l):
            time_text = l
            break

    ignore_keywords = ['已置顶', '消息免打扰', '撤销']
    message_line = None
    for l in lines[1:]:
        if l == time_text:
            continue
        if any(k in l for k in ignore_keywords):
            continue
        message_line = l

    if not message_line:
        return None

    msg_type = "文本"
    if ':' in message_line:
        sender, content = message_line.split(':', 1)
        return {
            "group_name": session_name,
            "sender": sender.strip().strip('"'),
            "content": content.strip(),
            "time": time_text,
            "msg_type": msg_type
        }

    return {
        "group_name": session_name,
        "sender": "我",
        "content": message_line,
        "time": time_text,
        "msg_type": msg_type
    }


def time_to_sort_key(time_str):
    """把 HH:MM 或 MM/DD 转成 datetime,用于排序"""
    if not time_str:
        return datetime.datetime.min
    try:
        if re.match(r'^\d{1,2}:\d{2}$', time_str):
            h, m = map(int, time_str.split(":"))
            now = datetime.datetime.now()
            return datetime.datetime(now.year, now.month, now.day, h, m)
        elif re.match(r'^\d{2}/\d{2}$', time_str):
            month, day = map(int, time_str.split("/"))
            now = datetime.datetime.now()
            return datetime.datetime(now.year, month, day)
    except:
        return datetime.datetime.min
    return datetime.datetime.min


class FetchThread(QtCore.QThread):
    data_signal = QtCore.pyqtSignal(list)

    def __init__(self, interval=1.5):
        super().__init__()
        self.interval = interval
        self._running = False
        auto.SetGlobalSearchTimeout(10)

    def run(self):
        self._running = True
        while self._running:
            try:
                results = self.fetch_data()
                if results:
                    # 按时间倒序排序
                    results.sort(key=lambda x: time_to_sort_key(x.get("time")), reverse=True)
                    self.data_signal.emit(results)
            except:
                pass
            self.msleep(int(self.interval * 1000))

    def stop(self):
        self._running = False

    def set_interval(self, interval):
        self.interval = interval

    def fetch_data(self):
        result_list = []
        root = auto.GetRootControl()
        target = root.Control(searchDepth=5, ClassName='mmui::MainWindow')
        if not target.Exists(2):
            return result_list

        def dump(control, depth=0):
            if depth == TARGET_DEPTH:
                try:
                    if control.ClassName == 'mmui::ChatSessionCell' and control.Name:
                        result = parse_session(control.Name)
                        if result:
                            result_list.append(result)
                except:
                    pass
                return
            for child in control.GetChildren():
                dump(child, depth + 1)

        dump(target)
        return result_list


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1300, 690)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.main_layout = QtWidgets.QVBoxLayout(self)
        self.main_layout.setContentsMargins(8, 8, 8, 8)

        self.container = QtWidgets.QFrame()
        self.container.setObjectName("container")
        self.container_layout = QtWidgets.QVBoxLayout(self.container)
        self.container_layout.setContentsMargins(20, 20, 20, 20)
        self.main_layout.addWidget(self.container)

        # 顶部栏
        title_bar = QtWidgets.QHBoxLayout()
        self.container_layout.addLayout(title_bar)
        self.title = QtWidgets.QLabel("微信会话实时监听")
        self.title.setStyleSheet("font-size:18px;font-weight:bold;")
        self.close_btn = QtWidgets.QPushButton("✕")
        self.close_btn.setFixedSize(36, 32)
        self.close_btn.clicked.connect(self.close)
        title_bar.addWidget(self.title)
        title_bar.addStretch()
        title_bar.addWidget(self.close_btn)

        # 切换按钮
        self.toggle_btn = QtWidgets.QPushButton()
        self.toggle_btn.setFixedSize(120, 60)
        self.toggle_btn.setStyleSheet("font-size:18px;font-weight:bold;")
        self.container_layout.addWidget(self.toggle_btn, alignment=QtCore.Qt.AlignLeft)

        # 表格
        self.table = QtWidgets.QTableWidget()
        self.table.setColumnCount(5)
        self.table.setHorizontalHeaderLabels(
            ["昵称", "发送者", "消息类型", "内容", "时间"]
        )
        self.table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        self.table.verticalHeader().setVisible(False)
        self.table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.table.setWordWrap(True)
        self.container_layout.addWidget(self.table)

        # 线程
        self.thread = FetchThread(interval=1.5)
        self.thread.data_signal.connect(self.update_table)

        self.toggle_btn.clicked.connect(self.toggle_listen)

        self.setStyleSheet("""
        QWidget {
            font-family: "Microsoft YaHei";
            color: #e6e6e6;
        }
        #container {
            background-color: #1e1f26;
            border-radius: 14px;
        }
        QPushButton {
            border-radius: 10px;
            font-size:18px;
            font-weight:bold;
        }
        QTableWidget {
            background-color: #232530;
            gridline-color: #2f3240;
        }
        QHeaderView::section {
            background-color: #2d2f3a;
            border: none;
            padding: 6px;
        }
        """)

        self._drag_pos = None
        self.listening = False
        self.start_listen()
        self.shown_msgs = set()

    # 拖动
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self._drag_pos = event.globalPos() - self.frameGeometry().topLeft()
            event.accept()

    def mouseMoveEvent(self, event):
        if self._drag_pos and event.buttons() == QtCore.Qt.LeftButton:
            self.move(event.globalPos() - self._drag_pos)
            event.accept()

    def mouseReleaseEvent(self, event):
        self._drag_pos = None

    # 监听控制
    def toggle_listen(self):
        if self.listening:
            self.stop_listen()
        else:
            self.start_listen()

    def start_listen(self):
        if not self.thread.isRunning():
            self.thread.start()
        self.listening = True
        self.toggle_btn.setText("停止监听")
        self.toggle_btn.setStyleSheet("""
            QPushButton {
                background-color: #c0392b;
                border-radius: 10px;
                font-size:18px;
                font-weight:bold;
            }
            QPushButton:hover {
                background-color: #e74c3c;
            }
        """)

    def stop_listen(self):
        self.thread.stop()
        self.listening = False
        self.toggle_btn.setText("开始监听")
        self.toggle_btn.setStyleSheet("""
            QPushButton {
                background-color: #27ae60;
                border-radius: 10px;
                font-size:18px;
                font-weight:bold;
            }
            QPushButton:hover {
                background-color: #2ecc71;
            }
        """)

    # 表格追加,最新在上
    def add_center_item(self, row, col, text):
        item = QtWidgets.QTableWidgetItem(text)
        item.setTextAlignment(QtCore.Qt.AlignCenter)
        self.table.setItem(row, col, item)

    # 修改 update_table 方法
    def update_table(self, data):
        for item in data:
            msg_key = (item["group_name"], item["sender"], item["content"], item["time"])
            if msg_key in self.shown_msgs:
                continue  # 已渲染过就跳过
            self.shown_msgs.add(msg_key)

            self.table.insertRow(0)  # 最新消息插在最上面
            self.add_center_item(0, 0, item["group_name"])
            self.add_center_item(0, 1, item["sender"])
            self.add_center_item(0, 2, item["msg_type"])
            content_item = QtWidgets.QTableWidgetItem(item["content"])
            content_item.setTextAlignment(QtCore.Qt.AlignCenter)
            content_item.setToolTip(item["content"])
            self.table.setItem(0, 3, content_item)
            self.add_center_item(0, 4, item["time"] or "")
            self.table.setRowHeight(0, 60)
            self.table.setColumnWidth(3, 300)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

界面

image.png

本文作者

TANKING

"呼噜娃" 是我为了监控自己晚上睡觉是否呼噜而制作的一个 App ,发布之后没想到进入了医疗付费榜前三。陆续有朋友问一些工具上的问题,在这里总结一下

主要开发周期:1 月 20 日到 2 月 2 日

用到的一些工具:

  1. vibe coding
    1. coding agent: opencode (主力) & claude code (难解决的问题换个工具帮帮忙)
    2. 模型:kimi k2.5 (主力,当时 kimi k2.5 刚发布,opencode 里可以免费使用,用下来感觉还不错) & claude opus 4.5
  2. 呼噜娃这个可爱的图标:
    1. 生成 gemini (nano banana): https://gemini.google.com/app/92b59d7915f185f3
    2. 水印去除: https://banana.ovo.re/
    3. 多平台图标生成: https://appiconmaker.co/
  3. 海报制作:
    1. 直接截图 App 使用界面
    2. 用使用界面制作介绍页: https://yuzu-hub.github.io/appscreen/

起因是过年经常和朋友玩 21 点、牛牛等扑克牌游戏
这时候大家都会用计算器/小程序记分
于是想着试着用 ai 弄一个,由于业务比较简单,很快就出来了
这种会不会有风险的?
注:页面不涉及金钱字眼,都是分


是不是必须备案

thanks

「2Libra 」—— To Balance,走向平衡。 这是一个以 工作与生活的平衡 为核心的社区。

这个帖子会给你带来一些帮助与指引,目的是可以让你更好的熟悉这里。

基本原则

  • 友好第一:请尊重他人,避免人身攻击、恶意挑衅或阴阳怪气;
  • 理性讨论:表达不同意见时,请用逻辑和事实,而非情绪和标签;
  • 平等交流:不论新手还是老手,都应同等的进行交流。

帮助文档

站内页脚可以进入 帮助文档 ,里面包含了大部分站内的规则约束以及功能介绍。里面有:

新功能发布我都会在站内置顶提示,可以查看我发布的历史帖子: https://2libra.com/user/Jimmy/post

常见问题

如何上传图片

站内没有自带图片上传功能,可以使用 Markdown 格式插入图片链接 直接显示。如果可以的话,学习 Markdown 的语法会让输入和排版更容易。

邀请码

请不要注册后就直接发送邀请码索取的帖子,这类内容很可能会被守护者移动到黑洞中。

内容被判违规

本站大部分内容的违规均由 AI 做判断,若出现判断失误,可以随时@守护者进行处理。目前的守护者有:
@JoeJoeJoe @Jimmy @wintermute @bopomofo @utags @0x7C00 @lin @cnskis @353804

本帖内容会在后续随时编辑。

2026年做UI设计,早就不只是画个界面那么简单了。设计师不光要高效做好原型,还得保证设计风格统一,更要让开发能直接用上设计对应的代码。选对一款合适的设计工具,不管是工作效率还是产品质量,都会受直接影响。今天就给大家盘点几款设计师常用的UI设计软件,从咱们国内软件设计产品,到几款海外热门工具,每一款都有自己的优势,值得大家了解参考。

  1. UXbot
    这是一款很懂国内设计师需求的国产新工具,上手完全没有难度。UXbot 聚焦产品原型、UI 设计与前端开发全链路的 AI智能平台。用户无需代码基础,通过文字描述即可生成高保真多页面原型,支持像素级编辑与沉浸式交互设计;基于云端共享功能,可实现跨角色高效协同,显著提升团队沟通与迭代效率。
    image.png

UXbot可将生成的设计稿直接生成为Web(Vue)、iOS(Swift)、Android(Kotlin)代码,支持编译成APK文件,安装至真机测试使用。这大大缩短了从设计到开发的周期,降低了出错风险。
UXbot最核心的价值就是打破了技术壁垒,集网页和应用界面设计、可交互原型制作、Web/iOS/Android前端代码生成为一体。哪怕完全没有代码基础,也能把脑子里的想法,或是细致的产品需求,变成有完整使用流程、交互效果出色的多页面项目。
不管是设计师打磨视觉效果、产品经理测试功能逻辑,还是前端开发实现设计和交互,UXbot都能帮上忙。全球的中小企业、创作者,不用懂代码就能快速做出有品牌特色、够专业的线上平台,不管是跨境电商、个人品牌展示,还是服务型企业拓客,都能适配。
image.png

  1. Figma
    Figma是全球广泛使用的设计工具,支持多端实时协作。设计师、产品经理和开发可以在同一项目中查看、编辑和评论,提升团队沟通效率。其插件生态完善,可实现图标库、设计系统和流程图整合,适合跨地域协作项目。
    image.png
  2. Sketch
    Sketch在Mac平台上仍具备高精度界面设计优势,支持丰富插件扩展,可实现自动布局、组件库管理和原型联动。对于追求高精度UI和复杂界面的设计团队,仍是值得选择的工具。但在团队实时协作上,需要依赖第三方平台。
    image.png
  3. Adobe XD
    Adobe XD专注于界面原型和交互动效,支持跨平台原型分享和用户测试。其组件和动画功能适合展示产品交互逻辑,但在代码生成和变量系统上不如UXbot便利。
    image.png
  4. Webflow
    Webflow 是一款可视化的前端设计工具,设计师可以直接在界面中布局元素,同时生成 HTML、CSS 和 JS 代码。它适合做网页原型和落地页面,不仅能快速呈现设计效果,还能直接交付开发使用。相比传统工具,Webflow 在前端交付效率上有明显优势,但在复杂组件和移动端应用设计上,仍需配合其他工具。
    image.png

一、引言

在企业数字化转型浪潮中,CRM(客户关系管理)系统已从单一的客户管理工具,升级为覆盖获客、销售、项目、上下游协同的全链路业务中枢。不同行业、规模的企业对CRM的需求差异显著:有的侧重全业务一体化,有的需要深度定制,有的聚焦海外营销协同。本文选取市场上8款主流CRM产品——超兔一体云、SugarCRM、HubSpot CRM、SuiteCRM、Freshsales、管家婆、 飞书 CRM、红圈CRM,从客户中心、公海管理、项目管理、上下游管理、自定义能力五大核心维度展开深度横评,为企业选型提供专业参考。

二、核心能力全景对比表

为直观呈现各产品的能力差异,先通过核心对比表格梳理关键特性:

品牌客户中心核心能力公海管理项目管理上下游管理自定义能力
超兔一体云多渠道获客+AI补全信息,全生命周期客池分层,AI生成工作流,精细数据权限灵活领用规则,自动释放,数据监控多方项目跟单模型,360°视图,业财一体管控OpenCRM打通内外,进销存+上下游协同功能白名单,自定义菜单/工作台/业务表/多表聚合
SugarCRM全生命周期管理(客户/线索/联系人/商机),全球化多语言,10个客户服务功能未明确提及无原生项目管理模块无原生上下游协同功能开源代码级定制,Sugar Studio可视化配置
HubSpot CRM多渠道营销线索整合,线索评分,轻量级客户视图,免费基础版基础线索分配,无分层客池机制轻量级任务管理,需集成第三方工具无原生进销存/采购模块,依赖第三方财务工具可视化工作流配置,基础定制,需依赖生态插件
SuiteCRM360°客户视图,全渠道互动数据整合内置公海/私海客池,自动分配回收规则原生能力弱,需自定义模块或集成第三方工具无原生上下游模块,需通过自定义字段/插件实现基础协同开源代码级定制,灵活调整表单、流程及模块
FreshsalesFreddy AI驱动智能客户管理,多渠道统一接入,智能跟进建议动态公海分配+AI线索评分优先推送高价值客户无原生项目模块,需集成Asana等第三方工具无专门上下游管理模块,聚焦销售与客户沟通场景低代码表单与流程配置,深度定制需依赖低代码工具
管家婆多维度标签分类管理,客户全生命周期记录,个性化提醒,与进销存系统实时联动未明确提及服务工单全流程跟踪,自定义项目报表,销售闭环联动进销存进销存实时联动,简单供应商/客户分类管理自定义报表、字段,灵活性弱于PaaS平台
飞书CRM360°客户画像,自动查重补漏,多角色协同权限管理未明确提及匹配不同商机管理模式,销售漏斗精细分析,多视图自定义呈现未明确提及自定义商机阶段、合同打印模板、数据分析维度
红圈CRM全生命周期动态数据管理,批量操作支持,多维度统计分析未明确提及PaaS平台适配复杂项目流程,销售漏斗预测业绩未明确提及PaaS高度灵活扩展,行业垂直定制,自定义报表工具

三、分维度深度对比

3.1 客户中心:从获客到留存的全生命周期闭环

客户中心是CRM的核心,核心能力聚焦获客效率、数据完整性、生命周期管控、智能辅助四大维度。

关键差异分析:

  • 超兔一体云:在获客阶段实现多渠道线索一键接入(百度/巨量引擎/官网/微信等),并通过AI自动补全工商信息、社交头像昵称,解决销售信息不对称问题;同时基于客户状态自动分层至“需求培养/有需求/目标”等客池,配合AI生成的工作流实现自动化跟进,精细的数据权限设置(如财务仅看财务数据)保障数据安全。
  • HubSpot CRM:侧重营销端线索整合,通过营销自动化捕获多渠道(邮件/海外社交/网站)免费线索,线索评分系统帮助销售优先跟进高转化潜力客户,适合中小外贸/营销驱动型企业,免费基础版降低入门门槛。
  • SugarCRM/SuiteCRM:主打全生命周期标准化管理,覆盖客户、线索、联系人、商机全节点,SugarCRM的全球化多语言支持+10个客户服务功能更适配跨国企业。
  • 红圈 CRM / 飞书 CRM:红圈侧重动态数据沉淀与批量操作,飞书依托飞书生态实现多角色协同,适合内部协作需求强的企业。

典型流程对比(Mermaid流程图):

超兔一体云客户生命周期自动化流程:

flowchart LR
    A[多渠道获客(广告/落地页/微信等)] --> B[AI智能查重+补全工商/社交信息]
    B --> C[自动分层至对应客池(需求培养/有需求/目标等)]
    C --> D[AI生成自定义工作流(自动更新状态/发送提醒)]
    D --> E[销售针对性跟进(产品介绍/方案沟通/商务谈判)]
    E --> F[阶段转化(成功成交/流失回收)]
    F --> G[数据权限分级展示(销售看详情/财务看数据)]
HubSpot CRM营销线索转化流程:

flowchart LR
    A[营销自动化捕获线索(邮件/社交/网站)] --> B[线索评分系统分级]
    B --> C[轻量级客户视图整合互动数据]
    C --> D[销售优先跟进高评分线索]
    D --> E[交易跟踪与转化]
    E --> F[客户服务模块承接售后留存]

3.2 公海管理:客户资源的高效分配与盘活

公海管理是解决销售资源闲置、撞单问题的核心机制,仅部分产品具备成熟能力:

关键差异分析:

  • 超兔一体云:是公海管理最完善的产品,支持管理员自定义领用规则(如销售领用上限、跟进期限),未按时跟进的客户自动释放回公海,系统实时监控公海客户数量、认领率、转化率等指标,帮助管理层优化资源分配。
  • SuiteCRM:内置公海/私海客池,支持线索自动分配与回收规则,基础能力完备但缺乏数据监控与精细化配置。
  • Freshsales:结合AI线索评分实现动态公海分配,优先推送高价值客户给销售,提升跟进效率。
  • HubSpot CRM:仅支持基础线索分配,无客池分层与自动释放机制,适合线索量少的中小企业。

公海管理核心规则时序图(Mermaid):

sequenceDiagram
    participant Admin as 系统管理员
    participant System as CRM系统
    participant SalesA as 销售A
    participant SalesB as 销售B

    Admin->>System: 配置公海规则(领用上限:5个/人,跟进期限:7天)
    SalesA->>System: 认领公海客户X
    System->>SalesA: 分配客户X,启动7天跟进计时
    alt 7天内提交跟进记录
        SalesA->>System: 上传客户X沟通记录
        System->>System: 客户X留存至SalesA私池
    else 7天内未跟进
        System->>System: 自动释放客户X回公海
        System->>SalesB: 推送公海新客户提醒
        System->>Admin: 同步公海数据报表(认领率/释放率)
    end

3.3 项目管理:从商机到交付的全流程管控

项目管理能力决定CRM是否能支撑复杂项目型业务,差异主要体现在项目模型适配、业财协同、可视化跟踪

关键差异分析:

  • 超兔一体云:独创多方项目跟单模型,适用于大型项目交付(如工程、设备销售),在一个项目视图内实现项目组、合同、采购、收支的全周期管控,360°跟单视图记录外勤拜访、待办任务,自动生成销售日报,业财一体锁库、供应商直发等功能优化供应链效率。
  • 红圈 CRM:基于PaaS平台适配复杂项目流程,支持销售全流程(线索-商机-成交)的自定义配置,销售漏斗分析帮助预测业绩,适合建筑、快消等垂直行业。
  • 飞书 CRM:匹配不同销售类型的商机管理模式,通过表格、甘特图多视图呈现项目信息,管理层可实时掌握关键节点,适合内部协作需求强的企业。
  • 其他品牌:SugarCRM/HubSpot/Freshsales均无原生项目模块,需集成第三方工具,仅支持轻量级任务管理。

超兔多方项目管理流程(Mermaid流程图):

flowchart LR
    A[创建多方项目] --> B[关联项目组/合同订单/供应商]
    B --> C[360°跟单视图记录(外勤拜访/待办任务/沟通记录)]
    C --> D[订单自动生成采购计划/锁库/供应商直发]
    D --> E[收支管控(回款跟踪/付款申请/财务对账)]
    E --> F[自动生成销售日报/项目报表]
    F --> G[项目验收与复盘]

3.4 上下游管理:从内控到外联的全链路协同

上下游管理能力是CRM从“内部工具”升级为“业务中枢”的关键,差异主要体现在链路闭环能力、内外协同效率

关键差异分析:

  • 超兔一体云:通过独创的OpenCRM架构打通企业内部CRM与上下游伙伴的业务数据,实现从询价、采购、发货到对账、开票、售后的全流程协同,解决了传统CRM仅管内部的痛点,适合贸易型、项目型企业。
  • 管家婆:依托进销存系统实现客户订单与供应商备货的实时联动,适合中小零售/服务型企业,但仅支持简单分类管理,无深度协同能力。
  • 其他品牌:均无原生上下游模块,需依赖第三方工具实现业财协同,无法形成全链路闭环。

超兔OpenCRM上下游协同流程(Mermaid流程图):

flowchart LR
    A[内部CRM客户订单] --> B[OpenCRM平台同步至供应商]
    B --> C[供应商确认采购单/备货发货]
    C --> D[物流信息同步至客户小程序/网页]
    D --> E[客户验收/发起售后]
    E --> F[内部CRM自动同步收支/对账数据]
    F --> G[财务生成发票/完成结算]

3.5 自定义能力:适配企业个性化需求的灵活性

自定义能力决定CRM能否适配企业独特的业务流程,主要分为代码级定制、 低代码 定制、基础定制三个层级:

关键差异分析:

  • 红圈 CRM /SuiteCRM/SugarCRM:属于代码级定制层级,红圈基于PaaS平台支持行业垂直定制(如建筑、快消),SuiteCRM/SugarCRM依托开源架构实现代码级扩展,适合有技术团队的中大型企业。
  • 超兔一体云/ 飞书 CRM /Freshsales:属于低代码定制层级,超兔支持自定义工作台、业务表、多表聚合,飞书依托飞书生态实现商机阶段、打印模板自定义,Freshsales提供低代码表单配置,适合无技术团队但有个性化需求的企业。
  • HubSpot CRM /管家婆:属于基础定制层级,仅支持可视化工作流、自定义报表等基础配置,深度需求需依赖生态插件或第三方工具。

自定义能力层级脑图(Mermaid):

mindmap
    root((CRM自定义能力层级))
        代码级深度定制
            红圈CRM(PaaS平台:行业垂直定制)
            SuiteCRM(开源:代码级调整表单/流程)
            SugarCRM(开源:Sugar Studio+代码定制)
        低代码可视化定制
            超兔一体云(自定义菜单/工作台/业务表/多表聚合)
            Freshsales(低代码表单/流程配置)
            飞书CRM(自定义商机阶段/打印模板/数据维度)
        基础生态化定制
            HubSpot CRM(可视化工作流+生态插件)
            管家婆(自定义报表/字段)

四、核心能力雷达图评分(满分10分)

品牌客户中心公海管理项目管理上下游管理自定义能力综合得分
超兔一体云9.5999.599.2
SugarCRM800093.4
HubSpot CRM7.553264.7
SuiteCRM87328.55.7
Freshsales8.57.53275.6
管家婆706654.8
飞书CRM80707.54.5
红圈CRM8.50809.55.2

五、选型建议

根据企业规模、业务类型、技术能力,给出针对性选型建议:

  1. 全业务一体化需求(贸易/项目型企业) :优先选择超兔一体云,其OpenCRM架构实现上下游协同,多方项目模型支撑复杂项目管控,业财一体能力覆盖进销存、财务全流程,适合需要全链路闭环的企业。
  2. 技术驱动的深度定制需求:选择红圈 CRM 、SuiteCRM、SugarCRM,红圈适合垂直行业复杂流程,SuiteCRM/SugarCRM适合有技术团队的企业进行代码级定制。
  3. 海外营销为主的中小微企业:选择HubSpot CRM,免费基础版降低门槛,多渠道营销线索整合能力强,适配海外社交/邮件营销场景。
  4. 中小零售/服务型企业(需进销存联动) :选择管家婆,简单易用,进销存与客户管理联动,满足基础业务需求。
  5. 飞书 生态内企业:选择飞书 CRM,与飞书办公套件深度协同,多角色权限管理适配内部协作需求。
  6. 跨国企业全球化需求:选择SugarCRM,多语言支持+全球化客户服务功能适配跨国业务场景。

六、总结

本次横评覆盖了从通用CRM到一体化CRM的主流产品,核心差异在于是否能实现全链路协同、是否适配复杂业务、自定义灵活性。超兔一体云凭借全业务一体化能力在综合评分中领先,适合需要全流程管控的企业;而开源CRM(Sugar/Suite)、PaaS型CRM(红圈)则适合有深度定制需求的企业;HubSpot、管家婆等则聚焦特定场景的中小微企业需求。企业选型需结合自身业务痛点、技术能力、预算等因素,选择最适配的CRM系统。

近日,Cybersec Asia 2026 在泰国曼谷诗丽吉王后国家会议中心(QSNCC)顺利举办。作为亚太地区极具影响力的数字安全盛会,展会精准汇聚东南亚各国政府安全监管机构、重点行业技术决策者,成为中国网络安全与合规科技企业展示实力、对接国际资源的关键平台。

在中国馆组织方斯元Z-ONE的牵头下,八家中国科技企业以“抱团出海”的形式联合参展,集中展示了适配东南亚市场需求的技术解决方案,充分展现了中国在网络安全与数字合规领域的整体实力与国际化潜力。

八家厂商各展所长,精准对接区域需求

此次参展的中国厂商包括:Ansign(HK)(安证通香港公司)、Mandarin Tech(斗斗鱼科技)、Green Radar、TrustAsia(亚洲诚信)、Cyberserval(薮猫科技)、Vinchin(云祺科技)、WuThreat(无胁科技)以及Netchina Cloud Security(中网云安)。各家厂商均带来了具有本地化适配能力的产品与解决方案,涵盖电子签名、基础防护、AI威胁检测、数据加密、终端风控、数据备份、漏洞检测、云安全等多个领域。

安证通香港(Ansign(HK)) 作为北京安证通全资海外主体,携海外签产品iTrustSign全球合规电子签名平台亮相展会。其平台:遵循欧盟eIDAS、美国ESIGN、GDPR 等合规与可靠电子签名要求,符合100+国家和地区电子签名法律;整合全球权威 CA 数字证书资源,支持实名认证、合同签署、存证归档全链路,可生成司法证据包;提供SaaS、混合云、私有化等灵活服务方式;全面赋能跨境贸易、金融合作、政府政务及公共事业等全球各类电子签名与认证场景。充分彰显了北京安证通在跨境合规电子签名领域的深厚实力。

Mandarin Tech(斗斗鱼科技)聚焦网络安全基础防护,此次重点展示适配东南亚中小企业的轻量化安全产品,兼顾合规性与高性价比,依托自身软件和信息技术服务积淀,助力当地中小企业低成本筑牢数字安全基础,快速适配区域数字化转型节奏。

Green Radar深耕AI安全与威胁检测领域,此次展出基于云端实时防护技术的核心解决方案,可有效抵御Web威胁与Bot程序渗透,精准适配东南亚企业数字化转型中面临的网络安全痛点,为当地企业提供高效、便捷的威胁防护支撑。

TrustAsia(亚洲诚信)作为具备国内CA与国际CA双重资质的企业,此次重点展示数字证书、商用密码及物联网安全相关基础解决方案,适配东南亚物联网产业快速发展的需求,凭借成熟的国际合规能力,为当地企业提供安全、合规的身份认证与数据加密服务。

Cyberserval(薮猫科技)主打安全风控与动态防御,此次带来行为生物特征识别、合同条款风控扫描等特色功能及终端威胁检测与响应相关产品,精准对接东南亚企业网络安全风控需求,助力当地企业防范各类网络安全风险。

Vinchin(云祺科技)专注数据备份与容灾领域,此次展出适配区域需求的无代理备份相关产品,支持多平台适配,可满足东南亚金融、电信等重点行业的核心数据保护需求,兼顾高效性与区域数据主权合规要求,为当地企业数据安全保驾护航。

WuThreat(无胁科技)聚焦漏洞检测与网络韧性建设,此次展示的核心技术成果可帮助东南亚企业精准发现网络漏洞、提升网络抗攻击能力,筑牢数字安全防线,适配当地企业提升网络韧性的核心需求。

Netchina Cloud Security(中网云安)聚焦云安全与云计算服务安全评估,此次带来适配东南亚本地数据中心的基础云安全防护方案,符合欧盟GDPR及东南亚各国数据隐私法规,助力当地企业安全上云、合规转型。

国际嘉宾高度认可,现场达成多项合作意向

展会期间,Ms. Panadda Kongma、Dr. Jaruwan Suwannasat等重要嘉宾专程到访中国馆,与八家中国厂商代表深入交流,并对中国厂商的技术优势与解决方案适配性给予高度认可。现场,八家厂商与当地潜在合作伙伴达成多项初步合作意向,展现出中国科技产品在东南亚市场的广阔前景。

抱团出海,迈向国际化新阶段

此次八家厂商的集体亮相,不仅实现了与东南亚市场的精准对接,也提升了中国在数字安全与合规科技领域的国际影响力。作为组织方,斯元Z-ONE表示,未来将继续发挥桥梁作用,推动更多中国企业参与国际交流与合作。

Ansign(HK)、TrustAsia等参展企业也表示,将以此次展会为契机,持续优化产品与解决方案,深化与东南亚政府及企业的合作,助力中国网络安全技术与合规服务在区域内的广泛应用,共同书写中国科技企业出海东南亚的新篇章。

产品设计的朋友,估计都被一个问题难住过:画原型到底用啥工具?有人说Axure最专业,有人觉得Sketch做UI最灵活,还有人强推UXbot效率拉满。转眼到了2026年,这三款工具到底该怎么选,才能不踩坑、少走弯路?
今天这篇,我就从大家实际工作中最关心的使用场景、功能特点、协作方式,还有国内环境适配度这几个角度,一次性讲明白——UXbot、Axure、Sketch各自适合谁,要是用错了,到底会多走多少冤枉路。

一、三款工具核心特点拆解

  1. UXbot:主打一站式设计&开发协作
    UXbot 不只是画原型的工具,不用懂代码、不用切换软件,就能搞定原型从想法生成、细节修改,到演示、团队协作、前端开发的全流程,省时又省心。
    核心亮点:
    ● 快速生成:只需要一句话描述或示例截图,UXbot就能自动梳理原型流程,一键生成整套可交互的原型界面,比手动画快好几倍。
    ● 精准编辑:生成后可随意调布局、改样式、换图文,操作简单,非专业设计师也能上手,贴合实际需求。
    ● 即时演示:一键生成可交互演示版,模拟真实使用流程,团队评审、客户演示都直观有说服力。
    ● 多端适配:高保真原型可直接驱动生成Web前端代码以及iOS、Android双端原生代码,1:1还原真机体验,还能直接安装测试,减少返工。
    ● 团队协作:支持原型导出和权限共享,成员可在线协作编辑,不用来回传文件,协作更顺畅。
    适用人群:产品经理、UI/UX设计师、创业小团队等,只要想快速出原型、高效协作、同步开发,选UXbot准没错。
    image.png
  2. Axure:复杂逻辑原型的“老大哥
    Axure算是原型工具里的“老前辈”了,它没有什么花里胡哨的功能,最大的优势就是:逻辑和交互能力极强,专门搞定复杂需求。
    核心特点总结3点,一看就懂:
    ● 能搞定复杂交互:支持条件判断、变量、动态面板,再复杂的交互逻辑都能实现;
    ● 擅长复杂流程:做那种步骤多、逻辑绕的业务流程,它比另外两款更稳妥;
    ● 偏功能不偏视觉:重点放在“功能演示”上,视觉呈现不是它的强项,更适合做“功能型原型”。
    适合谁用:主要适合做B端系统、后台管理系统,还有那些复杂流程产品的产品经理,普通简单原型用它就有点“大材小用”了。
    image.png
  3. Sketch:视觉设计师的“专属工具”(非纯原型工具)
    这里要跟大家澄清一下,Sketch本质上是一款UI设计工具,不是专门用来画原型的,只是很多人习惯用它顺带做原型。
    核心特点很鲜明:
    ● 视觉自由度高:做界面视觉设计特别顺手,能满足设计师的各种个性化需求;
    ● 插件丰富:各种辅助插件特别多,做App界面的时候能省不少力;
    ● 短板明显:交互能力和团队协作功能,比UXbot、Axure差不少,不适合复杂交互和多人协作场景。
    适合谁用:主要是纯UI设计师,还有那些更看重界面视觉表现、不太需要复杂交互的项目,产品经理单纯画原型的话,不建议优先选它。
    image.png

二、三款工具对比表
image.png

如果你想快速出方案,设计-开发0摩擦,还想靠AI大幅提效,选UXbot最省心;要是你的产品核心是复杂业务逻辑、需要精准演示流程,Axure是稳妥之选;而如果你的工作重点是界面视觉设计,不太需要复杂交互,那Sketch更适合你。

三、2026年产品经理,优先选谁?
2026年做产品,大家面对的都是需求变化快、沟通对象多、交付节奏紧的工作环境,这种情况下,UXbot无疑是更现实、更高效的选择。
尤其是对那些需要快速验证产品想法、频繁跟开发、老板、客户对齐方案,还想借助AI提升效率的产品经理来说,UXbot早就超出了“画原型”的范畴——你只要说一句话,就能生成可直接编辑的原型页面,还能自动输出成套的多页面结构,而且生成的不是静态图片,是能改文字、调布局完整可交互的设计稿,并且还能同步生成Web、iOS、Android的原生代码,还支持编译成APK文件,安装到手机。
举个例子,你输入“帮我设计一个电商App的个人中心页,要有订单、收藏、地址管理”,几秒钟就能得到一个结构完整、风格统一,还能直接深化优化的高保真页面,并且同步生成多端前端代码,从想法到开发的时间,直接缩短一大半。

四、从设计到开发,UXbot能直接“交付到位”
很多朋友用Axure或Sketch时,最后都会卡在同一个难题上:设计稿做完了,怎么顺利交给开发?反复沟通、解释设计细节,特别耗时。
而UXbot在这方面的优势,真的很突出。它不仅有专门的开发者模式,支持完整的代码导出,最关键的是,它有设计转代码能力——简单说就是,生成的设计稿能直接对接前端开发,大幅减少开发对图的理解偏差,也不用你反复解释设计要求。
对产品经理来说,这意味着你的工作不再是“我画完原型就完事”,而是真正实现了“我能顺利交付,推动落地”。

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程→https://go.hyper.ai/PEh1Q

在深入了解 TensorIR 之前,我们先介绍什么是原始张量函数(primitive tensor function)。原始张量函数指的是代表单个「计算单元」的函数。例如,一个卷积操作可以是一个原始张量函数,一个融合了卷积与 relu 的操作也可以是一个原始张量函数。通常,原始张量函数的抽象包含以下几个要素:多维缓冲区(multi-dimensional buffers)、驱动张量计算的循环嵌套(loop nests)以及计算语句本身。

from tvm.script import tir as T

@T.prim_func
def main(
    A: T.Buffer((128,), "float32"),
    B: T.Buffer((128,), "float32"),
    C: T.Buffer((128,), "float32"),
) -> None:
    for i in range(128):
        with T.block("C"):
            vi = T.axis.spatial(128, i)
            C[vi] = A[vi] + B[vi]

张量程序的关键元素

上面展示的原始张量函数计算了两个向量的逐元素加法。这个函数:

  • 接收三个多维缓冲区作为参数,并生成一个多维缓冲区作为输出。
  • 包含一个简单的循环嵌套 i 来驱动计算过程。
  • 包含一个计算语句,用于计算两个向量的逐元素加和。

TensorIR 中的额外结构

需要注意的是,我们无法对程序执行任意的变换,因为某些计算依赖于循环的顺序。幸运的是,我们关注的大多数原始张量函数具有良好的性质,例如循环迭代之间相互独立。例如,前面的程序中包含了块(block)和迭代(iteration)的注解信息:

  • 块注解 with T.block("C") 表示该块是调度中指定的基本计算单元。一个 block 可以只包含一条计算语句,也可以包含带有循环的多条语句,甚至是一些无法透视的内在指令(如 Tensor Core 指令)。
  • 迭代注解 T.axis.spatial 表示变量 vi 映射到 i,并且所有迭代是独立的。

虽然这些信息对于执行特定程序并非关键,但在变换程序时却非常有用。因此,只要我们访问了索引从 0 到 128 的所有元素,就可以放心地并行化或重排与 vi 相关的循环。