代码大全2读后感2
《代码大全2》里有一章我读得比预想中认真,叫防御式编程。书里说,要假设“任何可能出错的地方终将会出错”,用断言去抓那些绝不应该发生的逻辑错误,用异常去处理预料之中的环境问题。放在以前,我大概会觉得这是工作以后才用得上的东西,大二作业的数据都是自己编的,能出什么错?但AI编程工具铺开之后,这一章突然变得很当下。
Copilot或者Cursor生成一段Java方法,表面上看往往挑不出毛病:命名规范,结构完整,甚至注释都写好了。但已经有不少讨论指出,这类工具生成的代码可能引用不存在的API,可能在边界条件下行为不对,可能在安全相关的场景里埋着漏洞。一个资深开发者能扫一眼就察觉“这里不对劲”,但一个大二学生面对一段语法完美、格式漂亮的AI代码,判断力恰恰是最缺的。GitHub Copilot那边也有开发者提到,初级开发者会把“看起来对”的代码直接推上去,因为他们还没有能力分辨哪里不对。
这让我意识到,防御式编程对我而言,首先不是去防御用户输入,而是防御我自己对AI的轻信。书里区分断言和异常的那条线,我用一个很小的Java作业试了试:AI生成的一个数组处理函数,默认传入的列表不会为空。我没改逻辑,只在方法入口加了一个断言,把“这个参数按设计不应该为null”的假设显式写出来。跑单元测试的时候断言触发了,我才发现上游有一个分支确实会传空进来,而AI的代码在那个分支上会直接抛空指针,只是我之前没测到。这件事很小,但它让我第一次感觉到,“判断AI代码有没有问题”这件事本身,就是一项需要刻意练习的能力,而不是等学了架构自然就会有的。
书里还有一个提醒对我很受用:防御式编程不是对别人不信任,是对复杂性的敬畏。AI把写代码的门槛拉低之后,涌入代码库的“看起来对的东西”只会更多。如果我在大二就习惯了对生成结果照单全收,等到了团队里,我可能就是那个制造审查负担的人。反过来,如果我从现在开始对每一段借来的、生成的代码都问一句“它在什么情况下会错”,那我至少是在往“能兜底的人”那个方向走,而不是停在“会按按钮的人”那一层。

浙公网安备 33010602011771号