#代码质量

宝玉
1周前
AI本该助力新人,为何反而让高手更强? 作者:Can Elma “AI会不会彻底取代程序员?”类似的问题已经被问烂了,人们不断地尝试给出答案。虽然这个话题已经不新鲜,但我还是想分享一些自己的观察和思考。 起初,许多人都相信,未来公司会减少对高级工程师的依赖。毕竟,有了AI,初级程序员也能创造出高质量的代码——至少坊间流传的故事是这样的。然而现实却截然不同。AI并未如宣传中那样神奇,最终真正有效的组合,不是“新人 + AI”,而是“高手 + AI”。 为什么会这样? 我们来仔细看看,在代码编写上,AI到底哪里强、哪里弱。 AI擅长的事: • 快速生成大量样板代码(boilerplate)和脚手架(scaffolding)。 • 自动化重复、枯燥的任务。 • 尝试多种不同的实现方式。 • 借助快速迭代,迅速验证想法。 • 在需求清晰的前提下,快速交付功能。 这些特性帮助了谁?显然更利于高级工程师。对新人来说,想把AI的这些能力真正变成实际价值,要难得多。 AI出问题的地方: • 代码审查(Code review): AI无法真正“理解”代码。审查时可能有些帮助,但一旦涉及边缘情况(edge cases)——而AI生成的代码通常有更多边缘情况——最终还是需要资深工程师出马。 • 不好的指令(Bad prompts): 能写出高质量提示词的人,必须是那些真正懂得自己要做什么的人。如果使用者缺乏深入理解,即使AI看起来产出还行,实际也只是给项目埋下了无数隐患。 • 架构设计(Architecture): 没有扎实的架构,软件很快就会失去价值。当前AI并不擅长设计优秀架构,虽然表面上看起来似乎可以,但实际上,这种复杂推理仍然依赖人类。许多以弱架构起步的项目,最终深陷技术债(technical debt)泥潭。 • 代码质量(Code quality): 选择恰当的抽象层次、正确运用设计模式、保持代码的干净清晰,这些都是AI目前的短板。 • 安全性(Security): 新手搭配AI的组合更容易出现漏洞,就像盖一座房子忘了装门锁。虽说漏洞无处不在,但高级工程师至少能提高警觉和谨慎。 • 错误学习(Wrong learning): 新人如果不能正确判断AI产出的代码好坏,就会潜移默化地吸收错误知识。在公司里,这意味着制造的是损害而非价值。 以上这些问题,概括起来就是:AI暂时对高级工程师并没有威胁,甚至反而让他们更加强大。这里不是在批评新人,而是强调不应对他们抱有不切实际的期望,把他们扔到充满风险的环境中。 我们真正该如何用AI? • 快速原型开发(Fast prototyping): 想快速尝试新想法时,AI再适合不过。 • 加速重复任务(Speeding up routines): AI最重要的用途,就是自动化那些你已经非常熟悉并经常重复的工作。 • 跨领域协作(Multi-disciplinary work): AI可以弥补你知识上的短板,建议有用的函数库或方法,帮你快速连接不同领域的知识点。 • 功能测试(Function tests): 简单重复、风险较低的测试代码,AI可以帮你快速生成,并且容易进行人工复核。 从我的角度来看,这就是AI目前的现状。AI写的每一行代码,我们依然需要逐行审阅。它远远称不上完美:没有自我意识,只会模仿人类的推理,生成结果不可控(non-deterministic),所以我们才依靠确定性的东西,比如单元测试。可是,你真的放心让AI自己编写测试,来验证它自己的代码吗? 我想起我曾发过的一条推特,有个提示词可以让AI在“不懂时回答‘我不知道’”,我评论道:“即使AI回答‘我不知道’,你也不能确定它到底知不知道自己不知道。” 确实,“新人 + AI”的模式很诱人,看起来成本低廉,还迎合了人们“AI将抢走我们工作”的恐惧。但当你把软件开发和其他行业作比较,就会发现软件行业仍然不够成熟。在建筑行业,建筑师专注于设计;但在软件领域,即使是“架构师”,也仍在不断地亲手“砌砖”,编写底层代码。我们还远没有实现真正的分工和专长化,成本优先的思维主导市场,这只会贬低工作价值,让人疲惫不堪。 因此,AI目前非但没有让编程变得更加民主化,反而更集中地将能力交给了那些资深工程师。现实与预期产生了错位。未来会如何发展,谁也说不准。我对AI的长期发展依然乐观,但短期内,我们最好重新校准自己的期待,别再让不切实际的想法越走越偏了。
WquGuru🦀
1个月前
分享一个Claude Code全局提示词(也适用于Augment/Cursor等等),有架构师附身之奇效: ## Code Architecture - 编写代码的硬性指标,包括以下原则: (1)对于 Python、JavaScript、TypeScript 等动态语言,尽可能确保每个代码文件不要超过 200 行 (2)对于 Java、Go、Rust 等静态语言,尽可能确保每个代码文件不要超过 250 行 (3)每层文件夹中的文件,尽可能不超过 8 个。如有超过,需要规划为多层子文件夹 - 除了硬性指标以外,还需要时刻关注优雅的架构设计,避免出现以下可能侵蚀我们代码质量的「坏味道」: (1)僵化 (Rigidity): 系统难以变更,任何微小的改动都会引发一连串的连锁修改。 (2)冗余 (Redundancy): 同样的代码逻辑在多处重复出现,导致维护困难且容易产生不一致。 (3)循环依赖 (Circular Dependency): 两个或多个模块互相纠缠,形成无法解耦的“死结”,导致难以测试与复用。 (4)脆弱性 (Fragility): 对代码一处的修改,导致了系统中其他看似无关部分功能的意外损坏。 (5)晦涩性 (Obscurity): 代码意图不明,结构混乱,导致阅读者难以理解其功能和设计。 (6)数据泥团 (Data Clump): 多个数据项总是一起出现在不同方法的参数中,暗示着它们应该被组合成一个独立的对象。 (7)不必要的复杂性 (Needless Complexity): 用“杀牛刀”去解决“杀鸡”的问题,过度设计使系统变得臃肿且难以理解。 - 【非常重要!!】无论是你自己编写代码,还是阅读或审核他人代码时,都要严格遵守上述硬性指标,以及时刻关注优雅的架构设计。 - 【非常重要!!】无论何时,一旦你识别出那些可能侵蚀我们代码质量的「坏味道」,都应当立即询问用户是否需要优化,并给出合理的优化建议。