news 2026/10/12 3:51:25

Open Code Review:一种去权限化的协作范式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Open Code Review:一种去权限化的协作范式

1. “open-code-review”不是个工具名,而是一套可落地的协作范式

“open-code-review”这个词组乍看像某个开源项目或CLI工具的名称,但实际在技术社区里,它根本没注册过任何知名仓库,GitHub上搜不到同名主力项目,npm、PyPI、Maven中央库也查无此包。我最早是在某次跨团队代码规范共建会上听到这个词的——一位前端导师在白板上写下“open-code-review”,然后划掉“-”,写成“open code review”,再加了个箭头指向“everyone can read, anyone can comment, no gatekeeper”。那一刻我才意识到:这不是一个产品,而是一种被刻意命名的实践共识。

它解决的核心问题非常具体:传统Code Review流程中常见的“评审疲劳”“响应延迟”“权限壁垒”和“知识孤岛”。比如某次我参与的模拟项目X中,一个关键模块的PR挂了5天没人点Approve,不是因为没人看,而是因为只有两位资深成员有Merge权限,而他们正忙于另一个紧急上线;更讽刺的是,团队里三位 junior 开发者其实已经发现了其中两处边界条件遗漏,却因“不敢在没权限的人PR下留言”而保持沉默。这种状态持续两周后,那个模块在灰度阶段暴露出并发计数偏差——问题本身不难,但暴露路径极长。

“open-code-review”的关键词不在“code”或“review”,而在“open”。它要求把评审行为从“权限驱动”转向“意图驱动”:只要你想参与,就能参与;只要你留了言,就该被看见;只要你提了建议,就该被记录。它不取消审批流,但把审批前的讨论彻底解耦出来。这背后是三个隐性前提:第一,代码仓库本身必须对所有成员开放读取(非仅“可Fork”);第二,评审入口必须统一、低门槛(比如直接嵌在PR页面,而非跳转到Jira或飞书文档);第三,团队需建立轻量但明确的反馈礼仪——比如“标注疑问用问号,指出风险用⚠️,确认无误用✅”,避免情绪化表达。

我试过在两个不同规模的团队里推行这个范式:一个6人全栈小组,一个22人分前后端+测试的中台团队。前者一周内就形成了自然的交叉评审习惯;后者花了三周才跑通,主要卡在“如何让测试同学习惯在PR里直接写‘这个接口缺少401未登录态校验’而不是等提测后再报Bug”。但一旦跑通,PR平均首次响应时间从42小时压缩到6.3小时,合并前的缺陷拦截率提升37%(基于SonarQube历史扫描对比)。它不改变Git工作流,也不强制用新工具,只改动作定义——把“Review”从一个终点动作,变成一段持续可见的协作过程。

提示:推行初期最容易犯的错,是把它当成“降低评审标准”的借口。Open不等于随意,而是把标准显性化、过程透明化。我们团队的第一版《open code review 共识文档》里第一条就写着:“你可以不Approve,但不能不Comment;你可以Comment得简短,但不能只写‘OK’。”

2. 为什么不用现成的“Review App”?——工具链适配的底层逻辑

市面上有太多标榜“智能Code Review”的SaaS工具:有的能自动标出重复代码,有的集成AI生成评论,有的甚至能预测变更风险。但当我把“open-code-review”的需求清单拿给这些工具做匹配时,发现一个尴尬事实:它们越强大,越偏离核心目标。原因很实在——这些工具的设计哲学是“帮Reviewers省力”,而open-code-review要解决的是“让更多人愿意开始Review”。

举个具体例子。某次我们接入了一款热门Review工具,它能在PR提交后自动分析出12处潜在问题,并生成带链接的评论。听起来完美?实则埋了三个雷:第一,它把所有问题都标记为“Medium”优先级,导致开发者忽略真正危险的空指针隐患,而去修一个无关紧要的日志格式;第二,它的评论模板固定,无法体现“这个改动会影响支付回调重试逻辑,建议增加幂等键校验”这类上下文强相关的判断;第三,也是最关键的——它把评论框藏在独立Tab页里,团队新人根本不知道要切过去看,更别说主动留言。

真正的open-code-review依赖的是“最小必要工具链”:

  • 代码托管平台原生能力:GitHub/GitLab的PR界面已足够支撑基础交互。我们禁用了所有第三方Review插件,只保留平台自带的行内评论、任务列表(- [ ])、批准按钮。原因?路径最短——看到代码,鼠标悬停,点击加号,输入文字,回车。没有学习成本,没有跳转中断。
  • 轻量级同步机制:用企业微信/钉钉机器人监听PR事件,但只推送两类消息:① 新PR创建(含标题、作者、关联Issue编号);② 任意人在该PR下新增评论(含评论人、首句摘要)。绝不推送“已批准”“已合并”这类状态更新——因为open的本意是激发讨论,不是广播结果。
  • 零配置知识沉淀:所有评审讨论必须留在PR里,禁止导出到Confluence或飞书文档。我们设定了硬规则:如果某条评论引发了深度讨论,发起人需在讨论末尾加一句总结(如“结论:此处应增加超时重试,由A同学下周实现”),并@相关人。这样后续任何人翻看这个PR,都能在30秒内掌握决策脉络。

工具选型的本质,是选择信息流动的阻力大小。当一个 junior 开发者想指出“这个SQL没加索引”时,他需要几步操作?在GitHub原生流程里:打开PR → 滚动到对应文件 → 点击行号旁的+号 → 输入文字 → Ctrl+Enter。共4步,耗时约8秒。在某款Review SaaS里:点击右上角“Review中心” → 切换到“待处理”Tab → 找到对应PR → 点击“查看详情” → 等待页面加载 → 拉到底部点“添加评论”。共6步,平均耗时23秒——而这23秒,就是多数人放弃发言的临界点。

我们做过对照实验:同一组15人的团队,在使用原生GitHub流程的两周内,PR平均评论数从1.2条升至4.7条;切换到某SaaS工具后,首周评论数跌至0.9条,第二周略有回升(2.1条),但87%的评论来自3位资深成员,新人参与率为0。数据不会说谎:工具链的复杂度,直接决定了“open”的真实覆盖度。

注意:别迷信“自动检测”。SonarQube能发现硬编码密码,但发现不了“这个函数名叫getOrderList,实际返回的是用户订单统计摘要”。后者必须靠人眼+业务理解,而open-code-review要做的,就是让人眼更容易聚焦到这类高价值判断上。

3. 从“没人敢评”到“抢着评”:评审文化落地的四步破冰法

文化转型最难的从来不是定制度,而是改习惯。我们团队推行open-code-review初期,最大的阻力不是技术,而是心理:资深成员觉得“每条PR都留言太耗时”,新人担心“说错话丢面子”,测试同学抱怨“开发不写清楚改动点,我没法针对性评论”。这些都不是虚的,而是真实阻碍协作效率的毛细血管级堵点。我们没搞宣贯会,而是用四步实操动作,把抽象理念拆解成可执行、可感知、可反馈的具体行为。

3.1 第一步:设立“免审期”与“示范PR”

头两周,我们暂停所有正式的Approval流程。所有PR打上[OPEN-CODE-REVIEW]标签,明确告知:这两周不Merge、不考核、不追责,唯一目标是练习“怎么有效评论”。同时,由技术负责人提交一个“示范PR”——内容是重构一个大家熟悉的工具函数,改动清晰、风险可控。他在PR描述里写了三段话:① 这次改什么(删除冗余参数);② 为什么这么改(旧调用方已全部迁移);③ 希望大家重点看哪三处(类型推导是否准确、错误码映射是否完整、单元测试覆盖率是否达标)。然后他自己在三处关键代码行下各留一条评论,示范如何提问(“这里用Optional.ofNullable是否比直接判空更易读?”)、如何建议(“考虑把错误码映射抽成常量类,方便后续扩展”)、如何确认(“单元测试已覆盖所有分支,见test/xxx.java第45行”)。

效果立竿见影。第三天,就有两位前端同学在示范PR里留言:“第22行的异常捕获范围可以缩小到IOException吗?”“建议在README里补充这个函数的新调用方式”。这不是因为他们突然变积极了,而是因为示范PR给出了安全的“脚手架”——你知道该评论什么、怎么评论、评论后大概率会被认真对待。

3.2 第二步:定义“最小有效评论”标准

我们发现,很多人不评论,是因为觉得“必须写出完整方案才算数”。于是我们发布了《最小有效评论》清单,只列三条底线:

  • 能定位:必须指向具体文件+行号(如utils/DateHelper.java:88),禁止“那个日期处理函数有问题”;
  • 有依据:引用一条团队规范(如“规范3.2要求所有外部API调用必须带超时”)或一个可验证事实(如“当前测试环境该接口平均响应2.3s,超时阈值设为1s不合理”);
  • 给选项:至少提供一个可执行的改进方向(如“建议改为CompletableFuture.supplyAsync()”或“可考虑用LocalDateTime.parse(str, formatter)替代手动切割”)。

这条规则把评论门槛降到了“写一条带坐标的、有依据的、带建议的句子”。我们甚至允许用语音转文字提交——只要满足三点,就算有效评论。两周后统计显示,72%的新评论符合标准,而其中41%来自此前零评论记录的成员。

3.3 第三步:建立“评论-响应”闭环追踪

光鼓励评论不够,还得让评论者感受到价值。我们要求:任何PR作者,必须在48小时内对每一条非垃圾评论做出响应。响应不一定要采纳,但必须明确表态:

  • ✅ 接受:直接修改代码并回复“已按建议调整,见commit xxx”;
  • ⚠️ 暂缓:说明原因(如“当前优先级较低,已记入Tech Debt看板#123”);
  • ❌ 不采纳:给出技术依据(如“此处需保持向后兼容,旧客户端仍依赖该字段”)。

为避免遗忘,我们在PR模板里固化了响应检查项:

## 评论响应确认 - [ ] 对 @xxx 的建议(utils/DateHelper.java:88)已处理 - [ ] 对 @yyy 的疑问(README.md:12)已澄清 - [ ] 对 @zzz 的风险提示(api/OrderService.java:201)已评估

这个小设计带来意外收获:作者在勾选时,会重新审视每条评论的价值,有时甚至发现“原来这个建议真能避免一个线上问题”,从而更主动地邀请他人评论。

3.4 第四步:用“贡献可视化”替代“绩效考核”

最后一步,我们废除了“人均Review数量”KPI,改为每月发布《open-code-review 贡献图谱》。图谱不排名,只呈现三类关系:

  • 连接强度:谁经常评论谁的PR(线粗细表示评论频次);
  • 领域覆盖:用色块标注每位成员最常评论的模块(如后端同学多评API层,测试同学多评DTO校验);
  • 价值密度:统计每条评论后续是否引发代码修改(通过Git Blame追溯),用星星标注高影响力评论。

第一期图谱发布后,一位平时沉默的运维同学被标记为“基础设施层最高价值评论者”(他连续三次指出Dockerfile中基础镜像版本过旧的安全风险),团队立刻邀请他牵头制定镜像升级规范。这种基于真实协作痕迹的识别,比任何自评表都更有说服力。

实操心得:文化落地最忌“一刀切”。我们允许部分老员工继续用传统方式Review,但要求他们必须在PR里公开说明理由(如“本次变更涉及核心支付链路,按规范需双人审批,故暂不开放评论”)。这种“例外需声明”的机制,反而加速了共识形成——当例外越来越多被质疑,标准就自然成为默认。

4. 那些没写在文档里的坑:open-code-review的七类典型失效场景

再好的范式,落地时也会撞墙。我们踩过的坑,有些源于技术限制,有些来自人性本能,更多是两者交织的灰色地带。把这些失效场景摊开讲透,比罗列一百条成功经验更有价值。以下七类问题,均来自真实项目记录,附带根因分析与实操解法。

4.1 场景一:PR过大导致评论失焦——“2000行改动,没人看得完”

现象:某次数据库迁移PR包含17个文件、2134行新增、892行删除,首条评论是“整体思路不错”,第二条是“辛苦了”,第三条是表情包。两周后合并,上线第三天出现慢查询告警。

根因:open不等于放任。当单次变更超出人脑短期记忆容量(认知心理学证实,普通人一次只能处理4±1个信息组块),评论必然流于表面。“欢迎评论”变成“欢迎点赞”。

解法:强制PR分治。我们规定:

  • 单个PR代码变更量 > 300行,必须附《分治说明》(非可选);
  • 《分治说明》需列出:① 本次PR的单一目标(如“仅替换HikariCP连接池”);② 与其他待合PR的依赖关系(如“需先合入#456的配置中心改造”);③ 关键验证点(如“重点检查Connection.close()调用是否遗漏”)。
  • CI流水线增加预检:若PR未附说明且变更超限,自动拒绝提交,返回提示:“请按《分治说明》模板拆分,示例见docs/pr-split-template.md”。

实测效果:PR平均规模从1240行降至287行,关键路径评论覆盖率(针对核心逻辑的评论数/核心逻辑行数)从12%升至68%。

4.2 场景二:评论区沦为“表扬大会”——“全是👍,没有❓”

现象:某次UI组件库升级PR,收到19条评论,17条是“👍”“666”“支持”,1条是“图标颜色和设计稿不一致”,1条是“打包体积增加了12KB”。后者被淹没在表情包海洋里。

根因:社交压力。当多数人用非语言符号表达态度,后来者会下意识模仿,形成“沉默螺旋”。尤其当作者是团队权威时,“反对”需要更高勇气成本。

解法:引入“评论类型锚点”。我们在PR模板底部固化三行引导语:

## 请按类型留言(选其一) 🔹 **疑问**:对实现逻辑/设计选择有不解(例:“为何用Redis List而非Stream存消息?”) 🔹 **风险**:指出可能引发故障/安全/性能问题(例:“此处未校验用户ID长度,可能触发SQL注入”) 🔹 **建议**:提供可落地的优化方向(例:“考虑用Lombok @Builder减少构造函数代码”)

同时,CI脚本扫描PR评论,若某PR的“疑问/风险/建议”类评论占比 < 30%,自动在评论区顶置提醒:“检测到建设性评论不足,欢迎围绕以上三类深入探讨”。数据表明,该机制使高价值评论占比从11%稳定提升至43%。

4.3 场景三:跨时区团队的“评论孤儿”——“我留了言,但作者三天后才看到”

现象:某跨国项目,中国成员在下班前提交PR并留言“请检查JWT签名校验逻辑”,德国成员次日上班才看到,此时中国成员已离线,问题讨论中断。

根因:异步协作的天然延迟被放大。open-code-review依赖信息及时触达,但时区差让“留言-响应”周期拉长到12小时以上,热情冷却。

解法:建立“时区桥接人”轮值制。每周指定一名成员(需覆盖重叠工作时间),职责仅两项:① 监控自己在线时段内的所有新PR,对无评论的PR主动留首评(哪怕只是“已阅,稍后详看”);② 将跨时区的关键评论摘要,用邮件/IM同步给对方时区负责人。我们不做24小时响应承诺,但确保“任何PR在8小时内获得首次有效互动”。轮值表公开在团队Wiki,成员可自愿报名——意外发现,报名者多为希望提升全局视野的中级工程师。

4.4 场景四:敏感信息误入评论——“在公开PR里贴了数据库密码”

现象:某次配置优化PR,开发者在评论里写道:“测试环境DB密码已更新为‘abc123!@#’,请同步修改”。该评论被所有人可见。

根因:open不等于无边界。当评论区成为临时沟通场,容易忽略信息密级。而平台本身不校验评论内容安全性。

解法:双保险机制。第一层,Git Hooks预检:本地提交PR前,运行正则扫描评论草稿(.git/COMMIT_EDITMSG),匹配密码、密钥、token等模式,命中则阻断并提示:“检测到疑似敏感信息,请移至加密配置中心处理”。第二层,人工守门:所有含“密码”“密钥”“token”字样的评论,自动触发@安全负责人,由其判断是否需删除并通知作者。我们还把常见敏感词库做成VS Code插件,实时高亮编辑器中的风险文本。

4.5 场景五:评论引发“防御性解释”——“作者不改代码,先写800字说明为什么不该改”

现象:测试同学评论“这个接口缺少401未登录态校验”,作者回复长文:“1. 当前鉴权由网关统一处理;2. 服务层重复校验增加RT;3. 历史所有接口均未校验……”,但未修改代码。

根因:评论触发了心理防御机制。当建议被解读为“能力质疑”,回应焦点就从“问题解决”偏移到“自我辩护”。

解法:推行“评论-行动”绑定协议。我们在团队公约中明确:“每条评论必须对应一个可验证动作,包括但不限于:① 修改代码;② 补充文档;③ 创建Tech Debt Issue;④ 提交架构评审申请”。作者回复时,必须勾选其中一项并提供证据(如“已创建Tech Debt Issue #789,优先级P1”)。这个小约束,把对话从“对错之争”拉回“行动之约”。

4.6 场景六:新人评论被“礼貌性忽略”——“说了三次,没人回复”

现象:一位入职两周的后端同学在PR里三次指出“这个循环可能死锁”,每次都被作者回复“收到,后续优化”,但代码始终未改,也未进入任何跟踪系统。

根因:隐性权威结构。资深成员的“收到”常被默认为“已处理”,而新人的同样表述缺乏信任背书。

解法:实施“新人评论强制响应”。规则很简单:若评论者入职 < 3个月,且评论含“风险”“死锁”“OOM”“NPE”等关键词,PR作者必须在24小时内:① 修改代码并提交;② 或在评论下明确标注“已记录至Tech Debt #XXX”;③ 或发起快速会议(<15分钟)同步结论。违反者,PR自动进入“待复核”状态,需经技术负责人二次确认。三个月试行期后,新人高风险评论的响应率从31%升至98%。

4.7 场景七:自动化评论挤占人工空间——“Sonar扫出200个Warning,没人看真实建议”

现象:某PR集成SonarQube后,自动评论刷屏203条,其中198条是“Magic number should be replaced by a constant”,真正关于业务逻辑的3条人工评论被完全淹没。

根因:工具噪音压倒人的声音。当机器评论数量级远超人工,人类注意力必然被稀释。

解法:设置“评论信噪比阈值”。我们配置SonarQube只报告两类问题:① Blocker/Critical级别漏洞;② 团队自定义规则(如“所有SQL必须参数化”)。其他问题全部关闭。同时,CI流水线增加“人工评论优先级”检测:若PR中人工评论数 < 自动评论数 × 0.1,则阻断合并,提示:“检测到人工讨论不足,请确保至少3条建设性评论后再合入”。这个数字经过测算:3条评论足以覆盖一个中等PR的核心风险面。

经验总结:所有失效场景的共性,是把“open”误解为“无约束”。真正的open-code-review,是在开放协作与有效治理之间找动态平衡点——用轻量规则守住底线,用工具设计降低摩擦,用文化引导激发善意。它不追求100%参与率,而追求每一次参与都产生真实价值。

5. 超越代码:open-code-review如何重塑团队的知识流动网络

当open-code-review运行稳定后,一个意想不到的副产品浮现:团队的知识结构开始自发重组。它不再依赖“专家大脑”或“文档孤岛”,而演变成一张动态生长的、以PR为节点的活体知识图谱。这种变化无法用KPI衡量,却深刻影响着问题解决速度、新人成长曲线和系统韧性。

5.1 知识沉淀从“静态归档”变为“动态快照”

传统做法是:问题解决后,由当事人写一篇《XX问题排查手册》存入Confluence。但现实是,73%的此类文档半年后无人更新,12%的链接已失效,剩下15%的内容与当前代码严重脱节。而open-code-review让知识沉淀变成“伴随式记录”:每个PR本身就是一份带时间戳、带上下文、带决策链的微型知识包。比如某次支付回调超时问题,PR里完整记录了:① 现象(日志显示callback耗时>30s);② 排查路径(从Nginx access log→应用日志→DB慢查询→Redis连接池);③ 根因(Redis连接池maxIdle设为0,导致每次请求新建连接);④ 解决方案(调maxIdle=20,加连接健康检查);⑤ 验证方式(压测QPS 500时连接复用率>92%)。后续任何人遇到类似问题,搜索“payment callback timeout redis”,直接定位到这个PR,3分钟内复现整个分析过程。

我们统计过:团队内高频问题(如“OAuth2 token刷新失败”“分布式锁失效”)的平均解决时长,从推行前的11.2小时降至2.7小时。不是因为大家变聪明了,而是因为知识获取路径从“找人问→翻文档→试错”缩短为“搜关键词→看PR→复制命令”。

5.2 新人成长从“被动灌输”变为“主动浸润”

传统新人培训,是集中听两周课,再分配一个简单任务。而open-code-review让新人第一天就能“浸入”真实战场。我们给新人的第一个任务不是写代码,而是“每日PR观察员”:每天浏览5个新PR,完成三项动作:① 找出一个自己能看懂的亮点(如“这个单元测试用Mockito验证了异常路径,很规范”);② 提出一个自己不懂的问题(如“第45行的@Cacheable注解,缓存key是怎么生成的?”);③ 记录一个学到的新模式(如“原来用@Validated分组校验可以解决不同场景的参数校验需求”)。这些动作不计入考核,但所有回答都会被资深成员公开回复。三个月后,这批新人的首次独立PR通过率,比传统培训组高出41%,且平均首次评论数达3.2条(传统组为0.7条)。

更关键的是,这种浸润消解了“知识霸权”。当新人的问题被认真对待,当他们的观察被公开肯定,知识传递就从“自上而下”变成了“网状共振”。某次,一位新人指出“这个工具类的静态方法可能引发内存泄漏”,资深成员不仅立即修复,还在团队分享会上说:“这个问题我忽略了三年,感谢XX同学用新视角帮我们补上盲区。”

5.3 系统韧性从“个体英雄”变为“集体免疫”

最能体现范式价值的,是故障应对。去年一次线上事故中,支付渠道回调大量失败。按旧流程,需先定位负责人,再召集会议,再分工排查。而这次,故障发生12分钟内,已有7人在相关PR下留言:前端同学指出“回调URL拼接逻辑在PR#888中修改过”;运维同学贴出“最近Redis连接数突增监控图”;测试同学翻出“该渠道的幂等性测试用例未覆盖重试场景”。这些碎片信息在PR评论区自动聚合成线索链,23分钟后,根因锁定为“回调URL编码未处理特殊字符”,修复代码提交,47分钟恢复。全程无人指挥,全靠open-code-review培育的“问题嗅觉”和“信息共享肌肉记忆”。

事后复盘,我们发现:open-code-review本质是构建了一套“分布式故障预警系统”。每个PR都是一个微小的、可验证的“知识疫苗”,当足够多的疫苗被注入团队知识网络,整个系统就获得了对同类问题的群体免疫力。

最后分享一个小技巧:我们定期(每季度)用脚本导出所有PR评论,用NLP提取高频技术词(如“Redis”“幂等”“熔断”),生成《团队技术热力图》。这张图不用于考核,而是作为下季度技术分享选题的依据——哪里讨论最多,就说明哪里是真实痛点,也最值得深挖。它让技术演进,真正由一线实践驱动,而非由PPT规划驱动。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 3:51:13

【Web全栈进阶】前端世界观:现代工具链与框架为什么存在

早报站的API已经能注册、登录、收藏——但用户看到的还是那个Jinja2旧页面。 现在开始给早报站装上现代前端。 今天不写业务代码&#xff0c;先建立世界观、装好环境——这是前端版的环境篇。 &#x1f3af; 本篇产出&#xff1a;Node/Vite环境就绪、脚手架项目跑起来、以及一张…

作者头像 李华
网站建设 2026/10/12 3:50:59

RAG落地常见坑与评估上线:怎么知道这套东西好不好用?万字收尾

RAG 落地常见坑与评估上线&#xff1a;怎么知道这套东西好不好用 作者&#xff1a;利威尔xu | CSDN 专栏《RAG 保姆级实战&#xff1a;从原理到落地》 前言 在第五篇《RAG全流程》里&#xff0c;咱把检索链路走通了。混合召回把向量检索和关键词检索两路合并&#xff0c;重排…

作者头像 李华
网站建设 2026/10/12 3:50:58

HarmonyOS防截屏实现方案

防截屏的框架与代码实现 1. HarmonyOS 防截屏实现 在 HarmonyOS 中&#xff0c;防截屏功能主要通过 window 模块中的 setWindowPrivacyMode 方法实现。该方法可以设置窗口为隐私模式&#xff0c;从而防止截屏或录屏。 实现方式一&#xff1a;在 onWindowStageCreate 回调中设…

作者头像 李华
网站建设 2026/10/12 3:50:05

【零基础学AI】第 8 章课后练习与答案

第 8 章课后练习与答案 练习使用本章 examples 目录中的代码。先保留原文件&#xff0c;再复制一份完成修改。模型给出的文字不能填写成实际运行结果&#xff0c;必须在自己的终端执行以后记录。 &#x1f308; 关于《AI 零基础 36 讲》课后训练 &#x1f4da; 与正式讲解配套…

作者头像 李华