华为云码道实战记录零基础用代码智能体造出一个教材下载器一个非科班出身的用户在代码智能体辅助下从零到一完成了真实项目开发后期借助华为云码道 CodeArts 智能体进行验证整理与提交。开篇为什么我敢动这个念头老实说过去我想过要不咱们做个小工具吧但基本都死在起点。环境怎么装框架选啥代码报错了一脸懵。最后就成了算了。这次不一样。我发现了代码智能体这个东西。它和网上随便搜来的代码片段完全不同——它能理解一整个项目、看你的报错、直接改你的文件、跑测试给你看结果。代码智能体这类工具硬生生把写软件的门槛从得会语法降到了说清楚需求。这篇东西想记两件事。第一我这个零基础的人是怎么把第一道坎迈过去的第二真的用在一个要发布、有合规红线的真实项目上会踩哪些坑、能收获什么。这个项目叫 k12dl——为国家中小学智慧教育平台做的教材和课件离线下载器。第一部分零基础入门其实不是从写代码开始的最常见的错误上来就说帮我写个下载器我见过不少新手这么干。一上来就是帮我写个下载器吧然后智能体给你一个玩具级脚本你拿着也没法用。我那时候比这聪明一点点我是这么跟智能体说的我发现国家中小学智慧教育平台没法批量下载。教材得一页页翻着看课件得一个个点。我想做个工具能让我选好学段、学科、版本、年级然后一次性全下到电脑里。还有一个要求——千万不要依赖第三方库因为我要在不同电脑上直接跑装东西太麻烦。看起来就是絮絮叨叨说需求但这里其实有两个关键信息我要解决什么具体问题批量下教材我的硬约束是什么零依赖。智能体根据这两点给了我一个我自己想不到的方案“纯 Python 标准库 网页前端”。后来才明白这个选择多聪明——这样的工具能在 Windows、macOS、Linux 上直接跑甚至鸿蒙设备访问局域网的时候也能用就因为它就是一个本地 web 服务。需求说清后先满世界找轮子需求描述清楚只是第一步紧接着该做的是——别急着让智能体开写先让它去搜同类项目。我自己就吃过亏以为自己的想法独一无二结果写了一半才发现早就有人做过更完善的版本白费几天功夫。我的做法是让智能体把网撒得尽量广GitHub、AtomGit、Gitee、B 站、52 破解论坛都让它搜一遍。搜回来通常是一堆半成品和玩具脚本但这堆废料里往往藏着关键线索——有人已经摸清了平台的接口地图、有人已经踩过鉴权的坑、有人用 Go 写了能直接跑的版本。这些信息自己从零摸可能要一两周让智能体批量读源码再汇总给你半天就够。筛完之后别急着抄先自己下载试用。能用、能满足你需求的直接拿来用没必要重造差一口气、但思路对的让智能体去读它的源码、参考它的实现方式。k12dl 后来那一处关键的鉴权简化见实战篇 3.1就是从一款参考实现里读出来的不是从零想出来的。给新手的第二条建议需求说清后先花半天让智能体满世界找同类项目、自己挨个试用。能站在已有轮子的肩膀上就别从平地起步。别怕看不懂让智能体当翻译官给新手的第一条建议别急着写代码。先把我要解决什么、我有什么限制条件说清楚。限制条件说得越具体智能体给你的答案就越靠谱。代码看不懂那就边改边问入门最大的心理压力就是它生成的代码我一个字都看不懂。我的办法很简单每次它改代码我都问它一句为什么这么改。不是说要立刻学会语法而是得理解这改动是干嘛的。比如有一次它建议我用subprocess的列表参数而不是直接拼字符串调用系统命令。我当时不理解就问为什么不用os.system呢。它给我解释了用列表能防止命令注入也不会因为文件路径里有空格就出错。这一句解释比我去网上看十篇教程都管用。给新手的第三条建议把智能体当你的陪练不是许愿机。每个你不理解的点都追问一句为什么你的认知边界会快速拓展。零基础最容易踩的三个坑带新人用智能体的过程中我发现最常见的三个坑坑一轻信已修复智能体说改好了新手就算完事了。错一定要让它跑一下看看、或者复现给我看。不能只是在代码里 grep 到某个关键字就算过关。坑二一把梭式大改一上来就让智能体一口气重构整个项目结果出错以后谁都分不清是哪一步坏的。正确做法是小步快跑——每改一点就验证一下。坑三把私密信息贴进去这个特别重要。令牌、密钥、账号密码永远不要直接复制到聊天框里。我后面会讲一个差点翻车的真实故事。第二部分真刀真枪的项目实战——k12dl要说入门篇是试试水实战就是真的上手做事了。k12dl 全程靠代码智能体最后发布了 v1.0.0837 项测试全过、零第三方依赖、提供单文件 exe 和便携 zip。下面我挑最有代表性的几个踩坑→突破讲讲。开工前先当个审计员动手写业务代码前我让智能体先帮我审查了五个同类工具的源码Jiaocai-Downloader、SmarteduDL、TMDM 之类的。摸清楚它们都是怎么工作的——资源 ID 怎么变成 CDN 直链、它们用的什么技术框架GoFyne、PythonPyQt5、Electron 之类。最关键的发现来自一个鉴权细节有个参考实现只需要在请求头里加一个X-Nd-Auth: MAC idtoken,nonce0,mac0服务端只校验 token 身份根本不严格验证 MAC 签名。一下子我们原本以为得内嵌浏览器做复杂的 HMAC 签名的方案被简化成了用户自己粘贴一个 access_token。这是智能体帮我做源码审计挖出来的捷径。光靠我自己没个一两周根本发现不了这个。调试的几个难题问题一课件下载一直 403排查了三轮才找到真凶这是最耗时的一次调试。一开始以为是 MAC 算法算错了 → 又逆向了平台的前端 JS 代码算法一样 → 最后才发现真凶是后端有个路径重写函数_rewrite_cs_path把课件正文错误地映射到了公开的 CDN其实它应该在私有的r1-ndr-private桶里。修复以后从头到尾下载了一遍包括一个 237MB 视频的课件5/5 成功。教训报错信息通常只是表面症状真正的问题往往藏在数据怎么流转的里。智能体帮我做了逐行接口对齐审查所有 28 个 API 调用点全部核对才定位到这个错配。问题二纯 Python 解密视频只有 50.8 KB/s慢得不行教材视频都是加密的。用纯 Python 解 AES 加密只有 50.8 KB/s——一本有 149 个文件的资源要解密 65 分钟。这根本没法用。智能体提了一个分三档的方案首选用pycryptodome外部库但很标准次选调操作系统自带的硬件 AESWindows 的 CNG、Linux 的 OpenSSL通过 ctypes 调用最后才退回纯 Python。三档方案实测对比解密方案实测速度依赖取舍纯 Python标准库手写 AES50.8 KB/s无149 文件要 65 分钟不可用硬件 AESWindows CNG / Linux OpenSSLctypes 调用1571 MB/s系统自带首选零额外依赖pycryptodome约 800 MB/s需 pip 安装次选标准但非零依赖硬件路径是纯 Python 的三万两千倍快。关键在零依赖——不装任何第三方包用 stdlib 的ctypes直调系统自带的 AES-NI 硬件指令def_hw_backend()-str:探测操作系统 AES 快路径失败静默降级为空串。probe_keybytes(range(16))probe_ivbytes(range(16))probe_ctbytes(range(16))forname,fnin((bcrypt,_hw_cbc_decrypt_bcrypt),# Windows CNG(evp,_hw_cbc_decrypt_evp)):# Linux/macOS OpenSSLtry:gotfn(probe_key,probe_iv,probe_ct)exceptException:gotNoneifgotisnotNoneandlen(got)len(probe_ct):returnnamereturn用 16 字节探针测一下能不能解能就走硬件、不能就静默降级——这就是让智能体想出你根本不会想到的优化角度的典型例子。问题三测试全绿却还是漏了 bug那就用变异验证这一条最值得记。第一版的并发测试明明通过了但还是漏掉了一个缓存键粒度的 bug——net.probe_remote的缓存键是按 host 级别的其实应该按 URL 级别导致批量下载第二本资源的时候必然失败。智能体把测试改成任务 A 很快、任务 B 很慢然后用 barrier 让它们同时起步的写法缺陷才真正暴露出来。测试通过 ≠ 测试有效。这条我现在逢人就讲。问题四差点把凭据泄露出去开发期有一次真实的访问令牌被不小心写进了测试文件还留在了几个还没推的本地提交里。智能体立刻提醒我git push会把旧提交对象也一起推出去令牌就永久公开了。我们用git reset --soft把提交压成一个干净的再用git gc --prunenow把旧的对象彻底清除。这是给所有人的红线公开仓库提交前必须扫全量 git 历史不只是看当前工作区。令牌、密钥、账号永远只存本机绝不进日志明文绝不随下载文件外泄。让智能体做它擅长的事机械重构与反复审查有两类活我自己干又慢又容易出错交给智能体却特别稳一是大范围机械重构。项目最初叫 smartdl准备提交的时候我决定改名 k12dl。这种事听起来简单实际要改 105 处引用——文件名、导入语句、配置、测试、文档——漏一处就崩。我让智能体批量替换再跑全量测试确认残留归零173 项测试全绿半小时搞定。自己手动改光核对就得一整天。二是反复审查同一份代码。我让智能体连做了七轮代码审查每一轮都从不同角度过一遍。第三轮挖出一个 P0pkcs7_unpadAES 去填充在填充非法时会静默返回错误结果而不是报错——解密失败了你都不知道文件悄悄就坏了defpkcs7_unpad(data:bytes)-bytes:ifnotdata:returndata ndata[-1]ifn0orn_BLOCKornlen(data):returndata# ← 填充非法却静默返回不报错ifdata[-n:]!bytes([n])*n:returndata# ← 同上文件悄悄就坏了returndata[:-n]两个return data就是病根——填充不对该抛异常它却假装没事把原数据还给你。这种 bug 跑测试根本测不出来是审查时被智能体盯着每一条异常路径才发现的。这两类活的共同点耗时长、容易遗漏、不需要创意但需要耐心和全面。恰恰是智能体性价比最高的战场。搭建一套质量门禁项目后期我和智能体一起建了一套每次改动都要过的质量卡点。这也是智能体帮我补齐工程素养的地方单元测试峰值 843 项python -m unittest discover -s tests静态检查ruff 从 24 条告警收敛到 0分层守门有可执行的断言防止倒挂、原语层污染、循环导入、跨层跳跃文档契约端点表、路由、前端调用三方对齐WebUI 覆盖每个后端接口必须前端里出现或者显式豁免UI 冒烟真实 Chrome 浏览器自动化不能有 JS 报错、不能有 HTTP 错误其中最特别的一条门禁是合规红线写进代码——不是写在 README 注释里而是变成可被测试断言的常量任何新功能必须先对照此表PROHIBITED_ACTIONS{bypass_waf:不绕过任何站点的 WAF / 滑块 / 人机校验,decrypt_site_cipher:不逆向站点前端内嵌的私有密钥/加密目录,store_credentials_remotely:不把凭据托管到远端凭据只存本机,shell_injection:不用 os.system 拼接命令一律 subprocess 列表参数,raise_concurrency_cap:不提供解除并发硬顶的开关,silent_partial_delivery:不在失败率超阈值时静默交付残缺成品,track_users:不采集任何用户标识或遥测,}7 行字典就是这工具绝不做什么的硬约束改一行都得过测试——这才是合规内建。类似地几个容易被忽视的安全坑也写成了常量。比如重定向跳数上限——urlopen默认无限跟随且不校验最终地址于是扩展名白名单可被一次 302 绕过#: 请求 https://a/x.pdf 实际落盘的可以是任意内容#: 而下游只按 .pdf 的魔数校验静默落盘错误文件。MAX_REDIRECTS5再比如熔断的最小样本量——小批量不熔断否则2 个里失败 1 个就是 50%会误伤偶发抖动FAILURE_ABORT_RATIO0.02# 失败率 2% 即熔断MIN_ABORT_SAMPLE8# 但样本 8 不熔断避免小批量误杀这些注释里写的都是真实踩过的坑不是凭空设想。这一套下来项目从能跑的脚本变成了敢发布的软件。最后一步从代码到双击即用最后要把东西交出去得降低用户门槛。智能体写了k12dl_launcher.py用 tkinter 做状态窗口自动打开浏览器然后用 PyInstaller 打成单文件 exe约 20MB还有 embeddable Python 的便携 zip 版约 15MB里面内嵌了 tcl/tk。最后用户什么都不装双击就能用。发布前还做了一次历史抹平用git checkout --orphan新建分支把开发期的各种提交缓存零散文件等提交合成一个干净的根提交这样公开仓库读起来清爽多了。哪些功能是我拍板砍掉的智能体会很积极地加功能但有几个是它建议加、我最后拍板砍掉的云盘转存一度想加下载后自动转存到云盘。我判断平台实际没这个能力且会让工具变重砍了。局域网远程访问加过二维码让手机能访问。但工具定位是本机用远程访问徒增安全面砍了。检查更新自动检查新版本的功能。实测完全没有作用砍了。这些砍掉的决策代码读不出来但它们决定了项目的边界。智能体擅长加法做减法得靠人。第三部分用完了以后对代码智能体的真实看法做完这个项目我对代码智能体的能力边界有了更现实的认识。结合这次活动的能力测评我想说几点真话第一它擅长组合已知的东西不擅长替你做决定有一次智能体收到全面重构的指令一度想把整个项目推倒重做。但我先让它梳理一遍现状发现那个 24 条改进清单其实已经基本落地了——盲目重做只是用没验证过的新东西替换已经能用的东西反而是倒退。人在关键决策上不能弃权。第二太宽泛的错误处理会掩盖真正的 bug项目里有个settings.py的 P0 级缺陷被业务层的回退链兜住了好几天才发现。原来是业务代码的except Exception太宽泛直接吞掉了所有错误。写错误处理时要逼智能体具体捕获而不是一揽子吞掉。第三它的产出质量取决于你给的验收标准多硬“跑通测试”“ruff 零告警”“前端无报错”——这些可量化的门禁比看起来不错有用一百倍。标准越具体产出质量就越稳定。第四最被低估的能力是审计与对齐审查五个竞品源码、对齐前后端 28 处接口这些工作特别耗时、容易遗漏恰恰是智能体性价比最高的战场。这不是创意工作但是决定成败的细节工作。一句话总结代码智能体能把我一个人做不完变成我和它一起做得完。但方向盘始终该握在自己手里。后记把过程写下来把作品留下来如果你也想做点东西但觉得我不会写代码是个坎——不妨换个问法“我想解决什么有什么限制”把这个问题说清楚剩下的交给代码智能体也交给那个愿意一步一问、不怕看不懂的自己。k12dl 已经以 MIT 开源发布了。代码能审计过程能复盘踩过的坑都写在这里了。这大概就是技术成长最实在的样子。开源仓库https://atomgit.com/CYXue/k12dl MIT 协议837 项测试零第三方依赖这里写自定义目录标题华为云码道实战记录零基础用代码智能体造出一个教材下载器开篇为什么我敢动这个念头第一部分零基础入门其实不是从写代码开始的最常见的错误上来就说帮我写个下载器需求说清后先满世界找轮子别怕看不懂让智能体当翻译官代码看不懂那就边改边问零基础最容易踩的三个坑第二部分真刀真枪的项目实战——k12dl开工前先当个审计员调试的几个难题让智能体做它擅长的事机械重构与反复审查搭建一套质量门禁最后一步从代码到双击即用哪些功能是我拍板砍掉的第三部分用完了以后对代码智能体的真实看法后记把过程写下来把作品留下来k12dl 已经以 MIT 开源发布了。代码能审计过程能复盘踩过的坑都写在这里了。这大概就是技术成长最实在的样子。
