从一次让人头皮发麻的代码评审说起。上周三下午同事推了一个改动 600 行的大 PR涉及三个服务、两个数据库表结构变更。我打开 GitHub 的 diff 页面逐行往下翻翻了二十多分钟才看完主干逻辑刚要发表意见发现他后来又推了两轮 commit把之前的问题改了大半但也引入了新问题。那一刻我就在想代码审查这件事靠纯人力去堆效率天花板实在太低了。后来我在团队里尝试引入了 open-code-review 这个开源项目把一部分重复性、规则性的审查工作交给自动化工具去扛情况才慢慢有了改观。这篇文章不打算写成一份开源项目的说明书而是想把我这段时间用 open-code-review 的真实体验、踩过的坑、以及对代码审查这件事本身的理解一起梳理出来。适合正在寻找代码审查提效方案的团队、想给个人项目引入自动审查的独立开发者以及所有被 PR 评审搞得焦头烂额的工程师们。1. 代码审查为什么会变成团队的隐形负担1.1 审查流程中的常见困境代码审查本应该是一个质量保障手段但在很多团队里它慢慢变成了一种形式化的流程负担。PR 发出来没人看或者拖了两三天才有人回一句 LGTM有的团队虽然规定了必须有两个人 approve 才能合并但审查质量完全取决于审查者当时有没有时间、有没有耐心。更普遍的情况是一个团队里真正能挑出问题、给出有质量反馈的人就那么一两个其他人要么不敢发表意见要么提的意见都停留在命名和格式层面。我观察过不少团队包括我自己经历过的几个代码审查的效率瓶颈通常出在三个地方。第一是审查者的认知负担太重一份 PR 动辄几百行改动涉及多个文件、多个模块如果还牵涉到业务逻辑的变更要把上下文完整读一遍就已经很耗费精力了。第二是反馈周期太长审查者没有及时看、看完了还要等作者改、改完还要重新审这一来一回一个 PR 的合并周期很容易被拉到一两天以上。第三是经验分布不均核心审查者掌握的关键上下文和经验无法复制一旦这个人休假或者离职审查质量立刻断崖式下跌。这三个问题不是靠制定更严格的流程或者要求大家更认真就能解决的。真正可行的方向是让一部分审查工作被自动化工具接管。但传统的静态分析工具比如 ESLint、Checkstyle、SonarQube 这一类解决的是代码里有没有违反规则的问题而代码审查里更核心的部分——这次改动是否符合设计意图、有没有边界条件遗漏、有没有潜在的空指针风险——这些事它们做不了。1.2 自动化工具在代码审查中的角色变迁正因为传统静态分析工具的局限性过去几年AI 辅助代码审查才成了一个很热的方向。从最早的基于规则的自动审查到后来用机器学习模型做缺陷预测再到这一两年基于大语言模型的生成式审查工具整个演进路径其实是在回答同一个问题机器能不能像资深工程师一样去读代码、理解改动的意图然后给出有实际价值的反馈。open-code-review 这个开源项目走的就是最后一条路线。它不试图替代静态分析工具——规则类的问题比如格式、命名、明显的反模式交给传统工具处理仍然是效率最高的方式。它把重心放在理解这件事上给定一次代码变更的 diff结合相关的上下文让大语言模型生成结构化的审查意见包括问题的严重级别、影响范围、修复建议。这个定位我认为是准确的。代码审查这个场景天然适合大语言模型介入因为审查过程本质上是一次阅读理解 批判性思考的过程需要把改动的代码放到整个项目的语境里去看。而大语言模型在长文本理解、模式识别、以及知识广度上确实已经达到了能够辅助人工审查的水平。当然它肯定不是万能的这个后面会专门讲。2. open-code-review 的工作机理LLM 如何读懂一次代码变更2.1 从 diff 到审查意见的完整链路要理解 open-code-review 做了什么先要理清一条核心链路代码变更是如何被喂给模型、模型又是如何产出审查意见的。过程的起点是 Git diff。open-code-review 首先通过 Git 命令拿到当前分支和基线的差异包括新增、修改、删除的代码行以及每个变更涉及的文件路径。这里有一个很容易被忽略的细节diff 本身是高度结构化的文本但直接把这个原始 diff 丢给模型效果往往是灾难性的。因为模型需要区分上下文行和新增行需要理解一个函数从旧版本到新版本发生了什么变化而不只是看到两行文字被替换了。所以 open-code-review 内部会做一层 diff 的语义化重构。它会尝试把代码变更映射到语法树层面识别出这次改动涉及哪些函数、哪些类、哪些方法签名然后把重构后的变更描述——而不是原始的补丁文本——作为提示词的一部分。这一步的意义在于模型拿到的输入不再是第 37 行删了什么、第 38 行加了一句而是这个改动的目标是调整用户权限校验逻辑从基于角色改为基于策略这样更接近人类阅读 diff 后形成的理解。接下来是上下文扩展。模型不能只看改动的那几行代码就给出可靠意见它还需要看到这些代码在项目里是怎么被调用的、相关的数据结构是怎么定义的、有没有其他模块中的实现可以参考。open-code-review 会基于变更涉及的文件自动检索项目里的相关代码片段把这些信息一并组装到提示词里。最后一步才是生成审查意见。模型输出被设计成 JSON 结构每条意见包含文件路径、具体行号、问题类型、严重级别、问题描述和修复建议。结构化输出很关键因为后面的自动评论、分级路由都依赖这些字段。如果只让模型自由输出一段话信息提取会很麻烦也没办法做自动化的后续处理。2.2 关键的上下文获取策略上下文这个词是 AI 辅助代码审查实际效果的分水岭。我见过不少团队自己调用大模型 API 做代码审查最粗放的做法就是把 git diff 原封不动地贴进提示词里问模型这段代码有没有问题。这种做法的问题在于模型看到的信息量太少了。一次代码修改涉及的上下文远不止 diff 那几行。比如一个函数被改动了实现但没有改动测试模型需要知道这个函数原来是怎么被测试的才能判断改动是否引入了回归风险一个变量被重命名了模型需要知道这个变量的命名在项目里是否有统一的风格约定一个 API 的参数类型被修改了模型需要知道调用方有多少处才能判断这个改动的影响范围。open-code-review 处理这个问题的方式是把上下文获取拆成几个层次。第一层是项目内的检索它会提取变更文件里涉及的符号——函数名、类名、变量名——然后在项目的索引里搜索这些符号在其他文件中的引用位置把相关的调用代码拉进来。第二层是变更周边的代码也就是 diff 上下文行里包含的函数体、类定义、注释文档这部分信息能帮助模型理解代码所在的结构环境。第三层是可选的仓库级知识比如 README、设计文档、接口文档这些信息往往能提供业务层面的背景。不过这里有个现实约束上下文不是越多越好。大语言模型的输入窗口是有限的而代码审查需要在成本和效果之间找到平衡。把整个项目都塞进提示词是不现实的也是没有必要的。open-code-review 默认的策略是精准取用只把和本次变更最相关的代码片段加进去。这个相关性判断本身也是模型参与的通过在提示词中引导模型先识别关键符号再有目的地获取上下文避免一股脑地堆料。实测下来这种按需取用的策略比一次性喂完整文件的效果要好审查意见的准确率明显更高。2.3 审查规则的注入与定制除了理解代码本身open-code-review 还有一个非常重要的能力审查规则的定制。这一点和传统静态分析工具的理念很像——工具提供能力框架具体的审查标准由团队自己定义。但和静态分析工具的规则语法不同open-code-review 的规则注入走的是自然语言的路子。你不需要学一套 DSL不需要写正则表达式只需要用自然语言描述团队关注的审查点。举个例子如果你的团队重视日志规范可以在规则文件里写review_rules: - description: 新增代码中不允许直接使用 System.out.println 输出日志 level: error reasoning: 生产环境需要统一的日志框架标准输出不利于日志收集和排查问题review_rules: - description: 并发相关的改动必须显式说明线程安全性设计 level: warning keyword_hint: [synchronized, ReentrantLock, volatile, thread, 并发]这些规则会作为提示词的一部分注入到每次审查请求里。模型在生成审查意见时会带上这些约束去检查代码改动。和传统工具的规则引擎相比自然语言规则的优点是表达力更强能描述这个改动必须解释线程安全性设计这样抽象的要求而不是停留在禁止使用某函数这种机械层面。我要强调一个使用上的心得规则的条数不要贪多十条以内比较合适。规则太多会让模型审查时顾虑过多产生大量误报反而淹没了真正有价值的问题。另外一个技巧是规则里要尽量描述应该怎么做而不是只写禁止怎么做因为大语言模型对正向指令的理解和遵循能力通常比对负向约束更好。3. 从零搭建 open-code-review 的实操记录3.1 环境准备与依赖选型open-code-review 作为开源项目部署方式比较灵活既可以在本地命令行跑也可以作为 CI 流水线里的一个环节接入。我建议先在自己电脑上跑通一遍观察它的审查效果确认值得投入后再考虑集成到仓库的自动流程里。环境准备阶段需要准备的东西不复杂一个 GitHub 仓库或者能够提供 Git 仓库的平台因为工具依赖 Git 命令获取变更信息一个 Python 3.10 以上的运行环境以及一个可以访问的大语言模型 API。模型的选择上目前主流的商用模型都可以用open-code-review 按照安装说明配置好 API Key 就能跑起来。这里有一个非常容易踩的坑——API 的联网通道问题。有些公司或地区的网络环境默认无法直接访问境外模型服务商的接口导致工具能跑起来却始终拉不到模型的回复。我最初也遇到过这种问题排查了半天最后确认是网络通道导致的超时而不是代码问题。解决办法其实很简单检查你的请求链路中是否有可用的 API 网关或代理设置然后在 open-code-review 的配置里显式指定基础地址和超时时间。把网络问题前置确认好能省下大量排查时间。版本选择方面建议优先使用发布过的稳定版本而不是直接从主干分支拉最新代码。开源项目的主干分支往往包含正在开发中的功能稳定性没有保证。我在部署初期就踩过这个坑——当时直接按 GitHub 上最新的代码安装跑出来的审查结果格式很乱后来发现是构建流程中一个依赖库刚刚升级了大版本导致行为变化。回到发布版之后一切回归正常。3.2 最小可用配置的完整示例配置并不复杂但是有几个字段值得注意。下面是我在一台 Linux 服务器上跑通的最小配置# .open-code-review.yml model: provider: anthropic model_name: claude-sonnet-4-20250514 temperature: 0.2 repo: base_branch: main chain: rules: true output: format: json llm: request_timeout: 120 retry_times: 3其中 temperature 被我调到了 0.2。这个参数控制生成结果的随机程度代码审查场景应该尽量让输出稳定、可重复所以一个偏低的 temperature 会更合适。我用 0.7 试过一次模型常常会发挥过度在代码本来没问题的函数上提出一些似是而非的优化建议线上反馈里多了很多噪音。调到 0.2 之后意见的稳定性和可参考性都明显改善。base_branch 要和你们仓库的实际主分支名一致。有些仓库的主分支叫 main有些叫 master甚至还有叫 develop 的。配置错了会导致工具拿到的 diff 是错的——它会拿一个错误的基线去比较产生乱七八遭的审查结果。llm.request_timeout 建议调大一点。代码审查的提示词通常比较长模型生成意见也需要多轮次这个时间往往超过普通聊天请求的超时时间。我用默认的 60 秒跑过一次大批量的审查任务有一半以上会超时重试最后还是调到了 120 秒才稳定下来。3.3 第一次运行审查结果的解读配置好之后第一次运行我选的是一份改动量中等偏小的 PR大概新增 120 行、修改 40 行代码涉及一个订单状态流转的逻辑调整。命令执行后open-code-review 花了两分钟左右给出结果。输出的 JSON 结构大致长这样[ { file: src/services/order_service.py, line_start: 245, line_end: 260, severity: warning, category: edge_case, message: 订单状态从 PAID 到 SHIPPED 的转移缺少对支付时间超过 24 小时的校验存在超时订单被强制发货的风险。建议补充支付时效校验逻辑。, suggestion: 在状态转移前增加检查如果当前时间与支付时间的差值超过 tolerance 配置项则拒绝状态变更并记录审计日志。 } ]第一次看到这个结果的时候我的第一反应是这个意见的准确度已经超过团队里相当一部分同学了。它指出的那个问题我们在人工审查时确实容易漏掉——因为状态流转是散落在不同文件里的多个 case 分支靠肉眼对比很容易忽略边界条件。而 open-code-review 一次性把整个状态机相关的代码都读了能够发现这种跨函数、跨文件的边界问题这是它的优势所在。不过我也注意到结果里有一条让人哭笑不得的意见它在一个明明写得很干净的单元测试文件里建议应该增加断言以验证返回值在异常情况下不为空。问题在于这个测试的场景里异常情况下本就应该抛出异常是不存在返回值的。这种意见就属于典型的模型不理解语义约束情况。该怎么应对这类情况我在后面接工作流的章节里会专门讲。4. 我的实测open-code-review 与人工审查的差异对比4.1 测试场景设计工具到底有没有用不能凭感觉得靠数据说话。我在这台机器上做了个小小的对照实验挑了最近的 10 个已合并的 PR每个 PR 的代码变更量在 100 到 600 行之间已经走完了完整的人工审查流程并且合入了。然后把同一个版本的代码分别交给 open-code-review 审查把两者的意见对比一下。这 10 个 PR 覆盖了前后端不同模块的改动包括 Java 后端服务、TypeScript 前端页面、SQL 脚本变更和配置文件调整。我关注的指标有两个一是 open-code-review 能发现多少人审遗漏的问题二是它的意见里有多少是噪音。整个实验跑下来花了半天时间其中大部分时间花在查看 open-code-review 产生的结果上。为了减少主观判断的偏差我请了团队里的另外两位同事一起看结果对每条意见做标记有效问题、改进建议和误报。三个人分别标记然后对比意见意见不一致的地方再一起讨论确认。这个做法比较费时但能最大程度避免我一个人对工具产生不客观的评价。4.2 审查能力的优势区间10 个 PR 跑完之后我把结果汇总了一下。open-code-review 一共提出了 76 条意见其中被我们判定为有效问题的有 29 条改进建议33 条误报14 条。真正让我在意的是那 29 条有效问题里有 11 条是人审完全没有发现、在合入之后也没有被 QA 发现的。这 11 条问题的典型分布大概是这样问题类型发现条数典型表现边界条件遗漏5数组边界、空集合遍历、分页边界值未处理异常路径处理缺失3外部接口调用未捕获超时异常可能拖垮主流程并发安全问题2共享变量在多线程环境下出现可见性问题资源未释放1文件句柄在分支返回时未关闭这些问题的共同点是它们都藏在代码的安静区域不报错、不崩溃但是一旦触达特定条件就会爆发。人工审查容易漏掉这些原因也很简单——人在看 diff 的时候注意力天然会被修改的代码行吸引而对改动涉及但未修改的边界条件不够敏感。其中让我印象最深的一个案例是同事在重构缓存工具类时把并发度从固定线程数改成了基于 CPU 核数的动态线程池。这处改动本身没毛病但它忽略了一个前提这个缓存工具会被多个业务方共用而某些业务方运行在容器环境里容器分配的 CPU 配额并不等于宿主机的核数。按照机器核数动态计算的逻辑在线程池初始化时它能拿到的核数实际上是宿主机上所有容器的共享配额导致线程池创建了远超出预期数量的线程。这个问题人审没发现open-code-review 发现了。4.3 误报与漏报的典型样本当然工具也不是万能的。那 14 条误报我仔细看了一遍大概能分成三类第一类是上下文不足导致的误判。模型只看到了局部的代码片段就做了整体性的判断。比如它在一个私有方法里看到直接调用了一个公共 API就建议改为调用内部实现但它不知道那个公共 API 的内部实现和这个私有方法做的事情并不等价。第二类是业务语义理解错误。典型例子发生在状态机的代码上。模型对状态转移规则的判断是基于它对代码的抽象理解但它不知道我们的业务规则里有允许在审核通过后 30 分钟内反悔这样的线下约定。基于这个约定代码里的某些判断分支就是有意的妥协而不是缺陷。第三类是过度追求完美代码的意见。模型总是倾向于给出最佳实践级别的建议但实际工程里很多代码是在可读性、性能、复杂度之间做了权衡的。它建议你把一个深层嵌套的 if-else 重构为策略模式但实际业务里那个分支永远只会命中两次强行抽象反而增加理解成本。漏报的问题同样存在。我翻了 open-code-review 的所有输出没有一条对数据库索引设计提出过有效质疑因为这类问题需要理解数据量级、查询模式、索引选择性的权衡而模型看不到未来的数据增长曲线。也有一些关于分布式事务、缓存一致性等架构层面问题的遗漏这类问题即使是人审没有足够的架构背景也提不出来。总的来说我的评估是open-code-review 在处理具体的、可描述的、局部性问题上已经达到了相当不错的水平但在架构权衡、业务语义、长期演进这些问题上它仍然需要人工兜底。它不是替代品而是一个不错的前置过滤器。5. 把 open-code-review 嵌入团队工作流的关键设计5.1 触发时机与频率控制本地跑通之后我开始考虑把它接入团队的仓库工作流。第一步要确定的是触发时机。最自然的想法是每次 PR 创建/更新时都跑一次。但实际跑下来你就会发现这个策略有个问题——频繁更新的 PR 会让大语言模型的 API 调用次数快速累积成本控制不住。而且审查结果重复出现的现象非常明显某个问题刚被提出来开发修改后又冒出另一个问题来回折腾几次审查意见的毛刺很多体验并不好。我现在采用的方法是按阶段触发PR 一旦创建立即跑第一次审查给开发一个快速自检的反馈然后当 PR 状态从 draft 变为 ready for review 时再跑第二次之后只有当开发主动请求重新审查或者有新的 commit 被 push 时才更新审查结果。这样既能让审查结果保持新鲜又避免了每次 push 都触发导致的资源浪费。另一个关键是审查频率的并发控制。open-code-review 允许多个仓库共享同一个配置也可以为不同仓库分配不同的模型、不同的审查规则。但在大团队里如果有人同时打开几个大 PR 的审查模型 API 的并发请求会快速攀升很容易触发限流。我们是在网关层加了一简单的信号量控制把并发请求数限制在 3 以内效果不错既保证了响应速度也没有把模型服务商搞崩溃。5.2 审查意见的分级与路由审查意见做分级这件事是接入团队工作流之后才意识到的必要性。刚开始接入时所有意见不论严重级别如何一律推送到 PR 的评论区。结果就是开发打开 PR看到 20 多条评论其中 3 条是有价值的问题剩下的全是建议优化命名建议提取常量这类改进建议。时间一长开发对工具的信任度就下降了甚至会直接忽略所有自动评论。要解决这个问题就不能让工具输出的原始意见直接出现在评论区。open-code-review 输出的每条意见自带 severity 字段分为 error、warning、info 三个级别。我们根据级别做了路由error 级别的意见直接推送到 PR diff 页面标注为 block 状态必须处理warning 级别的意见进入审查队列由项目负责人在 merge 前统一查看info 级别直接丢进一个审查日志频道不做强制处理。这套分级逻辑其实是参照了人工审查的实践任何一项审查结论都要有不同处置方式不能一刀切同等对待。人工审查时你会和作者沟通这个一定要改那个可以商量自动审查也需要类似的沟通机制。分级路由就是给机器意见划定话语权的方式。5.3 与现有 CI/CD 体系的整合接入 CI/CD 是另一个需要细致处理的点。我们团队的流水线是基于 Jenkins 的核心关注点是构建、单测、静态扫描这几道关卡。现在 open-code-review 要作为一个新的环节插进去我先想的不是加进去而是放在哪一步之后。最终确定的顺序是代码检出 → 编译构建 → 单元测试 → 静态扫描SonarQube→ open-code-review 审查 → 汇总报告。这个顺序安排是有讲究的。编译和单测是最便宜的检查如果代码连编译都过不了后边的 AI 审查就是浪费算力。静态扫描解决规则类问题AI 审查应该聚焦在规则类工具管不到的问题上。环节复用、职责明确审查效率才是最高的。还有一个容易被忽略的细节open-code-review 的审查过程本身需要拉取代码、算 diff。在 CI 环境里如果 checkout 是浅克隆shallow cloneGit 历史可能不完整导致 diff 计算错误。我们吃过一次亏审查结果里把整个文件都标记为新增排查了很久才发现是浅克隆的问题。解决办法很简单在流水线配置里把 checkout 深度设为 0——也就是完整克隆代价是会多点时间但换来的是审查结果的可靠性。6. 它解决不了的问题使用边界与后续扩展6.1 架构级评审中的明显短板即便是在已经接入工作流的今天我也很清楚地知道 open-code-review 的边界在哪里。最明显的短板就是架构级评审。架构评审的核心是基于长期演进、团队结构、成本约束这些软性条件去做权衡。模型的 token 窗口和理解深度决定了它只能看到某一次变更的局部视图它不会知道你们团队刚刚做过一次技术债务清理也不会知道某个看似冗余的兼容层是为了给老客户保留能力。这些历史包袱和战略意图模型理解不了也没法从代码里推断出来。我做个类比open-code-review 像是一个很认真的高中优等生它能把你交上去的作文里的错别字、病句、标点问题都挑出来也能指出逻辑不够通顺的地方。但如果你让它评价这篇作文是否适合投给某个特定风格的杂志它的判断基本不可用。这是架构级评审要回答的问题工具目前无能为力。所以我的建议是架构评审这部分工作还是要由人来做而且需要的是团队里对系统有全局认知的资深工程师。自动化工具可以在架构评审之前做一些基础的信息收集比如变更涉及的模块范围、潜在的影响链路但最终的架构决策人必须保留决定权。6.2 业务语义理解的局限业务语义是另一个工具很难突破的关卡。代码审查里有相当一部分问题本质是要理解这段代码的业务约束是什么才能做出判断的。比如一个积分兑换接口代码里写的是用户每日最多兑换 3 次这看起来没什么问题。但如果你知道业务上有某些用户在特定活动期间会被提升兑换次数上限的规则你就会发现代码里少了一个判断条件。这种问题是模型无法仅凭代码判断的因为业务规则往往不存在代码库里。这也是我反复强调审查规则定制重要性的原因。open-code-review 允许你把团队特有的业务约束用规则形式写到配置里让它知道我们的账务系统不允许负余额所有对外接口必须做幂等性设计灰度发布阶段的实验代码必须附带开关配置。你写入的每一条规则都是给模型补上的一块业务拼图。规则写得越准确工具在业务语义层面的漏报就越少。这个能力也给团队提了个醒工具终究是工具它对业务的理解完全依赖团队注入的规则和上下文。指望装上工具就自动懂业务是不现实的前期规则的梳理和沉淀恰恰是对团队业务认知的一次系统性整理这个过程的收益甚至超过了工具本身。6.3 生态扩展与二次开发方向最后聊一聊二次开发的可能性。open-code-review 的价值不仅仅在于开箱即用的审查功能更在于它是一个可以持续扩展的基础设施。我在接入后不久就开始做定制开发第一个方向是对接内部的知识库。团队在 Confluence 上有整理好的编码规范文档和设计文档这些内容原本只是静态的参考资料靠人自觉去查。我通过一个简单的检索接口把这些文档切片向量化在提示词组装时把和本次变更内容相关的文档片段附加进去让审查结果和团队规范强对齐。这个改造并不复杂但对审查结果的团队适应性提升非常明显。第二个方向是审查数据的积累与复盘。每次审查产生的意见、和处理结果都被结构化地保存下来。每个月我们会做一次分析哪些类别的意见被修复的比例高、哪些类别的意见开发不太认可以此为依据反推规则的优化方向和人工审查的关注重点。这些数据还能用来评估团队的技术倾向比如某个模块的并发安全问题出现频率异常高那就说明这个模块的并发设计急需系统性的重构而不是修修补补。这个思路把 open-code-review 从一个单点工具变成了一个持续运转的质量反馈闭环。你可以沿着这个方向去扩展比如接消息平台做实时通知、对接工单系统自动立项、做审查趋势的可视化大屏——这些都是很好的切入点。我在实际使用中还有一个很深的体会open-code-review 这类工具带来的最大变化其实不只是在质量层面而是在团队心态层面。开发者提交代码前会先去跑一遍自动审查把自己能改的问题改掉再交给人工评审。这样一来人工评审看到的代码已经不是原始提交而是经过了机器初筛的代码。原本大量消耗在基础问题上的评审精力被释放出来人可以更专注地处理真正需要经验判断的部分。流程还是那个流程但大家都能明显感觉到整个协作的节奏顺滑了很多。最后分享一个经验接入这类工具时不要一开始就追求全量接入、规则全覆盖。更稳妥的落地节奏是从一个模块开始跑上几个迭代看看效果、磨合规则、建立信任再逐步铺开。工具只是辅助真正让代码质量提升的还是团队里每个人看待审查这件事的态度。如果你正在用或者准备用类似方案欢迎多交流实际使用中的问题和想法。